feat(specify): bound the auto-sign panel with an editorial self-correction loop

The spec-skeptic auto-sign panel was one-shot: under /boss with
spec_auto_sign on, any panel BLOCK fell straight back to the human
sign-off pause. Because the panel is adversarial-by-design and rarely
returns a unanimous SOUND, /boss escalated to the user even for defects
the orchestrator could mechanically repair.

Partition the five lenses by what a BLOCK means and run Step 6 as a
bounded loop:

- Editorial (criterion, ambiguity, plan-readiness) — the spec is
  under-articulated; the orchestrator self-corrects in place, re-runs
  Step 4 + Step 5, and re-dispatches all five lenses.
- Design (scope-fork, grounding) — the ground is not settled; escalate,
  never self-correct.

Re-loop limit: <= 2 rounds, the 3rd unresolved editorial BLOCK
escalates (hard-coded N, matching implement-orchestrator's idiom).
INFRA_ERROR and exhausted budget escalate too. Auto-sign still requires
a fresh unanimous SOUND on a green objective gate.

Re-dispatching all five lenses every round is the backstop: an
editorial repair that launders an unsourced design decision is caught
by the re-run scope-fork / grounding jurors and escalates. A criterion
repair is bounded to supplying the worked evidence the criterion already
demands — not re-judging acceptance (architect drift item).

specify/SKILL.md owns the loop; spec-skeptic.md keeps the juror
lens-agnostic; boss/SKILL.md, README.md, docs/profile-schema.md and
docs/pipeline.md are synced to the new semantics.

closes #6
This commit is contained in:
2026-06-11 11:46:08 +02:00
parent cbd460e242
commit a87916e578
6 changed files with 111 additions and 42 deletions
+14 -10
View File
@@ -23,16 +23,17 @@ eye. You arrive fresh, with a single lens and a single instruction:
**try to refute the spec along your lens.** You are not asked "is
this spec roughly fine?" — you are asked "can I find a reason this
spec must NOT be signed without a human looking at it?" If you can,
you `BLOCK`, and the auto-sign collapses back to a human sign-off
pause. Your loyalty is to the refutation, not to the orchestrator's
momentum.
you `BLOCK`, and auto-sign is denied this round — at worst routing the
spec to the human sign-off pause it would have hit anyway. Your loyalty
is to the refutation, not to the orchestrator's momentum.
The panel is **unanimous-or-nothing**: a single `BLOCK` from any one
of the five lenses is enough to deny auto-sign. So you do not need to
catch everything — only your own lens. Lean toward `BLOCK` when in
doubt; the cost of a false `BLOCK` is one human sign-off the user was
going to do anyway, while the cost of a false `SOUND` is an unreviewed
spec ratified into the pipeline.
doubt; the cost of a false `BLOCK` is, at worst, one human sign-off the
user was going to do anyway (and often just a cheap repair-and-re-panel),
while the cost of a false `SOUND` is an unreviewed spec ratified into
the pipeline.
## The lens you are assigned
@@ -133,13 +134,16 @@ it is the rubber-stamp the human sign-off was protecting against.
| Status | Meaning |
|--------|---------|
| `SOUND` | After an honest refutation attempt along this lens, no defect found. This juror permits auto-sign. |
| `BLOCK` | A defect along this lens would make signing without a human unsafe. Auto-sign is denied; specify falls back to a human sign-off pause and shows this report. |
| `BLOCK` | A defect along this lens would make signing without a human unsafe. Auto-sign is denied this round. What `specify` does next depends on your lens class — an editorial defect it may repair and re-panel, a design defect it routes to the human — but that is the orchestrator's call (defined in `../SKILL.md` Step 6), not yours. |
| `INFRA_ERROR` | The dispatch cannot complete (spec missing, no/invalid `lens`, workspace does not build for a `grounding` test-list, etc.). Auto-sign is denied; orchestrator falls back to human sign-off. |
There is no override path here and no "needs context": you are one of
five jurors and the panel is unanimous-or-nothing, so an
honest `BLOCK` simply routes the spec to the human who was going to
review it anyway.
five jurors and the panel is unanimous-or-nothing. Report the defect
you found along your lens, full stop — do not soften a `BLOCK` because
you guess the orchestrator will only repair it, and do not escalate
your own verdict to "this needs a human." How a `BLOCK` is handled is
decided in `../SKILL.md` Step 6 by lens class; your job is the honest
verdict, not its routing.
## Output format