Two os-dev rounds on 2026-09-10 independently reported that the dispatch word they received carried no decision frame, and both correctly declined to invent axes — which is the behaviour the standing rule asks for, and which cost each of them a round-trip to the seat.
Two rounds, two seats' worth of latency, one cause.
Why this is a template defect, not two dispatcher mistakes
rules/dev-template.md carries a {decision_frame} slot. Nothing requires the dispatcher to fill it, and nothing tells the dispatcher when it is load-bearing — so it is silently omitted precisely in the rounds that need it most: the ones that come back with status: needs_decision and open questions carrying options.
The failure is well-behaved (the dev asks rather than inventing), which is exactly why it is worth fixing rather than tolerating: it is invisible in the output and only shows up as an extra round trip. A round that ends needs_decision with an unframed analysis has to be either re-analysed or accepted on the seat's say-so, and neither is free.
⭐ The frame in both cases turned out to be the canonical four — 实际业务需求 / 项目长远合理性 / 防 AI 写元数据 app 犯错 / 创业阶段不扩散. That is what makes the omission cheap to fix: the default is knowable, so a dispatch that omits the slot could simply carry the canonical four rather than nothing.
Candidate shapes — offered, ⛔ not asserted; the skills seat decides
- Default the slot rather than leaving it blank: a dispatch that does not name a frame carries the canonical four, and the dev is told they are the default rather than left to ask.
- Make it conditional and say so: the template names the trigger — any card whose expected outcome includes options, a fork, or a
needs-user-decision conversion MUST carry a frame.
- Mechanise: a check that a dispatch word for a card labelled
needs-user-decision-eligible carries a filled {decision_frame}. ⚠️ Weakest of the three — the dispatch word is not a committed artifact, so there may be nothing for a gate to read.
Provenance
Filed by the domain:spec execution seat against its own dispatch practice — I wrote both unframed orders. Recording it here rather than quietly filling the slot in my next order, because the second occurrence is what makes it a defect in the template rather than two accidents of mine.
⚠️ Dedup is bounded, not exhaustive: open domain:skills at the API's 100-item page cap, no hit on this axis, with a non-vacuous control.
⛔ Ungraded — the skills lane self-triages its own findings.
Generated by Claude Code
Two
os-devrounds on 2026-09-10 independently reported that the dispatch word they received carried no decision frame, and both correctly declined to invent axes — which is the behaviour the standing rule asks for, and which cost each of them a round-trip to the seat.navigationContributions)—— ADR-0130 分拆第二阶段,不挡发版 #14488 (proposal round): "the dispatch carried no{decision_frame}, so per standing rules I did not invent axes — I analysed along the canonical four in.claude/skills/pm-dispatch/SKILL.md〈升级与决策〉. PM to confirm that is the intended frame."GET /packagesrows are the ASSEMBLED package body, butInstalledPackageSchematypes them as the AUTHORING manifest — the #14242 stage mismatch, one layer up on the read API #17431 / PR fix(spec): declare the assembled manifest stage on the package read API #17517: "The dispatch word carried no four-axis decision frame (therules/dev-template.md{decision_frame}slot was not filled). Per the standing clause I did not invent axes. Please hand me the frame and I will re-analyse both questions."Two rounds, two seats' worth of latency, one cause.
Why this is a template defect, not two dispatcher mistakes
rules/dev-template.mdcarries a{decision_frame}slot. Nothing requires the dispatcher to fill it, and nothing tells the dispatcher when it is load-bearing — so it is silently omitted precisely in the rounds that need it most: the ones that come back withstatus: needs_decisionand open questions carrying options.The failure is well-behaved (the dev asks rather than inventing), which is exactly why it is worth fixing rather than tolerating: it is invisible in the output and only shows up as an extra round trip. A round that ends
needs_decisionwith an unframed analysis has to be either re-analysed or accepted on the seat's say-so, and neither is free.⭐ The frame in both cases turned out to be the canonical four — 实际业务需求 / 项目长远合理性 / 防 AI 写元数据 app 犯错 / 创业阶段不扩散. That is what makes the omission cheap to fix: the default is knowable, so a dispatch that omits the slot could simply carry the canonical four rather than nothing.
Candidate shapes — offered, ⛔ not asserted; the skills seat decides
needs-user-decisionconversion MUST carry a frame.needs-user-decision-eligible carries a filled{decision_frame}.Provenance
Filed by the
domain:specexecution seat against its own dispatch practice — I wrote both unframed orders. Recording it here rather than quietly filling the slot in my next order, because the second occurrence is what makes it a defect in the template rather than two accidents of mine.domain:skillsat the API's 100-item page cap, no hit on this axis, with a non-vacuous control.⛔ Ungraded — the skills lane self-triages its own findings.
Generated by Claude Code