@gobing-ai/spur 0.3.41 → 0.3.42
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +15 -0
- package/README.md +15 -1
- package/config/templates/AGENTS.md +5 -3
- package/config/workflows/task-pipeline.yaml +103 -12
- package/package.json +15 -12
- package/plugins/README.md +655 -0
- package/plugins/sp/README.md +621 -0
- package/plugins/sp/agents/expert-spur.md +109 -0
- package/plugins/sp/agents/super-coder.md +126 -0
- package/plugins/sp/agents/super-planner.md +283 -0
- package/plugins/sp/agents/super-reviewer.md +154 -0
- package/plugins/sp/commands/dev-arch.md +30 -0
- package/plugins/sp/commands/dev-brainstorm.md +40 -0
- package/plugins/sp/commands/dev-changelog.md +28 -0
- package/plugins/sp/commands/dev-daily.md +29 -0
- package/plugins/sp/commands/dev-debug.md +29 -0
- package/plugins/sp/commands/dev-dogfood.md +33 -0
- package/plugins/sp/commands/dev-featurechange.md +130 -0
- package/plugins/sp/commands/dev-find-conflict.md +51 -0
- package/plugins/sp/commands/dev-find-issue.md +76 -0
- package/plugins/sp/commands/dev-find-next.md +60 -0
- package/plugins/sp/commands/dev-fixall.md +33 -0
- package/plugins/sp/commands/dev-gitmsg.md +28 -0
- package/plugins/sp/commands/dev-gtd.md +97 -0
- package/plugins/sp/commands/dev-handover.md +26 -0
- package/plugins/sp/commands/dev-idea.md +50 -0
- package/plugins/sp/commands/dev-next.md +31 -0
- package/plugins/sp/commands/dev-parallel.md +30 -0
- package/plugins/sp/commands/dev-plan.md +46 -0
- package/plugins/sp/commands/dev-refine.md +48 -0
- package/plugins/sp/commands/dev-refineall.md +65 -0
- package/plugins/sp/commands/dev-refresh.md +32 -0
- package/plugins/sp/commands/dev-reverse.md +32 -0
- package/plugins/sp/commands/dev-review.md +31 -0
- package/plugins/sp/commands/dev-run.md +63 -0
- package/plugins/sp/commands/dev-runall.md +80 -0
- package/plugins/sp/commands/dev-simplify.md +39 -0
- package/plugins/sp/commands/dev-unit.md +29 -0
- package/plugins/sp/commands/dev-verify.md +48 -0
- package/plugins/sp/commands/dev-verifyall.md +72 -0
- package/plugins/sp/commands/dev-wrap.md +30 -0
- package/plugins/sp/commands/dev-wrapall.md +33 -0
- package/plugins/sp/commands/rule-add.md +18 -0
- package/plugins/sp/commands/rule-refine.md +18 -0
- package/plugins/sp/commands/rule-scan.md +18 -0
- package/plugins/sp/commands/spur-init.md +22 -0
- package/plugins/sp/commands/workflow-add.md +18 -0
- package/plugins/sp/commands/workflow-refine.md +18 -0
- package/plugins/sp/hooks/agent-hint.ts +60 -0
- package/plugins/sp/hooks/careful-guard.ts +147 -0
- package/plugins/sp/hooks/context-post-tool.ts +325 -0
- package/plugins/sp/hooks/context-session-start.ts +182 -0
- package/plugins/sp/hooks/context-session-stop.ts +95 -0
- package/plugins/sp/hooks/hooks.json +51 -0
- package/plugins/sp/hooks/pi/guard-extension.ts +341 -0
- package/plugins/sp/hooks/task-write-guard.ts +84 -0
- package/plugins/sp/plugin.json +8 -0
- package/plugins/sp/scripts/batch-preflight.ts +204 -0
- package/plugins/sp/scripts/daily-summary/daily-summary.ts +606 -0
- package/plugins/sp/scripts/daily-summary/logger.ts +28 -0
- package/plugins/sp/scripts/dogfood-testing/detect-pipeline-driving.ts +363 -0
- package/plugins/sp/scripts/dogfood-testing/validate-report.ts +168 -0
- package/plugins/sp/scripts/feature-sync-bounded.ts +451 -0
- package/plugins/sp/scripts/stage-registry-adapter.ts +1341 -0
- package/plugins/sp/scripts/task-size-precheck.ts +202 -0
- package/plugins/sp/scripts/validate-commands.ts +651 -0
- package/plugins/sp/scripts/validate-flag-contracts.ts +875 -0
- package/plugins/sp/skills/brainstorm/SKILL.md +361 -0
- package/plugins/sp/skills/brainstorm/agents/openai.yaml +14 -0
- package/plugins/sp/skills/brainstorm/examples/ideation-example.md +209 -0
- package/plugins/sp/skills/brainstorm/metadata.openclaw +7 -0
- package/plugins/sp/skills/brainstorm/references/grilling-interview.md +68 -0
- package/plugins/sp/skills/brainstorm/references/workflows.md +255 -0
- package/plugins/sp/skills/branch-workflow/SKILL.md +109 -0
- package/plugins/sp/skills/branch-workflow/references/branch-lifecycle.md +69 -0
- package/plugins/sp/skills/branch-workflow/references/worktree-patterns.md +100 -0
- package/plugins/sp/skills/code-implementation/SKILL.md +176 -0
- package/plugins/sp/skills/code-implementation/references/debugging.md +64 -0
- package/plugins/sp/skills/code-implementation/references/implementation-patterns.md +113 -0
- package/plugins/sp/skills/code-improvement/SKILL.md +231 -0
- package/plugins/sp/skills/code-improvement/references/deepening-signals.md +205 -0
- package/plugins/sp/skills/code-review/SKILL.md +112 -0
- package/plugins/sp/skills/code-review/references/receiving-code-review.md +70 -0
- package/plugins/sp/skills/code-review/references/review-lenses.md +117 -0
- package/plugins/sp/skills/code-review/references/self-review-checklist.md +53 -0
- package/plugins/sp/skills/code-review/references/verification-before-completion.md +68 -0
- package/plugins/sp/skills/code-simplification/SKILL.md +225 -0
- package/plugins/sp/skills/code-testing/SKILL.md +108 -0
- package/plugins/sp/skills/code-testing/references/stacks/bun-ts.md +165 -0
- package/plugins/sp/skills/code-testing/references/stacks/go.md +88 -0
- package/plugins/sp/skills/code-testing/references/stacks/python.md +117 -0
- package/plugins/sp/skills/code-testing/references/test-loop-breaker.md +37 -0
- package/plugins/sp/skills/code-testing/references/test-output-discipline.md +52 -0
- package/plugins/sp/skills/code-testing/references/unit-testing.md +212 -0
- package/plugins/sp/skills/code-verification/SKILL.md +535 -0
- package/plugins/sp/skills/code-verification/references/code-improvement.md +39 -0
- package/plugins/sp/skills/code-verification/references/secu-review.md +94 -0
- package/plugins/sp/skills/code-verification/references/verdict-schema.md +141 -0
- package/plugins/sp/skills/conflict-finding/SKILL.md +254 -0
- package/plugins/sp/skills/conflict-finding/references/authority-resolution.md +258 -0
- package/plugins/sp/skills/conflict-finding/references/comparison-protocol.md +277 -0
- package/plugins/sp/skills/conflict-finding/references/finding-contract.md +346 -0
- package/plugins/sp/skills/conflict-finding/references/remediation-routing.md +276 -0
- package/plugins/sp/skills/daily-summary/SKILL.md +171 -0
- package/plugins/sp/skills/daily-summary/agents/openai.yaml +13 -0
- package/plugins/sp/skills/doc-evolve/SKILL.md +175 -0
- package/plugins/sp/skills/doc-evolve/references/operations.md +93 -0
- package/plugins/sp/skills/dogfood-testing/SKILL.md +608 -0
- package/plugins/sp/skills/dogfood-testing/references/monitor-ledger.md +211 -0
- package/plugins/sp/skills/dogfood-testing/references/report-template.md +351 -0
- package/plugins/sp/skills/doubt-driven-development/SKILL.md +136 -0
- package/plugins/sp/skills/functional-review/SKILL.md +364 -0
- package/plugins/sp/skills/functional-review/references/verdict-schema.md +133 -0
- package/plugins/sp/skills/indexed-context/SKILL.md +164 -0
- package/plugins/sp/skills/issue-finding/SKILL.md +424 -0
- package/plugins/sp/skills/issue-finding/agents/openai.yaml +15 -0
- package/plugins/sp/skills/issue-finding/examples/expected-findings.json +27 -0
- package/plugins/sp/skills/issue-finding/examples/session-test-loop.jsonl +23 -0
- package/plugins/sp/skills/issue-finding/references/session-formats.md +121 -0
- package/plugins/sp/skills/next-feature/SKILL.md +125 -0
- package/plugins/sp/skills/next-feature/references/handoff-routing.md +92 -0
- package/plugins/sp/skills/next-feature/references/proposal-contract.md +49 -0
- package/plugins/sp/skills/next-feature/references/ranking-rubric.md +52 -0
- package/plugins/sp/skills/next-feature/references/signal-derivation.md +67 -0
- package/plugins/sp/skills/next-router/SKILL.md +181 -0
- package/plugins/sp/skills/next-router/references/messages.md +90 -0
- package/plugins/sp/skills/next-router/references/routing-table.md +216 -0
- package/plugins/sp/skills/parallel-execution/SKILL.md +148 -0
- package/plugins/sp/skills/parallel-execution/references/dispatch-surface.md +100 -0
- package/plugins/sp/skills/parallel-execution/references/fan-out-patterns.md +101 -0
- package/plugins/sp/skills/parallel-execution/references/result-synthesis.md +94 -0
- package/plugins/sp/skills/reverse-engineering/SKILL.md +375 -0
- package/plugins/sp/skills/reverse-engineering/agents/openai.yaml +18 -0
- package/plugins/sp/skills/source-driven-development/SKILL.md +124 -0
- package/plugins/sp/skills/spec-decomposition/SKILL.md +117 -0
- package/plugins/sp/skills/spec-decomposition/references/decomposition.md +539 -0
- package/plugins/sp/skills/spur-cli/SKILL.md +133 -0
- package/plugins/sp/skills/spur-cli/references/agent.md +179 -0
- package/plugins/sp/skills/spur-cli/references/features/acceptance-criteria.md +82 -0
- package/plugins/sp/skills/spur-cli/references/features/hierarchy-mece.md +177 -0
- package/plugins/sp/skills/spur-cli/references/features/roadmap-priority.md +84 -0
- package/plugins/sp/skills/spur-cli/references/features/verbs.md +122 -0
- package/plugins/sp/skills/spur-cli/references/features.md +234 -0
- package/plugins/sp/skills/spur-cli/references/init.md +119 -0
- package/plugins/sp/skills/spur-cli/references/message.md +98 -0
- package/plugins/sp/skills/spur-cli/references/rules/authoring-rules.md +212 -0
- package/plugins/sp/skills/spur-cli/references/rules/fine-tuning.md +148 -0
- package/plugins/sp/skills/spur-cli/references/rules/operations.md +228 -0
- package/plugins/sp/skills/spur-cli/references/rules/validation-and-extension.md +129 -0
- package/plugins/sp/skills/spur-cli/references/rules.md +209 -0
- package/plugins/sp/skills/spur-cli/references/serve.md +58 -0
- package/plugins/sp/skills/spur-cli/references/tasks/l3-guard-cheatsheet.md +98 -0
- package/plugins/sp/skills/spur-cli/references/tasks/section-editing.md +95 -0
- package/plugins/sp/skills/spur-cli/references/tasks/verbs.md +361 -0
- package/plugins/sp/skills/spur-cli/references/tasks.md +278 -0
- package/plugins/sp/skills/spur-cli/references/team.md +133 -0
- package/plugins/sp/skills/spur-cli/references/workflows/authoring-workflows.md +226 -0
- package/plugins/sp/skills/spur-cli/references/workflows/operations.md +211 -0
- package/plugins/sp/skills/spur-cli/references/workflows/validation-and-extension.md +129 -0
- package/plugins/sp/skills/spur-cli/references/workflows.md +355 -0
- package/plugins/sp/skills/spur-dev/SKILL.md +224 -0
- package/plugins/sp/skills/spur-dev/references/ac-style-guide.md +196 -0
- package/plugins/sp/skills/spur-dev/references/cross-cutting.md +664 -0
- package/plugins/sp/skills/spur-dev/references/decision-brief.md +80 -0
- package/plugins/sp/skills/spur-dev/references/dev-operations.md +546 -0
- package/plugins/sp/skills/spur-dev/references/done-housekeeping.md +164 -0
- package/plugins/sp/skills/spur-dev/references/execution-batch.md +727 -0
- package/plugins/sp/skills/spur-dev/references/execution-workflow.md +350 -0
- package/plugins/sp/skills/spur-dev/references/feature-link-helper.md +191 -0
- package/plugins/sp/skills/spur-dev/references/flag-glossary.md +417 -0
- package/plugins/sp/skills/spur-dev/references/gate-checklists.md +171 -0
- package/plugins/sp/skills/spur-dev/references/glossary.md +95 -0
- package/plugins/sp/skills/spur-dev/references/idea-evaluation.md +80 -0
- package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +88 -0
- package/plugins/sp/skills/spur-dev/references/planning-workflow.md +302 -0
- package/plugins/sp/skills/spur-dev/references/product-planning.md +206 -0
- package/plugins/sp/skills/spur-dev/references/section-batching.md +24 -0
- package/plugins/sp/skills/sys-architecture/SKILL.md +155 -0
- package/plugins/sp/skills/sys-architecture/references/decision-method.md +137 -0
- package/plugins/sp/skills/sys-architecture/references/upkeep-survey.md +75 -0
- package/plugins/sp/skills/sys-debugging/SKILL.md +228 -0
- package/plugins/sp/skills/sys-debugging/references/debugging-protocol.md +62 -0
- package/plugins/sp/skills/test-driven-development/SKILL.md +248 -0
- package/plugins/sp/skills/wayfinder/SKILL.md +292 -0
- package/spur.js +6093 -5180
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: doubt-driven-development
|
|
3
|
+
description: "In-flight adversarial review of a non-trivial decision before you commit it: extract the artifact + contract, hand them (not your reasoning) to a fresh-context skeptic, reconcile findings, stop at 3 cycles. Triggers: \"doubt this\", \"stress-test this decision\", \"adversarial check before I commit\"."
|
|
4
|
+
license: Apache-2.0
|
|
5
|
+
metadata:
|
|
6
|
+
author: spur
|
|
7
|
+
version: "1.0"
|
|
8
|
+
platforms: "claude-code,codex,openclaw,opencode,antigravity"
|
|
9
|
+
category: execution
|
|
10
|
+
interactions:
|
|
11
|
+
- technique
|
|
12
|
+
operations:
|
|
13
|
+
- doubt
|
|
14
|
+
openclaw:
|
|
15
|
+
emoji: "🕵️"
|
|
16
|
+
see_also:
|
|
17
|
+
- sp:parallel-execution
|
|
18
|
+
- sp:code-verification
|
|
19
|
+
- sp:source-driven-development
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
# doubt-driven-development — the in-flight adversarial-review competency
|
|
23
|
+
|
|
24
|
+
Catch a wrong decision **while you can still change it cheaply** — before the code is written, the
|
|
25
|
+
migration is run, or the design is locked. You state a claim, strip it to its artifact and its
|
|
26
|
+
contract, and hand *only those* to a fresh-context skeptic whose job is to find where the artifact
|
|
27
|
+
violates the contract. The skeptic never sees your reasoning, so it cannot be talked into agreeing.
|
|
28
|
+
|
|
29
|
+
This is a **technique** skill: it stress-tests a decision mid-flight. It is **not** the post-hoc
|
|
30
|
+
gate — `sp:code-verification` verifies finished work against requirements, and `sp:code-review`
|
|
31
|
+
reviews a completed diff. Doubt runs *earlier and cheaper*: on a plan, an interface, a schema, a
|
|
32
|
+
tricky algorithm, before you invest in building it.
|
|
33
|
+
|
|
34
|
+
## When to use
|
|
35
|
+
|
|
36
|
+
- A non-trivial decision is about to be committed: an API/interface shape, a schema, a state
|
|
37
|
+
machine, a concurrency approach, a migration plan, a security boundary.
|
|
38
|
+
- You feel the pull of "this is probably right" on something whose cost-of-wrong is high.
|
|
39
|
+
- Review flagged a design concern and you want an independent adversary before reworking.
|
|
40
|
+
|
|
41
|
+
Do **not** use this skill for:
|
|
42
|
+
|
|
43
|
+
- **Trivial or reversible choices** — a variable name, a local refactor. Doubt has a cost; spend it
|
|
44
|
+
where being wrong is expensive.
|
|
45
|
+
- **Finished-work verification** — that is `sp:code-verification` (requirements) / `sp:code-review`
|
|
46
|
+
(diff). Doubt is pre-commit, not the completion gate.
|
|
47
|
+
- **Fact-checking an external claim** — that is `sp:source-driven-development` (verify against
|
|
48
|
+
primary sources). Doubt tests *your* artifact against *its* contract, not the world.
|
|
49
|
+
|
|
50
|
+
## The five-step loop
|
|
51
|
+
|
|
52
|
+
### 1. CLAIM — state what you are about to commit
|
|
53
|
+
|
|
54
|
+
One sentence: the decision and why you believe it is right. This is *your* view — it does **not**
|
|
55
|
+
travel to the skeptic. Writing it down makes the next step honest.
|
|
56
|
+
|
|
57
|
+
### 2. EXTRACT — artifact + contract, strip the reasoning
|
|
58
|
+
|
|
59
|
+
Reduce the claim to two things the skeptic can check independently:
|
|
60
|
+
|
|
61
|
+
- **Artifact** — the concrete thing under judgment: the interface signature, the schema DDL, the
|
|
62
|
+
pseudocode, the plan steps. No commentary.
|
|
63
|
+
- **Contract** — the invariants it must satisfy: the requirements, the edge cases, the performance
|
|
64
|
+
or safety bounds, the AC it will be verified against later.
|
|
65
|
+
|
|
66
|
+
**Strip your reasoning.** The skeptic must not receive *why* you think it works — only *what* it is
|
|
67
|
+
and *what it must do*. Reasoning is what smuggles your blind spot into the reviewer.
|
|
68
|
+
|
|
69
|
+
### 3. DOUBT — hand artifact + contract (NOT the claim) to a fresh-context skeptic
|
|
70
|
+
|
|
71
|
+
Dispatch an adversarial reviewer whose sole instruction is: *find where this artifact violates this
|
|
72
|
+
contract; assume it is wrong until proven otherwise.* Pass **only** the artifact and the contract.
|
|
73
|
+
Use `sp:parallel-execution` (the adversarial-verification-panel pattern) or a single
|
|
74
|
+
`spur agent run` with a fresh context — the point is a reviewer that shares none of your framing.
|
|
75
|
+
|
|
76
|
+
**Never pre-judge the reviewer.** No "don't worry about X", no "this part is fine", no pre-rated
|
|
77
|
+
severity. A steered skeptic is theater. (See `sp:parallel-execution` — never pre-judge the reviewer.)
|
|
78
|
+
|
|
79
|
+
Optional: offer a **cross-model** skeptic (a different model than the author) when the decision is
|
|
80
|
+
high-stakes — a different model has different blind spots.
|
|
81
|
+
|
|
82
|
+
### 4. RECONCILE — classify every finding
|
|
83
|
+
|
|
84
|
+
For each thing the skeptic raised, classify it — do not argue with it reflexively:
|
|
85
|
+
|
|
86
|
+
| Class | Meaning | Action |
|
|
87
|
+
|---|---|---|
|
|
88
|
+
| **Contract-misread** | The skeptic misunderstood an invariant | Tighten the contract wording; the artifact stands |
|
|
89
|
+
| **Actionable** | A real violation of the contract | Fix the artifact before committing |
|
|
90
|
+
| **Trade-off** | A cost you knowingly accept | Record the decision + why; do not silently drop it |
|
|
91
|
+
| **Noise** | Out of scope / not tied to the contract | Discard, with a one-line reason |
|
|
92
|
+
|
|
93
|
+
A finding you cannot classify is **actionable** until proven otherwise — the benefit of the doubt
|
|
94
|
+
goes to the doubt.
|
|
95
|
+
|
|
96
|
+
### 5. STOP — bounded at 3 cycles
|
|
97
|
+
|
|
98
|
+
If RECONCILE produced fixes, you may re-run DOUBT on the changed artifact — but **at most 3 cycles
|
|
99
|
+
total**. Beyond three, the loop is no longer finding defects; it is manufacturing them. Stop, record
|
|
100
|
+
the residual trade-offs, and commit. Endless doubting is its own failure mode (see Red Flags).
|
|
101
|
+
|
|
102
|
+
## Common Rationalizations
|
|
103
|
+
|
|
104
|
+
| Rationalization | Reality |
|
|
105
|
+
|---|---|
|
|
106
|
+
| "I already reviewed it myself — a second pass is redundant." | Self-review shares your blind spot. A fresh-context skeptic exists precisely to see what you cannot. |
|
|
107
|
+
| "I'll give the reviewer my reasoning so it understands." | Your reasoning is the vector for your blind spot. Pass artifact + contract only; reasoning steers the skeptic to agree. |
|
|
108
|
+
| "The skeptic is being pedantic — I'll just overrule it." | Reflexive overrule defeats the loop. Classify the finding (misread / actionable / trade-off / noise); overrule only with a recorded reason. |
|
|
109
|
+
| "This decision is basically right, doubt is overkill." | "Basically right" on a high-cost-of-wrong decision is exactly what doubt is for. Cheap now beats a rewrite later. |
|
|
110
|
+
| "One more cycle and it'll be perfect." | Past 3 cycles you are inventing problems, not finding them. Record residual trade-offs and commit. |
|
|
111
|
+
|
|
112
|
+
## Red Flags
|
|
113
|
+
|
|
114
|
+
- Passing your **reasoning** (not just artifact + contract) to the skeptic — the review is now contaminated.
|
|
115
|
+
- Pre-judging the reviewer ("this part is fine", pre-rated severity, "don't flag X").
|
|
116
|
+
- Overruling every finding without classifying it — the loop became a rubber stamp for your original claim.
|
|
117
|
+
- **Doubt theater**: running the loop but having already decided to ship unchanged regardless of findings.
|
|
118
|
+
- Exceeding 3 cycles — endless doubting that manufactures defects instead of finding them.
|
|
119
|
+
- Using doubt as a substitute for the post-hoc gates (`sp:code-verification` / `sp:code-review`) rather than as the earlier, cheaper pass.
|
|
120
|
+
|
|
121
|
+
## Verification
|
|
122
|
+
|
|
123
|
+
Before you commit the decision, confirm — with evidence, not assertion:
|
|
124
|
+
|
|
125
|
+
- [ ] The skeptic received the **artifact + contract only**; your reasoning was withheld (state it).
|
|
126
|
+
- [ ] Every finding is classified (contract-misread / actionable / trade-off / noise) with a one-line disposition.
|
|
127
|
+
- [ ] Every **actionable** finding is fixed in the artifact, or explicitly deferred with a recorded reason.
|
|
128
|
+
- [ ] Every **trade-off** is recorded (not silently dropped) — it survives into the task's design/decision notes.
|
|
129
|
+
- [ ] The loop stopped at ≤ 3 cycles; residual trade-offs are named.
|
|
130
|
+
- [ ] This was a *pre-commit* pass — the post-hoc gate (`sp:code-verification` / `sp:code-review`) still runs on the finished work.
|
|
131
|
+
|
|
132
|
+
## See also
|
|
133
|
+
|
|
134
|
+
- **`sp:parallel-execution`** — the adversarial-verification-panel / fresh-context subagent mechanics doubt dispatches through.
|
|
135
|
+
- **`sp:code-verification`** — the post-hoc requirements/AC gate; doubt is the earlier, cheaper, pre-commit counterpart.
|
|
136
|
+
- **`sp:source-driven-development`** — when the doubt is about an external fact (an API contract), verify it against primary sources there.
|
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: functional-review
|
|
3
|
+
description: "Requirements traceability assessment: verify implementation satisfies ALL task requirements. Phase 8b gate for the sp pipeline. Produces per-requirement verdicts with file:line evidence. Triggers: \"functional review\", \"traceability check\", \"verify requirements\", \"did we build what was asked\", \"requirements completeness\"."
|
|
4
|
+
license: Apache-2.0
|
|
5
|
+
metadata:
|
|
6
|
+
author: spur
|
|
7
|
+
version: "1.0"
|
|
8
|
+
platforms: "claude-code,codex,openclaw,opencode,antigravity"
|
|
9
|
+
interactions:
|
|
10
|
+
- reviewer
|
|
11
|
+
- pipeline
|
|
12
|
+
modes:
|
|
13
|
+
- verify
|
|
14
|
+
verdicts:
|
|
15
|
+
- PASS
|
|
16
|
+
- PARTIAL
|
|
17
|
+
- FAIL
|
|
18
|
+
openclaw:
|
|
19
|
+
emoji: "📋"
|
|
20
|
+
see_also:
|
|
21
|
+
- sp:code-verification
|
|
22
|
+
- sp:code-improvement
|
|
23
|
+
- sp:spur-dev
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
# Spur Functional Review
|
|
27
|
+
|
|
28
|
+
The **requirements traceability** counterweight to `sp:code-verification`'s SECUA review. Where
|
|
29
|
+
code-verification asks "is the code correct and secure?", functional-review asks "did we build what
|
|
30
|
+
the task actually asked for?" — mapping every `R{n}` requirement to concrete implementation evidence
|
|
31
|
+
and refusing to certify gaps.
|
|
32
|
+
|
|
33
|
+
## When to Use
|
|
34
|
+
|
|
35
|
+
**Trigger phrases:** "functional review", "traceability check", "verify requirements",
|
|
36
|
+
"requirements completeness", "did we build what was asked", "check the requirements".
|
|
37
|
+
|
|
38
|
+
Load this skill when:
|
|
39
|
+
|
|
40
|
+
- Verifying implementation against the task's `## Requirements` section (per-requirement traceability).
|
|
41
|
+
- Producing an audit trail that ties each requirement to `file:line` evidence.
|
|
42
|
+
- Running the requirements-completeness dimension of a multi-dimensional review (`/sp:dev-review`).
|
|
43
|
+
- Determining whether functional completeness is sufficient for `done`.
|
|
44
|
+
|
|
45
|
+
Do **not** use this skill for:
|
|
46
|
+
|
|
47
|
+
- SECUA code-quality review (use `sp:code-verification` review mode).
|
|
48
|
+
- Architecture / deepening review (use `sp:code-improvement`).
|
|
49
|
+
- Running tests or measuring coverage (use `sp:code-testing`).
|
|
50
|
+
- Driving the pipeline (use `sp:spur-dev`).
|
|
51
|
+
|
|
52
|
+
## Key Distinctions
|
|
53
|
+
|
|
54
|
+
| Skill | Question it answers |
|
|
55
|
+
| ------- | --------------------- |
|
|
56
|
+
| **`sp:functional-review`** | Are all task requirements implemented? (requirements completeness) |
|
|
57
|
+
| **`sp:code-verification`** | Is the code correct, secure, efficient, usable? (SECUA quality) |
|
|
58
|
+
| **`sp:code-improvement`** | Is the architecture deep / testable? (structural depth) |
|
|
59
|
+
|
|
60
|
+
A complete `/sp:dev-review` runs all three: functional (this skill) + SECUA + architecture.
|
|
61
|
+
|
|
62
|
+
## Cross-cutting rules (inherited from sp:spur-dev)
|
|
63
|
+
|
|
64
|
+
The CLI-gated section-write contract (every mutation via `spur task update --section --from-file`,
|
|
65
|
+
never a legacy `tasks` CLI) is the SSOT in
|
|
66
|
+
[spur-dev/cross-cutting.md](../spur-dev/references/cross-cutting.md). The universal honesty gate —
|
|
67
|
+
**no "done / passing / fixed / works" claim without fresh, pasted verification evidence run this
|
|
68
|
+
turn** — lives in that same file:
|
|
69
|
+
[Verification Before Completion](../spur-dev/references/cross-cutting.md#verification-before-completion).
|
|
70
|
+
A PASS verdict is a completion claim; it obeys the gate.
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## Two-Track Assessment
|
|
75
|
+
|
|
76
|
+
### Track A — BDD-Assisted (if `--bdd-report` provided)
|
|
77
|
+
|
|
78
|
+
When a BDD execution report exists (from `sp:code-testing --bdd` or equivalent), map each
|
|
79
|
+
requirement to one or more Gherkin scenarios by requirement text, identifier, or explicit
|
|
80
|
+
traceability markers:
|
|
81
|
+
|
|
82
|
+
| Scenario status | Requirement status |
|
|
83
|
+
| ----------------- | -------------------- |
|
|
84
|
+
| All covering scenarios `passed` | `MET` |
|
|
85
|
+
| Any covering scenario `failed` or `skipped` | `PARTIAL` |
|
|
86
|
+
| No covering scenarios found | fall through to Track B |
|
|
87
|
+
|
|
88
|
+
Only requirements that remain uncovered after BDD mapping fall through to Track B — the BDD report
|
|
89
|
+
is the stronger (deterministic) evidence and takes precedence.
|
|
90
|
+
|
|
91
|
+
**Expected BDD report schema** (JSON):
|
|
92
|
+
|
|
93
|
+
```typescript
|
|
94
|
+
interface BddExecutionReport {
|
|
95
|
+
total: number;
|
|
96
|
+
passed: number;
|
|
97
|
+
failed: number;
|
|
98
|
+
skipped: number;
|
|
99
|
+
duration_ms: number;
|
|
100
|
+
scenarios: Array<{
|
|
101
|
+
name: string; // maps to requirement text or AC scenario title
|
|
102
|
+
feature: string;
|
|
103
|
+
status: 'passed' | 'failed' | 'skipped';
|
|
104
|
+
steps: Array<{ step: string; checker: string; status: string }>;
|
|
105
|
+
}>;
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### Track B — LLM Assessment (direct source evidence)
|
|
110
|
+
|
|
111
|
+
For each requirement not covered by BDD, gather concrete source evidence and assess:
|
|
112
|
+
|
|
113
|
+
1. Read the changed files (the task's diff scope — see Step 3 of `sp:code-verification`).
|
|
114
|
+
2. Search for implementation evidence: function definitions, type declarations, test cases,
|
|
115
|
+
config keys, CLI surface.
|
|
116
|
+
3. Assign a per-requirement status using the Evidence Quality Standard below.
|
|
117
|
+
|
|
118
|
+
```typescript
|
|
119
|
+
// For each uncovered requirement
|
|
120
|
+
const evidence = gatherEvidence(req, changedFiles);
|
|
121
|
+
const assessment = llmAssess(req, evidence);
|
|
122
|
+
verdict[req.id] = { status: assessment.status, evidence: assessment.evidence };
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## Per-Requirement Status
|
|
128
|
+
|
|
129
|
+
| Status | Condition |
|
|
130
|
+
| -------- | ----------- |
|
|
131
|
+
| **MET** | Concrete evidence (code + test, or code + static ref) for the requirement exists in scope |
|
|
132
|
+
| **PARTIAL** | Evidence for part of the requirement only — a material sub-condition is missing or only inferred |
|
|
133
|
+
| **UNMET** | No implementation evidence found in scope |
|
|
134
|
+
|
|
135
|
+
**Zero-requirements case:** if the task has 0 numbered requirements, return `verdict = PASS` with the
|
|
136
|
+
note "No requirements to verify" — this is a documentation-only or config-only task, not a failure.
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## Evidence Quality Standard
|
|
141
|
+
|
|
142
|
+
All evidence MUST be specific. Vague evidence is rejected and the requirement is downgraded to
|
|
143
|
+
`UNMET` or `PARTIAL`.
|
|
144
|
+
|
|
145
|
+
### SPECIFIC Evidence (required)
|
|
146
|
+
|
|
147
|
+
| Type | Example |
|
|
148
|
+
| ------ | --------- |
|
|
149
|
+
| File path + line | `src/api/users.ts:42` |
|
|
150
|
+
| Function / method name | `createUser()` |
|
|
151
|
+
| Class / type name | `UserController` |
|
|
152
|
+
| Test case | `tests/users.test.ts::createUser validates email` |
|
|
153
|
+
| Command + exit status | `bun test apps/cli --reporter=dots` → exit 0, 2499 pass |
|
|
154
|
+
| Config / schema key | `package.json#bin.spur` |
|
|
155
|
+
|
|
156
|
+
### VAGUE Evidence (rejected)
|
|
157
|
+
|
|
158
|
+
| Type | Why rejected |
|
|
159
|
+
| ------ | -------------- |
|
|
160
|
+
| "implemented correctly" | No specific location |
|
|
161
|
+
| "meets requirements" | No evidence cited |
|
|
162
|
+
| "the code does X" | No file:line reference |
|
|
163
|
+
| "as specified" | No implementation pointer |
|
|
164
|
+
|
|
165
|
+
### Evidence Templates
|
|
166
|
+
|
|
167
|
+
**MET:**
|
|
168
|
+
|
|
169
|
+
```
|
|
170
|
+
- `src/api/users.ts:42` — `createUser()` implements user creation
|
|
171
|
+
- `src/api/users.ts:45-48` — input validation for email field
|
|
172
|
+
- `tests/users.test.ts:15-20` — unit test verifies email uniqueness
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
**PARTIAL:**
|
|
176
|
+
|
|
177
|
+
```
|
|
178
|
+
- `src/api/users.ts:42` — `createUser()` implements basic creation
|
|
179
|
+
- MISSING: `src/api/users.ts` — no error handling for duplicate emails (R3 sub-condition "duplicate email rejected")
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
**UNMET:**
|
|
183
|
+
|
|
184
|
+
```
|
|
185
|
+
- NO IMPLEMENTATION FOUND for requirement R5: "Send email notification on user creation"
|
|
186
|
+
- Searched: src/api/, src/services/, src/notifications/
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## Workflow
|
|
192
|
+
|
|
193
|
+
### Step 1 — Load the task
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
spur task show <wbs> --json
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
Parse from `content`:
|
|
200
|
+
|
|
201
|
+
- `## Requirements` — the `R{n}` items (the traceability targets).
|
|
202
|
+
- `## Acceptance Criteria` — if present, AC evaluation is complementary; `sp:code-verification`
|
|
203
|
+
verify mode owns the AC gate, but functional-review cross-checks that AC map back to requirements.
|
|
204
|
+
|
|
205
|
+
Flags: `--bdd-report <path>` (BDD execution report JSON), `--source-paths <a,b>` (explicit source
|
|
206
|
+
scope; defaults to the task's diff scope), `--auto` (no confirmations), `--next` (on PASS,
|
|
207
|
+
auto-transition `testing → done`; on PARTIAL/FAIL, stop).
|
|
208
|
+
|
|
209
|
+
### Step 2 — Parse requirements
|
|
210
|
+
|
|
211
|
+
Extract every `R{n}` from `## Requirements` into a numbered list. If the section is empty or absent,
|
|
212
|
+
return `verdict = PASS` with "No requirements to verify" (zero-requirements case).
|
|
213
|
+
|
|
214
|
+
### Step 3 — Establish the change scope
|
|
215
|
+
|
|
216
|
+
If `--source-paths` is given, use it. Otherwise derive the diff scope exactly as
|
|
217
|
+
`sp:code-verification` Step 3 does (the task file's last commit → `git diff --name-only` for
|
|
218
|
+
`*.ts`/`*.tsx`/`*.js`/`*.jsx`, fallback to working-tree diff).
|
|
219
|
+
|
|
220
|
+
### Step 4 — Track A: BDD mapping (if `--bdd-report`)
|
|
221
|
+
|
|
222
|
+
Load the BDD report, map each requirement to scenarios, assign `MET`/`PARTIAL` per the Track A
|
|
223
|
+
table. Uncovered requirements fall through to Track B.
|
|
224
|
+
|
|
225
|
+
### Step 5 — Track B: LLM evidence assessment
|
|
226
|
+
|
|
227
|
+
For each uncovered requirement, gather source evidence and assign `MET`/`PARTIAL`/`UNMET` per the
|
|
228
|
+
Evidence Quality Standard. Record the evidence string (`file:line`, command, or test name).
|
|
229
|
+
|
|
230
|
+
### Step 6 — Aggregate the verdict
|
|
231
|
+
|
|
232
|
+
Apply the aggregation rule (contract in
|
|
233
|
+
[references/verdict-schema.md](references/verdict-schema.md#aggregation-rule)):
|
|
234
|
+
|
|
235
|
+
```
|
|
236
|
+
any core requirement UNMET → FAIL
|
|
237
|
+
any core requirement PARTIAL (no UNMET) → PARTIAL
|
|
238
|
+
all core requirements MET → PASS
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
`PARTIAL` blocks the gate exactly like `FAIL` — the distinction only tells the operator *how far
|
|
242
|
+
off* delivery is.
|
|
243
|
+
|
|
244
|
+
### Step 7 — Write findings to the task
|
|
245
|
+
|
|
246
|
+
Write the review body to the task's `## Review` section via CLI verbs. The body MUST lead with a
|
|
247
|
+
`| Priority | Dimension | Location | Finding |` table (the L3 `hasPopulatedPriorityTable` gate at
|
|
248
|
+
`task-check.ts:96-106` requires at least one `P[1-4]` row with non-placeholder siblings — any other
|
|
249
|
+
shape, e.g. `| Req | Status | Evidence |` alone, is structurally rejected and denies the
|
|
250
|
+
`wip→testing` transition). Use the same canonical shape as `sp:code-verification`:
|
|
251
|
+
|
|
252
|
+
```bash
|
|
253
|
+
cat > /tmp/<wbs>-functional.md <<'BODY'
|
|
254
|
+
| Priority | Dimension | Location | Finding |
|
|
255
|
+
| --- | --- | --- | --- |
|
|
256
|
+
| P4 | — | — | No P1–P3 findings; functional verdict PASS |
|
|
257
|
+
|
|
258
|
+
| Req | Status | Evidence |
|
|
259
|
+
| --- | --- | --- |
|
|
260
|
+
| R1 | MET | `src/api/users.ts:42` — `createUser()` |
|
|
261
|
+
| R2 | PARTIAL | `src/api/users.ts:42` — basic only; MISSING duplicate-email handling |
|
|
262
|
+
| R3 | UNMET | no implementation found; searched src/api/, src/services/ |
|
|
263
|
+
BODY
|
|
264
|
+
spur task update <wbs> --section Review --from-file /tmp/<wbs>-functional.md
|
|
265
|
+
rm /tmp/<wbs>-functional.md
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
For a PARTIAL/FAIL verdict, replace the P4 row with the actual P1–P3 findings ranked by severity.
|
|
269
|
+
The priority table leads; the traceability table follows for per-requirement detail.
|
|
270
|
+
|
|
271
|
+
Section bodies passed to `spur task update --section` must be **body-only** — no same-level (`##`)
|
|
272
|
+
headings inside the body. Tables and bold labels are fine.
|
|
273
|
+
|
|
274
|
+
### Step 8 — Report
|
|
275
|
+
|
|
276
|
+
End the output with an explicit, parseable verdict line:
|
|
277
|
+
|
|
278
|
+
```
|
|
279
|
+
Functional Verdict: PASS (or PARTIAL / FAIL)
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
Include the per-requirement traceability table in the report:
|
|
283
|
+
|
|
284
|
+
```markdown
|
|
285
|
+
| Req | Status | Evidence |
|
|
286
|
+
|-----|--------|----------|
|
|
287
|
+
| R1 | MET | `src/api/users.ts:42` — `createUser()` |
|
|
288
|
+
| R2 | PARTIAL | `src/api/users.ts:42` — basic only; MISSING duplicate-email handling |
|
|
289
|
+
| R3 | UNMET | no implementation found; searched src/api/, src/services/ |
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
**Under the pipeline**, `sp:functional-review` is the review step dispatched by `/sp:dev-review`,
|
|
293
|
+
so it owns `## Review` — its `--section Review` write is the authoritative source. The pipeline's
|
|
294
|
+
`record` step transcribes only `## Testing` from the verify verdict (`code-verification/SKILL.md`,
|
|
295
|
+
`task-record.ts:226-247`); it does not overwrite a non-bare `## Review` thanks to the
|
|
296
|
+
`sectionIsBare` guard (`task-service.ts:485`). Keep the priority-table lead stable so the L3 gate
|
|
297
|
+
stays satisfied through `record` → `done`.
|
|
298
|
+
|
|
299
|
+
---
|
|
300
|
+
|
|
301
|
+
## Quality Gates
|
|
302
|
+
|
|
303
|
+
1. **Evidence gate:** all evidence must be specific (`file:line` or named test/command).
|
|
304
|
+
2. **Coverage gate:** every numbered requirement must have a verdict row.
|
|
305
|
+
3. **Verdict gate:** overall verdict must be PASS/PARTIAL/FAIL with per-requirement reasoning.
|
|
306
|
+
|
|
307
|
+
---
|
|
308
|
+
|
|
309
|
+
## Verdict Schema
|
|
310
|
+
|
|
311
|
+
The artifact shape, per-requirement status enum, and aggregation rule are the contract in
|
|
312
|
+
[references/verdict-schema.md](references/verdict-schema.md). When emitting a machine-readable
|
|
313
|
+
verdict (standalone or pipeline), shape it as `FunctionalVerdict` — not `VerifyVerdict` (which is
|
|
314
|
+
`sp:code-verification`'s SECUA + AC contract). The two artifacts are complementary; a full
|
|
315
|
+
`/sp:dev-review` may emit both.
|
|
316
|
+
|
|
317
|
+
---
|
|
318
|
+
|
|
319
|
+
## Common Rationalizations
|
|
320
|
+
|
|
321
|
+
| Rationalization | Reality |
|
|
322
|
+
| --- | --- |
|
|
323
|
+
| "The requirement is obviously met — I can see it in the diff." | Seeing code is not evidence. A requirement is MET only when `file:line` evidence is cited. |
|
|
324
|
+
| "All tests pass, so all requirements are covered." | Green tests prove the suite's assertions, not that every requirement has coverage. Map each requirement to its evidence. |
|
|
325
|
+
| "The implementer reported it works — I'll trust the summary." | A subagent success report is a claim, not a verdict. Functional review **re-checks** the evidence; trusting the report skips the gate. |
|
|
326
|
+
| "R5 is a minor requirement — I'll skip it." | Every numbered requirement gets a row. No silent skipping. |
|
|
327
|
+
| "PARTIAL is close enough to ship." | PARTIAL/FAIL both block the gate. Rounding PARTIAL up to PASS is the exact dishonesty this gate exists to catch. |
|
|
328
|
+
|
|
329
|
+
---
|
|
330
|
+
|
|
331
|
+
## Red Flags
|
|
332
|
+
|
|
333
|
+
- A PASS verdict with no per-requirement evidence column.
|
|
334
|
+
- A requirement marked MET with evidence that is a description, not a `file:line` anchor.
|
|
335
|
+
- A verdict authored from the implementer's summary without independently re-reading the source.
|
|
336
|
+
- Softening FAIL to PARTIAL, or PARTIAL to PASS, to avoid surfacing to the operator.
|
|
337
|
+
- Skipping a requirement because "it's advisory" — if it carries an `R{n}` number, it gets a row.
|
|
338
|
+
|
|
339
|
+
---
|
|
340
|
+
|
|
341
|
+
## Gotchas
|
|
342
|
+
|
|
343
|
+
1. **Requirements ≠ AC.** `sp:code-verification` owns the AC gate; this skill owns the
|
|
344
|
+
requirements gate. They are complementary, not redundant.
|
|
345
|
+
2. **Zero requirements is a PASS.** A doc-only or config-only task with no `R{n}` items is not a
|
|
346
|
+
failure — return PASS with the "No requirements to verify" note.
|
|
347
|
+
3. **BDD takes precedence.** When a BDD report covers a requirement, the deterministic scenario
|
|
348
|
+
result wins; do not re-assess with LLM judgment.
|
|
349
|
+
4. **Never direct-write the task file.** All findings go through `spur task update --section`.
|
|
350
|
+
|
|
351
|
+
---
|
|
352
|
+
|
|
353
|
+
## Platform Notes
|
|
354
|
+
|
|
355
|
+
### Claude Code
|
|
356
|
+
|
|
357
|
+
Invoke via `Skill(skill="sp:functional-review", args="<wbs>")`. The `spur` CLI runs via the Bash
|
|
358
|
+
tool for `spur task show` / `spur task update`.
|
|
359
|
+
|
|
360
|
+
### Codex / OpenClaw / OpenCode / Antigravity
|
|
361
|
+
|
|
362
|
+
Run `spur` CLI via Bash; parse `--json`. Invoke this skill directly for the functional-review logic
|
|
363
|
+
— the skill is the SSOT; the commands are thin wrappers. `Skill()` and `$ARGUMENTS` are
|
|
364
|
+
Claude-specific; on other platforms, execute the workflow steps inline.
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# Functional Review Verdict Schema
|
|
2
|
+
|
|
3
|
+
The machine-readable artifact shape for `sp:functional-review`. This is the **requirements
|
|
4
|
+
traceability** contract; for the SECUA quality contract, see
|
|
5
|
+
[`sp:code-verification`'s `verdict-schema.md`](../../code-verification/references/verdict-schema.md)
|
|
6
|
+
(`VerifyVerdict`). The two are complementary — a full `/sp:dev-review` may emit both.
|
|
7
|
+
|
|
8
|
+
## TypeScript Interface
|
|
9
|
+
|
|
10
|
+
```typescript
|
|
11
|
+
/**
|
|
12
|
+
* Requirements-traceability artifact produced by sp:functional-review.
|
|
13
|
+
* Maps every R{n} requirement to implementation evidence and a per-requirement status.
|
|
14
|
+
*/
|
|
15
|
+
interface FunctionalVerdict {
|
|
16
|
+
/** Task WBS number, e.g. "0227". */
|
|
17
|
+
wbs: string;
|
|
18
|
+
/** Overall aggregation of per-requirement statuses. */
|
|
19
|
+
verdict: 'PASS' | 'PARTIAL' | 'FAIL';
|
|
20
|
+
/** One row per numbered requirement in the task's ## Requirements section. */
|
|
21
|
+
requirements: RequirementVerdict[];
|
|
22
|
+
/** Free-form summary: counts, notes, zero-requirements case. */
|
|
23
|
+
summary: string;
|
|
24
|
+
/**
|
|
25
|
+
* BDD execution report path, if Track A was used. null for LLM-only (Track B).
|
|
26
|
+
*/
|
|
27
|
+
bddReportPath: string | null;
|
|
28
|
+
/**
|
|
29
|
+
* Explicit source scope (if --source-paths given) or derived diff scope
|
|
30
|
+
* (the changed *.ts/*.tsx/*.js/*.jsx files for the task's last commit).
|
|
31
|
+
*/
|
|
32
|
+
sourcePaths: string[];
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
interface RequirementVerdict {
|
|
36
|
+
/** Requirement id from the task, e.g. "R1". */
|
|
37
|
+
id: string;
|
|
38
|
+
/** Requirement text (verbatim from ## Requirements). */
|
|
39
|
+
text: string;
|
|
40
|
+
/** Per-requirement status. */
|
|
41
|
+
status: 'MET' | 'PARTIAL' | 'UNMET';
|
|
42
|
+
/**
|
|
43
|
+
* Specific evidence: file:line, named test, or command+exit status.
|
|
44
|
+
* MUST be specific — vague evidence ("implemented correctly") downgrades to UNMET/PARTIAL.
|
|
45
|
+
*/
|
|
46
|
+
evidence: string[];
|
|
47
|
+
/** For PARTIAL/UNMET: what's missing. Empty array for MET. */
|
|
48
|
+
gaps: string[];
|
|
49
|
+
/**
|
|
50
|
+
* Assessment track used.
|
|
51
|
+
* - 'bdd' if a BDD report covered this requirement (deterministic)
|
|
52
|
+
* - 'llm' if Track B LLM assessment was used
|
|
53
|
+
*/
|
|
54
|
+
track: 'bdd' | 'llm';
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Aggregation Rule
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
any core requirement UNMET → FAIL
|
|
62
|
+
any core requirement PARTIAL (no UNMET) → PARTIAL
|
|
63
|
+
all core requirements MET → PASS
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
- **Zero-requirements case:** if the task has 0 numbered requirements, return `verdict = PASS`
|
|
67
|
+
with `summary: "No requirements to verify"`.
|
|
68
|
+
- **PARTIAL blocks the gate** exactly like FAIL — the distinction only tells the operator *how
|
|
69
|
+
far off* delivery is. Never round PARTIAL up to PASS.
|
|
70
|
+
- The verdict is computed from `requirements[].status`; the `summary` field is descriptive, not
|
|
71
|
+
load-bearing.
|
|
72
|
+
|
|
73
|
+
## JSON Example
|
|
74
|
+
|
|
75
|
+
```json
|
|
76
|
+
{
|
|
77
|
+
"wbs": "0227",
|
|
78
|
+
"verdict": "PARTIAL",
|
|
79
|
+
"requirements": [
|
|
80
|
+
{
|
|
81
|
+
"id": "R1",
|
|
82
|
+
"text": "Add functional-review skill to plugins/sp/skills/",
|
|
83
|
+
"status": "MET",
|
|
84
|
+
"evidence": [
|
|
85
|
+
"plugins/sp/skills/functional-review/SKILL.md:1 — skill file created",
|
|
86
|
+
"plugins/sp/skills/functional-review/references/verdict-schema.md:1 — verdict schema ref"
|
|
87
|
+
],
|
|
88
|
+
"gaps": [],
|
|
89
|
+
"track": "llm"
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
"id": "R2",
|
|
93
|
+
"text": "Add code-improvement skill",
|
|
94
|
+
"status": "PARTIAL",
|
|
95
|
+
"evidence": [
|
|
96
|
+
"plugins/sp/skills/code-improvement/SKILL.md:1 — skill body created"
|
|
97
|
+
],
|
|
98
|
+
"gaps": [
|
|
99
|
+
"plugins/sp/skills/code-improvement/references/deepening-signals.md — referenced but not yet written"
|
|
100
|
+
],
|
|
101
|
+
"track": "llm"
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"id": "R5",
|
|
105
|
+
"text": "Add receiving-code-review + verification-before-completion guardrails",
|
|
106
|
+
"status": "UNMET",
|
|
107
|
+
"evidence": [],
|
|
108
|
+
"gaps": [
|
|
109
|
+
"No guardrail reference files found in plugins/sp/skills/code-review/references/"
|
|
110
|
+
],
|
|
111
|
+
"track": "llm"
|
|
112
|
+
}
|
|
113
|
+
],
|
|
114
|
+
"summary": "4 MET, 1 PARTIAL, 1 UNMET — R5 guardrails missing, R2 deepening-signals ref pending",
|
|
115
|
+
"bddReportPath": null,
|
|
116
|
+
"sourcePaths": [
|
|
117
|
+
"plugins/sp/skills/functional-review/SKILL.md",
|
|
118
|
+
"plugins/sp/skills/code-improvement/SKILL.md",
|
|
119
|
+
"plugins/sp/commands/dev-review.md",
|
|
120
|
+
"plugins/sp/agents/super-reviewer.md"
|
|
121
|
+
]
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Relationship to `VerifyVerdict`
|
|
126
|
+
|
|
127
|
+
| Artifact | Owning skill | Question | Aggregation |
|
|
128
|
+
|----------|-------------|----------|-------------|
|
|
129
|
+
| `FunctionalVerdict` | `sp:functional-review` | Did we build what was asked? (requirements completeness) | any UNMET → FAIL; any PARTIAL → PARTIAL; else PASS |
|
|
130
|
+
| `VerifyVerdict` | `sp:code-verification` | Is the code SECUA-correct and AC-complete? | any core req/AC UNMET → FAIL; any blocker correctness/security → FAIL; any PARTIAL → PARTIAL; else PASS |
|
|
131
|
+
|
|
132
|
+
A complete `/sp:dev-review --focus all` pipeline may produce both artifacts; they are consumed by
|
|
133
|
+
the pipeline's `record` step and written to the task's `## Testing` section.
|