crosstalk install registers the MCP server at the installed binary’s absolute path; the plugin carries only the skilldocs/plans/release-0.1.3.md section (a); ADR 0013 (rejected crosstalk install, plugin-supplied server); docs/setup.md ENOENT row; the 2026-11-04 clean-account run and a Linux test VM runADR 0013 ships the MCP server inside the plugin with the bare command crosstalk, so the binary must be on the PATH the harness sees. A harness started outside a shell does not see shell-profile PATH entries, which fails as ENOENT on Claude (ADR 0013 “Not yet run live”, PATH row; setup.md troubleshooting table). Setup is eight manual steps, two of them easy to get wrong: removing a manual MCP entry (two shims, agent_held) and removing a Codex [mcp_servers.crosstalk] table without its tools.* sub-tables (Codex refuses the whole config with invalid transport). The operator reversed ADR 0013’s rejection of crosstalk install for 0.1.3 and ruled that MCP registration uses the absolute installed path.
Terms: shim = the crosstalk mcp process a harness starts. Allow rule = an entry in Claude Code’s permissions.allow list in ~/.claude/settings.json. Bin dir = the directory install copies the binary into.
crosstalk install [claude|codex], crosstalk uninstall [claude|codex] and crosstalk reinstall [claude|codex] exist. With no harness name, the command finds each of claude and codex on the PATH and acts on each one found; with a name, it acts on that one.os.Executable, symlinks resolved) to a stable bin dir, default ~/.local/bin (no admin rights), by writing a temporary file in that directory and renaming it over the target, so a running shim keeps its old file and is never killed or blocked. When the running binary already is the target, the copy is skipped. A binary from go install installs the same way.claude mcp add --scope user crosstalk -- <path> mcp; Codex as a [mcp_servers.crosstalk] table in ~/.codex/config.toml with default_tools_approval_mode = "approve". An existing entry keeps its approval mode, environment and tool sub-tables; its command becomes the installed path and its args ["mcp"]. The server key stays crosstalk (the Codex delivery namespace in internal/harness/codex/appserver/methods.go:203 depends on it).claude plugin install, codex plugin marketplace add and codex plugin add), so the skill arrives in the same run. The plugin manifests carry the skill only: no mcpServers key, no claude.mcp.json or codex.mcp.json.mcp__crosstalk__* and ports every rule naming the old mcp__plugin_crosstalk_crosstalk__ prefix, in every permission source it can find (user, project and local settings of projects listed in ~/.claude.json, managed settings), so no restriction is lost: user and local files are rewritten; a checked-in project or managed file with an old-prefix deny or ask stops the install before any registration, naming the file, until the user ports it.crosstalk send; the harnesses no longer need it.--yes runs every required step without asking (the PATH step needs --path too); without a terminal and without --yes, install changes nothing and exits non-zero. Every changed config file is written atomically after a backup copy next to it.crosstalk MCP server is registered per harness; codex mcp list succeeds (Codex’s own parser) and no [mcp_servers.crosstalk.tools.*] table is left without its parent; the allow rule is present and no deny rule names the prefix; the registered command is the installed path and is executable; a live MCP handshake with the registered command lists the seven tools and reports the binary’s version. Install prints that running sessions keep their old server until restarted.~/.local/state/crosstalk (journals, tokens) in place; --purge deletes the state dir on a full uninstall (operator ruling Q5).git-subdir source on this repo, path plugins/crosstalk, ref vX.Y.Z), so a plugin install or update gets the tagged plugin, not main (operator ruling Q11; both CLIs confirmed live). The ref moves in its own commit after the release tag exists, never to an rc tag.harness.Installer interface (Found, InstallSteps, UninstallSteps, Checks, and Registered, which the plan did not list: it reads a harness’s config files without its CLI, so uninstall keeps the shared binary and state while any other harness’s config still runs the binary or cannot be read; as NativeIngress and Supersession are optional), per ADR 0008; the binary copy, PATH step, prompts and check runner live in cmd/crosstalk. harness.InstallEnv carries, besides Bin, Version, Home and Run (the plan’s shape), three fields the plan did not list: Handshake (the K6 MCP client lives in cmd/crosstalk, while each adapter knows its registered command, args and env), SkipRulePort (a Claude-only flag the Claude step needs) and Marketplace (what plugin marketplace add receives, GoodOlClint/CrossTalk unless CROSSTALK_MARKETPLACE names another source, so an rc rehearsal can point at a scratch marketplace whose ref is the rc tag). harness.ReplaceFile is the one backup-then-atomic-write used by both adapters and the PATH step; it backs a file up once per run, so the backup is the file before this run.marketplace add on both CLIs accepts a marketplace already present, verified live). Claude registration is claude mcp add --scope user crosstalk [-e K=V ...] -- <path> mcp: the name precedes -e, since -e placed before the name takes the name as an env pair (verified live). K2 on Claude reads the installed plugin’s mcpServers from claude plugin list --json and the local-scope entries in ~/.claude.json, not claude mcp list, which starts every configured server to report its health. Codex plugin marketplace upgrade is skipped for a local marketplace, which Codex refuses to upgrade.${HOME}/.local/bin/crosstalk in the static plugin manifests. Claude expands environment variables in plugin MCP config; Codex support is unknown, and any bin dir other than the default breaks.crosstalk install”, and install does only settings and MCP. Leaves the plugin and the MCP registration in two steps the user can do out of order (plugin 0.1.2 still carries a server, so a 0.1.2 plugin plus an install-registered server gives two shims). Kept as the fallback text in the plugin README; the operator ruled for install running the plugin commands (plan Q1).codex mcp list as the parser check is enough.crosstalk install and its plugin-supplied server. ADR 0013 is edited in place (AGENTS.md: all ADRs are provisional and edited in place).mcp__plugin_crosstalk_crosstalk__ to mcp__crosstalk__. Allow rules, eval graders under plugins/crosstalk/evals/ and any other repo or settings file naming the old prefix need the new one.crosstalk reinstall.docs/setup.md shrinks to: download, verify, ./crosstalk install.main reach no user until the ref moves. The server removal, the installer and the version bump still merge in one PR. A 0.1.2 user who updates the plugin after the ref moves to v0.1.3 has no server until they run the 0.1.3 binary’s crosstalk install (release notes and plugin README say so). An old plugin next to an install-registered server gives two shims; the install’s “exactly one server” check catches it.impl-0.1.3-install): e617ba5 A0 marketplace pin; 12b805b A1 Installer and skeleton; 433354e A2 binary copy; a425407 A3 skill-only plugin; 1c32e0b A4 Claude steps; 4a836fe A5 Codex steps; 3151339 A6 checks K1-K7; a67a48e A7 uninstall, reinstall, purge; 4d5bcb3 A8 PATH (macOS); 967b0f3 B3 PATH (Linux); e4cac37 CROSSTALK_MARKETPLACE; 79e8dfc local marketplace skips upgrade; e97e9a3 A9 docs; a48adaf B4 Linux setup; fb29f0e version 0.1.3; 8395786 this ADR as built; Codex review fixes af7b687 (Registered, keep on uncertainty), 0b209b7 (brackets in strings and comments), 25a3507 (Claude entry recovery copy). Implementing commits carry Provisional-ADR: 0016.~/.claude/crosstalk-mcp-entry.crosstalk-backup.json before removal and restored when the new add fails.CROSSTALK_MARKETPLACE. Not yet run: a clean account (A9), a Linux host (B5), claude plugin eval with the renamed graders.docs/plans/release-0.1.3.md section (a).