Skip to content

fix(pair): refuse a Codex lead, name the pair tools, and end paired mode when the pair is off - #638

Merged
rynfar merged 2 commits into
pylonfrom
fix/pair-lead-support
Sep 18, 2026
Merged

rynfar merged 2 commits into
pylonfrom
fix/pair-lead-support

Conversation

@rynfar

@rynfar rynfar commented Sep 18, 2026 •

Copy link
Copy Markdown
Collaborator

What

A live end-to-end run of pair mode found that a Codex lead does not pair, while a Claude lead does. This makes the product say so, and tightens what a paired lead is told.

  • Codex cannot lead a pair for now. pair_start refuses it and the composer's Pair control shows it as unavailable with a reason, the same way Antigravity already was. Both still work as the executor.
  • The pair protocol names its tools. It now says the executor is reached only through pair_handoff, pair_await and pair_stop on the t3-code MCP server, tells the lead to search for pair_handoff if it is not listed, and says that an agent started with the harness's own tools (Agent, Task, spawn_agent, a collaboration namespace) is not the executor.
  • Turning a pair off now really turns it off. The pair capability was granted whenever the executor thread existed, and turning off a pair with history archives the executor instead of deleting it. That lead would have kept the Agent tool denied and the pair protocol in its instructions. The capability now needs an executor that is not archived, which is what the internals doc already said. Found by reading the code while testing, covered by a new case in ProviderService.test.ts.
  • A paired Codex app-server also gets features.multi_agent_v2=false. Kept for Codex threads that already have an executor; it is not enough on its own (below).

Evidence

Run against an isolated server with real providers, task: "brief your executor to create a file, wait, verify".

  • Codex lead (codex-cli 0.153.4, GPT-6-Astra), four runs, two of them on a fresh thread with both flags off and the new protocol text: every time the lead called Codex's own collaboration.spawn_agent / followup_task / wait_agent, the work ran on the lead's model, and the pair executor never got a session.
  • codex exec -c features.multi_agent=false -c features.multi_agent_v2=false still lists all six collaboration.* tools, so the flags flip in codex features list without removing the tools. agents.max_depth=0 does not remove them either.
  • Asked directly, the Codex lead reported no <pylon_pair> block and no t3-code tools, although the provider log shows t3-code reaching ready and the protocol inside the turn's developer instructions. Not yet explained; tracked in feat: pair mode, a linked lead/executor thread pair replacing fan-out delegation #622.
  • Claude lead (Claude provider, Sonnet 5) with a Claude executor: the lead called pair_handoff and pair_await, the executor's own session wrote the file, the lead verified it, the control read "Finished", and the wake message rendered as the compact notice.

Verification

  • vp test run on the pair toolkit, RuntimeInstructions.test.ts, CodexAdapter.test.ts and packages/client-runtime/src/state: 710 passed. ProviderService.test.ts: 138 passed.
  • Typecheck t3, @t3tools/client-runtime, @t3tools/web: 0 errors. Lint on the changed files: clean.

Known limits

Part of #622.

Model: Claude Fable 5.1, in Pylon via the Claude Code harness.


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need. Autofix is disabled.

@vercel

vercel Bot commented Sep 18, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
pylon-marketing Ready Ready Preview Sep 18, 2026 5:14pm UTC

@rynfar rynfar changed the title fix(pair): refuse a Codex lead and name the pair tools in the protocol fix(pair): refuse a Codex lead, name the pair tools, and end paired mode when the pair is off Sep 18, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ℹ️ The exact PR base did not have a successful artifact. Baseline uses the latest successful main measurement shown below.

Provider Metric Main baseline This PR Impact PR ceiling
Codex Total thread wire 13.9 KiB 13.9 KiB +49 B (+0.3%) 15.1 KiB ✅
Codex Thread snapshot wire 7.2 KiB 7.2 KiB +9 B (+0.1%) 7.3 KiB ✅
Codex Live turn WebSocket wire 6.7 KiB 6.7 KiB +40 B (+0.6%) 7.8 KiB ✅
Codex Live turn WebSocket decoded 58.0 KiB 58.0 KiB +44 B (+0.1%) 66.4 KiB ✅
Codex Live turn messages 8 9 +1 (+12.5%) 21 ✅
Claude Total thread wire 13.9 KiB 14.0 KiB +45 B (+0.3%) 15.1 KiB ✅
Claude Thread snapshot wire 7.2 KiB 7.2 KiB +16 B (+0.2%) 7.3 KiB ✅
Claude Live turn WebSocket wire 6.7 KiB 6.7 KiB +29 B (+0.4%) 7.8 KiB ✅
Claude Live turn WebSocket decoded 58.8 KiB 58.9 KiB +44 B (+0.1%) 66.4 KiB ✅
Claude Live turn messages 8 9 +1 (+12.5%) 21 ✅

Baseline: 93931e7 · PR result: 7bbe9ac · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 115.7 KiB
  • Claude decoded thread snapshot: 116.4 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

@rynfar
rynfar merged commit 6468f56 into pylon Sep 18, 2026
20 checks passed
@rynfar
rynfar deleted the fix/pair-lead-support branch September 18, 2026 19:50

This branch was successfully deployed

1 active deployment
Preview — 7bbe9ac3 Deployed Sep 18, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant