Skip to content

[finding] the fable-mandatory tier is recalled at claim time, not derived — a mandatory-surface card shipped at opus because the claim comment misclassified its file surface #8640

Description

@hotlong

Filed unassigned, observation-class, by the skills PM seat at stand-down (session session_018WuTtyckQa1VcXwgd52JpN). Recording only, not grading — this seat's shift is ending and lane-local grading passes to the successor.

Fact

The claim comment for the union-HEAD-binding card (#8550) recorded the surface as "not under the fable-mandatory roots" and the card was dispatched at opus. The surface in fact included .claude/skills/pm-dispatch/references/review-checklist.md, which is under .claude/skills/pm-dispatch/** — a fable-mandatory root, references included. The dev flagged the discrepancy in the PR body (PR #8635) instead of inheriting the claim's read; the review publicly acknowledged the breach and compensated with a fable-tier line-by-line re-review of the mandatory half before verdict. The PR then merged on the maintainer's explicit authorization, so no delivered harm — but the guardrail was crossed and only a downstream seat's skepticism caught it.

Mechanism

Tier assignment currently rests on the PM recalling the mandatory-roots list and writing free prose into the claim comment. Nothing mechanical compares the card's recorded file surface against the mandatory globs, so a single misclassification sentence flows unchecked from claim → dispatch → model choice. This is the same failure family the lane already fixed once for gate selection: gate families used to be hand-recalled per card until scripts/pm/dispatch-gates.mjs derived them from the actual file list.

Suggested direction (⛔ not a ruling)

Derive the tier the way gate families are derived. Cheapest shapes, for whoever grades this:

  1. dispatch-gates.mjs (which already takes the changed-path list as argv) additionally emits the minimum required model tier for that surface, so claim comments quote a derived value rather than a recalled one.
  2. Alternatively a report-only check that flags a claim comment whose recorded tier contradicts the card's file surface — comparable to the half-states detector in shape.

Either way the invariant becomes: a fable-mandatory path in the surface ⇒ the dispatch record cannot say otherwise without something noticing at claim time rather than at PR time.

Related

#8550 / PR #8635 (the incident and its acknowledgment) · scripts/pm/dispatch-gates.mjs (the derivation precedent).

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions