Repository navigation
Description
RFC: T3 Code as the restaurant: one front of house for every kitchen
Status: draft for owner review · 2026-11-02 · fork-local (kvnloo/t3code). Nothing upstream until each piece goes through the gate.
Pieces: the UX wave (#57, with #48–#65) is the dining-room layer of this RFC, not the whole plan.
Evidence: data/operations/t3code-system-rfc/20261102/: audits/A-upstream.md, B-failures.md, C-reuse.md, C-graph.{md,json} (277 nodes / 542 edges), corpus/ (fork threads plus about 450 upstream threads with full comments). Upstream refs are written as plain numbers.
1. Why
On 2026-10-23 you decided: "let's just use t3code to manage everything — it acts as the restaurant that manages all the harnesses." (I couldn't confirm that Theo said the metaphor first; the X search was out of credits. It is your sentence in the record.) The OSS factory already uses the same frame: a Michelin kitchen where every station has one job.
Since then, most recurring failures happened because several systems each tried to be the restaurant: z0bridge identity, Dash notifications, phone loops, Kerdoios capacity, custom import timers. Each one adds a snapshot another layer has to read, and none of them is the default path. Measured today (B-failures.md):
| Failure | Evidence |
|---|---|
| Agents claim success that isn't real | 523 runs claimed_success with failing tests and no passing ones; 9,044 claimed vs 1,828 verified overall |
| Paid capacity wasted | Claude 32% used with 60 h to reset (pace 0.27) while Codex is throttled at 76%. Kerdoios planning failed on 239/239 turns (kvnloo/z0intelligence#139) |
| K3s doesn't absorb work | MBP cordoned for 6 days by a crashing health probe (IndexError), which fails closed; 0 jobs queued; everything lands on groot |
| Host pressure | 7,515 OOM victims since 10-25 (5,478 on 10-29), 59 of them "protected"; zram 19/23 GB |
| Memory doesn't help | replay eval: current system 0.24, correction-capture arm 0.71. The gap is capture, not search; ctx-import last succeeded 167 h ago |
| T3 itself fails opaquely | 32/405 runs failed, 27 on Hermes ACP, shown as "Internal error" / "Failed to open session" (#58) |
| Sessions invisible | Tern / Hermes-app sessions don't reach T3, and imported ones are empty (#59) |
| Phone lanes | DeepSeek confirmed 3 sends out of 140 attempts |
| Upstream churn | 3 of 38 upstream PRs merged; ~21 closed for unexecuted tests, ~10 for attribution/model policy |
2. The model
| Restaurant | System | Owner |
|---|---|---|
| Dining room / front of house | web, desktop, Android clients | T3 (UX wave #57) |
| Expediter (tickets, timing, "where's table 4?") | orchestration v2: delegate_task + wake on completion, schedule_task, webhooks, Working section, notifications |
T3 |
| Kitchens | harnesses: Hermes, OMP, Claude Code, Codex, opencode, Antigravity, through ACP or native adapters | the harness; T3 only owns the kitchen door (adapter fidelity) |
| Stations | groot, MBP, phones: environments, linked environments, load balancing | T3 places agent threads; .files/K3s owns builds, GPU and phones |
| Purchasing / budget | burn-pace posture, provider choice | policy: a small script; data: T3 Usage + orchestrator_capabilities |
| Pantry / recipe book | memory, corrections, State Packets | z0intelligence, outside T3 |
| Health inspector | upstream gate, HITL, CONTRIBUTING | oss-factory process |
| Dish check before it leaves | verification ("completed ≠ verified") | parent prompt or a scheduled verifier, never the cook's own word |
Rules (from your corrections):
- One owner per concern. No second pairing layer, no second memory owner, no second OOM writer.
- Built-ins first. T3 ships 1,695 commits beyond your 0.1.2. Use them before building anything.
- Fix the generic door, not one kitchen. Theo answers "support harness X" with "use ACP" (upstream 6814, 6786), so every T3 ask is framed as a fix to the ACP path.
- Small. No new planes, daemons or stores. If a layer needs a new service, it's wrong.
3. Layers
Each layer lists what T3 already does, what we change, and what stays outside.
L0. Open the doors: update off 0.1.2
- Do: update to stable v0.1.6 (or nightly). Re-check fix(acp): failed turns hide the real cause behind "Internal error" / "Failed to open … provider session" #58, Agent-started thread stuck in Plan mode on Android while Runtime says Full access #61, Android: native render errors, low-memory exits, and inline WebView taps blanking the feed #62 and Desktop/CLI setup friction found while setting up groot + MBP #64 on it before reporting anything (upstream's own triage playbook §6).
- Gains: 28419 (ACP exit code/signal in the error item), managed policy
providers.allowedDrivers(replaces hand-editing settings to stop Codex/Claude launching, Desktop/CLI setup friction found while setting up groot + MBP #64.6), linked environments (delegate to MBP), guest links,t3 triage, Working section,t3 service protect. - Cost: MCP tool names changed (25423), so agent prompts written for 0.1.2 tool names need a pass.
- Acceptance:
t3 --version≥ 0.1.6 on groot and MBP; Desktop/CLI setup friction found while setting up groot + MBP #64 re-checked.
L1. Kitchen door: ACP fidelity for Hermes (and every ACP agent)
Most of the dining-room P0s are really door problems.
| Problem | Fix | Owner / venue |
|---|---|---|
| 8 MiB edit-approval frame wedges sessions | commit + deploy the bounded preview | kvnloo/hermes-agent#688 (fix written, uncommitted) |
| Outside sessions not listed | promote the draft (already live) | kvnloo/hermes-agent#656 |
| No effort control | Hermes advertises ACP configOptions; T3 already renders them |
Hermes upstream 136084 / 78229 |
| Idle while subagents run (#60) | Hermes emits ACP subagent_update; then one T3 rule: ACP-reported background work keeps a thread Working |
Hermes upstream 137069 → 137380; T3 behavior change needs Ideas approval (extends 24610, Claude-only today) |
| Opaque failures (#58) | after 28419, re-scope to what's left: the credential-timeout and 1009 cases, plus the non-exit "Internal error" path | upstream 17072 |
Inline html_render missing (#57) |
don't write it: verify Julius's open PR 29141 on Android | upstream 29130 / 29141 |
| Handoff kills ACP runs (#63) | add the ACP repro | upstream 22971 |
Acceptance: a live Hermes turn on ≥0.1.6 shows effort control, inline renders, Working while children run, and a readable cause when it fails.
L2. Expediter: continuity without side loops
Your memory canon records that side loops, crons and self-wake promises failed every night. T3 has two primitives that do fire: scheduled tasks (server-side, bound to a thread) and wake on child completion.
- Do: one scheduled expediter tick per active project (e.g. every 30–60 min) with a fixed prompt: read finished child tasks, re-run their gates (or read the outcome ledger's
tests_failed), harvest phone-lane returns, then report or re-dispatch. That is the whole "overnight" mechanism; delete ad-hoc self-wake promises. - Do: every delegation brief ends with a verifier step. A child's
completedis a claim (523 counterexamples). - Owner decision D1: the memory canon says overnight runs go only through Hermes
/goal. Either T3 scheduled ticks become the backstop, or/goalstays and ticks are daytime only. Don't run both. - Acceptance: an overnight window with per-hour tick receipts in the thread and zero
claimed_success-with-red-tests results reported as success.
L3. Stations: put agent threads where the capacity is
- T3 does: load balancing places new agent threads on the MBP when it runs a T3 server (prefer MBP, groot manual-only); linked environments let a groot parent delegate to MBP.
- Fix outside T3 (.files, one change):
fleet-healthmust fail open and notify. A probe bug currently removes the only worker for days. - Owner decision D2, the single memory/OOM owner: T3 launches agents into its own
app-t3code-agents-*slice (caps exist in code but areinfinitylive), andt3 service protectwrites oom_score_adj. That conflicts with fix(agents,k3s): harness survives child OOM; one memory owner; k3s reserves host budgets .files#79 (one memory owner) and fix(oom): never kill agent roots; one guard owns kill order .files#104 (one oom writer). Recommendation: .files stays the owner; configure or neutralize T3's slice caps and don't enableservice protect. - Stays outside: builds and tests (fleet-build / Kueue), GPU, phones. T3 balancing ignores disk and heat and never moves running threads.
L4. Purchasing: route by budget using T3's data
- Do: burn-pace reads Claude/Codex windows from T3 Usage (already ingested) instead of its own probes; launchers read
orchestrator_capabilitiesas the live model catalog (kills the 212unsupported_modelruns); the expediter tick passes the burn-pace posture intodelegate_taskprovider choice (today: prefer Claude, avoid Codex). - Fix the rot, don't add a plane: P0: e2e trace — stop per-turn process spawn, missing Kerdoios interpreter, Groq quota fail-close z0intelligence#139 (missing interpreter) and the unmerged feat(dispatch): route factory jobs to the cheapest good-enough lane with capacity z0intelligence#178–180 stack; either merge them or drop them in favor of this edge.
- Gaps for upstream (Ideas, not code): no Hermes usage reader; OMP usage may already work by pointing a Pi instance at
~/.omp/agent(PI_CODING_AGENT_DIR; format unverified). - Acceptance: Claude pace ≥ 0.8 over a week without manual model picking; zero unsupported-model launches.
L5. Dining room: the UX wave (#57)
Unchanged priorities, now with venues (A-upstream §5) and reuse (C-reuse):
- P0 fix(acp): failed turns hide the real cause behind "Internal error" / "Failed to open … provider session" #58 · Sessions started outside T3 (Tern, Hermes app) don't reach T3, and imported ones are empty #59 · Hermes threads show idle while its background work and subagents are still running #60 · Agent-started thread stuck in Plan mode on Android while Runtime says Full access #61 (fixed upstream by 29275/29267: verify, don't code) · Hermes effort.
- P1 one lab APK for feat(android): show active-thread context-window usage near composer #49 context meter (argue in upstream 14404, 56 votes; copy Dash's "no native snapshot" wording), feat(android): hold composer send to steer without opening queue menu #50 hold-to-steer (Ideas draft ready; cite 24718), fix(android): show Hermes identity instead of ACP fallback in composer #51 icon · inline renders (29141) · Worktree handoff on a Hermes ACP thread kills the run and leaves the continuation and cwd behind #63 · Android: native render errors, low-memory exits, and inline WebView taps blanking the feed #62.
- P2 feat(android): continuous hands-free voice in the active thread #48 continuous voice (Dash
continuous-voice.tsis the reference; cite z0live's floor/barge-in contract) · feat(clients): one-tap nudge chips (Continue / Retry / Status) and PR verbs #54 chips (venue 6839) · feat(clients): "Needs you" queue for approvals, questions and review-ready results #65 Needs-you, reframed as a cross-project view of the Working section (venue 21377) plus Dash's bulk-safe approve/reject-with-reason · Desktop/CLI setup friction found while setting up groot + MBP #64. - P3 OpenUI v2 boards · RFC: contextual next-action button (rules → per-user ranking → provider hints) #55 next-action · Android share target (Dash
dash-sharemodule; venue 25898). - First, before any of it: commit the ~34 uncommitted files in
~/.t3/worktrees/t3code/{feat-needs-you-inbox,feat-android-voice-context-steer}.
L6. Pantry: memory stays out of T3
- T3 gets no memory feature.
- T3 as a source: z0intelligence reads T3 threads via outside-agent MCP (read-only) or
t3 thread show --json. - One capture point: when most sessions run through T3, corrections ("no, I meant…") have one place to be captured. Build the correction-capture arm (0.71 vs 0.24) in z0intelligence (memory: canonical continuity plan, State Packet, and implementation status z0intelligence#22, memory MCP: owner-first ranking (machine text sorts after human turns) z0intelligence#298), triggered from the expediter tick, not a new indexer.
- Fix ctx-import starvation by fixing L3 (memory pressure), not by adding retries.
4. Retire or freeze (no new code anywhere)
| Thing | Replaced by |
|---|---|
| z0bridge identity / pairing layer (kvnloo/z0bridge#2, kvnloo/z0bridge#3) | T3 pairing + T3 Connect (freeze) |
| Dash notification / outbox rebuilds (kvnloo/dash#555, kvnloo/dash#498) | T3 mobile notifications; Dash keeps only S Pen / annotation / voice until T3 has them |
| Custom ACP import timer | upstream auto-import (#59 Ideas) once approved; keep until then |
| Ad-hoc self-wake / cron loops | L2 expediter tick |
| DeepSeek phone lane | paused (3/140); the opencode free models in T3 are the free lane |
Hand-edited settings.json provider toggles |
managed policy |
5. Work order (from the dependency graph)
- Level 0, outside T3 code: update to ≥0.1.6 · commit + deploy fix(acp): edit-approval payload exceeds the 8 MiB gateway frame and wedges the session hermes-agent#688 · promote fix(acp): list and attach native gateway conversations hermes-agent#656 · verify 29141 and 29275 on Android · agree the
subagent_updatetransport with the Hermes PR authors ·fleet-healthfail-open · commit the uncommitted fork worktrees. - Level 1: fix(acp): failed turns hide the real cause behind "Internal error" / "Failed to open … provider session" #58 re-scoped · Sessions started outside T3 (Tern, Hermes app) don't reach T3, and imported ones are empty #59 Ideas posts (27524 / 21080 / 22015) · expediter tick (after D1) · burn-pace reads T3 Usage · Android lab APK (feat(android): show active-thread context-window usage near composer #49–fix(android): show Hermes identity instead of ACP fallback in composer #51).
- Level 2: Hermes threads show idle while its background work and subagents are still running #60 after 137380 · feat(clients): "Needs you" queue for approvals, questions and review-ready results #65 / feat(clients): one-tap nudge chips (Continue / Retry / Status) and PR verbs #54 Ideas · correction capture in z0intelligence.
- Level 3: OpenUI v2 A/B · RFC: contextual next-action button (rules → per-user ranking → provider hints) #55 · share target.
Only #54 and #39 are T3-side code that unblocks anything else. The first wave is almost entirely updates, Hermes fixes and verifying other people's PRs.
6. Working with upstream
- Rules: CONTRIBUTING at origin/main (unchanged since 30654b3). Features need linked maintainer approval; one problem per PR; executed evidence; no line cap; Gemini and Muse Wonder banned. Attribution comes from AGENTS.md and the PR template. TRIAGE.md misstates the Muse rule (fix it).
- People:
- Julius: reliability, mobile, VCS, linked environments; wants a test that is red on main; closes duplicates fast.
- Theo: product and UX; redirects harness asks to ACP; owns Docker sandboxes (15350) and is doing multi-repo projects himself (7041).
- maria: MCP tools and ACP usage; routes product calls to Julius and Theo.
- How to report:
t3 triageflow (check newer release → prefer duplicates →via-triagetemplate), everything throughupstream-gate propose. - Don't build what's in flight: 29141, 29275/29267, 28419, multi-repo projects, Docker sandboxes, LayerFS backends (no decision on 10853/11266 yet; evidence only).
7. Decisions for you
- D1: overnight continuity goes through T3 scheduled ticks or Hermes
/goal, not both. - D2: the single memory/OOM owner. Recommendation: .files, with T3's agent-slice caps neutralized.
- D3: freeze z0bridge identity and the Dash notification rebuild in favor of T3 Connect and mobile notifications.
- D4: pause the DeepSeek phone lane.
8. Non-goals
A memory feature in T3; a capacity plane; a new scheduler; first-class harness requests upstream; porting TSP, sonic pairing or the z0live broker; any upstream PR without linked approval.
Activity
kvnloo commentedon Nov 3, 2026
Dining-room follow-up: running work is invisible on the mobile home list (Working shelf sits below every Done row, collapsed). Five indicator prototypes and a recommendation are in #68. It pairs with the "Needs you" queue (#65).
kvnloo commentedon Nov 3, 2026
L5 addition: #69 (per-host icons on mobile, icon-only host labels).
kvnloo commentedon Nov 3, 2026
New kitchen: UniiChat now runs in T3 through the generic ACP path, with no T3 code.
unii acpis kvnloo/uniichat#10, and the provider instanceuniichat-acp-local(driveracpRegistry,source: local) was proven by a real delegated turn. Its program index, waves and CI are tracked in kvnloo/uniichat#11.kvnloo commentedon Nov 3, 2026
Share/handoff RFC: #72
kvnloo commentedon Nov 4, 2026
Dining room (L5): attention-priority ordering: #74 (draft, branch
exp/attention-priority)The active list can now sort by what needs you instead of by hand or by return time. Each thread gets a tier: 1 needs you, 2 review, 3 in progress, 4 quiet. Within a tier, points come from the kind of need, how long it has waited, how recently you used it, how often you open it, and whether it has an open PR or goal. Scores show on web/desktop rows and project folders, and project folders sort by their most urgent thread. Mobile gets "Order by priority".
It complements the "Needs you" queue (#65) and is a natural input for the next-action RFC (#55): it shares the same pure scorer in
client-runtime/state/threadPriority.ts. Unit tests and typecheck pass. A rendered pass in a real client is still owed.kvnloo commentedon Nov 4, 2026
Attention-priority sorting — recorded walkthrough (#74)
Watch / download the 69-second MP4
The recording shows the actual branch UI: switch Settings → General → Thread order → Priority, see approvals move above failures and unread results, hover scores for explanations, approve a request so it leaves “Needs you”, then enable project folders to see project-level ranking.
Demo data: two scratch projects with a scripted ACP agent generating approvals, a failure, completed turns and ongoing work. No owner conversations, credentials, or real project content. This is a UI interaction recording, not a live-model qualification. Captured at 1280×800 from commit
58019b7754; real-time, captioned, no audio. Encoded video checked via extracted frames. Mobile was not recorded.