feat(boss): opt-in spec auto-sign via adversarial spec-skeptic panel

Add `pipeline.boss.spec_auto_sign` (default off). With it on, a /boss
run may sign a spec in the user's place — but only through a gate built
to never rely on the orchestrator's own confidence: all objective gates
green (precondition, parse, grounding-check PASS with no human override)
AND a unanimous five-lens adversarial spec-skeptic panel (criterion,
grounding, scope-fork, ambiguity, plan-readiness). Any single BLOCK
falls back to the human sign-off pause.

On a clean sign the orchestrator commits the spec ((boss-signed) in the
subject), fires a mandatory informational-with-veto notify, and proceeds
to planner without stopping. A later veto is a forward correction, never
a history rewind.

- new agent: specify/agents/spec-skeptic.md (read-only, one lens per dispatch)
- specify Step 6 + Iron Law: approval may come from the auto-sign gate,
  never from model self-confidence
- boss: third notify category, §"Spec auto-sign", rationalisations, red flags
- profile-schema + template: the opt-in slot
- pipeline.md, agent-template.md, README: the auto-sign path documented
This commit is contained in:
2026-06-09 18:19:28 +02:00
parent 8d375d5622
commit cbd460e242
8 changed files with 395 additions and 15 deletions
+74 -6
View File
@@ -126,8 +126,9 @@ verdict ("test-specifiable → `tdd`" / "design settled → `specify`" /
exhaustive issue body, a long in-context discussion — then the design
is **settled** and `specify` owns it. Dispatch `specify`
autonomously: it is bounded (no interview), produces the spec through
all the gates, and pauses only at its own user-review gate (a
problem-state notify, not a pre-dispatch checkpoint).
all the gates, and — unless the profile enables auto-sign (see below)
— pauses at its own user-review gate (a problem-state notify, not a
pre-dispatch checkpoint).
- Writing the spec would force a choice between two or three plausible
designs with real trade-offs — a genuine design fork — then discovery
must resolve it first, and `brainstorm` owns it. Starting a fresh
@@ -140,9 +141,16 @@ fresh `brainstorm` cycle bounces back — is **not** a ranking of the
skills. It is a consequence of context budget: `tdd` and `specify` are
both bounded (no open Q&A), whereas a fresh `brainstorm` is high-context
discovery the orchestrator cannot compact on its own (see trigger 4).
`specify` dispatched in `/boss` still pauses at its own Step-6
user-review gate to take sign-off — that is a final-sign-off notify, not
a pre-dispatch checkpoint. Do not let the asymmetry harden into a reflex
`specify` dispatched in `/boss` pauses at its own Step-6 user-review
gate to take sign-off — that is a final-sign-off notify, not a
pre-dispatch checkpoint. The one exception is the opt-in auto-sign
slot (`pipeline.boss.spec_auto_sign`): when a project enables it, a
spec that clears all objective gates AND a unanimous adversarial
`spec-skeptic` panel is signed by the orchestrator without pausing,
and the run continues to `planner` — see §"Spec auto-sign" below. The
gate is built so that the orchestrator's own confidence is never what
signs; absent the slot, the human signature stays mandatory. Do not
let the asymmetry harden into a reflex
of routing borderline items to `brainstorm` "to be safe" — that is the
exact bias this reflection exists to break; apply the design-line test
honestly each time. The one principled tilt is two-sided and lives
@@ -245,7 +253,8 @@ question.
## Notifications
Two states call for a notify; nothing else does:
Two states call for a notify; nothing else does — plus a third,
narrow one that exists only when spec auto-sign is enabled:
1. **Done-state.** The autonomous queue is empty — the cycle
closed, the audit ratified, and no further iteration is
@@ -265,6 +274,16 @@ Two states call for a notify; nothing else does:
the next backlog item is a new cycle (no spec yet) and
starting it would force a fresh `brainstorm`.
3. **Auto-sign (only with `pipeline.boss.spec_auto_sign`).** The
orchestrator signed a spec in the user's place and is
continuing the run — see §"Spec auto-sign". This is the one
sanctioned mid-flow notify, and it is sanctioned *because it
carries a decision*: the spec normally needs the user's
signature, so the user retains a veto over what was signed
without them. It is not a progress ping — it is the audit
trail for a gate the user delegated. It does not stop the
loop.
A user-specified stop trigger ("until X is done, then notify")
counts as done-state only if X is truly the last actionable
item in the autonomous queue at that moment. If hitting X
@@ -321,6 +340,46 @@ watch the orchestrator work**:
checkpoint) follow the same editorial rules but carry the
actionable ask, not a wrap-up summary.
## Spec auto-sign
Off by default. A project turns it on with
`pipeline.boss.spec_auto_sign: true`. With it off, a `specify`
dispatch in `/boss` always pauses for the user's signature — the
conservative default, unchanged.
With it on, the orchestrator MAY sign a spec in the user's place,
but only through `specify`'s Step-6 auto-sign gate, which is owned
and defined there. The boss-side contract is just this:
- **The gate is not the orchestrator's judgement.** Signing requires
every objective gate green (precondition, parse, a `grounding-check`
`PASS` that needed no human override) AND a unanimous five-lens
`spec-skeptic` panel returning `SOUND`. A single `BLOCK` — or any
objective gate not green — routes the spec to the human sign-off
pause it would have hit anyway. "The spec looks good to me" is never
a signature; that confidence is the exact signal the gate refuses to
trust.
- **On a clean sign, do not stop.** Commit the spec (the auto-sign
commit subject carries `(boss-signed)` so the act is auditable in
history), fire the auto-sign notify, and continue to `planner` in
the same run. The notify is informational-with-veto, not a pause.
- **The notify must be vetoable.** It follows the same editorial rules
as a done-state notify (English, user-as-reader, no iteration codes
or crate names) with one addition forced by its purpose: it must
name, in the user's terms, *what capability the signed spec covers*,
so the user can decide whether to veto. State plainly that the spec
was signed without them, that the plan is proceeding, and that a
reply vetoes. One example shape: "Signed off the spec for <plain
capability> myself and started the implementation plan — reply to
veto." No internals, but enough identity to act on.
- **A veto is a forward correction.** If the user vetoes after the
fact, the signed spec is already a commit on `main` (forward-only).
Undo it forward — revert the spec commit, discard the downstream
working-tree work with `git checkout`, file the redirection — never
a history rewind. This is the same containment as any other
orchestrator call (§"Direction freedom"): bad calls are contained on
the forward edge, not recovered by rewinding HEAD.
## Common Rationalisations
| Excuse | Reality |
@@ -335,6 +394,9 @@ actionable ask, not a wrap-up summary.
| "Feature work, so route it to `brainstorm` — that's the safe default" | `brainstorm`, `specify`, and `tdd` are co-equal entry paths; none is the default. Routing a settled design to `brainstorm` re-litigates decided choices; routing a test-specifiable item there wastes the test path. Run the Entry-path reflection and pick by the design line. The only tilt toward `brainstorm` is a genuinely unresolved fork — and that is a fork, not a default. |
| "The issue is exhaustive but it's a new cycle, so bounce to the user before `specify`" | `specify` direct-entry is bounded and autonomously dispatchable — it is NOT the high-context `brainstorm` cycle that trigger 4 reserves for the user. Dispatch it; it will pause at its own user-review gate for sign-off. The pre-dispatch bounce is for an *open* design that needs discovery, not for a settled one that needs only production. |
| "`tdd` is opt-in / profile-gated, so it's the secondary skill" | Profile-gating is about whether the path is *available*, not about rank. Once enabled, the choice between the two is decided by fit per item, reflected on each time — not by treating `brainstorm` as primary and `tdd` as the exception. |
| "Auto-sign is on and this spec is clearly good — I'll sign it and skip the panel" | The panel IS how a spec gets signed under auto-sign; there is no signing on judgement. Your sense that it is clearly good is the precise signal the gate is built not to trust. Run the objective gates, dispatch the five jurors, require unanimity. |
| "Four jurors said SOUND, one blocked on something I think is wrong — I'll sign" | Unanimous-or-nothing. You do not overrule a juror; a single `BLOCK` routes the spec to the human sign-off it would have had anyway. Overruling the panel is signing on your own confidence by the back door. |
| "Auto-sign let me continue, so I don't need to notify — it's just progress" | The auto-sign notify is mandatory and carries a decision (the user's veto over a signature made without them). It is the one sanctioned mid-flow notify precisely because it is not progress — it is the audit trail for a delegated gate. |
## Red Flags — STOP
@@ -345,6 +407,8 @@ actionable ask, not a wrap-up summary.
- About to bounce back at every iteration boundary "just to be safe" — that's reactive deference, not direction freedom.
- About to dispatch `brainstorm` on a backlog issue that does not yet have a spec file, without first bouncing back to the user. New cycles never start autonomously.
- About to route feature work to `brainstorm` without running the Entry-path reflection — defaulting to it because it "feels safer" than `specify` or `tdd`, rather than applying the design-line test. The three are co-equal; the choice is reflected on each time. Routing a *settled* design to `brainstorm` (re-litigating decided choices) is as much a failure as skipping discovery on an open one.
- About to sign a spec under auto-sign on confidence — without all objective gates green and a unanimous `spec-skeptic` panel, or by overruling a single juror's `BLOCK`. The gate exists so the orchestrator's confidence never signs.
- About to run the auto-sign path at all when `pipeline.boss.spec_auto_sign` is not enabled, or to skip the mandatory auto-sign notify after signing.
## Cross-references
@@ -361,6 +425,10 @@ actionable ask, not a wrap-up summary.
the profile; CLI command at `git.issue_tracker.list_cmd`.
- **Glossary write-rule:** `../docs/glossary-convention.md`
record-reality discipline for the only autonomous glossary writer.
- **Spec auto-sign gate:** owned by `../specify` Step 6; the
adversarial juror is `../specify/agents/spec-skeptic.md` (dispatched
five times, one per lens). Enabled per project by
`pipeline.boss.spec_auto_sign` — see `../docs/profile-schema.md`.
- **Downstream skills dispatched:** `../brainstorm`,
`../specify` (spec-production core; autonomously dispatchable for a
settled design), `../planner`, `../implement`, `../audit`,