@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.
Files changed (185) hide show
  1. package/.claude-plugin/marketplace.json +15 -0
  2. package/README.md +15 -1
  3. package/config/templates/AGENTS.md +5 -3
  4. package/config/workflows/task-pipeline.yaml +103 -12
  5. package/package.json +15 -12
  6. package/plugins/README.md +655 -0
  7. package/plugins/sp/README.md +621 -0
  8. package/plugins/sp/agents/expert-spur.md +109 -0
  9. package/plugins/sp/agents/super-coder.md +126 -0
  10. package/plugins/sp/agents/super-planner.md +283 -0
  11. package/plugins/sp/agents/super-reviewer.md +154 -0
  12. package/plugins/sp/commands/dev-arch.md +30 -0
  13. package/plugins/sp/commands/dev-brainstorm.md +40 -0
  14. package/plugins/sp/commands/dev-changelog.md +28 -0
  15. package/plugins/sp/commands/dev-daily.md +29 -0
  16. package/plugins/sp/commands/dev-debug.md +29 -0
  17. package/plugins/sp/commands/dev-dogfood.md +33 -0
  18. package/plugins/sp/commands/dev-featurechange.md +130 -0
  19. package/plugins/sp/commands/dev-find-conflict.md +51 -0
  20. package/plugins/sp/commands/dev-find-issue.md +76 -0
  21. package/plugins/sp/commands/dev-find-next.md +60 -0
  22. package/plugins/sp/commands/dev-fixall.md +33 -0
  23. package/plugins/sp/commands/dev-gitmsg.md +28 -0
  24. package/plugins/sp/commands/dev-gtd.md +97 -0
  25. package/plugins/sp/commands/dev-handover.md +26 -0
  26. package/plugins/sp/commands/dev-idea.md +50 -0
  27. package/plugins/sp/commands/dev-next.md +31 -0
  28. package/plugins/sp/commands/dev-parallel.md +30 -0
  29. package/plugins/sp/commands/dev-plan.md +46 -0
  30. package/plugins/sp/commands/dev-refine.md +48 -0
  31. package/plugins/sp/commands/dev-refineall.md +65 -0
  32. package/plugins/sp/commands/dev-refresh.md +32 -0
  33. package/plugins/sp/commands/dev-reverse.md +32 -0
  34. package/plugins/sp/commands/dev-review.md +31 -0
  35. package/plugins/sp/commands/dev-run.md +63 -0
  36. package/plugins/sp/commands/dev-runall.md +80 -0
  37. package/plugins/sp/commands/dev-simplify.md +39 -0
  38. package/plugins/sp/commands/dev-unit.md +29 -0
  39. package/plugins/sp/commands/dev-verify.md +48 -0
  40. package/plugins/sp/commands/dev-verifyall.md +72 -0
  41. package/plugins/sp/commands/dev-wrap.md +30 -0
  42. package/plugins/sp/commands/dev-wrapall.md +33 -0
  43. package/plugins/sp/commands/rule-add.md +18 -0
  44. package/plugins/sp/commands/rule-refine.md +18 -0
  45. package/plugins/sp/commands/rule-scan.md +18 -0
  46. package/plugins/sp/commands/spur-init.md +22 -0
  47. package/plugins/sp/commands/workflow-add.md +18 -0
  48. package/plugins/sp/commands/workflow-refine.md +18 -0
  49. package/plugins/sp/hooks/agent-hint.ts +60 -0
  50. package/plugins/sp/hooks/careful-guard.ts +147 -0
  51. package/plugins/sp/hooks/context-post-tool.ts +325 -0
  52. package/plugins/sp/hooks/context-session-start.ts +182 -0
  53. package/plugins/sp/hooks/context-session-stop.ts +95 -0
  54. package/plugins/sp/hooks/hooks.json +51 -0
  55. package/plugins/sp/hooks/pi/guard-extension.ts +341 -0
  56. package/plugins/sp/hooks/task-write-guard.ts +84 -0
  57. package/plugins/sp/plugin.json +8 -0
  58. package/plugins/sp/scripts/batch-preflight.ts +204 -0
  59. package/plugins/sp/scripts/daily-summary/daily-summary.ts +606 -0
  60. package/plugins/sp/scripts/daily-summary/logger.ts +28 -0
  61. package/plugins/sp/scripts/dogfood-testing/detect-pipeline-driving.ts +363 -0
  62. package/plugins/sp/scripts/dogfood-testing/validate-report.ts +168 -0
  63. package/plugins/sp/scripts/feature-sync-bounded.ts +451 -0
  64. package/plugins/sp/scripts/stage-registry-adapter.ts +1341 -0
  65. package/plugins/sp/scripts/task-size-precheck.ts +202 -0
  66. package/plugins/sp/scripts/validate-commands.ts +651 -0
  67. package/plugins/sp/scripts/validate-flag-contracts.ts +875 -0
  68. package/plugins/sp/skills/brainstorm/SKILL.md +361 -0
  69. package/plugins/sp/skills/brainstorm/agents/openai.yaml +14 -0
  70. package/plugins/sp/skills/brainstorm/examples/ideation-example.md +209 -0
  71. package/plugins/sp/skills/brainstorm/metadata.openclaw +7 -0
  72. package/plugins/sp/skills/brainstorm/references/grilling-interview.md +68 -0
  73. package/plugins/sp/skills/brainstorm/references/workflows.md +255 -0
  74. package/plugins/sp/skills/branch-workflow/SKILL.md +109 -0
  75. package/plugins/sp/skills/branch-workflow/references/branch-lifecycle.md +69 -0
  76. package/plugins/sp/skills/branch-workflow/references/worktree-patterns.md +100 -0
  77. package/plugins/sp/skills/code-implementation/SKILL.md +176 -0
  78. package/plugins/sp/skills/code-implementation/references/debugging.md +64 -0
  79. package/plugins/sp/skills/code-implementation/references/implementation-patterns.md +113 -0
  80. package/plugins/sp/skills/code-improvement/SKILL.md +231 -0
  81. package/plugins/sp/skills/code-improvement/references/deepening-signals.md +205 -0
  82. package/plugins/sp/skills/code-review/SKILL.md +112 -0
  83. package/plugins/sp/skills/code-review/references/receiving-code-review.md +70 -0
  84. package/plugins/sp/skills/code-review/references/review-lenses.md +117 -0
  85. package/plugins/sp/skills/code-review/references/self-review-checklist.md +53 -0
  86. package/plugins/sp/skills/code-review/references/verification-before-completion.md +68 -0
  87. package/plugins/sp/skills/code-simplification/SKILL.md +225 -0
  88. package/plugins/sp/skills/code-testing/SKILL.md +108 -0
  89. package/plugins/sp/skills/code-testing/references/stacks/bun-ts.md +165 -0
  90. package/plugins/sp/skills/code-testing/references/stacks/go.md +88 -0
  91. package/plugins/sp/skills/code-testing/references/stacks/python.md +117 -0
  92. package/plugins/sp/skills/code-testing/references/test-loop-breaker.md +37 -0
  93. package/plugins/sp/skills/code-testing/references/test-output-discipline.md +52 -0
  94. package/plugins/sp/skills/code-testing/references/unit-testing.md +212 -0
  95. package/plugins/sp/skills/code-verification/SKILL.md +535 -0
  96. package/plugins/sp/skills/code-verification/references/code-improvement.md +39 -0
  97. package/plugins/sp/skills/code-verification/references/secu-review.md +94 -0
  98. package/plugins/sp/skills/code-verification/references/verdict-schema.md +141 -0
  99. package/plugins/sp/skills/conflict-finding/SKILL.md +254 -0
  100. package/plugins/sp/skills/conflict-finding/references/authority-resolution.md +258 -0
  101. package/plugins/sp/skills/conflict-finding/references/comparison-protocol.md +277 -0
  102. package/plugins/sp/skills/conflict-finding/references/finding-contract.md +346 -0
  103. package/plugins/sp/skills/conflict-finding/references/remediation-routing.md +276 -0
  104. package/plugins/sp/skills/daily-summary/SKILL.md +171 -0
  105. package/plugins/sp/skills/daily-summary/agents/openai.yaml +13 -0
  106. package/plugins/sp/skills/doc-evolve/SKILL.md +175 -0
  107. package/plugins/sp/skills/doc-evolve/references/operations.md +93 -0
  108. package/plugins/sp/skills/dogfood-testing/SKILL.md +608 -0
  109. package/plugins/sp/skills/dogfood-testing/references/monitor-ledger.md +211 -0
  110. package/plugins/sp/skills/dogfood-testing/references/report-template.md +351 -0
  111. package/plugins/sp/skills/doubt-driven-development/SKILL.md +136 -0
  112. package/plugins/sp/skills/functional-review/SKILL.md +364 -0
  113. package/plugins/sp/skills/functional-review/references/verdict-schema.md +133 -0
  114. package/plugins/sp/skills/indexed-context/SKILL.md +164 -0
  115. package/plugins/sp/skills/issue-finding/SKILL.md +424 -0
  116. package/plugins/sp/skills/issue-finding/agents/openai.yaml +15 -0
  117. package/plugins/sp/skills/issue-finding/examples/expected-findings.json +27 -0
  118. package/plugins/sp/skills/issue-finding/examples/session-test-loop.jsonl +23 -0
  119. package/plugins/sp/skills/issue-finding/references/session-formats.md +121 -0
  120. package/plugins/sp/skills/next-feature/SKILL.md +125 -0
  121. package/plugins/sp/skills/next-feature/references/handoff-routing.md +92 -0
  122. package/plugins/sp/skills/next-feature/references/proposal-contract.md +49 -0
  123. package/plugins/sp/skills/next-feature/references/ranking-rubric.md +52 -0
  124. package/plugins/sp/skills/next-feature/references/signal-derivation.md +67 -0
  125. package/plugins/sp/skills/next-router/SKILL.md +181 -0
  126. package/plugins/sp/skills/next-router/references/messages.md +90 -0
  127. package/plugins/sp/skills/next-router/references/routing-table.md +216 -0
  128. package/plugins/sp/skills/parallel-execution/SKILL.md +148 -0
  129. package/plugins/sp/skills/parallel-execution/references/dispatch-surface.md +100 -0
  130. package/plugins/sp/skills/parallel-execution/references/fan-out-patterns.md +101 -0
  131. package/plugins/sp/skills/parallel-execution/references/result-synthesis.md +94 -0
  132. package/plugins/sp/skills/reverse-engineering/SKILL.md +375 -0
  133. package/plugins/sp/skills/reverse-engineering/agents/openai.yaml +18 -0
  134. package/plugins/sp/skills/source-driven-development/SKILL.md +124 -0
  135. package/plugins/sp/skills/spec-decomposition/SKILL.md +117 -0
  136. package/plugins/sp/skills/spec-decomposition/references/decomposition.md +539 -0
  137. package/plugins/sp/skills/spur-cli/SKILL.md +133 -0
  138. package/plugins/sp/skills/spur-cli/references/agent.md +179 -0
  139. package/plugins/sp/skills/spur-cli/references/features/acceptance-criteria.md +82 -0
  140. package/plugins/sp/skills/spur-cli/references/features/hierarchy-mece.md +177 -0
  141. package/plugins/sp/skills/spur-cli/references/features/roadmap-priority.md +84 -0
  142. package/plugins/sp/skills/spur-cli/references/features/verbs.md +122 -0
  143. package/plugins/sp/skills/spur-cli/references/features.md +234 -0
  144. package/plugins/sp/skills/spur-cli/references/init.md +119 -0
  145. package/plugins/sp/skills/spur-cli/references/message.md +98 -0
  146. package/plugins/sp/skills/spur-cli/references/rules/authoring-rules.md +212 -0
  147. package/plugins/sp/skills/spur-cli/references/rules/fine-tuning.md +148 -0
  148. package/plugins/sp/skills/spur-cli/references/rules/operations.md +228 -0
  149. package/plugins/sp/skills/spur-cli/references/rules/validation-and-extension.md +129 -0
  150. package/plugins/sp/skills/spur-cli/references/rules.md +209 -0
  151. package/plugins/sp/skills/spur-cli/references/serve.md +58 -0
  152. package/plugins/sp/skills/spur-cli/references/tasks/l3-guard-cheatsheet.md +98 -0
  153. package/plugins/sp/skills/spur-cli/references/tasks/section-editing.md +95 -0
  154. package/plugins/sp/skills/spur-cli/references/tasks/verbs.md +361 -0
  155. package/plugins/sp/skills/spur-cli/references/tasks.md +278 -0
  156. package/plugins/sp/skills/spur-cli/references/team.md +133 -0
  157. package/plugins/sp/skills/spur-cli/references/workflows/authoring-workflows.md +226 -0
  158. package/plugins/sp/skills/spur-cli/references/workflows/operations.md +211 -0
  159. package/plugins/sp/skills/spur-cli/references/workflows/validation-and-extension.md +129 -0
  160. package/plugins/sp/skills/spur-cli/references/workflows.md +355 -0
  161. package/plugins/sp/skills/spur-dev/SKILL.md +224 -0
  162. package/plugins/sp/skills/spur-dev/references/ac-style-guide.md +196 -0
  163. package/plugins/sp/skills/spur-dev/references/cross-cutting.md +664 -0
  164. package/plugins/sp/skills/spur-dev/references/decision-brief.md +80 -0
  165. package/plugins/sp/skills/spur-dev/references/dev-operations.md +546 -0
  166. package/plugins/sp/skills/spur-dev/references/done-housekeeping.md +164 -0
  167. package/plugins/sp/skills/spur-dev/references/execution-batch.md +727 -0
  168. package/plugins/sp/skills/spur-dev/references/execution-workflow.md +350 -0
  169. package/plugins/sp/skills/spur-dev/references/feature-link-helper.md +191 -0
  170. package/plugins/sp/skills/spur-dev/references/flag-glossary.md +417 -0
  171. package/plugins/sp/skills/spur-dev/references/gate-checklists.md +171 -0
  172. package/plugins/sp/skills/spur-dev/references/glossary.md +95 -0
  173. package/plugins/sp/skills/spur-dev/references/idea-evaluation.md +80 -0
  174. package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +88 -0
  175. package/plugins/sp/skills/spur-dev/references/planning-workflow.md +302 -0
  176. package/plugins/sp/skills/spur-dev/references/product-planning.md +206 -0
  177. package/plugins/sp/skills/spur-dev/references/section-batching.md +24 -0
  178. package/plugins/sp/skills/sys-architecture/SKILL.md +155 -0
  179. package/plugins/sp/skills/sys-architecture/references/decision-method.md +137 -0
  180. package/plugins/sp/skills/sys-architecture/references/upkeep-survey.md +75 -0
  181. package/plugins/sp/skills/sys-debugging/SKILL.md +228 -0
  182. package/plugins/sp/skills/sys-debugging/references/debugging-protocol.md +62 -0
  183. package/plugins/sp/skills/test-driven-development/SKILL.md +248 -0
  184. package/plugins/sp/skills/wayfinder/SKILL.md +292 -0
  185. 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.