shapeup-sdlc 1.6.2
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/settings.local.example.json +20 -0
- package/.claude-plugin/marketplace.json +16 -0
- package/.claude-plugin/plugin.json +18 -0
- package/.env.shapeup.example +14 -0
- package/AGENTS.md +133 -0
- package/LICENSE +21 -0
- package/README.md +362 -0
- package/SECURITY.md +72 -0
- package/bin/init.mjs +329 -0
- package/commands/build.md +14 -0
- package/commands/eval.md +15 -0
- package/commands/hammer.md +12 -0
- package/commands/orient.md +11 -0
- package/commands/qa.md +12 -0
- package/commands/retro.md +13 -0
- package/commands/scopes.md +14 -0
- package/commands/shape.md +12 -0
- package/commands/ship.md +53 -0
- package/commands/wire.md +11 -0
- package/hooks/anti-rationalization.mjs +244 -0
- package/hooks/compact-snapshot.mjs +47 -0
- package/hooks/gate-deadline.mjs +151 -0
- package/hooks/gate-intake.mjs +110 -0
- package/hooks/gate-l2.mjs +161 -0
- package/hooks/gate-zerowork.mjs +264 -0
- package/hooks/hooks.json +118 -0
- package/hooks/lib/decision.mjs +183 -0
- package/hooks/safety-spine.mjs +296 -0
- package/hooks/sandbox-guard.mjs +172 -0
- package/hooks/session-rehydrate.mjs +109 -0
- package/hooks/slop-cleaner.mjs +176 -0
- package/oracles/_shared.mjs +46 -0
- package/oracles/http-oracle.mjs +155 -0
- package/oracles/index.mjs +36 -0
- package/oracles/process-oracle.mjs +146 -0
- package/oracles/snapshot-oracle.mjs +119 -0
- package/oracles/test-oracle.mjs +138 -0
- package/package.json +49 -0
- package/skills/advisor-protocol/SKILL.md +171 -0
- package/skills/ba-pitch-analyzer/SKILL.md +175 -0
- package/skills/ba-pitch-analyzer/assets/templates/_index.tmpl.md +84 -0
- package/skills/ba-pitch-analyzer/assets/templates/api-feasibility.tmpl.md +65 -0
- package/skills/ba-pitch-analyzer/assets/templates/assess-report.tmpl.md +127 -0
- package/skills/ba-pitch-analyzer/assets/templates/contracts/be-service.contract.tmpl.md +62 -0
- package/skills/ba-pitch-analyzer/assets/templates/contracts/offline-storage.contract.tmpl.md +92 -0
- package/skills/ba-pitch-analyzer/assets/templates/contracts/third-party-api.contract.tmpl.md +66 -0
- package/skills/ba-pitch-analyzer/assets/templates/cross-context/context-map.tmpl.md +64 -0
- package/skills/ba-pitch-analyzer/assets/templates/cross-context/event-choreography.tmpl.md +77 -0
- package/skills/ba-pitch-analyzer/assets/templates/cross-context/migration-plan.tmpl.md +104 -0
- package/skills/ba-pitch-analyzer/assets/templates/cross-context/team-handoff.tmpl.md +79 -0
- package/skills/ba-pitch-analyzer/assets/templates/domain-model.tmpl.md +79 -0
- package/skills/ba-pitch-analyzer/assets/templates/feedback.tmpl.md +87 -0
- package/skills/ba-pitch-analyzer/assets/templates/integration.tmpl.md +64 -0
- package/skills/ba-pitch-analyzer/assets/templates/run-state.tmpl.md +77 -0
- package/skills/ba-pitch-analyzer/assets/templates/scope-summary.tmpl.md +105 -0
- package/skills/ba-pitch-analyzer/assets/templates/synthesis.tmpl.md +215 -0
- package/skills/ba-pitch-analyzer/assets/templates/task-board.tmpl.md +35 -0
- package/skills/ba-pitch-analyzer/assets/templates/task-spike.tmpl.md +86 -0
- package/skills/ba-pitch-analyzer/assets/templates/task.tmpl.md +84 -0
- package/skills/ba-pitch-analyzer/assets/templates/usecase.tmpl.md +105 -0
- package/skills/ba-pitch-analyzer/assets/templates/ux-behavior.tmpl.md +65 -0
- package/skills/ba-pitch-analyzer/references/contract-patterns.md +152 -0
- package/skills/ba-pitch-analyzer/references/ddd-patterns.md +173 -0
- package/skills/ba-pitch-analyzer/references/doc-schemas.md +275 -0
- package/skills/ba-pitch-analyzer/references/integration-analysis.md +152 -0
- package/skills/ba-pitch-analyzer/references/task-generation.md +623 -0
- package/skills/ba-pitch-analyzer/references/test-surface.md +102 -0
- package/skills/ba-pitch-analyzer/references/ux-behavior-patterns.md +269 -0
- package/skills/ba-pitch-analyzer/scripts/board-derive.mjs +241 -0
- package/skills/ba-pitch-analyzer/scripts/spec-lint.mjs +239 -0
- package/skills/coach/SKILL.md +202 -0
- package/skills/orient/SKILL.md +262 -0
- package/skills/qa-edge-hunter/SKILL.md +369 -0
- package/skills/scope-architect/SKILL.md +111 -0
- package/skills/scope-hammer/SKILL.md +186 -0
- package/skills/shapeup/SKILL.md +403 -0
- package/skills/shapeup/resources/breadboard-reflection.md +88 -0
- package/skills/shapeup/resources/breadboarding.md +334 -0
- package/skills/shapeup/resources/context-compaction.md +240 -0
- package/skills/shapeup/resources/framing-doc.md +92 -0
- package/skills/shapeup/resources/kickoff-doc.md +95 -0
- package/skills/shapeup/resources/shaping.md +194 -0
- package/skills/shapeup/resources/spike.md +86 -0
- package/skills/solution-architect/SKILL.md +129 -0
- package/skills/spec-evaluator/README.md +93 -0
- package/skills/spec-evaluator/SKILL.md +213 -0
- package/skills/spec-evaluator/references/anti-leniency.md +50 -0
- package/skills/spec-evaluator/references/dimension-contract.md +126 -0
- package/skills/spec-evaluator/references/dimensions/_registry.md +40 -0
- package/skills/spec-evaluator/references/dimensions/completeness.md +102 -0
- package/skills/spec-evaluator/references/dimensions/integration.md +129 -0
- package/skills/spec-evaluator/references/dimensions/performance.md +48 -0
- package/skills/spec-evaluator/references/dimensions/security.md +60 -0
- package/skills/spec-evaluator/references/dimensions/spec-conformance.md +134 -0
- package/skills/spec-evaluator/references/dimensions/tdd-surface.md +110 -0
- package/skills/spec-evaluator/references/dimensions/test-surface-conformance.md +100 -0
- package/skills/spec-evaluator/references/probing.md +177 -0
- package/skills/spec-evaluator/references/report-schema.md +101 -0
- package/skills/spec-evaluator/references/verdict-ledger.md +92 -0
- package/skills/spec-evaluator/scripts/verdict-ledger.mjs +166 -0
- package/skills/task-executor/SKILL.md +194 -0
- package/skills/tech-lead/README.md +71 -0
- package/skills/tech-lead/SKILL.md +459 -0
- package/skills/tech-lead/references/delegation.md +254 -0
- package/skills/tech-lead/references/gates.md +379 -0
- package/skills/tech-lead/references/invocation.md +45 -0
- package/skills/tech-lead/references/ledger-schema.md +214 -0
- package/skills/tech-lead/references/round-protocol.md +184 -0
- package/skills/tech-lead/references/state-model.md +66 -0
- package/skills/tech-lead/references/tiny-lane.md +52 -0
- package/skills/tech-lead/schemas/domain.schema.json +2294 -0
- package/skills/tech-lead/schemas/gate-answers.schema.json +92 -0
- package/skills/tech-lead/schemas/work-order.schema.json +21 -0
- package/skills/tech-lead/schemas/work-result.schema.json +40 -0
- package/skills/tech-lead/scripts/aegis-digest.mjs +124 -0
- package/skills/tech-lead/scripts/budget-check.mjs +156 -0
- package/skills/tech-lead/scripts/compile-order.mjs +518 -0
- package/skills/tech-lead/scripts/fit-check.mjs +196 -0
- package/skills/tech-lead/scripts/gate-answers.mjs +338 -0
- package/skills/tech-lead/scripts/ingest-result.mjs +270 -0
- package/skills/tech-lead/scripts/init-run.mjs +326 -0
- package/skills/tech-lead/scripts/lib/argv.mjs +224 -0
- package/skills/tech-lead/scripts/lib/contract-md.mjs +481 -0
- package/skills/tech-lead/scripts/lib/is-main.mjs +82 -0
- package/skills/tech-lead/scripts/lib/paths.mjs +278 -0
- package/skills/tech-lead/scripts/lib/ratchet-tree.mjs +112 -0
- package/skills/tech-lead/scripts/run-snapshot.mjs +269 -0
- package/skills/tech-lead/scripts/ship-report.mjs +275 -0
- package/skills/tech-lead/scripts/stats.mjs +423 -0
- package/skills/tech-lead/scripts/t0-verify.mjs +470 -0
- package/skills/tech-lead/scripts/trace-lint.mjs +367 -0
- package/skills/tech-lead/scripts/validate-envelope.mjs +283 -0
- package/skills/translator/README.md +66 -0
- package/skills/translator/SKILL.md +258 -0
- package/skills/translator/references/preservation-rules.md +102 -0
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# Kickoff Doc — Reference
|
|
2
|
+
|
|
3
|
+
> Source: rjs/shaping-skills (upstream). Loaded on demand by the shapeup skill.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## What This Does
|
|
8
|
+
|
|
9
|
+
Turns a shaped project kickoff transcript into a **builder reference document**. Captures what was shaped, what was agreed, and what the builder needs before starting.
|
|
10
|
+
|
|
11
|
+
**⚠️ GIGO Warning:** Same as framing-doc — formats and distills, doesn't evaluate.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## When to Use
|
|
16
|
+
|
|
17
|
+
- You have a transcript of a kickoff/handoff meeting for a shaped project
|
|
18
|
+
- You need a document the builder can reference during implementation
|
|
19
|
+
- The shape already exists and decisions have been made
|
|
20
|
+
|
|
21
|
+
**This is a document skill for team contexts.** Not part of the solo shaping workflow.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Phase K1 — Parse Transcript
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
Read entire transcript before writing. Extract:
|
|
29
|
+
- The shaped solution: what parts/mechanisms were agreed
|
|
30
|
+
- Scope boundaries: what's in, what's explicitly out
|
|
31
|
+
- Known rabbit holes flagged
|
|
32
|
+
- Decisions already made (builder should not re-open these)
|
|
33
|
+
- Open questions for the builder to resolve
|
|
34
|
+
- Constraints: timeline, integration dependencies, platform limits
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Phase K2 — Write Kickoff Document
|
|
40
|
+
|
|
41
|
+
Write `shapeup/[feature-slug]/shaping/kickoff.md`
|
|
42
|
+
|
|
43
|
+
```markdown
|
|
44
|
+
---
|
|
45
|
+
shaping: true
|
|
46
|
+
feature: [feature-slug]
|
|
47
|
+
doc_type: kickoff
|
|
48
|
+
status: active
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
# [Feature Name] — Kickoff Reference
|
|
52
|
+
|
|
53
|
+
## What We're Building
|
|
54
|
+
[1–2 sentences: the core mechanism from the user's perspective]
|
|
55
|
+
|
|
56
|
+
## The Shape
|
|
57
|
+
A1: [part name] — [one sentence description]
|
|
58
|
+
A2: ...
|
|
59
|
+
|
|
60
|
+
## In Scope
|
|
61
|
+
[Explicit boundaries of this cycle's work]
|
|
62
|
+
|
|
63
|
+
## Out of Scope
|
|
64
|
+
[Things deferred — not "never", just "not this cycle"]
|
|
65
|
+
|
|
66
|
+
## Known Rabbit Holes
|
|
67
|
+
[Areas flagged as risky. Include the specific risk if mentioned.]
|
|
68
|
+
|
|
69
|
+
## Decisions Already Made
|
|
70
|
+
[Things the builder should NOT re-open during implementation.
|
|
71
|
+
If something seems wrong: raise it before building, not after.]
|
|
72
|
+
|
|
73
|
+
## Open Questions for the Builder
|
|
74
|
+
[Things left for builder to resolve during implementation]
|
|
75
|
+
|
|
76
|
+
## Constraints
|
|
77
|
+
[Timeline, integration dependencies, platform limits]
|
|
78
|
+
[Omit if not mentioned in transcript]
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
*Generated from kickoff transcript. Reference, not specification.*
|
|
82
|
+
*For wiring detail: [[breadboard.md]]*
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## Phase K3 — Quality Check
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
- [ ] "Decisions Already Made" contains ONLY things explicitly agreed — no assumptions
|
|
91
|
+
- [ ] "Open Questions" are builder-resolvable, not business strategy questions
|
|
92
|
+
- [ ] Shape parts are at mechanism level, not implementation detail
|
|
93
|
+
- [ ] No technology choices in shape unless explicitly agreed in transcript
|
|
94
|
+
- [ ] Wikilink to breadboard.md included if it exists
|
|
95
|
+
```
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
# Shaping — Reference
|
|
2
|
+
|
|
3
|
+
> Source: rjs/shaping-skills (upstream) + local v1.x extensions. Loaded on demand by the shapeup skill.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## What Shaping Does
|
|
8
|
+
|
|
9
|
+
Shaping separates **what you need** (requirements) from **how you might build it** (shape). It ends when every requirement maps to a shape part. Unknowns are flagged for spikes.
|
|
10
|
+
|
|
11
|
+
**Stop here — do not slice yet.** Slicing is the final phase of breadboarding.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## When to Use Shaping
|
|
16
|
+
|
|
17
|
+
- You have an idea but haven't separated problem from solution
|
|
18
|
+
- You want to explore multiple solution options before committing
|
|
19
|
+
- Any "should we build X or Y?" decision
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Phase S1 — Problem Frame + Appetite
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
1. Ask: "Describe the problem from the user's perspective. What's broken or missing?"
|
|
27
|
+
2. Capture:
|
|
28
|
+
- Situation: what triggers the need
|
|
29
|
+
- Complication: what's wrong or missing right now
|
|
30
|
+
- Desired outcome: what success looks like for the user
|
|
31
|
+
- Anti-goals: what we're explicitly NOT solving
|
|
32
|
+
3. Collect appetite (time budget):
|
|
33
|
+
Ask: "How long is the right amount of time to spend on this? (e.g. ~1 week, ~2 weeks)"
|
|
34
|
+
Appetite is the scope anchor — it decides what's in vs. out when tradeoffs arise.
|
|
35
|
+
If the user gives no bound: prompt once, then proceed with "appetite: TBD (uncapped)".
|
|
36
|
+
Warning: an uncapped appetite tends to produce shapes that are too large.
|
|
37
|
+
4. Write a one-paragraph problem statement.
|
|
38
|
+
Rule: no solution language — observable symptoms only.
|
|
39
|
+
5. Ask: "Is this the right problem, or is there a more fundamental one?"
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Output: Internal only. Do NOT write files yet.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Phase S2 — Requirements (R)
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
1. Derive requirements as observable outcomes from the problem frame.
|
|
50
|
+
Format: R[N]: [observable condition that must be true when feature is done]
|
|
51
|
+
Example: R0: User sees empty dashboard with guided setup when no data exists
|
|
52
|
+
2. Number them R0..RN
|
|
53
|
+
3. Flag any R that blurs into solution territory — note it, keep it for discussion
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
**Good requirements are:**
|
|
57
|
+
- Observable from the outside (a QA person could verify them)
|
|
58
|
+
- Technology-agnostic (no tables, components, API names)
|
|
59
|
+
- Non-redundant (each R covers exactly one observable thing)
|
|
60
|
+
|
|
61
|
+
Output: Internal R-list only.
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Phase S2.5 — Rabbit Holes + No-goes
|
|
66
|
+
|
|
67
|
+
Before selecting a shape, surface the known traps.
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
1. Ask: "Are there any approaches that look obvious but would derail the build?
|
|
71
|
+
Any known rabbit holes — things that could eat weeks of implementation time?"
|
|
72
|
+
2. Also capture explicit no-goes: things the user has already decided NOT to build.
|
|
73
|
+
3. Record both lists. They constrain shape selection in S3:
|
|
74
|
+
- A shape that passes through a rabbit hole needs extra justification or a spike.
|
|
75
|
+
- No-goes block shape parts silently assumed — call them out.
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
**Why this matters:** Rabbit holes are the most common reason a well-shaped feature blows
|
|
79
|
+
its appetite. Naming them before shape selection keeps S3 honest.
|
|
80
|
+
|
|
81
|
+
Skip if: input has already listed no-goes and confirmed no known traps.
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## Phase S3 — Solution Shape (A)
|
|
86
|
+
|
|
87
|
+
```
|
|
88
|
+
1. Generate 2–3 possible shapes — named sets of parts/mechanisms.
|
|
89
|
+
Format: A[N]: [part name] — [one sentence: what it does for the user]
|
|
90
|
+
Rule: parts are higher-level than affordances.
|
|
91
|
+
"a settings page with webhook URL" not "a <CopyButton> component"
|
|
92
|
+
2. For each shape, note:
|
|
93
|
+
- What requirements it covers
|
|
94
|
+
- What it leaves unresolved
|
|
95
|
+
- Complexity signal: simple / moderate / complex
|
|
96
|
+
3. Ask: "Which shape resonates? Any better option?"
|
|
97
|
+
4. Select one shape. Record selection rationale.
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
**Fat marker rule:** If describing a part takes more than one sentence, it's too detailed for shaping — save it for breadboarding.
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## Phase S4 — Fit Check
|
|
105
|
+
|
|
106
|
+
```
|
|
107
|
+
For each requirement R[N]:
|
|
108
|
+
Map to shape part(s) A[N] that satisfy it.
|
|
109
|
+
Mark: ✅ covered | ⚠️ partially covered | ❌ not covered
|
|
110
|
+
|
|
111
|
+
If any R is ❌ not covered:
|
|
112
|
+
- Either extend shape with a new part (preferred)
|
|
113
|
+
- Or reclassify as non-goal (with user agreement)
|
|
114
|
+
→ Do NOT proceed to breadboarding with uncovered requirements.
|
|
115
|
+
|
|
116
|
+
If any R is ⚠️ partially:
|
|
117
|
+
- Document what remains unresolved
|
|
118
|
+
- Flag whether a spike is needed before breadboarding
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
**Output table:**
|
|
122
|
+
```
|
|
123
|
+
| R# | Requirement | Covered by | Status |
|
|
124
|
+
|-----|---------------------------------------|------------|--------|
|
|
125
|
+
| R0 | Empty dashboard shows guided setup | A4 | ✅ |
|
|
126
|
+
| R2 | Auto-generated secret per account | A1 | ✅ |
|
|
127
|
+
| R5 | One-click backfill from UI | A3, A4 | ✅ |
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## Output File: shaping.md
|
|
133
|
+
|
|
134
|
+
Write `shapeup/[feature-slug]/shaping/shaping.md`
|
|
135
|
+
|
|
136
|
+
```markdown
|
|
137
|
+
---
|
|
138
|
+
shaping: true
|
|
139
|
+
feature: [feature-slug]
|
|
140
|
+
status: shaped
|
|
141
|
+
appetite: [~1 week | ~2 weeks | ~6 weeks | TBD (uncapped)]
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
# [Feature Name] — Shaping
|
|
145
|
+
|
|
146
|
+
## Problem Frame
|
|
147
|
+
[one paragraph, no solution language]
|
|
148
|
+
|
|
149
|
+
## Appetite
|
|
150
|
+
[time budget + rationale: "~1 week — small improvement, already understand the surface"]
|
|
151
|
+
|
|
152
|
+
## Requirements
|
|
153
|
+
R0: ...
|
|
154
|
+
R1: ...
|
|
155
|
+
|
|
156
|
+
## Rabbit Holes
|
|
157
|
+
[Known traps that could eat the budget — be specific about what makes them dangerous]
|
|
158
|
+
- RH1: [name] — [why it's a rabbit hole]
|
|
159
|
+
(Omit section if none identified — don't invent them)
|
|
160
|
+
|
|
161
|
+
## No-goes
|
|
162
|
+
[Things explicitly outside this feature's scope]
|
|
163
|
+
- [item] — [brief reason]
|
|
164
|
+
(Omit section if none stated by user)
|
|
165
|
+
|
|
166
|
+
## Selected Shape — [Name]
|
|
167
|
+
Rationale: [why this over alternatives; how it fits within the appetite]
|
|
168
|
+
|
|
169
|
+
### Parts
|
|
170
|
+
A1: ...
|
|
171
|
+
A2: ...
|
|
172
|
+
|
|
173
|
+
## Fit Check
|
|
174
|
+
| R# | Requirement | Covered by | Status |
|
|
175
|
+
|----|-------------|------------|--------|
|
|
176
|
+
|
|
177
|
+
## Unknowns → Spike Needed?
|
|
178
|
+
- [ ] [unknown 1] → spike-[slug].md
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
**Note:** This file is a kicked-off pitch. `/ba-pitch-analyzer` and `/tech-lead` consume it as-is — the appetite, rabbit holes, and no-goes inform scope decisions downstream.
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## Common Mistakes
|
|
186
|
+
|
|
187
|
+
| Mistake | Why it matters |
|
|
188
|
+
|---|---|
|
|
189
|
+
| Skipping appetite collection | Without a time budget, every option seems equally valid — the shape has no natural stopping point |
|
|
190
|
+
| Putting slicing inside shaping | Slicing is breadboarding's final phase, not shaping's |
|
|
191
|
+
| Solution language in requirements | "User sees a modal" is not a requirement — it's a shape |
|
|
192
|
+
| Fat marker parts (multi-sentence) | Details belong in breadboarding, not shaping |
|
|
193
|
+
| Skipping fit check | Uncovered requirements lead to missing features in implementation |
|
|
194
|
+
| No rabbit holes section | Known traps go undocumented and derail the build once implementation starts |
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Spike — Reference
|
|
2
|
+
|
|
3
|
+
> Loaded on demand by the shapeup skill.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## What a Spike Is
|
|
8
|
+
|
|
9
|
+
A spike is a **time-boxed investigation** — not a prototype, not a full implementation. It answers a specific question so the breadboard can be grounded in fact.
|
|
10
|
+
|
|
11
|
+
**When to use:** After fit check, when any shape part depends on an assumption that hasn't been verified (library capability, API behavior, performance characteristic).
|
|
12
|
+
|
|
13
|
+
**When NOT to use:** When the unknown is trivial to verify with a quick search. Only spike things that could change the shape if the answer is "no."
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Spike Process
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
1. State the question precisely:
|
|
21
|
+
"Can we use Python's built-in zoneinfo for DST-aware timezone math,
|
|
22
|
+
or do we need a network API like Google Timezone?"
|
|
23
|
+
|
|
24
|
+
2. Define the acceptance condition:
|
|
25
|
+
Yes: [what shape part looks like if confirmed]
|
|
26
|
+
No: [what changes to the shape]
|
|
27
|
+
|
|
28
|
+
3. Conduct the investigation:
|
|
29
|
+
- Check official docs, not community posts
|
|
30
|
+
- Write minimal proof-of-concept code if needed
|
|
31
|
+
- Document what you found and the source
|
|
32
|
+
|
|
33
|
+
4. Record the decision:
|
|
34
|
+
- What was confirmed
|
|
35
|
+
- Which shape part this affects
|
|
36
|
+
- Any constraints or caveats discovered
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Output File: spike-[part].md
|
|
42
|
+
|
|
43
|
+
```markdown
|
|
44
|
+
---
|
|
45
|
+
shaping: true
|
|
46
|
+
feature: [feature-slug]
|
|
47
|
+
doc_type: spike
|
|
48
|
+
part: A[N]
|
|
49
|
+
status: resolved | open
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
# Spike: [Question]
|
|
53
|
+
|
|
54
|
+
## Question
|
|
55
|
+
[precise question this spike answers]
|
|
56
|
+
|
|
57
|
+
## Acceptance Condition
|
|
58
|
+
Yes: [what shape part looks like if confirmed]
|
|
59
|
+
No: [what changes to the shape]
|
|
60
|
+
|
|
61
|
+
## Investigation
|
|
62
|
+
[what was found, with sources]
|
|
63
|
+
|
|
64
|
+
## Decision
|
|
65
|
+
[yes/no + one sentence impact on shape]
|
|
66
|
+
|
|
67
|
+
## Constraints Discovered
|
|
68
|
+
[any caveats the breadboard must account for]
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## SPIKE-UNRESOLVED Fallback
|
|
74
|
+
|
|
75
|
+
If a spike cannot be resolved (external dependency, blocked, time-boxed):
|
|
76
|
+
|
|
77
|
+
```
|
|
78
|
+
SPIKE-UNRESOLVED: [part name]
|
|
79
|
+
- Question: [precise question]
|
|
80
|
+
- Blocker: [why unresolvable now]
|
|
81
|
+
- Risk: [how this could affect the breadboard]
|
|
82
|
+
- Assumption for now: [what we're proceeding with]
|
|
83
|
+
- Revisit when: [condition that unblocks this]
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Proceed with the assumption clearly documented. Revisit before implementation of that specific part.
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: solution-architect
|
|
3
|
+
description: "Use this skill to design how each use-case's engine integrates into the running application — the wiring map that guarantees no engine ships orphaned. Triggers on: \"write the wiring map\", \"declare the integration seam for each use case\", \"how does each use case get wired in\", \"map engines to the entry point\", \"which use cases are reachable from the composition root\", \"the asset pipeline has zero call sites\", \"front-load the integration seam before we slice scopes\", or a tech-lead --order dispatch (operation wire) at gate L1a.5. Writes the per-use-case wiring map: engine → integration seam → composition-root attachment → player-visible affordance, resolved against the project profile's entry_point. NOT for slicing scopes (scope-architect) or decomposing a pitch into tasks (ba-pitch-analyzer)."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Solution Architect (pure worker v1.1)
|
|
7
|
+
|
|
8
|
+
**Design the seam, or the engine ships orphaned.**
|
|
9
|
+
|
|
10
|
+
The audit that motivated this skill found a 631-line asset pipeline with 26 passing tests and
|
|
11
|
+
**zero call sites** in the app's composition root — built, green, and unreachable from the
|
|
12
|
+
running application. Five more scopes had engines never wired to a player. This skill closes that
|
|
13
|
+
hole at the front: before the scopes are sliced, it designs a committed **wiring map**
|
|
14
|
+
(`shapeup/<slug>/wiring-map.md`) that names, for every use case, the chain from the
|
|
15
|
+
engine module to a player-visible affordance — including **how** and **where** the engine attaches
|
|
16
|
+
to the application's entry point.
|
|
17
|
+
|
|
18
|
+
You work at **design time (gate L1a.5), before any code exists.** Your output is *intended*
|
|
19
|
+
architecture — the seam the build must create — not a description of code already written. You do
|
|
20
|
+
**not** verify reachability and you do **not** run any oracle: that is a build-time fact the
|
|
21
|
+
orchestrator's `trace-lint` proves against real code at L1b. Your job is to make the seam
|
|
22
|
+
*explicit and buildable*.
|
|
23
|
+
|
|
24
|
+
Two payoffs, one artifact:
|
|
25
|
+
- **Reachability becomes checkable later.** Because you name each UC's `engine` (a real
|
|
26
|
+
repo-relative module path) and the profile declares the `entry_point`, `trace-lint.mjs` can
|
|
27
|
+
fold this map into its oracle *after the build*: a UC whose engine does not reach the
|
|
28
|
+
`entry_point` via the import graph goes red. You supply the two anchors; the oracle does the
|
|
29
|
+
proving.
|
|
30
|
+
- **The slicer gets its integration seam up front.** Declaring each attachment *before*
|
|
31
|
+
`scope-architect` runs supplies the missing input behind the round-1 substrate-expansion
|
|
32
|
+
escalations — the four identical "declined by precedent" stalls. (This skill *front-loads* the
|
|
33
|
+
seam; it does not enforce the re-slice rule — that's a separate change.)
|
|
34
|
+
|
|
35
|
+
You are the **sole writer** of the wiring map, written **directly** (the same authority
|
|
36
|
+
`scope-architect` has over `scopes/*.md` — you bypass `ingest-result`). Everything else you
|
|
37
|
+
return as a WorkResult.
|
|
38
|
+
|
|
39
|
+
## Input contract — the WorkOrder
|
|
40
|
+
|
|
41
|
+
| Field | What it is |
|
|
42
|
+
|---|---|
|
|
43
|
+
| `operation` | `wire` (author/refresh the wiring map after `analyze`, before `map-scopes`) |
|
|
44
|
+
| `payload.feature` / `payload.spec_folder` | Slug + committed spec — read `usecases/` for the UCs and the engine each one needs, `domain-model.md`/`synthesis.md` for the module surface |
|
|
45
|
+
| `payload.project_profile` | Path to the SHARED `project-profile.md`. Its `entry_point` is the composition root every engine must attach to — **archetype-specific** (a client-only game's `main.js` is not a web-service's `src/server.ts`). Read it; never guess the entry point |
|
|
46
|
+
| `substrate.allowed` | `wiring-map.md` — your ONLY write surface (the spec core, scopes, and the profile are frozen) |
|
|
47
|
+
|
|
48
|
+
**If the profile is absent in an orchestrated run, ESCALATE (spec-ambiguity) — do not invent an
|
|
49
|
+
entry point.** The whole point is that the seam resolves against a *declared* composition root; a
|
|
50
|
+
guessed `main.js` would make the later oracle certify nothing.
|
|
51
|
+
|
|
52
|
+
## Core process
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
1 READ the project profile → entry_point + archetype. Read every use case in usecases/.
|
|
56
|
+
For each UC, identify the engine module that carries its core logic (the file that
|
|
57
|
+
WILL exist, named from the domain model / synthesis surface — not a guess at a folder).
|
|
58
|
+
2 DESIGN for each UC, design the integration path from the entry_point inward:
|
|
59
|
+
engine the module implementing the UC (repo-relative path — the ONE
|
|
60
|
+
field the later reachability oracle resolves; name the real path)
|
|
61
|
+
wiring_seam HOW it attaches — the mechanism: an event handler, a route
|
|
62
|
+
registration, an init hook, a subscription, a DI registration, a
|
|
63
|
+
CLI command, a cron trigger (prose the slicer reads)
|
|
64
|
+
entry_call_site WHERE it attaches — the composition root it registers into, named
|
|
65
|
+
from the profile's entry_point as design intent, e.g.
|
|
66
|
+
"src/server.ts — POST /checkout route" or "main.js — game-loop
|
|
67
|
+
init hook". This is the seam the build will CREATE, symbolic, not
|
|
68
|
+
an existing coordinate. Never invent a line number; the concrete
|
|
69
|
+
file:line is a build-time fact (the oracle proves reachability by
|
|
70
|
+
the import graph, it does not parse this field)
|
|
71
|
+
affordance the player-visible thing this UC exposes once wired (the human
|
|
72
|
+
end of the chain — what a user can DO, not an internal call)
|
|
73
|
+
3 WRITE shapeup/<slug>/wiring-map.md (WiringMap): {schema_version:1, feature,
|
|
74
|
+
entry_point (echo of the profile), entries[]}. One entry per use case. A UC whose
|
|
75
|
+
engine has no attachment path is exactly the gap this artifact exists to surface —
|
|
76
|
+
write the entry with the seam you INTEND and raise it in deviations[]/escalates[], so
|
|
77
|
+
the build knows the wiring it must close. Your craft ends here: WRITE, then return the
|
|
78
|
+
WorkResult. You do not run trace-lint — the orchestrator runs it advisory at L1b.
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
**No use case is exempt.** If a UC's engine genuinely has no player-facing seam (a pure
|
|
82
|
+
background job), say so in `wiring_seam` and name the boot/cron/init attachment that starts it — a
|
|
83
|
+
cron registration, a boot hook. "It's internal" is how the asset pipeline stayed orphaned; there
|
|
84
|
+
is always an attachment to the entry point, or the code never runs.
|
|
85
|
+
|
|
86
|
+
## Anti-rationalization table
|
|
87
|
+
|
|
88
|
+
| Excuse | Reality |
|
|
89
|
+
|---|---|
|
|
90
|
+
| "The engine is imported somewhere, that's enough" | Reachability (proven later) is from the *entry_point*, transitively. Imported by a sibling that nothing runs is still orphaned. Design the attachment to the composition root. |
|
|
91
|
+
| "I'll guess the entry point is main.js" | The profile declares it. A game's `main.js` is not a service's `src/server.ts`. Read the profile or ESCALATE. |
|
|
92
|
+
| "I'll write the call site as main.js:42" | You design at L1a.5 — that code does not exist yet, so a line number is a fabrication no oracle reads. Name the composition root + mechanism as intent; leave the concrete line to the build. |
|
|
93
|
+
| "This UC has no visible affordance, skip it" | Then name its boot/cron/init attachment. A UC with no entry point is a UC that never runs. |
|
|
94
|
+
| "I'll run trace-lint to check my map" | Not your step. You design the seam; the orchestrator runs the reachability oracle against real code at L1b. Pre-build there is no code to trace — running it here proves nothing. |
|
|
95
|
+
| "I'll also slice the scopes while I'm here" | Not your authority. You design seams; scope-architect slices. Cross-role work is a defect. |
|
|
96
|
+
|
|
97
|
+
## Output contract — the WorkResult
|
|
98
|
+
|
|
99
|
+
`wiring-map.md` in your substrate, then `.shapeup/<slug>/results/<order-suffix>.json`:
|
|
100
|
+
`status`, `artifacts[]` (the wiring map written), `escalates[]` (e.g. a missing profile, or a UC
|
|
101
|
+
whose engine the spec never names — the planner's territory), `assumptions[]` (engine paths
|
|
102
|
+
inferred from the domain model where the spec was silent), `deviations[]` (any UC left with an
|
|
103
|
+
uncertain seam, or an engine with no attachment path, and why). You never touch spec docs,
|
|
104
|
+
`scopes/*.md`, `project-profile.md`, task files, or run-state.
|
|
105
|
+
|
|
106
|
+
## Verification checklist
|
|
107
|
+
|
|
108
|
+
- [ ] Every use case in `usecases/` has exactly one wiring-map entry
|
|
109
|
+
- [ ] Every entry names a real repo-relative `engine` and a `wiring_seam` (attachment mechanism); a player-facing UC also names an `affordance`
|
|
110
|
+
- [ ] `entry_call_site` is a symbolic composition-root attachment resolved against the profile's `entry_point` — no invented line number, no guessed entry point
|
|
111
|
+
- [ ] `entry_point` echoes the profile — no independently-chosen seam
|
|
112
|
+
- [ ] The profile was READ, not guessed; a missing profile in orchestrated mode → ESCALATE, not an invented entry point
|
|
113
|
+
- [ ] Any UC whose engine has no attachment path is raised in `deviations[]`/`escalates[]` (the wiring the build must close), never silently dropped
|
|
114
|
+
- [ ] The WorkResult validates against `work-result.schema.json`
|
|
115
|
+
|
|
116
|
+
## Invocation
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
# Orchestrated — compile-order --operation wire --worker solution-architect (or resolved by op) …
|
|
120
|
+
/solution-architect --order .shapeup/checkout-vnpay/orders/wire.json
|
|
121
|
+
|
|
122
|
+
# Standalone shim (compiles the same envelope)
|
|
123
|
+
/solution-architect --wire shapeup/checkout-vnpay/
|
|
124
|
+
|
|
125
|
+
# The reachability oracle is the ORCHESTRATOR's, run advisory at L1b — not part of your craft.
|
|
126
|
+
# Standalone, you MAY preview it after writing the map (it self-skips arms whose artifacts are
|
|
127
|
+
# absent, and is near-vacuous pre-build since the engine code does not exist yet):
|
|
128
|
+
# node "${CLAUDE_PLUGIN_ROOT}/skills/tech-lead/scripts/trace-lint.mjs" --slug checkout-vnpay
|
|
129
|
+
```
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# spec-evaluator
|
|
2
|
+
|
|
3
|
+
The **judge** in a planner → generator → evaluator harness. Pairs with `task-executor`
|
|
4
|
+
(generator) and `ba-pitch-analyzer` (planner). Reads the same spec tree, exercises the
|
|
5
|
+
**running** app, returns a hard-threshold verdict + file:line bug list, and hands bugs back
|
|
6
|
+
to the generator. Skeptical by default; never marks a task `done`.
|
|
7
|
+
|
|
8
|
+
v0.1 evaluates one dimension only — **spec-conformance** (AC + Done-when + contract shapes +
|
|
9
|
+
non-go). Security / performance ship disabled, injectable later with zero core changes.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Resource map
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
spec-evaluator/
|
|
17
|
+
├── SKILL.md # entry point — frontmatter, GATE V0–V3, flags, hard rules
|
|
18
|
+
├── README.md # this file
|
|
19
|
+
└── references/
|
|
20
|
+
├── dimension-contract.md # ★ the injection interface every dimension implements
|
|
21
|
+
├── anti-leniency.md # skeptical posture — read before any verdict (GATE V2)
|
|
22
|
+
├── probing.md # Phase A — Playwright CLI + per-variant probe strategy
|
|
23
|
+
├── report-schema.md # Phase B — the EVAL-TASK-NNN.md handoff file
|
|
24
|
+
└── dimensions/
|
|
25
|
+
├── _registry.md # which dimensions are active + how to add one
|
|
26
|
+
├── spec-conformance.md # ✅ the only enabled dimension (correctness)
|
|
27
|
+
├── security.md # ⛔ disabled stub — worked example of the contract
|
|
28
|
+
└── performance.md # ⛔ disabled stub — worked example of the contract
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
| Resource | Loaded at | Purpose |
|
|
32
|
+
|----------|-----------|---------|
|
|
33
|
+
| `SKILL.md` | always | gate pipeline, invocation, authority rules |
|
|
34
|
+
| `references/dimension-contract.md` | GATE V0.5 | the interface; validates each dimension before running it |
|
|
35
|
+
| `references/dimensions/_registry.md` | GATE V0.5 | active set resolution (`--dimensions` overrides) |
|
|
36
|
+
| `references/dimensions/spec-conformance.md` | per task | the default correctness dimension |
|
|
37
|
+
| `references/dimensions/{security,performance}.md` | only if enabled | injectable stubs, off by default |
|
|
38
|
+
| `references/anti-leniency.md` | before GATE V2 | absence of evidence = FAIL; banned phrases |
|
|
39
|
+
| `references/probing.md` | Phase A | how to collect evidence (CLI > MCP, per variant) |
|
|
40
|
+
| `references/report-schema.md` | Phase B | the file the generator reads next |
|
|
41
|
+
|
|
42
|
+
★ = the load-bearing file for "spec now, more dimensions later."
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Install
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
# Project scope (shareable via version control) — recommended
|
|
50
|
+
cp -r spec-evaluator <repo>/.claude/skills/
|
|
51
|
+
|
|
52
|
+
# or user scope (all your projects)
|
|
53
|
+
cp -r spec-evaluator ~/.claude/skills/
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Restart the session (or re-open the skills interface) so the new skill is discovered.
|
|
57
|
+
|
|
58
|
+
## Invoke
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
/spec-evaluator --spec shapeup/checkout-vnpay/spec/ --task TASK-007 # default: spec-conformance
|
|
62
|
+
/spec-evaluator --spec ... --task TASK-007.web # platform variant
|
|
63
|
+
/spec-evaluator --spec ... --task TASK-007.be --browser none # backend-only, no browser
|
|
64
|
+
/spec-evaluator --spec ... --task TASK-007 --dimensions spec-conformance,security # inject a dimension
|
|
65
|
+
/spec-evaluator --spec ... --task TASK-007 --single-pass --auto # one end pass, skip sign-off
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Pipeline position
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
ba-pitch-analyzer (planner) ─► task-executor (generator) ─► spec-evaluator (judge)
|
|
72
|
+
▲ │
|
|
73
|
+
└──── bug list (EVAL-TASK-NNN) ◄─┘ on FAIL
|
|
74
|
+
```
|
|
75
|
+
The evaluator writes `.shapeup/<slug>/evaluation/EVAL-<task_id>.md` (LOCAL run-trace root) and sets `eval_verdict` on the task.
|
|
76
|
+
`task-executor` owns `status: done`. Judge and doer stay separate by design.
|
|
77
|
+
|
|
78
|
+
## Inject a new dimension (zero core edits)
|
|
79
|
+
|
|
80
|
+
1. Copy the "Minimal valid dimension" block from `references/dimension-contract.md` to
|
|
81
|
+
`references/dimensions/<id>.md`; fill criteria, probes, threshold, bug template.
|
|
82
|
+
2. Set `enabled: true` in `references/dimensions/_registry.md` (or pass `--dimensions … ,<id>`).
|
|
83
|
+
3. Re-run. GATE V0.5 validates it against the contract and loads it; non-conforming files
|
|
84
|
+
are skipped with a warning, never half-run.
|
|
85
|
+
|
|
86
|
+
`applies_to` scopes a dimension to a lens / package / platform variant, so a `visual`
|
|
87
|
+
dimension can run only on `.web` tasks and `security` only on `.be`/`.shared`.
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Version
|
|
92
|
+
0.1 — initial template. GATE V0–V3, skeptical-by-default, single enabled dimension,
|
|
93
|
+
pluggable dimension contract, Playwright CLI probing, file:line bug handoff.
|