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:
+74
-6
@@ -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`,
|
||||
|
||||
Reference in New Issue
Block a user