Repository navigation
feat(t3): T3 Code as a third harness (#253) - #272
Conversation
Corrections to the ported T3 host section, per the #253 design: - The parent records the orchestration harness and the model runtime once; T3 is detected from the session's instructions and working tools, with T3CODE_THREAD_ID only as corroboration. - A lane goes through delegate_task when T3 offers its provider, enabled, with the model and effort; otherwise it takes the standalone route of the same runtime (native or the external runner with --parent <runtime>); a named dropout only when neither can run it. - inherit-parent and auto go through delegate_task with no target. - Alias resolution stays inside the provider and the catalog's revision form, compares revisions numerically and ignores suffixes such as -high. - Worktree children need a committed base or fixture inputs; no commits of unrelated changes on their behalf. - Advisory read-only only where the caller allows it; enforced read-only takes the standalone route. - T3 results are T3 launch configuration evidence with explicit completion, timeout and dropout rules. Refs #253 Co-authored-by: Aiden Lee <aiden@fika.vc> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Step 1 records the orchestration harness and the runtime, and the runtime selects the config home, sheet and integration. Step 5 reads T3's capabilities once and routes each family by the T3 host order: T3-routed families probe through delegate_task, standalone-routed families keep the runtime's checks and probes. Step 7 shows each family's route and step 9 runs the smoke panel through the same routes. The fork's blanket setup bypass in provider-dispatch.md is deleted. Refs #253 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…docs AGENTS.md, UPSTREAM.md, README.md and docs/reference.md name Claude Code, Codex and T3 Code; T3 owns orchestration while its runtime owns configuration and skill installation. The triage rule that routed a new tool only as an external provider now distinguishes model providers from parent harnesses. UPSTREAM.md records the T3 routing adaptation, and CHANGES.md carries the entry under Unreleased. Refs #253 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
T3 names Claude `claudeAgent` and Antigravity `antigravity`, where pstack says `claude` and `agy`. One table in the T3 host section now maps each pstack provider to the `driverKind` a live `orchestrator_capabilities` call lists; a provider without a T3 driver takes the standalone route. Refs #253 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The verifier can now run a live lane from a real T3 Code session. The `t3` transport starts a run-owned disposable T3 server from the operator's installed service binary, gives its Claude provider the same session-only candidate plugin flags as the Claude harness, runs each case with `t3 thread start --wait --json`, stops the server, and parses the parent's Claude transcript, located through the run-owned `statev2.sqlite`, with the Claude stream parser. `t3:dispatch` has the installed poteto-mode dispatch one fixture-sheet role (`claude:claude-haiku-5-5@low`) and asserts the candidate skill path, the exact `delegate_task` request, the settled response and a per-run marker the child read from a fixture file. Classification reaches `t3:dispatch` only from provider-dispatch.md, codex-tools.md, setup-pstack/SKILL.md and recipes.ts, never by default; self-test adds no T3 session, and the doctor checks the T3 binary only when a `t3:` feature is named. Refs #253 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Refs #253 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Merge Protections🟢 All 2 merge protections satisfied — ready to merge. Show 2 satisfied protections🟢 Queue ready pull requestsAutomatically queue non-draft pull requests targeting main after verify and live-gate pass on the head and every review thread is resolved.
🟢 🚦 Auto-queueWhen all merge protections are satisfied and these conditions match, this pull request will be queued automatically.
|
Live evidence: Open Pstack
|
✅ Merged into
|
|
[Medium impact] The new dispatch behavior is limited to T3 sessions, with separate changes to the operator verifier. Fix the two T3 verifier failures before merging. FindingsSummaryAdds T3 Code as a third parent harness while keeping Claude Code and Codex responsible for configuration and skill loading.
Acknowledged by Reviews (1) · Last reviewed commit: "chore: release T3 Code as a third harnes..." · Reviewed by Greptile |
🛑 10 blocking findings🔴 Critical · T3 route ignores the writer-sandbox setting for confined writers 🔴 High · Map the T3 transport itself to 🟡 Medium · Startup cancellation leaves T3 running 🟡 Medium · Handle Claude's hashed transcript folders for long paths 🟡 Medium · Escape apostrophes in the T3 plugin path 🟡 Medium · Empty Claude config overrides break transcript collection 🟡 Medium · Resolve T3 routes before rejecting writer assignments 🟡 Medium · Deferred completion is judged from the initial response 🟡 Medium · The server stops before deferred delegation completes 🟡 Medium · T3 server readiness loop never exits if the server dies by signal WalkthroughAdds T3 Code as a third parent harness next to Claude Code and Codex. In a T3 session, pstack still chooses each role's provider, model and effort. A lane whose provider T3 offers and has enabled goes through T3's
Since the last review
Repair promptRead the
Details
First review of this pull request. @unfret review · @unfret status · @unfret help |
There was a problem hiding this comment.
🛑 10 blocking findings
🔴 Critical · T3 route ignores the writer-sandbox setting for confined writers
🔴 High · Map the T3 transport itself to `t3:dispatch`
🟡 Medium · Startup cancellation leaves T3 running
🟡 Medium · Handle Claude's hashed transcript folders for long paths
🟡 Medium · Escape apostrophes in the T3 plugin path
🟡 Medium · Empty Claude config overrides break transcript collection
🟡 Medium · Resolve T3 routes before rejecting writer assignments
🟡 Medium · Deferred completion is judged from the initial response
🟡 Medium · The server stops before deferred delegation completes
🟡 Medium · T3 server readiness loop never exits if the server dies by signal
Check
Why
Eric decided on 2026-11-06 that T3 Code becomes a third harness next to Claude Code and Codex. In a T3 session, T3 owns starting, isolating and tracking agents, and pstack's dispatch rules conflicted with that. This adds a T3 route at the existing dispatch boundary, starting from fikaventures' PR #254 (first commit authored by Aiden Lee). Closes #253.
Summary
Eric's rule, quoted in #253: "any lane for which there is a delegate provider available and configured should go through that delegate provider, otherwise it should go through the external runners."
status: completed,workState: result_available, no pending children, question or approval; non-empty summary. A wait timeout means still running.delegate_taskand the rest as before. Fork's blanket setup bypass deleted.AGENTS.md,UPSTREAM.md,.agents/triage-backlog.md, README and reference name three harnesses.t3transport runs a run-owned disposable T3 server from the operator's installed T3 binary, with the candidate plugin passed through the Claude provider'slaunchArgs, and reads the session transcript. Recipet3:dispatch.Evidence
t3:dispatch, real run against a disposable T3 0.1.7 server, before this rebase (nothing published):poteto-modeloaded from the candidate path; exactly onedelegate_taskwithclaudeAgent/claude-haiku-5-5/{effort: low}; settled per the completion rules; a per-run marker absent from the prompt returned.~/.t3/userdata/settings.jsonunchanged (hash and mtime).launchArgs --plugin-dir, and a child it delegates to loads it too.t3:dispatch,claude:setup,codex:skill-invocation:poteto-mode, with--self-test.Merge Danger
Door: two-way
Blast Radius: T3 sessions
Standalone Claude Code and Codex routing is unchanged outside the
## T3 hostsection. In T3, lanes for providers T3 enables move from the runner todelegate_task.Acceptance criteria
provider-dispatch.mdhas a T3 parent route… A lane whose provider T3 offers and has enabled goes through T3'sdelegate_task; any other lane goes through the existing external runner… A named dropout only when neither route can run it." Done (## T3 host); the runtime's own provider falls back to its native subagent, since the runner refuses same-provider lanes./setup-pstackworks from a T3 session." Text done (steps 1, 5, 7, 9); not run live in T3 (see Not verified).AGENTS.md,UPSTREAM.mdand.agents/triage-backlog.mdname three harnesses…" Done.verify-open-pstackcan run a live lane from a real T3 session, and the live gate for this PR covers T3, Claude Code and Codex." Transport and recipe done; live gate pending.Gate results
On
30ba229:bun run test0,bun run typecheck0,bun run static0,claude plugin validate plugins/pstack0, verifierbun run test0 (205 pass).no-comments: no comments added.Not verified
/setup-pstackrun live from a T3 session.reasoningEffortspelling) and a T3 lane that falls back to the runner: no recipe yet.orchestration_v2_projection_provider_threads,server-runtime.json); a T3 change fails the case loudly.~/.claude/projects/.🤖 Generated with Claude Code