verify-package-paths flagged the new built-bin smokes' `lib/bin.js` citations as stale-source drift, failing CI: doc-sync runs BEFORE build, so the build output is absent at lint time. The gate targets moved SOURCE paths, so skip any reference whose target goes through a `lib/` segment — mirroring how the file scan already excludes `lib/`. The acp built-bin smoke resolved `zod`/`@agentclientprotocol/sdk` via `import.meta.resolve` from the test file's own context, but `acp-agent` does not declare them — `dsh-acp` does. Under pnpm's strict layout they are not exposed where the test resolves, so the new CI built-bin step failed with "Cannot find package 'zod'". Resolve each from the `ui/acp` package URL (the one that declares it) instead.
ui/ — editor/client integration surfaces
Integrations that expose the agent to an external editor or client. These are product packages: a real surface a user drives the harness through.
| Package | Role | ctx key |
|---|---|---|
acp/ |
Agent Client Protocol bridge: serves the agent to an ACP editor (Zed) over JSON-RPC stdio | (drives ctx.agents/ctx.sessions) |
stdio-agent/ |
Terminal stdio chat APP: the agent-core spine + console logger + readline UI + a pre-created main agent, with a bin |
(composition + bin) |
acp-agent/ |
ACP server APP: the agent-core spine + JSONL persistence + the acp bridge (no stdout logger), with a bin |
(composition + bin) |
A UI integration is a client-driver plugin, not a loop change and not a capability seam: it consumes the existing agent/* event taxonomy and the dsh-agent factory. The readline ui-stdio plugin is the unstructured analogue but lives in support/ because it exists chiefly for the examples and the coverage gate — ui/ is reserved for surfaces shipped as product.
stdio-agent and acp-agent are the two app packages: each composes the core/agent-core spine with its coupled front-door cluster (and owns the boot bin), so a leaf cordis.yml is just the swappable backends plus one app entry. They live in ui/ because each IS a user-facing front door; the stdout-purity coupling (logger vs. no logger) becomes a property of the artifact rather than a leaf convention.