Skip to content

feat(pair): pair without the Pylon delegation setting - #648

Merged
rynfar merged 4 commits into
pylonfrom
feat/pair-standalone
Sep 18, 2026
Merged

rynfar merged 4 commits into
pylonfrom
feat/pair-standalone

Conversation

@rynfar

@rynfar rynfar commented Sep 18, 2026 •

Copy link
Copy Markdown
Collaborator

What

Pairing no longer needs the Pylon delegation setting. A thread is paired when its executor exists and is not archived, and that alone now gives the lead its pair tools, the pair protocol, the native fan-out denial, and the wake when the executor finishes.

The setting keeps the meaning it should have had: whether agents may start and drive other threads on their own. With it off, fan-out children stay silent and pair_start is refused, so an agent cannot begin a pair by itself. A pair the user switches on from the composer works either way.

Why

Turning a pair on took two steps in two places, and the first one read as unrelated. The requirement only existed because pair mode was first built as a delegation variant with one kill switch. The switch in the composer is per thread and explicit, which is already the consent the setting was standing in for.

How

  • ProviderService.agentAccessCapabilities: the pair capability no longer sits inside the delegation branch.
  • Pair toolkit: pair_start still requires delegation; pair_handoff, pair_await and pair_stop accept pair or delegation, and a caller with neither still sees the delegation error.
  • followThroughChildren and isFollowThroughAdmitted (pure): with delegation off, only the parent's pair executor may wake it, and a wake is admitted only when every child it names is that executor. The follow-through reactor and the engine's admission both use them.
  • Web: the "turn on Pylon delegation" reason and its guard are removed from the Pair control.
  • Docs: the user guide says pairing does not need the setting and that asking for a pair in a message does; the internals page describes the split. It also records that Prime Agent was verified as a lead.

No contract, decider, projector or migration changes.

Verification

  • vp test run on apps/server/src/orchestration, the pair and delegation toolkits, ProviderService.test.ts, RuntimeInstructions.test.ts and the web Pair control tests: 1101 passed. Five new tests were written first and seen failing: the two pure rules, the capability table, the pair tool gate with only the pair capability, and a reactor test where delegation is off, a fan-out child finishing stays silent, and the pair executor finishing wakes the lead.
  • Typecheck t3 and @t3tools/web: 0 errors. Lint and vp run knip:check clean.
  • Live, isolated server, enableAgentDelegation: false, Claude lead with a Claude executor: the Pair switch was enabled with no reason shown; the lead briefed the executor and ended its turn; the executor wrote the file; the follow-through wake was delivered to the lead, which then confirmed the content. Before this change the switch was blocked, and an executor created anyway left the lead unpaired with no wake.

Built test-first: contract, tests, client change, review and prose by the lead; server implementation by an Antigravity executor, with the four test files pinned by blob hash and unchanged.

Part of #622.

Model: Claude Fable 5.1 (lead) with an Antigravity executor, in Pylon via the Claude Code harness.

@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L labels Sep 18, 2026
@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 8:53pm UTC

@github-actions

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

Provider Metric Main baseline This PR Impact PR ceiling
Codex Total thread wire 14.0 KiB 13.9 KiB −33 B (−0.2%) 15.1 KiB ✅
Codex Thread snapshot wire 7.2 KiB 7.2 KiB +13 B (+0.2%) 7.3 KiB ✅
Codex Live turn WebSocket wire 6.8 KiB 6.7 KiB −46 B (−0.7%) 7.8 KiB ✅
Codex Live turn WebSocket decoded 58.0 KiB 58.0 KiB −88 B (−0.1%) 66.4 KiB ✅
Codex Live turn messages 10 8 −2 (−20.0%) 21 ✅
Claude Total thread wire 14.0 KiB 13.9 KiB −77 B (−0.5%) 15.1 KiB ✅
Claude Thread snapshot wire 7.2 KiB 7.2 KiB −5 B (−0.1%) 7.3 KiB ✅
Claude Live turn WebSocket wire 6.8 KiB 6.7 KiB −72 B (−1.0%) 7.8 KiB ✅
Claude Live turn WebSocket decoded 58.9 KiB 58.8 KiB −88 B (−0.1%) 66.4 KiB ✅
Claude Live turn messages 10 8 −2 (−20.0%) 21 ✅

Baseline: f2a9637 · PR result: 33a97c0 · 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.6 KiB
  • Claude decoded thread snapshot: 116.3 KiB

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

@rynfar
rynfar merged commit 933d6f7 into pylon Sep 18, 2026
19 checks passed
@rynfar
rynfar deleted the feat/pair-standalone branch September 18, 2026 20:56

This branch was successfully deployed

1 active deployment
Preview — 33a97c03 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:L 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