Skip to content

RFC: T3 Code as the restaurant — one front of house for every kitchen (UX wave = dining room) #66

Open

Description

@kvnloo

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):

  1. One owner per concern. No second pairing layer, no second memory owner, no second OOM writer.
  2. Built-ins first. T3 ships 1,695 commits beyond your 0.1.2. Use them before building anything.
  3. 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.
  4. 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

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 completed is 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 /goal stays 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-health must 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 are infinity live), and t3 service protect writes 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 enable service 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

L5. Dining room: the UX wave (#57)

Unchanged priorities, now with venues (A-upstream §5) and reuse (C-reuse):

L6. Pantry: memory stays out of T3

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)

  1. 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_update transport with the Hermes PR authors · fleet-health fail-open · commit the uncommitted fork worktrees.
  2. 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).
  3. 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.
  4. 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 triage flow (check newer release → prefer duplicates → via-triage template), everything through upstream-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

  1. kvnloo commented on Nov 3, 2026

    @kvnloo
    OwnerAuthor

    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).

  2. kvnloo commented on Nov 3, 2026

    @kvnloo
    OwnerAuthor

    L5 addition: #69 (per-host icons on mobile, icon-only host labels).

  3. kvnloo commented on Nov 3, 2026

    @kvnloo
    OwnerAuthor

    New kitchen: UniiChat now runs in T3 through the generic ACP path, with no T3 code. unii acp is kvnloo/uniichat#10, and the provider instance uniichat-acp-local (driver acpRegistry, source: local) was proven by a real delegated turn. Its program index, waves and CI are tracked in kvnloo/uniichat#11.

  4. kvnloo commented on Nov 3, 2026

    @kvnloo
    OwnerAuthor

    Share/handoff RFC: #72

  5. kvnloo commented on Nov 4, 2026

    @kvnloo
    OwnerAuthor

    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.

  6. kvnloo commented on Nov 4, 2026

    @kvnloo
    OwnerAuthor

    Attention-priority sorting — recorded walkthrough (#74)

    Watch / download the 69-second MP4

    Attention-priority walkthrough

    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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions