@gobing-ai/spur 0.3.41 → 0.3.43
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 +113 -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 +83 -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 +48 -0
- package/plugins/sp/commands/dev-wrapall.md +51 -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 +203 -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 +442 -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 +151 -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 +109 -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 +280 -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 +680 -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 +790 -0
- package/plugins/sp/skills/spur-dev/references/execution-workflow.md +352 -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 +120 -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 +6035 -4963
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: product-planning
|
|
3
|
+
description: Product-management judgment for the sp planning path: intake, prioritization, strategy profiles, PRD-shaped output, and handoff rules without adding a PM command surface.
|
|
4
|
+
see_also:
|
|
5
|
+
- spur-dev
|
|
6
|
+
- planning-workflow
|
|
7
|
+
- decomposition
|
|
8
|
+
- spur-cli
|
|
9
|
+
- doc-evolve
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Product Planning Guidance
|
|
13
|
+
|
|
14
|
+
This reference captures product-management judgment for the Spur planning path without adding old
|
|
15
|
+
feature-tree, PRD command, or PM-agent surfaces. `sp:spur-dev` remains the planning orchestrator.
|
|
16
|
+
Product planning is a lens applied during intake, feature authoring, prioritization, decomposition,
|
|
17
|
+
and doc handoff; deterministic writes still go through `spur feature`, `spur task`,
|
|
18
|
+
`spur workflow`, and `sp:doc-evolve`.
|
|
19
|
+
|
|
20
|
+
## Routing Rule
|
|
21
|
+
|
|
22
|
+
Use this reference when the request is PM-shaped:
|
|
23
|
+
|
|
24
|
+
- prioritizing a backlog or roadmap,
|
|
25
|
+
- turning a vague idea into a feature with measurable outcomes,
|
|
26
|
+
- deciding whether to create a feature, task, or doc update,
|
|
27
|
+
- choosing a decomposition strategy (`simplify`, `mvp`, `standard`, `mature`),
|
|
28
|
+
- producing PRD-shaped thinking without creating a PRD command family.
|
|
29
|
+
|
|
30
|
+
Do not create a standalone `sp:product-management` skill, `sp:super-pm` agent, or `/sp:prd-*`
|
|
31
|
+
command for this workflow unless a later task proves a stable, distinct routing value.
|
|
32
|
+
|
|
33
|
+
## Intake Questions
|
|
34
|
+
|
|
35
|
+
Ask only for missing information. A senior, specific request can proceed directly to feature
|
|
36
|
+
creation.
|
|
37
|
+
|
|
38
|
+
| Dimension | Question |
|
|
39
|
+
| --- | --- |
|
|
40
|
+
| Outcome | What user or business result changes if this ships? |
|
|
41
|
+
| User | Which persona, workflow, or operator role benefits first? |
|
|
42
|
+
| Scope | What is explicitly in and out for this iteration? |
|
|
43
|
+
| Success | Which observable metric, behavior, or acceptance signal proves it worked? |
|
|
44
|
+
| Constraints | What timeline, risk, compliance, migration, or compatibility limits shape the plan? |
|
|
45
|
+
| Opportunity cost | What current or planned work should lose priority if this wins? |
|
|
46
|
+
|
|
47
|
+
Expertise calibration:
|
|
48
|
+
|
|
49
|
+
- **Sparse idea:** ask foundational outcome/scope/success questions.
|
|
50
|
+
- **Problem + rough scope:** ask boundary, metric, and dependency questions.
|
|
51
|
+
- **Problem + personas + metrics:** ask tradeoff and opportunity-cost questions; do not over-elicit.
|
|
52
|
+
|
|
53
|
+
## Elicitation Question Taxonomy
|
|
54
|
+
|
|
55
|
+
Four dimensions frame every elicitation. Ask only what is missing — a senior, specific request may
|
|
56
|
+
answer all four in its first sentence and proceed directly to feature creation. This taxonomy
|
|
57
|
+
deepens the intake table above with the question *form* and the expertise-adaptive depth rule.
|
|
58
|
+
|
|
59
|
+
| Dimension | Core question | What "answered" looks like |
|
|
60
|
+
| --- | --- | --- |
|
|
61
|
+
| Purpose | What user or business result changes if this ships? | A named outcome the operator will observe. |
|
|
62
|
+
| Scope | What is explicitly in and out for this iteration? | A boundary testable against proposed tasks. |
|
|
63
|
+
| Constraints | What timeline, risk, compliance, migration, or compatibility limits shape the plan? | A list of non-negotiables the plan must respect. |
|
|
64
|
+
| Success criteria | Which observable metric, behavior, or acceptance signal proves it worked? | A signal encodable as an acceptance scenario. |
|
|
65
|
+
|
|
66
|
+
### Expertise-adaptive questioning
|
|
67
|
+
|
|
68
|
+
Calibrate depth to the input. Over-elicit and you waste the operator's time; under-elicit and you
|
|
69
|
+
ship ambiguity into the corpus.
|
|
70
|
+
|
|
71
|
+
| Input shape | Ask |
|
|
72
|
+
| --- | --- |
|
|
73
|
+
| Sparse idea (one sentence, no scope) | Purpose + Scope + Success — foundational framing only. |
|
|
74
|
+
| Problem + rough scope | Constraints + Success — boundary and metric. |
|
|
75
|
+
| Problem + personas + metrics | Opportunity cost + Constraints — tradeoff surface only. Do not re-elicit what is already stated. |
|
|
76
|
+
| Senior, fully-specified request | Nothing. Proceed to `spur feature create`. |
|
|
77
|
+
|
|
78
|
+
### Question form
|
|
79
|
+
|
|
80
|
+
One question at a time, always with a recommended default. Never ask "what are your constraints?"
|
|
81
|
+
open-ended; offer "I see X and Y as the likely constraints — am I missing one?" The recommendation
|
|
82
|
+
trains the elicitation; the operator's override trains future elicitation.
|
|
83
|
+
|
|
84
|
+
## Prioritization
|
|
85
|
+
|
|
86
|
+
Use prioritization to decide ordering, not to replace operator judgment.
|
|
87
|
+
|
|
88
|
+
### RICE
|
|
89
|
+
|
|
90
|
+
Use RICE when comparing multiple candidates with enough estimates to rank them.
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
score = (reach * impact * confidence) / effort
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
| Field | Guidance |
|
|
97
|
+
| --- | --- |
|
|
98
|
+
| Reach | A count over a defined period, e.g. users/quarter or runs/month. |
|
|
99
|
+
| Impact | `3` massive, `2` high, `1` medium, `0.5` low, `0.25` minimal. |
|
|
100
|
+
| Confidence | `1.0` high, `0.8` medium, `0.5` low. Penalize guesses. |
|
|
101
|
+
| Effort | Person-months or equivalent relative effort; keep the unit consistent. |
|
|
102
|
+
|
|
103
|
+
Flag outliers: if one score is more than 10x the median, review the inputs before using the rank.
|
|
104
|
+
|
|
105
|
+
### MoSCoW
|
|
106
|
+
|
|
107
|
+
Use MoSCoW when shaping a release boundary.
|
|
108
|
+
|
|
109
|
+
| Bucket | Meaning |
|
|
110
|
+
| --- | --- |
|
|
111
|
+
| Must | Release fails without it; critical path or blocking dependency. |
|
|
112
|
+
| Should | Important and high-value, but can slip one release. |
|
|
113
|
+
| Could | Useful if capacity remains. |
|
|
114
|
+
| Won't | Explicitly out of scope for this release; document for future. |
|
|
115
|
+
|
|
116
|
+
The Must set should be sufficient to satisfy the release goal. If it is not, the release goal or the
|
|
117
|
+
bucket assignment is wrong.
|
|
118
|
+
|
|
119
|
+
## Strategy Profiles
|
|
120
|
+
|
|
121
|
+
Strategy profiles tune planning ceremony and decomposition scope. They are judgment aids, not new
|
|
122
|
+
CLI flags unless a command explicitly supports them.
|
|
123
|
+
|
|
124
|
+
| Profile | Use when | Scope | Tests/docs expectation |
|
|
125
|
+
| --- | --- | --- | --- |
|
|
126
|
+
| `simplify` | Low-risk request, operator wants speed, or a tiny workflow change. | Minimum useful deliverable; skip non-blocking edge cases. | Smoke/manual evidence and concise task prose. |
|
|
127
|
+
| `mvp` | Need to validate demand or unblock learning quickly. | Core happy path; defer nice-to-haves. | Basic automated happy-path checks where cheap. |
|
|
128
|
+
| `standard` | Normal validated work. | Balanced core + known edge cases. | Unit/integration coverage and normal docs. |
|
|
129
|
+
| `mature` | Production-critical, regulated, security-sensitive, or high-reliability work. | Complete path including migration, failure modes, observability, and rollback. | Unit + integration + e2e/perf/security evidence as relevant. |
|
|
130
|
+
|
|
131
|
+
Auto-selection heuristics:
|
|
132
|
+
|
|
133
|
+
- Sparse request + explicit speed/minimal ceremony -> `simplify`.
|
|
134
|
+
- Uncertain demand or missing success metric -> `mvp`.
|
|
135
|
+
- Clear problem, scope, and acceptance signals -> `standard`.
|
|
136
|
+
- Compliance, money movement, data loss, auth, migration, or reliability keywords -> `mature`.
|
|
137
|
+
|
|
138
|
+
## Decomposition Decision Rules
|
|
139
|
+
|
|
140
|
+
Each strategy profile implies a decomposition shape. Use these rules when the `sp:spec-decomposition`
|
|
141
|
+
competency produces the task batch — the profile constrains granularity, edge-case coverage, and
|
|
142
|
+
the acceptable task count.
|
|
143
|
+
|
|
144
|
+
| Profile | Granularity | Edge cases | Target task count | Template variant |
|
|
145
|
+
| --- | --- | --- | --- | --- |
|
|
146
|
+
| `simplify` | One task if possible; split only when a single change spans two unrelated files. | Skip non-blocking. | 1-2 | `feature-impl` or `issue` |
|
|
147
|
+
| `mvp` | Core happy path as one task; split only when a separate concern blocks the happy path. | Defer to a follow-up task noted in `## Background`. | 1-3 | `feature-impl` |
|
|
148
|
+
| `standard` | One task per cohesive unit of work (a feature slice, a module, a cross-cutting change). | Include known edge cases in the same task or a sibling task. | 3-8 | `feature-impl` (mix with `review`/`meta` as needed) |
|
|
149
|
+
| `mature` | One task per failure mode, migration step, rollback path, and observability surface — in addition to the core. | All failure modes, migration, rollback, and observability are first-class tasks, not afterthoughts. | 6-15 | `feature-impl` + `review` + `meta` mix |
|
|
150
|
+
|
|
151
|
+
### Decision order
|
|
152
|
+
|
|
153
|
+
1. Pick the profile (auto-select heuristics above, or operator override).
|
|
154
|
+
2. Apply the granularity rule to each cohesive unit.
|
|
155
|
+
3. Apply the edge-case rule to decide what stays in-task vs. splits out.
|
|
156
|
+
4. Sanity-check the target count — if you are 2x over, the profile is wrong or the scope is two features.
|
|
157
|
+
|
|
158
|
+
### When to split a feature
|
|
159
|
+
|
|
160
|
+
If decomposition produces more than ~12 tasks under `mature` or ~8 under `standard`, the feature is
|
|
161
|
+
probably two features. Split along the natural seam (subsystem, release boundary, team ownership)
|
|
162
|
+
and create a second `spur feature create`. A single feature with 20 tasks is a decomposition smell,
|
|
163
|
+
not a plan.
|
|
164
|
+
|
|
165
|
+
## Feature, Task, Or Doc
|
|
166
|
+
|
|
167
|
+
Choose the smallest durable artifact that preserves traceability.
|
|
168
|
+
|
|
169
|
+
| Need | Artifact |
|
|
170
|
+
| --- | --- |
|
|
171
|
+
| New user-facing capability, roadmap item, or acceptance criteria surface | `spur feature create` |
|
|
172
|
+
| Concrete implementation work with a bounded code change | `spur task create` or `spur task batch-create` |
|
|
173
|
+
| Existing canonical docs drift or a PRD-style decision record | `sp:doc-evolve` |
|
|
174
|
+
| Repeatable, stable multi-step PM process | `spur workflow` YAML, only after the steps stabilize |
|
|
175
|
+
|
|
176
|
+
Default to one feature and one task until the decomposition rubric proves a split. A PRD-shaped
|
|
177
|
+
document is useful for stakeholder alignment, scope negotiation, or cross-team handoff; it is not a
|
|
178
|
+
reason to add `/sp:prd-doc`.
|
|
179
|
+
|
|
180
|
+
## PRD-Shaped Output
|
|
181
|
+
|
|
182
|
+
When the operator asks for a PRD, product brief, or requirements doc, produce the needed shape in the
|
|
183
|
+
current planning artifact or route to `sp:doc-evolve` for canonical docs. Use the template size that
|
|
184
|
+
matches the decision:
|
|
185
|
+
|
|
186
|
+
| Shape | Sections | Use when |
|
|
187
|
+
| --- | --- | --- |
|
|
188
|
+
| Brief | Problem, users, success, scope, next decision | Exploration or a one-week spike. |
|
|
189
|
+
| One-page PRD | Problem, solution, scope, success metrics | Simple feature, one team, two to four weeks. |
|
|
190
|
+
| Standard PRD | Problem, goals, users, scope in/out, AC, metrics, risks, rollout, open questions | Complex feature, multiple stakeholders, or six-plus weeks. |
|
|
191
|
+
|
|
192
|
+
Always include an Out of Scope section when the output is PRD-shaped. That is the part that prevents
|
|
193
|
+
scope creep.
|
|
194
|
+
|
|
195
|
+
## Handoff Rules
|
|
196
|
+
|
|
197
|
+
- Feature writes: use `spur feature create`, `spur feature update`, and direct feature-body edits
|
|
198
|
+
followed by `spur feature check`.
|
|
199
|
+
- Task writes: use `spur task create`, `spur task batch-create`, or
|
|
200
|
+
`spur task update --section --from-file`.
|
|
201
|
+
- Documentation synchronization: invoke `sp:doc-evolve` and follow the constitution.
|
|
202
|
+
- Repeatable orchestration: author `spur workflow` YAML only when the process has become mechanical
|
|
203
|
+
enough to validate and rerun.
|
|
204
|
+
|
|
205
|
+
Rejected surfaces for now: `sp:super-pm`, `/sp:prd-run`, `/sp:prd-doc`, `/sp:prd-adjust`,
|
|
206
|
+
`/sp:prd-init`, and a standalone `sp:product-management` skill.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: section-batching
|
|
3
|
+
description: Stage pipeline task sections together, apply them through Spur, and validate once per coherent batch.
|
|
4
|
+
see_also:
|
|
5
|
+
- spur-dev
|
|
6
|
+
- spur-cli
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Section batching protocol
|
|
10
|
+
|
|
11
|
+
Use this protocol when an in-session operation must author multiple pipeline sections. A workflow
|
|
12
|
+
`record` step should still prefer `spur task record` for verdict-derived `Testing` and `Review`.
|
|
13
|
+
|
|
14
|
+
1. Read `spur-cli/references/tasks/l3-guard-cheatsheet.md`.
|
|
15
|
+
2. Run `spur task sections <wbs> list --json` to learn which sections the current matrix permits.
|
|
16
|
+
3. Stage complete, body-only `Solution`, `Testing`, and `Review` files before the first task check.
|
|
17
|
+
4. Run `spur task check <wbs> --json` once, then apply every permitted staged section with
|
|
18
|
+
`spur task update <wbs> --section <name> --from-file <path>`.
|
|
19
|
+
5. Run `spur task check <wbs> --json` once after the coherent write batch.
|
|
20
|
+
6. If the post-write check fails, group all findings by section, repair all affected staged bodies, re-apply them, and
|
|
21
|
+
check once more.
|
|
22
|
+
|
|
23
|
+
Budget: no more than two section writes per section and two task checks per task unless a new
|
|
24
|
+
external failure changes the evidence. Do not use a write→check loop for each section.
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sys-architecture
|
|
3
|
+
description: "The architecture competency — decide and record system design before code: module boundaries, data flow, build-vs-extend, transport/storage/auth tradeoffs, ADR routing. Triggers: \"what's the right approach\", \"design this\", \"architecture\", \"should this be an ADR\", \"module boundary\", \"build vs extend\"."
|
|
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
|
+
- technique
|
|
11
|
+
competency: architecture
|
|
12
|
+
operations:
|
|
13
|
+
- survey
|
|
14
|
+
openclaw:
|
|
15
|
+
emoji: "📐"
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
# sys-architecture — the architecture competency
|
|
19
|
+
|
|
20
|
+
Decide and record the *shape* of a change before it is implemented: where boundaries go, how data
|
|
21
|
+
flows, what to build vs. extend, and which cross-cutting choices warrant a recorded decision. This is
|
|
22
|
+
a deep competency the spine (`sp:spur-dev`) consults when a task's design is unsettled —
|
|
23
|
+
it owns *deciding the shape*, distinct from `sp:code-implementation` which *builds the decided shape*.
|
|
24
|
+
|
|
25
|
+
The split mirrors the project's own doc map: this skill produces **decisions with one-line reasons**
|
|
26
|
+
(which belong in `docs/00_ADR.md`) and **mechanism/rationale** (which belongs in
|
|
27
|
+
`docs/03_ARCHITECTURE.md`); it does not write feature code.
|
|
28
|
+
|
|
29
|
+
## When to use
|
|
30
|
+
|
|
31
|
+
- **Choose an approach** — two or three viable designs exist; pick one with an explicit tradeoff.
|
|
32
|
+
- **Place a boundary** — decide which module/seam/package owns a responsibility.
|
|
33
|
+
- **Build vs. extend** — decide whether to add to an existing seam or introduce a new one.
|
|
34
|
+
- **ADR judgment** — decide whether a choice is cross-cutting enough to need a recorded ADR entry,
|
|
35
|
+
and draft it.
|
|
36
|
+
- **Pre-implementation design** — fill a task's `## Design` section with the decided shape so
|
|
37
|
+
`sp:code-implementation` can execute it.
|
|
38
|
+
|
|
39
|
+
Do **not** use this skill for:
|
|
40
|
+
|
|
41
|
+
- **Writing the code** — that is `sp:code-implementation`.
|
|
42
|
+
- **Coverage / testing** — that is `sp:code-testing`.
|
|
43
|
+
- **Review of already-written code** — that is `sp:code-verification`.
|
|
44
|
+
- **Driving the lifecycle / decomposition** — that is the spine, `sp:spur-dev`.
|
|
45
|
+
|
|
46
|
+
## Behavior
|
|
47
|
+
|
|
48
|
+
This skill behaves as a **technique**: given a problem and the codebase, it surfaces 2–3 candidate
|
|
49
|
+
designs, weighs them on the dimensions that matter (coupling, blast radius, scalability, cost,
|
|
50
|
+
reversibility), recommends one with a one-line reason, and routes the result:
|
|
51
|
+
|
|
52
|
+
- A **cross-cutting decision** (new app/package, transport swap, auth boundary, storage swap, a new
|
|
53
|
+
shared convention) → a dated **ADR** entry in `docs/00_ADR.md`, with mechanism detail in
|
|
54
|
+
`docs/03_ARCHITECTURE.md`.
|
|
55
|
+
- A **task-local design** → the task's `## Design` section (written via `spur task update`).
|
|
56
|
+
|
|
57
|
+
Full procedure: **[references/decision-method.md](references/decision-method.md)** — candidate
|
|
58
|
+
generation, the tradeoff dimensions, the deep-module vocabulary (module/interface/depth/seam/adapter/
|
|
59
|
+
leverage/locality, the deletion test, design-it-twice), and the ADR-or-not gate.
|
|
60
|
+
|
|
61
|
+
## The ADR-or-not gate
|
|
62
|
+
|
|
63
|
+
Record an ADR when the choice is **cross-cutting and hard to reverse**: it changes a module boundary,
|
|
64
|
+
introduces or swaps a dependency/transport/store, alters an auth surface, or sets a convention other
|
|
65
|
+
code must follow. A task-local, easily-reversed choice stays in the task's `## Design`. When in
|
|
66
|
+
doubt, prefer recording — a cheap ADR entry beats an undocumented divergence (the project conflict
|
|
67
|
+
rule forbids diverging from an unrecorded decision).
|
|
68
|
+
|
|
69
|
+
## Survey operation — architecture upkeep
|
|
70
|
+
|
|
71
|
+
A standing **upkeep audit**, distinct from the per-decision design flow above: scan the whole
|
|
72
|
+
codebase (or a named module tree) for **shallow modules and deepening opportunities**, and surface
|
|
73
|
+
them as candidates for the planning half. This is a *generator*, not a fixer — it never refactors;
|
|
74
|
+
it produces a ranked candidate report an operator can turn into a task.
|
|
75
|
+
|
|
76
|
+
**Not `/sp:dev-review`.** `/sp:dev-review` is a per-task DIFF review (a WBS, forward, findings written
|
|
77
|
+
to the task's `## Review`, backed by `sp:code-verification`). The survey has no WBS and no diff — it
|
|
78
|
+
audits the standing codebase and feeds the planning half. Folding it into `dev-review` would overload
|
|
79
|
+
that verb and pollute `code-verification` with a codebase scanner; it earns its own operation here.
|
|
80
|
+
|
|
81
|
+
**Method (reuse, do not restate).** The survey applies the deep-module vocabulary already defined in
|
|
82
|
+
[references/decision-method.md](references/decision-method.md) — module / interface / depth / seam /
|
|
83
|
+
adapter / leverage / locality, and the **deletion test** — to flag shallow modules, pass-through
|
|
84
|
+
wrappers, and leaky seams. The full procedure and the MARKDOWN candidate-report template live in
|
|
85
|
+
[references/upkeep-survey.md](references/upkeep-survey.md).
|
|
86
|
+
|
|
87
|
+
**Output: a MARKDOWN candidate report, never HTML.** Each candidate names the files, the problem
|
|
88
|
+
(which depth/seam smell), the proposed deepening, a before/after in prose, and a recommendation
|
|
89
|
+
strength — as markdown an operator can read and paste, never a rendered HTML report.
|
|
90
|
+
|
|
91
|
+
**Route: candidate → grilling-to-design.** The operator picks a candidate; it enters the existing
|
|
92
|
+
grilling-to-design flow (the planning half — `/sp:dev-idea` / `/sp:dev-plan`) as a generated idea,
|
|
93
|
+
where it is stress-tested and shaped into a task. The survey stops at surfacing candidates; it never
|
|
94
|
+
auto-refactors — upkeep framing, not a refactor bot.
|
|
95
|
+
|
|
96
|
+
## Arguments
|
|
97
|
+
|
|
98
|
+
When invoked via `/sp:dev-arch`, the command forwards `survey $ARGUMENTS` to this skill:
|
|
99
|
+
|
|
100
|
+
| Argument | Description | Default |
|
|
101
|
+
|----------|-------------|---------|
|
|
102
|
+
| `[<module-path>]` | Module path to scope the architecture survey. | omitted (whole repo) |
|
|
103
|
+
| `--scope <all\|path>` | Limit the survey to a path or expand to the whole repo. | all |
|
|
104
|
+
| `--json` | Emit structured JSON instead of the MARKDOWN candidate report. | off |
|
|
105
|
+
|
|
106
|
+
`--agent <inline|auto|name>` is consumed by the `dev-arch` wrapper (execution-surface selection) and is not forwarded as a survey argument.
|
|
107
|
+
|
|
108
|
+
## Common Rationalizations
|
|
109
|
+
|
|
110
|
+
| Rationalization | Reality |
|
|
111
|
+
|---|---|
|
|
112
|
+
| "One option is obviously right — no need to compare." | Evaluating a single option is rationalization, not a decision. Weigh at least two; the second reveals the first's cost. |
|
|
113
|
+
| "Add a layer now for future flexibility." | A layer with one implementation is a shallow module that adds indirection, not depth. Add the seam when a second case is real. |
|
|
114
|
+
| "We'll refactor the shortcut later." | "Later" rarely comes; the shortcut becomes load-bearing. Decide the boundary now, or record the debt explicitly. |
|
|
115
|
+
| "This decision is small — skip the ADR." | Cross-cutting choices (a new package, a transport swap, an auth boundary) are exactly what the ADR captures. Small-looking seams calcify. |
|
|
116
|
+
| "More abstraction is more robust." | Depth is interface-simplicity over capability, not layer count. The deletion test: if removing the module simplifies the system, it was shallow. |
|
|
117
|
+
|
|
118
|
+
## Red Flags
|
|
119
|
+
|
|
120
|
+
- A design presented with exactly one option and no alternative considered.
|
|
121
|
+
- A new module/layer whose interface is as complex as what it wraps (a pass-through).
|
|
122
|
+
- A cross-cutting decision made with no ADR entry and no recorded reason.
|
|
123
|
+
- Abstraction justified only by hypothetical future requirements.
|
|
124
|
+
- A boundary that fails the deletion test — the system is simpler without it.
|
|
125
|
+
|
|
126
|
+
## Gotchas
|
|
127
|
+
|
|
128
|
+
1. **Decide, then hand off.** This skill ends at a recorded decision + a filled `## Design`; the
|
|
129
|
+
spine dispatches `sp:code-implementation` to build it. Do not write feature code here.
|
|
130
|
+
2. **One-line reason is mandatory.** A decision without its reason is not a decision — `docs/00_ADR.md`
|
|
131
|
+
exists precisely to carry the *why*.
|
|
132
|
+
3. **Prefer extending a seam over adding one.** A new boundary is justified only when it removes real
|
|
133
|
+
complexity or gives a second concrete caller/adapter.
|
|
134
|
+
4. **Route to the owning doc.** Decision + reason → `00`; mechanism/rationale in depth → `03`;
|
|
135
|
+
command/config/schema shapes → `04`. Do not restate a fact across docs.
|
|
136
|
+
|
|
137
|
+
## See also
|
|
138
|
+
|
|
139
|
+
- **`sp:spur-dev`** — the spine that consults this competency when a task's design is unsettled.
|
|
140
|
+
- **`sp:code-implementation`** — builds the shape this skill decides.
|
|
141
|
+
- **`docs/00_ADR.md` / `docs/03_ARCHITECTURE.md`** — the homes for the decisions and rationale this
|
|
142
|
+
skill produces.
|
|
143
|
+
|
|
144
|
+
## Platform Notes
|
|
145
|
+
|
|
146
|
+
### Claude Code
|
|
147
|
+
|
|
148
|
+
Invoke directly via `Skill(skill="sp:sys-architecture", args="<question>")`, or as the design step of
|
|
149
|
+
planning. Use the `spur` CLI via the Bash tool to write a task's `## Design`; edit `docs/00_ADR.md`
|
|
150
|
+
directly for ADR entries.
|
|
151
|
+
|
|
152
|
+
### Codex / OpenClaw / OpenCode / Antigravity
|
|
153
|
+
|
|
154
|
+
Invoke this skill directly for design judgment; write decisions to the owning docs and task sections.
|
|
155
|
+
The skill is the SSOT for the method; the result lives in the docs it routes to.
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: decision-method
|
|
3
|
+
description: "The architecture decision method for sp:sys-architecture — candidate generation, the tradeoff dimensions, the deep-vs-shallow-module test, and the ADR-or-not gate. Produces a recorded decision with a one-line reason, routed to the owning doc."
|
|
4
|
+
see_also:
|
|
5
|
+
- sys-architecture
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Architecture Decision Method
|
|
9
|
+
|
|
10
|
+
The procedure `sp:sys-architecture` runs to turn a design question into a recorded decision. The
|
|
11
|
+
output is always **a chosen option + a one-line reason**, routed to its owning doc.
|
|
12
|
+
|
|
13
|
+
## 1. Frame the decision
|
|
14
|
+
|
|
15
|
+
State, in one sentence, what is being decided. If you cannot state it in one sentence, the decision
|
|
16
|
+
is actually several — split them and decide in dependency order. Read the codebase first: many
|
|
17
|
+
"decisions" are already constrained by an existing pattern, dependency, or convention. If the answer
|
|
18
|
+
is in the code, state it and stop — do not manufacture options for a settled question.
|
|
19
|
+
|
|
20
|
+
## 2. Generate 2–3 candidates
|
|
21
|
+
|
|
22
|
+
Never evaluate a single option (that is rationalization, not a decision) and rarely more than three
|
|
23
|
+
(analysis paralysis). For each candidate, name what it commits to and what it defers. Bias toward
|
|
24
|
+
options that *extend an existing seam* over options that *introduce a new one*.
|
|
25
|
+
|
|
26
|
+
## 3. Weigh on the dimensions that matter
|
|
27
|
+
|
|
28
|
+
Score the candidates on the axes relevant to this decision — not all apply every time:
|
|
29
|
+
|
|
30
|
+
| Dimension | The question |
|
|
31
|
+
|-----------|--------------|
|
|
32
|
+
| **Coupling** | What does this bind together that was independent? Can the two sides still evolve apart? |
|
|
33
|
+
| **Blast radius** | If this is wrong, how much has to change to undo it? |
|
|
34
|
+
| **Reversibility** | Is this a one-way door (hard to reverse) or a two-way door (cheap to revisit)? |
|
|
35
|
+
| **Scalability** | Does it hold at the next order of magnitude of load/size/teams, or is there a known cliff? |
|
|
36
|
+
| **Cost** | Build/run/maintain cost — including the cost of a new dependency or runtime. |
|
|
37
|
+
| **Conformance** | Does it match the codebase's existing conventions, or fork them? |
|
|
38
|
+
|
|
39
|
+
A one-way door with a large blast radius deserves more deliberation and almost always an ADR; a
|
|
40
|
+
two-way door can be decided fast and revisited.
|
|
41
|
+
|
|
42
|
+
## 4. Apply the deep-module vocabulary
|
|
43
|
+
|
|
44
|
+
Prefer a design whose modules are **deep**: a narrow interface hiding substantial capability, reused
|
|
45
|
+
by callers that do not need to know its internals. Be suspicious of **shallow** modules — thin
|
|
46
|
+
wrappers with a wide interface, or boundaries drawn along *temporal phases* ("a step-1 module and a
|
|
47
|
+
step-2 module") rather than *capabilities*. A boundary that two callers almost always cross together
|
|
48
|
+
is the wrong boundary; relocate or remove it.
|
|
49
|
+
|
|
50
|
+
Use these seven terms precisely — each has near-synonyms this method deliberately avoids, because a
|
|
51
|
+
vaguer word lets an under-designed boundary pass without scrutiny:
|
|
52
|
+
|
|
53
|
+
| Term | Meaning | Avoid |
|
|
54
|
+
|------|---------|-------|
|
|
55
|
+
| **Module** | A unit of functionality with one owner and one reason to change. | "piece", "part", "chunk" |
|
|
56
|
+
| **Interface** | The surface callers depend on — signatures, types, contracts. Not the implementation. | "API" (too transport-coded), "surface area" |
|
|
57
|
+
| **Depth** | Capability hidden ÷ interface size. A deep module does a lot behind a little. | "complexity" (depth is the *ratio*, not raw complexity) |
|
|
58
|
+
| **Seam** | A place the design can vary without the caller knowing — the proven joint an adapter sits on. | "layer", "boundary" (see Rejected framings) |
|
|
59
|
+
| **Adapter** | A concrete implementation behind a seam. One adapter alone does not prove the seam is real. | "wrapper", "shim" |
|
|
60
|
+
| **Leverage** | What a module buys its callers — the work it removes from every call site. | "value", "benefit" |
|
|
61
|
+
| **Locality** | How much of a change stays inside one module vs. spilling across many. | "cohesion" (locality is about *change*, not static grouping) |
|
|
62
|
+
|
|
63
|
+
**The deletion test:** for any proposed module or seam, ask "if I deleted this and inlined its one
|
|
64
|
+
caller, would anything get harder?" If no caller would notice, the boundary is not pulling its
|
|
65
|
+
weight — either it hides no real complexity, or it has exactly one caller and no second use in
|
|
66
|
+
sight. Deletion-test failures are the most common shallow-module smell.
|
|
67
|
+
|
|
68
|
+
**One adapter = hypothetical seam, two = real.** A seam justified by "we might swap this later" is
|
|
69
|
+
speculative until a second adapter actually exists. Building a seam for a hypothetical second
|
|
70
|
+
implementation is premature abstraction (R2); building it when the second implementation is already
|
|
71
|
+
needed is a real seam. When in doubt, inline the single adapter and extract the seam when the second
|
|
72
|
+
caller arrives — extraction is cheap, premature generality is not.
|
|
73
|
+
|
|
74
|
+
**The interface is the test surface.** A deep module's tests exercise the interface, not the
|
|
75
|
+
internals — if a test needs to reach past the interface to assert something, either the interface
|
|
76
|
+
is missing a capability it should expose, or the test is coupling to implementation detail that
|
|
77
|
+
will make refactors expensive. This is also the fastest depth check available: an interface you
|
|
78
|
+
can test completely from outside is doing its job.
|
|
79
|
+
|
|
80
|
+
### Rejected framings
|
|
81
|
+
|
|
82
|
+
These near-synonym terms are deliberately **not** used in this method, to keep the vocabulary above
|
|
83
|
+
unambiguous:
|
|
84
|
+
|
|
85
|
+
| Term | Why rejected |
|
|
86
|
+
|------|--------------|
|
|
87
|
+
| **Component** | Overloaded across UI frameworks and infra tooling — does not distinguish depth from size. |
|
|
88
|
+
| **Service** | Implies a network/process boundary; conflates *module* (a code-level unit) with *deployment* (an infra-level unit). A module is not always a service and a service is not always one module. |
|
|
89
|
+
| **Boundary** | Too generic — used for module edges, security perimeters, and transaction scopes alike. This method uses **seam** for the specific "place the design can vary" meaning. |
|
|
90
|
+
|
|
91
|
+
### Design-it-twice (for a genuinely unsettled interface)
|
|
92
|
+
|
|
93
|
+
When the interface shape itself is the open question — not just which of two known options to
|
|
94
|
+
pick, but what the right shape even is — fan out 2–3 radically different interface designs in
|
|
95
|
+
parallel via `sp:parallel-execution` (independent subagents, one design each, same problem
|
|
96
|
+
statement) rather than iterating on one design serially. Compare the results on **depth**,
|
|
97
|
+
**locality**, and **seam placement** — the three axes above that a single linear design pass tends
|
|
98
|
+
to anchor on its first idea instead of exploring. Use this only when the interface is the crux of
|
|
99
|
+
the decision; for a settled interface with a build-vs-extend question, steps 1–3 above are enough.
|
|
100
|
+
|
|
101
|
+
## 5. Recommend one, with the one-line reason
|
|
102
|
+
|
|
103
|
+
Pick the candidate that best fits the weighed dimensions and state the single sentence that justifies
|
|
104
|
+
it over the runner-up. The reason is the deliverable — a decision without its reason cannot be
|
|
105
|
+
maintained or revisited honestly.
|
|
106
|
+
|
|
107
|
+
## 6. The ADR-or-not gate
|
|
108
|
+
|
|
109
|
+
Record a dated **ADR** entry in `docs/00_ADR.md` when the decision is **cross-cutting and hard to
|
|
110
|
+
reverse** — any of:
|
|
111
|
+
|
|
112
|
+
- introduces, swaps, or removes a dependency, transport, runtime, or data store;
|
|
113
|
+
- changes a module/package boundary or an auth surface;
|
|
114
|
+
- sets a convention other code must follow;
|
|
115
|
+
- supersedes or diverges from a prior recorded decision.
|
|
116
|
+
|
|
117
|
+
Otherwise the decision is **task-local**: write it to the task's `## Design` section via
|
|
118
|
+
`spur task update <wbs> --section Design --from-file <tmp>`. When uncertain, prefer recording — a
|
|
119
|
+
cheap ADR entry beats an undocumented divergence, and the project conflict rule forbids diverging
|
|
120
|
+
from a decision that was never recorded.
|
|
121
|
+
|
|
122
|
+
## 7. Route to the owning doc (do not restate)
|
|
123
|
+
|
|
124
|
+
| Output | Home |
|
|
125
|
+
|--------|------|
|
|
126
|
+
| The decision + its one-line reason | `docs/00_ADR.md` (cross-cutting) or the task's `## Design` (task-local) |
|
|
127
|
+
| Mechanism, data flow, invariants, rationale in depth | `docs/03_ARCHITECTURE.md` |
|
|
128
|
+
| Concrete command / flag / config / schema shapes | `docs/04_DESIGN.md` |
|
|
129
|
+
|
|
130
|
+
A fact lives in exactly one doc; the others link to it. If you find yourself writing *how it's built*
|
|
131
|
+
or *why* inside `00`, it belongs in `03` — move it and link.
|
|
132
|
+
|
|
133
|
+
## Handoff
|
|
134
|
+
|
|
135
|
+
The decision is complete when: one option is chosen with a one-line reason, it is recorded in its
|
|
136
|
+
owning doc (ADR or task `## Design`), and `sp:code-implementation` can build it without re-deciding
|
|
137
|
+
anything. Hand off to the spine (`sp:spur-dev`) to dispatch implementation.
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: upkeep-survey
|
|
3
|
+
description: "The architecture-upkeep survey procedure for sp:sys-architecture — scan a codebase (or module tree) for shallow modules and deepening opportunities using the deep-module vocabulary, and emit a MARKDOWN candidate report that feeds the planning half. Surfaces candidates; never auto-refactors."
|
|
4
|
+
see_also:
|
|
5
|
+
- sys-architecture
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Architecture-Upkeep Survey
|
|
9
|
+
|
|
10
|
+
A whole-codebase (or named-module-tree) audit that surfaces **deepening opportunities** — places where
|
|
11
|
+
a shallow module, a pass-through wrapper, or a leaky seam could be made deeper, simpler at the
|
|
12
|
+
interface, or better-located. It is the standing-upkeep counterpart to the per-decision design method
|
|
13
|
+
in [decision-method.md](decision-method.md): same vocabulary, different trigger. It **generates
|
|
14
|
+
candidates for the planning half**; it never edits code.
|
|
15
|
+
|
|
16
|
+
## Scope
|
|
17
|
+
|
|
18
|
+
- **Whole codebase** (default) or a **named module tree** (`apps/cli`, `packages/domain`, …).
|
|
19
|
+
- Prefer a bounded tree per run — a survey that flags fifty things helps no one. Rank hard, present few.
|
|
20
|
+
|
|
21
|
+
## Method — reuse the deep-module vocabulary
|
|
22
|
+
|
|
23
|
+
Apply the vocabulary and tests defined in [decision-method.md](decision-method.md) §4 (do not restate
|
|
24
|
+
them here): **module / interface / depth / seam / adapter / leverage / locality**, and the **deletion
|
|
25
|
+
test**. Scan for the smells that vocabulary names:
|
|
26
|
+
|
|
27
|
+
| Smell | What to look for |
|
|
28
|
+
|---|---|
|
|
29
|
+
| **Shallow module** | Interface nearly as large as the implementation it hides — little capability per unit of interface. |
|
|
30
|
+
| **Pass-through wrapper** | A module whose methods just forward to another with no added value — fails the deletion test. |
|
|
31
|
+
| **Leaky seam** | A boundary that exposes its internals; callers reach past the interface into implementation. |
|
|
32
|
+
| **Misplaced locality** | Logic that lives far from the data/state it operates on, forcing round-trips. |
|
|
33
|
+
| **Repeated adapter** | The same glue written at many call sites instead of behind one seam. |
|
|
34
|
+
|
|
35
|
+
For each candidate, run the **deletion test**: "if I deleted this module and inlined it, does the
|
|
36
|
+
system get simpler?" A yes is the strongest signal it is shallow.
|
|
37
|
+
|
|
38
|
+
## Output — a MARKDOWN candidate report (never HTML)
|
|
39
|
+
|
|
40
|
+
Emit markdown the operator can read and paste. One block per candidate, ranked strongest-first:
|
|
41
|
+
|
|
42
|
+
```markdown
|
|
43
|
+
## Architecture-upkeep candidates — <scope> (<date>)
|
|
44
|
+
|
|
45
|
+
### C1 — <short title> [strength: strong | moderate | speculative]
|
|
46
|
+
- **Files:** `path/a.ts`, `path/b.ts`
|
|
47
|
+
- **Problem:** <which smell; the deletion-test result in one line>
|
|
48
|
+
- **Proposed deepening:** <the restructuring — the deeper module / merged seam / relocated logic>
|
|
49
|
+
- **Before → after (prose):** <today's shape> → <the proposed shape>, and why the interface shrinks
|
|
50
|
+
- **Recommendation:** <do it now / schedule / leave — with the one-line reason>
|
|
51
|
+
|
|
52
|
+
### C2 — …
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
- **Markdown only.** Never emit an HTML report; the corpus and the operator read markdown.
|
|
56
|
+
- **Strength label is mandatory** so the operator can triage; a survey with no ranking is noise.
|
|
57
|
+
- **Before/after in prose**, not a diff — the survey proposes shape, it does not write the change.
|
|
58
|
+
|
|
59
|
+
## Route — candidate → grilling-to-design
|
|
60
|
+
|
|
61
|
+
The survey ends at the report. The operator picks a candidate and routes it into the **planning half**
|
|
62
|
+
as a generated idea:
|
|
63
|
+
|
|
64
|
+
- `/sp:dev-idea` — turn the candidate into a feature + task batch (when it is a larger restructuring).
|
|
65
|
+
- `/sp:dev-plan` — plan it directly (when it is a single, well-scoped deepening).
|
|
66
|
+
|
|
67
|
+
The chosen candidate is then **grilled** through the normal design flow (2–3 approaches, tradeoffs,
|
|
68
|
+
approval gate) before any code is written. The survey never auto-refactors — it only surfaces the
|
|
69
|
+
candidate and hands it to planning.
|
|
70
|
+
|
|
71
|
+
## Upkeep framing (the one rule)
|
|
72
|
+
|
|
73
|
+
Surface candidates; **never** auto-refactor. The value is the ranked shortlist of where the
|
|
74
|
+
architecture could deepen, presented for a human decision — not an autonomous rewrite. A survey that
|
|
75
|
+
changes code has overstepped its role.
|