docs(agents): the program plan puts the front door first — a request routes itself to a preset, and the pi series waits behind it - #1019
Conversation
…routes itself to a preset, and the pi series waits behind it Record 0026's slice two — the router — becomes Phase H of the orchestration program (U30 to U32) by the owner's call of 2026-09-14: U26 to U29 wait behind it. U30 is the router behind routing.auto with the offline replay as its gate and a thread-reply pause for write presets; U31 flips the default and rewrites help; U32 routes compound requests to the conductor. Requirements R45 to R49, KD5, KTD14 and KTD15, the phase table, the graph, the verification contract, the definition of done and Appendix B are amended. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
There was a problem hiding this comment.
LGTM: Docs-only plan update adding Phase H (front-door router, U30–U32); internally consistent, all bookkeeping (phases, graph, gates, DoD, appendices) updated.
- [nit] F1 docs/plans/2026-09-10-001-feat-orchestration-program-plan.md:139 — KD5 says Phase H comes 'after' U25 lands, while U30 and the phase table say it runs beside U25 independently
Approve — docs-only plan update adding Phase H (the front-door router, U30–U32) per the owner's 2026-09-14 call. The change is internally consistent: requirements R45–R49, KD5, KTD14/15, the reordered dependency graph (U32→U26), the nine-phase table, the verification contract, Definition of Done, and Appendix B dispositions all agree. specs:coverage and test-guard are clean.
One nit (F1): KD5 says slice two is "the next work after the proxy (U25) lands," while U30's Dependencies and the Phase H row say it's independent of U25 and runs beside it — the graph supports "beside"; a one-word tweak in KD5 would remove the ambiguity.
|
Review round 1: LGTM with one nit (F1, KD5's "after U25 lands" vs the phase table's "beside U25"). Gate is minor, so the nit is skipped this round; the graph and U30's Dependencies are the binding statements and both say the front door runs beside U25. Merging on the clean verdict. |
The orchestration program's plan now puts the "front door" — an @-mention with no
agent:directive picks its own preset and says why on the card — ahead of the remaining pi harness steps, because the owner judged that people need it for the product to be useful to them. Three new units (U30 to U32) design it from record 0026; the pi series' second step (U26) waits behind them.What & why
Record 0026 designed the router as its slice two: a filter after
resolveRun, run only when the agent would otherwise bedefaults.agent, on the deployment's fast model, answering a preset with a one-line reason, cheap, allowed to be wrong and harmless when wrong. The program plan (parent #821) listed that slice as a sibling board item owned elsewhere. On 2026-09-14 the owner reprioritized it over the pi series ("people really need that feature for it to be useful to them so it might make sense over pi as a priority"), so this amendment — in the shape of #957 and #1005 — absorbs it as Phase H with requirements R45 to R49, KD5, KTD14 and KTD15, three units, three board items, and the graph and phase table reordered so U26 waits on U32 as well as U25.routing.auto, off by default, the offline replay (npm run load -- route) as its gate, and a thread-reply pause (go) before any write preset dispatches.helpsays "describe what you want"; the one-word override on the card.The plan is
proposed, so its body may be amended (decisions:checkholds accepted bodies only). Record 0026 is accepted and untouched. Another agent is building U30's first pull request in parallel; both cite record 0026.Tour
1. The owner's decision, as a key decision
KD5 records the reprioritization with the owner's words and the reasoning: the pi series is invisible to a person who mentions the bot, the front door is what that person meets, and the series loses only calendar because U25 and U30 touch disjoint code.
Look for: the claim that U25 is unaffected — the router touches no harness code and the proxy no routing code.
switchboard/docs/plans/2026-09-10-001-feat-orchestration-program-plan.md
Line 139 in 38b2309
2. Five requirements for the front door
R45 to R49 turn record 0026's Routing section into testable statements: when the router runs and when it is skipped (R45), what every routed run shows and how a routed thread stays sticky (R46), the pause for write presets (R47), the compound shape (R48) and the replay's bar (R49: at least 90 percent on
review,codingandresearch; nocodingorshipanswer for a read-only truth).Look for: R45's invariants — the router never emits a profile, never widens a boundary, never bypasses a gate; a directive always wins.
switchboard/docs/plans/2026-09-10-001-feat-orchestration-program-plan.md
Lines 110 to 116 in 38b2309
3. The phase table: G waits on H
Phase H is a new row; Phase G's "waits on" gains U32 for U26. Phase H's own gate is U21 and U22 (both done), so its first unit can start now.
switchboard/docs/plans/2026-09-10-001-feat-orchestration-program-plan.md
Lines 269 to 270 in 38b2309
4. The dependency graph
Five new edges: U21 and U22 into U30, the chain U30 → U31 → U32, and U32 → U26. The existing U25 → U26 edge stays, so U26 has two predecessors.
switchboard/docs/plans/2026-09-10-001-feat-orchestration-program-plan.md
Lines 185 to 189 in 38b2309
5. U30 — the router behind a flag, the replay its gate
The unit names the seam (
resolve()reports which layer named the agent; the stage sits betweenresolveRunandauthorizeAgent, so both gates judge the routed preset), the flag's validation shape (ship.coordinator's rule before #1011 removed it), the prompt (the preset table rendered from the registry, filtered to the requester's grants), the fallbacks, where a route shows (card label,run_note routed,profile.chosenByandroutedReason, the own-label sticky read), the pause for write presets (beforeresolveTarget, so no GitHub call, no memory read, no executor beforego) and the replay harness with its bar.Look for: Approach step 5 — the replay's truth is the record's
agent, because theinputevent's text is directive-stripped and the record carries no directive;generalruns are excluded untilchosenByexists, and the sample sizes are on the table.switchboard/docs/plans/2026-09-10-001-feat-orchestration-program-plan.md
Lines 797 to 819 in 38b2309
6. U31 — the default flips
Gated on a week of production routes scored by a correction signal (a same-thread run within thirty minutes, chosen by a directive naming a different preset, is a misroute). The flip is one default plus a migration note;
help, the About block and the config block are rewritten; the one-word override (agent:<preset>in a thread reply) is shown to be the sticky path that already exists, so the unit adds words and a card pointer, not a path.switchboard/docs/plans/2026-09-10-001-feat-orchestration-program-plan.md
Lines 821 to 837 in 38b2309
7. U32 — compound requests route to the conductor
The router's second answer shape, accepted only when
conductorand every part's preset were offered and the parts fitspawn.maxChildren; each child's text beginsagent:<preset>so a child never routes; one pause at the parent for any write part; twenty hand-written compounds and ten look-alike singles checked into the harness, with the bar stated (18 of 20; at most 1 of 10 split). The history's conductor runs are few and the unit says so.switchboard/docs/plans/2026-09-10-001-feat-orchestration-program-plan.md
Lines 839 to 855 in 38b2309
8. Two technical decisions
KTD14: the switch is
routing.auto(a boolean) besiderouting.model, not the record'sdefaults.models.routerdoubling as the switch — the record's substance is unchanged and the deviation is flagged for the owner. KTD15: the pause is a thread reply because the Slack card has no interactive element and a thread reply is already heard without a mention.switchboard/docs/plans/2026-09-10-001-feat-orchestration-program-plan.md
Lines 161 to 162 in 38b2309
9. U26's dependency line agrees with the table
The unit's own Dependencies bullet now names U32, so the unit, the phase table and the graph say one thing. The board item #1007 carries the same note as a comment.
switchboard/docs/plans/2026-09-10-001-feat-orchestration-program-plan.md
Line 719 in 38b2309
10. The verification contract gains the router's gate
A new row for
npm run load -- routewith its three modes (offline,--production,--compound) and the units it applies to;npm test,docs:checkand the live-receipts rows gain U30 to U32.switchboard/docs/plans/2026-09-10-001-feat-orchestration-program-plan.md
Line 868 in 38b2309
11. Definition of done
One bullet states what "slice two is live" means, including that the offline replay and the week's production table both met the bar before the default flipped.
switchboard/docs/plans/2026-09-10-001-feat-orchestration-program-plan.md
Line 892 in 38b2309
12. Appendix B: the reorder and a new deferral
The pi series' reorder is a row with disposition "decided by the owner 2026-09-14"; a per-channel
routing.autois deferred with its trigger. Two existing rows are updated: tool bundles no longer wait on the router (it routes over presets), and the force-versus-default split of a scope'sagentmoves from "slice two's concern" to deferred with a trigger.switchboard/docs/plans/2026-09-10-001-feat-orchestration-program-plan.md
Lines 947 to 948 in 38b2309
13. Record 0026's open question, tracked here
The record left "which model routes, and is its prompt cached" open until slice two; the plan's open-questions table now carries it with U30's replay as the resolver.
switchboard/docs/plans/2026-09-10-001-feat-orchestration-program-plan.md
Line 254 in 38b2309
14. Remaining changes
docs/plans/2026-09-10-001-feat-orchestration-program-plan.mdL17–L18 and L22–L23 — Goal Capsule: the Objective names the front door and KD5; Authority says 0026 wins on the router; the Execution profile lists Phase H's specs; Tail ownership names the U31 flip as Justin's read.Decisions
routing.auto+routing.model, notdefaults.models.router. Record 0026's rollout line names a model key that doubles as the switch. The plan realizes it as a boolean switch (validated likeship.coordinatorwas: anything buttrue/falsefails by name) beside an optional model, defaulting todefaults.models.general— the fast model the record names. A model-name switch reads a typo as "off" and cannot say "on, with the default model". Substance unchanged; flagged here for the owner (KTD14).go, not a button. The Slack card carries text and a link and the tree has noblock_actionshandler; the live page's Stop/Kill stop, they do not start; a thread reply in a participated thread is heard without a mention. So a routedcodingrun opens its card as pending and waits on the thread's inbox beforeresolveTarget— no GitHub call, no memory read, no executor, no token. A plain reply folds into the request and the wait continues; a stop or ten minutes of silence ends itroute_unconfirmed(KTD15). Chosen over cancelling on any non-goreply, which would kill a run because the user added detail.agent. Theinputevent is directive-stripped and the record has no directive field, so "the requester typed a directive" is not recoverable from today's history. The replay takes the run's preset as truth for every preset butdefaults.agent, excludesgeneralruns until the newchosenByfield saysdirective, and prints sample sizes. The two bar criteria are computable from today's records (identity from the registry)..github/and.depot/trees; any spec or code — this is the plan only. U30's implementation is another agent's pull request.Validation
No code or visual changes; the criteria are the repository's checks on the amended plan plus the board state.
npm run decisions:check→decisions:check ok — 45 record(s) carry a valid status, every superseded_by resolves, accepted bodies unchanged against origin/maindocs:check ok — 10 file(s) match…;specs:check ok — 44 spec(s), 2727 proof reference(s) checkedpublic-hygiene ok — 0 file(s), 0 hit(s);check:project-facts ok — 15 file(s) agree;All matched files use Prettier code style!npm run verifyexit 0 at38b23098— 373 test files, 6812 tests passed, 2 skipped; the CI checks on this pull requestcheck:pr-title ok — docs(agents): …git show 38b23098:<path> | sed -nbefore this body was written🤖 Generated with Claude Code