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.
Files changed (135) hide show
  1. package/.claude/settings.local.example.json +20 -0
  2. package/.claude-plugin/marketplace.json +16 -0
  3. package/.claude-plugin/plugin.json +18 -0
  4. package/.env.shapeup.example +14 -0
  5. package/AGENTS.md +133 -0
  6. package/LICENSE +21 -0
  7. package/README.md +362 -0
  8. package/SECURITY.md +72 -0
  9. package/bin/init.mjs +329 -0
  10. package/commands/build.md +14 -0
  11. package/commands/eval.md +15 -0
  12. package/commands/hammer.md +12 -0
  13. package/commands/orient.md +11 -0
  14. package/commands/qa.md +12 -0
  15. package/commands/retro.md +13 -0
  16. package/commands/scopes.md +14 -0
  17. package/commands/shape.md +12 -0
  18. package/commands/ship.md +53 -0
  19. package/commands/wire.md +11 -0
  20. package/hooks/anti-rationalization.mjs +244 -0
  21. package/hooks/compact-snapshot.mjs +47 -0
  22. package/hooks/gate-deadline.mjs +151 -0
  23. package/hooks/gate-intake.mjs +110 -0
  24. package/hooks/gate-l2.mjs +161 -0
  25. package/hooks/gate-zerowork.mjs +264 -0
  26. package/hooks/hooks.json +118 -0
  27. package/hooks/lib/decision.mjs +183 -0
  28. package/hooks/safety-spine.mjs +296 -0
  29. package/hooks/sandbox-guard.mjs +172 -0
  30. package/hooks/session-rehydrate.mjs +109 -0
  31. package/hooks/slop-cleaner.mjs +176 -0
  32. package/oracles/_shared.mjs +46 -0
  33. package/oracles/http-oracle.mjs +155 -0
  34. package/oracles/index.mjs +36 -0
  35. package/oracles/process-oracle.mjs +146 -0
  36. package/oracles/snapshot-oracle.mjs +119 -0
  37. package/oracles/test-oracle.mjs +138 -0
  38. package/package.json +49 -0
  39. package/skills/advisor-protocol/SKILL.md +171 -0
  40. package/skills/ba-pitch-analyzer/SKILL.md +175 -0
  41. package/skills/ba-pitch-analyzer/assets/templates/_index.tmpl.md +84 -0
  42. package/skills/ba-pitch-analyzer/assets/templates/api-feasibility.tmpl.md +65 -0
  43. package/skills/ba-pitch-analyzer/assets/templates/assess-report.tmpl.md +127 -0
  44. package/skills/ba-pitch-analyzer/assets/templates/contracts/be-service.contract.tmpl.md +62 -0
  45. package/skills/ba-pitch-analyzer/assets/templates/contracts/offline-storage.contract.tmpl.md +92 -0
  46. package/skills/ba-pitch-analyzer/assets/templates/contracts/third-party-api.contract.tmpl.md +66 -0
  47. package/skills/ba-pitch-analyzer/assets/templates/cross-context/context-map.tmpl.md +64 -0
  48. package/skills/ba-pitch-analyzer/assets/templates/cross-context/event-choreography.tmpl.md +77 -0
  49. package/skills/ba-pitch-analyzer/assets/templates/cross-context/migration-plan.tmpl.md +104 -0
  50. package/skills/ba-pitch-analyzer/assets/templates/cross-context/team-handoff.tmpl.md +79 -0
  51. package/skills/ba-pitch-analyzer/assets/templates/domain-model.tmpl.md +79 -0
  52. package/skills/ba-pitch-analyzer/assets/templates/feedback.tmpl.md +87 -0
  53. package/skills/ba-pitch-analyzer/assets/templates/integration.tmpl.md +64 -0
  54. package/skills/ba-pitch-analyzer/assets/templates/run-state.tmpl.md +77 -0
  55. package/skills/ba-pitch-analyzer/assets/templates/scope-summary.tmpl.md +105 -0
  56. package/skills/ba-pitch-analyzer/assets/templates/synthesis.tmpl.md +215 -0
  57. package/skills/ba-pitch-analyzer/assets/templates/task-board.tmpl.md +35 -0
  58. package/skills/ba-pitch-analyzer/assets/templates/task-spike.tmpl.md +86 -0
  59. package/skills/ba-pitch-analyzer/assets/templates/task.tmpl.md +84 -0
  60. package/skills/ba-pitch-analyzer/assets/templates/usecase.tmpl.md +105 -0
  61. package/skills/ba-pitch-analyzer/assets/templates/ux-behavior.tmpl.md +65 -0
  62. package/skills/ba-pitch-analyzer/references/contract-patterns.md +152 -0
  63. package/skills/ba-pitch-analyzer/references/ddd-patterns.md +173 -0
  64. package/skills/ba-pitch-analyzer/references/doc-schemas.md +275 -0
  65. package/skills/ba-pitch-analyzer/references/integration-analysis.md +152 -0
  66. package/skills/ba-pitch-analyzer/references/task-generation.md +623 -0
  67. package/skills/ba-pitch-analyzer/references/test-surface.md +102 -0
  68. package/skills/ba-pitch-analyzer/references/ux-behavior-patterns.md +269 -0
  69. package/skills/ba-pitch-analyzer/scripts/board-derive.mjs +241 -0
  70. package/skills/ba-pitch-analyzer/scripts/spec-lint.mjs +239 -0
  71. package/skills/coach/SKILL.md +202 -0
  72. package/skills/orient/SKILL.md +262 -0
  73. package/skills/qa-edge-hunter/SKILL.md +369 -0
  74. package/skills/scope-architect/SKILL.md +111 -0
  75. package/skills/scope-hammer/SKILL.md +186 -0
  76. package/skills/shapeup/SKILL.md +403 -0
  77. package/skills/shapeup/resources/breadboard-reflection.md +88 -0
  78. package/skills/shapeup/resources/breadboarding.md +334 -0
  79. package/skills/shapeup/resources/context-compaction.md +240 -0
  80. package/skills/shapeup/resources/framing-doc.md +92 -0
  81. package/skills/shapeup/resources/kickoff-doc.md +95 -0
  82. package/skills/shapeup/resources/shaping.md +194 -0
  83. package/skills/shapeup/resources/spike.md +86 -0
  84. package/skills/solution-architect/SKILL.md +129 -0
  85. package/skills/spec-evaluator/README.md +93 -0
  86. package/skills/spec-evaluator/SKILL.md +213 -0
  87. package/skills/spec-evaluator/references/anti-leniency.md +50 -0
  88. package/skills/spec-evaluator/references/dimension-contract.md +126 -0
  89. package/skills/spec-evaluator/references/dimensions/_registry.md +40 -0
  90. package/skills/spec-evaluator/references/dimensions/completeness.md +102 -0
  91. package/skills/spec-evaluator/references/dimensions/integration.md +129 -0
  92. package/skills/spec-evaluator/references/dimensions/performance.md +48 -0
  93. package/skills/spec-evaluator/references/dimensions/security.md +60 -0
  94. package/skills/spec-evaluator/references/dimensions/spec-conformance.md +134 -0
  95. package/skills/spec-evaluator/references/dimensions/tdd-surface.md +110 -0
  96. package/skills/spec-evaluator/references/dimensions/test-surface-conformance.md +100 -0
  97. package/skills/spec-evaluator/references/probing.md +177 -0
  98. package/skills/spec-evaluator/references/report-schema.md +101 -0
  99. package/skills/spec-evaluator/references/verdict-ledger.md +92 -0
  100. package/skills/spec-evaluator/scripts/verdict-ledger.mjs +166 -0
  101. package/skills/task-executor/SKILL.md +194 -0
  102. package/skills/tech-lead/README.md +71 -0
  103. package/skills/tech-lead/SKILL.md +459 -0
  104. package/skills/tech-lead/references/delegation.md +254 -0
  105. package/skills/tech-lead/references/gates.md +379 -0
  106. package/skills/tech-lead/references/invocation.md +45 -0
  107. package/skills/tech-lead/references/ledger-schema.md +214 -0
  108. package/skills/tech-lead/references/round-protocol.md +184 -0
  109. package/skills/tech-lead/references/state-model.md +66 -0
  110. package/skills/tech-lead/references/tiny-lane.md +52 -0
  111. package/skills/tech-lead/schemas/domain.schema.json +2294 -0
  112. package/skills/tech-lead/schemas/gate-answers.schema.json +92 -0
  113. package/skills/tech-lead/schemas/work-order.schema.json +21 -0
  114. package/skills/tech-lead/schemas/work-result.schema.json +40 -0
  115. package/skills/tech-lead/scripts/aegis-digest.mjs +124 -0
  116. package/skills/tech-lead/scripts/budget-check.mjs +156 -0
  117. package/skills/tech-lead/scripts/compile-order.mjs +518 -0
  118. package/skills/tech-lead/scripts/fit-check.mjs +196 -0
  119. package/skills/tech-lead/scripts/gate-answers.mjs +338 -0
  120. package/skills/tech-lead/scripts/ingest-result.mjs +270 -0
  121. package/skills/tech-lead/scripts/init-run.mjs +326 -0
  122. package/skills/tech-lead/scripts/lib/argv.mjs +224 -0
  123. package/skills/tech-lead/scripts/lib/contract-md.mjs +481 -0
  124. package/skills/tech-lead/scripts/lib/is-main.mjs +82 -0
  125. package/skills/tech-lead/scripts/lib/paths.mjs +278 -0
  126. package/skills/tech-lead/scripts/lib/ratchet-tree.mjs +112 -0
  127. package/skills/tech-lead/scripts/run-snapshot.mjs +269 -0
  128. package/skills/tech-lead/scripts/ship-report.mjs +275 -0
  129. package/skills/tech-lead/scripts/stats.mjs +423 -0
  130. package/skills/tech-lead/scripts/t0-verify.mjs +470 -0
  131. package/skills/tech-lead/scripts/trace-lint.mjs +367 -0
  132. package/skills/tech-lead/scripts/validate-envelope.mjs +283 -0
  133. package/skills/translator/README.md +66 -0
  134. package/skills/translator/SKILL.md +258 -0
  135. 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.