.agents/skills/sync-acp-spec/SKILL.md
Sync the ACP (Agent Client Protocol) schema implementation with the official reference repo by comparing Rust source types against our Python Pydantic models.
npx skillsauth add phil65/agentpool sync-acp-specInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Keep src/acp/schema/ aligned with the official Agent Client Protocol reference implementation.
Clone the reference repo into a temporary directory:
tmp=$(mktemp -d)
git clone --depth 1 https://github.com/agentclientprotocol/agent-client-protocol "$tmp/acp"
Identify new commits since last sync:
git -C "$tmp/acp" log --oneline <SPEC_SYNCED_COMMIT>..HEAD
The synced commit hash is stored as SPEC_SYNCED_COMMIT in src/acp/__init__.py.
Read the upstream Rust source (the authoritative types):
$tmp/acp/src/agent.rs — agent-side types: capabilities, auth methods, session state, config options, slash commands, content blocks, session updates, MCP servers$tmp/acp/src/client.rs — client-side types: client capabilities, requests, responses$tmp/acp/src/error.rs — error codes and Error struct$tmp/acp/src/content.rs — content block types$tmp/acp/src/tool_call.rs — tool call types$tmp/acp/src/plan.rs — plan entry types$tmp/acp/src/rpc.rs — JSON-RPC message types, method strings$tmp/acp/src/ext.rs — extension notifications$tmp/acp/src/version.rs — protocol version constant$tmp/acp/schema/schema.json and schema.unstable.json — JSON Schema (useful for cross-checking)Compare with our Python implementation (mapping table):
| Upstream Rust file | Our Python module |
|---|---|
| agent.rs (capabilities) | schema/capabilities.py |
| agent.rs (auth, common types) | schema/common.py |
| agent.rs (session updates) | schema/session_updates.py |
| agent.rs (session state) | schema/session_state.py |
| agent.rs (slash commands) | schema/slash_commands.py |
| agent.rs (MCP servers) | schema/mcp.py |
| agent.rs (responses) | schema/agent_responses.py |
| agent.rs (requests to client) | schema/agent_requests.py |
| client.rs (requests) | schema/client_requests.py |
| client.rs (responses) | schema/client_responses.py |
| client.rs (capabilities) | schema/capabilities.py |
| content.rs | schema/content_blocks.py |
| tool_call.rs | schema/tool_call.py |
| plan.rs | schema/agent_plan.py |
| rpc.rs | schema/messages.py |
| ext.rs | schema/notifications.py |
| error.rs | schema/common.py (Error), exceptions.py (RequestError) |
| version.rs | schema/__init__.py (PROTOCOL_VERSION) |
Apply updates to our code:
#[cfg(feature = "unstable_*")] fields to field: Type | None = NoneLiteral types for new method strings in schema/messages.py__init__.py exports in both schema/__init__.py and acp/__init__.pycamelCase alias convention (alias_generator=to_camel in base)schema/ (connection handlers, bridge, transports) — only update those if they need to handle new schema typesWire up new schema types in the protocol layer (if needed):
agent/connection.py — add dispatch cases for new agent methodsclient/connection.py — add client-side methods for new requestsbridge/bridge.py — add bridge handler casesagent/protocol.py — add methods to the Agent protocolagent/implementations/testing.py — add stubs to TestAgentagent/implementations/debug_server/mock_agent.py — add stubs to MockAgentWire up in the ACP server (if needed):
src/agentpool_server/acp_server/acp_agent.py — implement new methods, advertise new capabilitiessrc/agentpool_server/acp_server/event_converter.py — emit new session update typessrc/agentpool_server/acp_server/session.py — store new stateUpdate the synced commit hash in src/acp/__init__.py:
git -C "$tmp/acp" rev-parse HEAD
Update the SPEC_SYNCED_COMMIT constant to the new hash.
Clean up:
rm -rf "$tmp"
#[serde(rename_all = "camelCase")] → handled by our alias_generator=to_camel in Schema base#[serde(rename = "_meta")] → handled by our convert() function (field_meta → _meta)Option<T> → T | None = None#[serde(default)] booleans → bool = False or bool | None = False#[serde(tag = "type")] enums → Pydantic discriminated unions with Discriminator()#[serde(untagged)] variants → Field(exclude=True) on the type discriminator fieldVec<T> → Sequence[T] (for inputs) or list[T]HashMap<K, V> → dict[K, V]#[cfg(feature = "unstable_*")]) → always included, marked with **UNSTABLE** docstringsconnection.py (base JSON-RPC connection) — only if the wire protocol itself changestransports.py — transport layer is our ownstdio.py — our process management layerclient/ implementations (DefaultACPClient, HeadlessACPClient, NoOpClient) — agentpool-specificregistry/ — our agent registry, not part of ACP spectask/ — our task abstractiontool_call_reporter.py, tool_call_state.py — our extensionsfilesystem.py — our filesystem handler implementationtesting
A simple example skill that demonstrates the basic structure and functionality. Use when you need to show how skills work or test skill loading.
testing
Sync the agentpool skills implementation with the official Agent Skills Spec by comparing against the reference repository.
tools
Use when work should span one or more detached tasks but still behave like one job with a single owner context. TaskFlow is the durable flow substrate under authoring layers like Lobster, ACPX, plugins, or plain code. Keep conditional logic in the caller; use TaskFlow for flow identity, child-task linkage, waiting state, revision-checked mutations, and user-facing emergence.
tools
# Lobster Lobster executes multi-step workflows with approval checkpoints. Use it when: - User wants a repeatable automation (triage, monitor, sync) - Actions need human approval before executing (send, post, delete) - Multiple tool calls should run as one deterministic operation ## When to use Lobster | User intent | Use Lobster? | | ------------------------------------------------------ | --------------------------