Skip to content

[finding] The os-dev dispatch template's {decision_frame} slot is optional and unconditioned, so it is omitted exactly on the rounds that return needs_decision — two independent rounds hit it the same day #17520

Description

@os-bill

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

  1. 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.
  2. 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.
  3. 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

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions