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,334 @@
|
|
|
1
|
+
# Breadboarding — Reference
|
|
2
|
+
|
|
3
|
+
> Source: rjs/shaping-skills (upstream). Loaded on demand by the shapeup skill.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## What Breadboarding Does
|
|
8
|
+
|
|
9
|
+
Breadboarding transforms a workflow description (existing system or shaped parts) into a complete map of **affordances** and their **relationships**. The output is always a set of tables showing numbered UI and Code affordances with their Wires Out and Returns To relationships.
|
|
10
|
+
|
|
11
|
+
**The tables are the truth. Mermaid diagrams are optional visualizations.**
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Use Cases
|
|
16
|
+
|
|
17
|
+
### 1. Mapping an Existing System
|
|
18
|
+
|
|
19
|
+
Input:
|
|
20
|
+
- Code repo(s) to analyze
|
|
21
|
+
- Workflow description (always from the perspective of an operator trying to make an effect happen — through UI or as a caller)
|
|
22
|
+
|
|
23
|
+
Output:
|
|
24
|
+
- UI Affordances table
|
|
25
|
+
- Code Affordances table
|
|
26
|
+
- (Optional) Mermaid visualization
|
|
27
|
+
|
|
28
|
+
Note: If the workflow spans multiple applications (frontend + backend), create ONE breadboard. Label places to show which system they belong to.
|
|
29
|
+
|
|
30
|
+
### 2. Designing from Shaped Parts
|
|
31
|
+
|
|
32
|
+
Input:
|
|
33
|
+
- Parts list (mechanisms from shaping)
|
|
34
|
+
- The R (requirement/outcome) the parts are meant to achieve
|
|
35
|
+
- Existing system (optional) — if the new parts must interoperate with existing code
|
|
36
|
+
|
|
37
|
+
### 3. Mixtures
|
|
38
|
+
|
|
39
|
+
Often you have both: an existing system that must remain as-is, plus new pieces or changes defined in a shape. Breadboard both together — existing affordances and new ones — showing how they connect.
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Core Concepts
|
|
44
|
+
|
|
45
|
+
### Places
|
|
46
|
+
|
|
47
|
+
A Place is a **bounded context of interaction**. While you're in a Place:
|
|
48
|
+
- You have a specific set of affordances available to you
|
|
49
|
+
- You **cannot** interact with affordances outside that boundary
|
|
50
|
+
- You must take an action to leave
|
|
51
|
+
|
|
52
|
+
**Place is perceptual, not technical.** It's not about URLs or components — it's about what the user experiences as their current context.
|
|
53
|
+
|
|
54
|
+
#### The Blocking Test
|
|
55
|
+
|
|
56
|
+
The simplest test for whether something is a different Place: **Can you interact with what's behind?**
|
|
57
|
+
|
|
58
|
+
| Answer | Meaning |
|
|
59
|
+
|--------|---------|
|
|
60
|
+
| **No** | You're in a different Place |
|
|
61
|
+
| **Yes** | Same Place, with local state changes |
|
|
62
|
+
|
|
63
|
+
#### Examples
|
|
64
|
+
|
|
65
|
+
| UI Element | Blocking? | Place? | Why |
|
|
66
|
+
|---|---|---|---|
|
|
67
|
+
| Modal | Yes | Yes | Can't interact with page behind |
|
|
68
|
+
| Confirmation popover | Yes | Yes | Must respond before returning |
|
|
69
|
+
| Edit mode (whole screen transforms) | Yes | Yes | All affordances changed |
|
|
70
|
+
| Checkbox reveals extra fields | No | No | Surroundings unchanged |
|
|
71
|
+
| Dropdown menu | No | No | Can click away, non-blocking |
|
|
72
|
+
| Tooltip | No | No | Informational, non-blocking |
|
|
73
|
+
|
|
74
|
+
#### Mode-Based Places
|
|
75
|
+
|
|
76
|
+
When a mode transforms the entire screen — different buttons, different affordances everywhere — model as separate Places:
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
PLACE: CMS Page (Read Mode)
|
|
80
|
+
PLACE: CMS Page (Edit Mode)
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
#### Labeling Conventions
|
|
84
|
+
|
|
85
|
+
| Pattern | Use |
|
|
86
|
+
|---|---|
|
|
87
|
+
| `PLACE: Page Name` | Standard page/route |
|
|
88
|
+
| `PLACE: Page Name (Mode)` | Mode-based variant |
|
|
89
|
+
| `PLACE: Modal Name` | Modal dialog |
|
|
90
|
+
| `PLACE: Backend` | API/database boundary |
|
|
91
|
+
|
|
92
|
+
### Place IDs
|
|
93
|
+
|
|
94
|
+
Each Place gets an ID. IDs enable explicit navigation wiring and Mermaid subgraph matching.
|
|
95
|
+
|
|
96
|
+
| # | Place | Description |
|
|
97
|
+
|---|---|---|
|
|
98
|
+
| P1 | CMS Page (Read Mode) | View-only state |
|
|
99
|
+
| P2 | CMS Page (Edit Mode) | Editing state |
|
|
100
|
+
| P2.1 | widget-grid (subplace) | Letter editing widget within P2 |
|
|
101
|
+
| P3 | Letter Form Modal | Form for adding/editing |
|
|
102
|
+
| P4 | Backend | API resolvers and database |
|
|
103
|
+
|
|
104
|
+
### Navigation Wiring
|
|
105
|
+
|
|
106
|
+
Wire to the **Place itself**, not to an affordance inside:
|
|
107
|
+
|
|
108
|
+
```
|
|
109
|
+
✅ N1 Wires Out: → P2 (navigate to Edit Mode)
|
|
110
|
+
❌ N1 Wires Out: → U3 (affordance inside P2)
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### Affordances
|
|
114
|
+
|
|
115
|
+
- **UI affordances (U)**: inputs, buttons, displayed elements, scroll regions
|
|
116
|
+
- **Code affordances (N)**: methods, subscriptions, data stores, framework mechanisms
|
|
117
|
+
|
|
118
|
+
### Wiring
|
|
119
|
+
|
|
120
|
+
**Wires Out** — control flow (what an affordance triggers or calls):
|
|
121
|
+
- Call wires, write wires, navigation wires
|
|
122
|
+
|
|
123
|
+
**Returns To** — data flow (where an affordance's output flows):
|
|
124
|
+
- Return wires, read wires
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## Output Tables
|
|
129
|
+
|
|
130
|
+
### Places Table
|
|
131
|
+
|
|
132
|
+
| # | Place | Description |
|
|
133
|
+
|---|---|---|
|
|
134
|
+
| P1 | Search Page | Main search interface |
|
|
135
|
+
| P2 | Detail Page | Individual result view |
|
|
136
|
+
|
|
137
|
+
### UI Affordances Table
|
|
138
|
+
|
|
139
|
+
| # | Place | Component | Affordance | Control | Wires Out | Returns To |
|
|
140
|
+
|---|---|---|---|---|---|---|
|
|
141
|
+
| U1 | P1 | search-detail | search input | type | → N1 | — |
|
|
142
|
+
| U2 | P1 | search-detail | loading spinner | render | — | — |
|
|
143
|
+
| U3 | P1 | search-detail | results list | render | — | — |
|
|
144
|
+
| U4 | P1 | search-detail | result row | click | → P2 | — |
|
|
145
|
+
|
|
146
|
+
### Code Affordances Table
|
|
147
|
+
|
|
148
|
+
| # | Place | Component | Affordance | Control | Wires Out | Returns To |
|
|
149
|
+
|---|---|---|---|---|---|---|
|
|
150
|
+
| N1 | P1 | search-detail | `activeQuery.next()` | call | → N2 | — |
|
|
151
|
+
| N2 | P1 | search-detail | `activeQuery` subscription | observe | → N3 | — |
|
|
152
|
+
| N3 | P1 | search-detail | `performSearch()` | call | → N4, → N5, → N6 | — |
|
|
153
|
+
| N5 | P1 | search-detail | `loading` | write | store | → U2 |
|
|
154
|
+
| N6 | P1 | search-detail | `results` | write | store | → U3 |
|
|
155
|
+
|
|
156
|
+
### Data Stores Table
|
|
157
|
+
|
|
158
|
+
| # | Place | Store | Description |
|
|
159
|
+
|---|---|---|---|
|
|
160
|
+
| S1 | P1 | `results` | Array of search results |
|
|
161
|
+
| S2 | P1 | `loading` | Boolean loading state |
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## Procedures
|
|
166
|
+
|
|
167
|
+
### Mapping an Existing System
|
|
168
|
+
|
|
169
|
+
1. Pick a specific user journey — frame as "operator trying to do something"
|
|
170
|
+
2. Walk through the journey, identify each distinct place
|
|
171
|
+
3. Trace through the code from entry point; find every component touched
|
|
172
|
+
4. For each component, list UI and Code affordances
|
|
173
|
+
5. **Name the actual thing, not an abstraction** — if you write "DATABASE", stop. What's the actual method?
|
|
174
|
+
6. Fill in Control column (what triggers each affordance)
|
|
175
|
+
7. Fill in Wires Out (what does it trigger)
|
|
176
|
+
8. Fill in Returns To (where does its output flow)
|
|
177
|
+
9. Add data stores as affordances (write + read)
|
|
178
|
+
10. Add framework mechanisms (e.g., `cdr.detectChanges()`)
|
|
179
|
+
11. Verify against the code
|
|
180
|
+
|
|
181
|
+
### Designing from Shaped Parts
|
|
182
|
+
|
|
183
|
+
1. List each part from the shape
|
|
184
|
+
2. Translate parts into affordances (UI + Code per part)
|
|
185
|
+
3. Verify every U has a supporting N
|
|
186
|
+
4. Classify places as existing or new
|
|
187
|
+
5. Wire the affordances (Wires Out + Returns To)
|
|
188
|
+
6. Connect to existing system if applicable
|
|
189
|
+
7. Check completeness: handlers → Wires Out; queries → Returns To; stores → Returns To
|
|
190
|
+
8. Treat user-visible outputs as Us (emails, notifications)
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## Key Principles
|
|
195
|
+
|
|
196
|
+
### Never use memory — always check the data
|
|
197
|
+
When tracing a flow backwards, scan the Wires Out column for ALL affordances that wire to your target. The tables are the source of truth.
|
|
198
|
+
|
|
199
|
+
### Every affordance name must exist (when mapping)
|
|
200
|
+
Never invent abstractions. Every name must point to something real.
|
|
201
|
+
|
|
202
|
+
### Mechanisms aren't affordances
|
|
203
|
+
Things that look like affordances but are just implementation details:
|
|
204
|
+
- Visual containers (`modal-frame wrapper`) — just a Place boundary
|
|
205
|
+
- Internal transforms (`letterDataTransform()`) — internal to caller
|
|
206
|
+
- Navigation mechanisms (`modalService.open()`) — wire to destination directly
|
|
207
|
+
|
|
208
|
+
```
|
|
209
|
+
❌ N8 --> N22 --> P3 (N22 is modalService.open — just mechanism)
|
|
210
|
+
✅ N8 --> P3 (handler navigates to modal)
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### Two flows: Navigation and Data
|
|
214
|
+
- **Navigation flow**: Movement from Place to Place (Wires Out → Places)
|
|
215
|
+
- **Data flow**: How state populates displays (Returns To → Us)
|
|
216
|
+
|
|
217
|
+
Trace both flows when reviewing a breadboard.
|
|
218
|
+
|
|
219
|
+
### Every U that displays data needs a source
|
|
220
|
+
```
|
|
221
|
+
❌ U6: letter list (no incoming wire)
|
|
222
|
+
✅ S1 -.-> U6 (store feeds the display)
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
### Every N must connect
|
|
226
|
+
- Handlers → should have Wires Out
|
|
227
|
+
- Queries → should have Returns To
|
|
228
|
+
- Data stores → should have Returns To
|
|
229
|
+
|
|
230
|
+
### Backend is a Place
|
|
231
|
+
The database and resolvers aren't floating infrastructure — they're a Place with their own affordances.
|
|
232
|
+
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
## Subplaces
|
|
236
|
+
|
|
237
|
+
A **subplace** is a defined subset of a Place. Use when a Place contains multiple distinct widgets. Notation: `P2.1`, `P2.2`, etc.
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
241
|
+
## Chunking
|
|
242
|
+
|
|
243
|
+
Collapse a subsystem with one wire in + one wire out into a single chunk node. Show internals separately in a chunk diagram. Use stadium shape in Mermaid: `dynamicForm[["CHUNK: dynamic-form"]]`
|
|
244
|
+
|
|
245
|
+
**Color**: `#b3e5fc` (light blue)
|
|
246
|
+
|
|
247
|
+
---
|
|
248
|
+
|
|
249
|
+
## Mermaid Visualization
|
|
250
|
+
|
|
251
|
+
### Line Conventions
|
|
252
|
+
|
|
253
|
+
| Line Style | Mermaid Syntax | Use |
|
|
254
|
+
|---|---|---|
|
|
255
|
+
| Solid (`-->`) | `A --> B` | Wires Out: calls, triggers, writes |
|
|
256
|
+
| Dashed (`-.->`) | `A -.-> B` | Returns To: return values, data store reads |
|
|
257
|
+
| Labeled | `A -.->|label| B` | Abbreviated flow |
|
|
258
|
+
|
|
259
|
+
### Color Conventions
|
|
260
|
+
|
|
261
|
+
```
|
|
262
|
+
classDef ui fill:#ffb6c1,stroke:#d87093,color:#000
|
|
263
|
+
classDef nonui fill:#d3d3d3,stroke:#808080,color:#000
|
|
264
|
+
classDef store fill:#e6e6fa,stroke:#9370db,color:#000
|
|
265
|
+
classDef chunk fill:#b3e5fc,stroke:#0288d1,color:#000,stroke-width:2px
|
|
266
|
+
classDef placeRef fill:#ffb6c1,stroke:#d87093,stroke-width:2px,stroke-dasharray:5 5
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
### Subgraph IDs = Place IDs
|
|
270
|
+
Use Place IDs as subgraph IDs so navigation wiring connects properly:
|
|
271
|
+
```
|
|
272
|
+
subgraph P1["P1: CMS Page (Read Mode)"]
|
|
273
|
+
U1["U1: Edit button"]
|
|
274
|
+
end
|
|
275
|
+
N1 --> P2 ← wire connects to Place boundary
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
---
|
|
279
|
+
|
|
280
|
+
## Slicing a Breadboard
|
|
281
|
+
|
|
282
|
+
Slicing groups affordances into **vertical implementation slices** — each demonstrating a mechanism working.
|
|
283
|
+
|
|
284
|
+
### Rules
|
|
285
|
+
- **Every slice must have visible UI that can be demoed**
|
|
286
|
+
- Demo means: entry point (UI interaction) + observable output (UI renders, effect occurs)
|
|
287
|
+
- Aim for ≤ 9 slices
|
|
288
|
+
- Right size: coherent journey with clear "watch me do this" demo
|
|
289
|
+
|
|
290
|
+
### Procedure
|
|
291
|
+
|
|
292
|
+
1. **Identify minimal demo-able increment** — core data fetch + basic rendering (V1)
|
|
293
|
+
2. **Layer mechanisms as slices** — each slice = one mechanism from the shape
|
|
294
|
+
3. **Assign affordances** — each affordance in the slice where it's first needed
|
|
295
|
+
4. **Create per-slice affordance tables**
|
|
296
|
+
5. **Write a demo statement** for each slice: "Type 'dharma', results filter live"
|
|
297
|
+
|
|
298
|
+
### Slice Summary Format
|
|
299
|
+
|
|
300
|
+
| # | Slice | Mechanism | Demo |
|
|
301
|
+
|---|---|---|---|
|
|
302
|
+
| V1 | Widget with real data | F1, F4, F6 | "Widget shows letters from API" |
|
|
303
|
+
| V2 | Search works | F3 | "Type to filter results" |
|
|
304
|
+
| V3 | Infinite scroll | F5 | "Scroll down, more load" |
|
|
305
|
+
|
|
306
|
+
### Visualizing Slices
|
|
307
|
+
|
|
308
|
+
| Category | Style | Description |
|
|
309
|
+
|---|---|---|
|
|
310
|
+
| **This slice** | Bright color | Affordances being added |
|
|
311
|
+
| **Already built** | Solid grey | Previous slices |
|
|
312
|
+
| **Future** | Transparent, dashed border | Not yet built |
|
|
313
|
+
|
|
314
|
+
---
|
|
315
|
+
|
|
316
|
+
## Verification Checks
|
|
317
|
+
|
|
318
|
+
| Check | Question | If No... |
|
|
319
|
+
|---|---|---|
|
|
320
|
+
| Every U that displays data | Incoming wire present? | Add the data source |
|
|
321
|
+
| Every N | Has Wires Out or Returns To? | Investigate — may be dead code |
|
|
322
|
+
| Every S | Something reads from it? | Investigate — may be unused |
|
|
323
|
+
| Navigation mechanisms | Is N just "how" of getting somewhere? | Wire directly to Place |
|
|
324
|
+
| N with side effects | Affects external state? | Add a store for external state |
|
|
325
|
+
|
|
326
|
+
---
|
|
327
|
+
|
|
328
|
+
## Handoff to High-Fidelity Design
|
|
329
|
+
|
|
330
|
+
Once the breadboard is completed, verified, and sliced, it serves as the wireframe blueprint for the **Product Designer**:
|
|
331
|
+
1. **Place to Figma Frame**: Each Place (e.g. `P1`, `P2`) maps to a distinct Figma frame/view.
|
|
332
|
+
2. **Affordance to Element**: Every UI Affordance (e.g. `U1`, `U2`) must be represented as a visual component in the design.
|
|
333
|
+
3. **Transition to Navigation**: The wires between Places define the interactive flows and navigation transitions in the Figma prototype.
|
|
334
|
+
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
# Context Compaction — Reference
|
|
2
|
+
|
|
3
|
+
> Loaded on demand by the shapeup skill for `/shapeup full` (and any multi-gate
|
|
4
|
+
> run). Operationalizes the v2.1 context-compaction design: digest format,
|
|
5
|
+
> two-zone rules, writer ops, and the per-gate consumer view.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Why this exists
|
|
10
|
+
|
|
11
|
+
Over a long shaping run the artifacts (`shaping.md`, `spike-*.md`,
|
|
12
|
+
`breadboard.md`, `pitch.md`) accumulate. Re-feeding raw prose into the LLM at
|
|
13
|
+
every gate is token-expensive, signal-diluting, and eventually
|
|
14
|
+
context-overflowing. The fix is **not** to stop accumulating — it is to stop
|
|
15
|
+
using the **source of truth** as the **decision context**.
|
|
16
|
+
|
|
17
|
+
Two layers, never collapsed into one:
|
|
18
|
+
|
|
19
|
+
- **Source** = the full artifacts on disk (`shapeup/[slug]/shaping/...`). Immutable
|
|
20
|
+
once confirmed. The traceability + RULE 3 non-regression record.
|
|
21
|
+
- **Decision context (the digest)** = a cheap, regenerable **derived read
|
|
22
|
+
model**. Never a write surface. The moment a gate's decision mutates the
|
|
23
|
+
digest as if it were state, the confirmed source is lost.
|
|
24
|
+
|
|
25
|
+
> Compaction is lossy; RULE 3 (non-regression) is lossless.
|
|
26
|
+
> Therefore compaction lives **only** in the derived layer.
|
|
27
|
+
|
|
28
|
+
This is not a new philosophy — Shape Up already compacts (breadboard compacts the
|
|
29
|
+
idea, the pitch compacts shaping into 5 ingredients, affordance IDs `U[N]`/`N[N]`
|
|
30
|
+
are a compact symbol table). The digest is the missing read model for **in-run
|
|
31
|
+
state**.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## The digest — `digest.md`
|
|
36
|
+
|
|
37
|
+
One digest per shaping run. It lives in the **ephemeral, gitignored** run
|
|
38
|
+
workspace, not next to the source artifacts:
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
.shapeup/[feature-slug]/digest.md
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
The LLM reads the digest at each gate; it follows a wikilink down to a full
|
|
45
|
+
source artifact **only** when it must drill into one decision. No vector DB at
|
|
46
|
+
the gate — a gate decision needs *every* constraint still in force (a missed
|
|
47
|
+
No-Go or out-of-bounds = a silent wrong decision), which is a deterministic need.
|
|
48
|
+
|
|
49
|
+
### Schema — 4 fields
|
|
50
|
+
|
|
51
|
+
| Field | Meaning |
|
|
52
|
+
|---|---|
|
|
53
|
+
| `appetite` | central Shape Up constraint — never drops out of context |
|
|
54
|
+
| `confirmed` | signed-off decisions, one line each + wikilink (frozen record) |
|
|
55
|
+
| `open` | open questions / unresolved spikes — the thing that blocks the next gate |
|
|
56
|
+
| `links` | wikilinks down to source artifacts |
|
|
57
|
+
|
|
58
|
+
Affordance tables are **NOT** inlined — they are their own symbol table in
|
|
59
|
+
`breadboard.md`; the digest links to them.
|
|
60
|
+
|
|
61
|
+
`schema_version: 1` is carried in the frontmatter — v2.1 output must be readable
|
|
62
|
+
by v2.2 (8-skill versioning is tightly coupled; forward-compat for one field is
|
|
63
|
+
cheap).
|
|
64
|
+
|
|
65
|
+
### Two-zone structure
|
|
66
|
+
|
|
67
|
+
Shaping is **not** monotonic: GATE 1 can loop back and revise the R-list; an
|
|
68
|
+
UNRESOLVED spike can force the shape to change at GATE 2/3. "Append-only" and
|
|
69
|
+
"revision-before-confirm" cannot both be literally true. The resolution reuses
|
|
70
|
+
the existing *frozen zone untouched, append-only* pattern:
|
|
71
|
+
|
|
72
|
+
- **Frozen zone** — decisions that have *passed* a gate. Append-only,
|
|
73
|
+
**absolutely immutable**. This *is* RULE 3 embodied. One line + wikilink each.
|
|
74
|
+
- **Working head** — exactly one block: the current pre-confirm phase. Freely
|
|
75
|
+
**overwritten / regenerated** until its gate confirms. On confirm → **promote**
|
|
76
|
+
the block into the frozen zone; open a fresh working head for the next phase.
|
|
77
|
+
|
|
78
|
+
> Corrected definition: not "append-only digest" but
|
|
79
|
+
> **"append-only frozen zone + mutable working head."**
|
|
80
|
+
|
|
81
|
+
Staleness is **designed out**, not patched:
|
|
82
|
+
- the frozen zone never stales (both source and digest are frozen — drift
|
|
83
|
+
impossible);
|
|
84
|
+
- the working head never stales (rebuilt from the live artifact before its gate
|
|
85
|
+
fires).
|
|
86
|
+
|
|
87
|
+
### Digest template
|
|
88
|
+
|
|
89
|
+
```markdown
|
|
90
|
+
---
|
|
91
|
+
schema_version: 1
|
|
92
|
+
type: shaping-digest
|
|
93
|
+
feature: [feature-slug]
|
|
94
|
+
appetite: [~1 week | ~2 weeks | ~6 weeks | TBD (uncapped)]
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
# [Feature] — Shaping Digest (derived read model — DO NOT hand-edit)
|
|
98
|
+
|
|
99
|
+
> Regenerated from source on each phase. Source of truth is the artifacts under
|
|
100
|
+
> `shapeup/[feature-slug]/shaping/`. This file is ephemeral + gitignored.
|
|
101
|
+
|
|
102
|
+
## Appetite
|
|
103
|
+
[~N weeks — anchors scope for every gate below]
|
|
104
|
+
|
|
105
|
+
## Confirmed (frozen — append-only, immutable)
|
|
106
|
+
- [S1] Problem frame: [one line] → [[shaping#problem-frame]]
|
|
107
|
+
- [S2] R-list: R0..RN [one-line gist] → [[shaping#requirements]]
|
|
108
|
+
- [S2.5] Rabbit holes / no-goes: [one line] → [[shaping#rabbit-holes]]
|
|
109
|
+
- [S3] Shape: [name] — [one line rationale] → [[shaping#selected-shape]]
|
|
110
|
+
- [S4] Fit check: clean (or: R3 ⚠️ → [[spike-pagination]]) → [[shaping#fit-check]]
|
|
111
|
+
- [B1] Places: [list] → [[breadboard#places]]
|
|
112
|
+
- [B3] Affordances: U0..UN / N0..NN → [[breadboard#affordances]]
|
|
113
|
+
- [B5] Slices: [count] (≤9) → [[breadboard#slicing]]
|
|
114
|
+
|
|
115
|
+
## Working head — [current phase, e.g. "S3 — Solution Shape"]
|
|
116
|
+
[the full pre-confirm content of the current phase; freely overwritten until its
|
|
117
|
+
gate confirms, then promoted to a one-liner above and replaced by the next phase]
|
|
118
|
+
|
|
119
|
+
## Open (blocks the next gate)
|
|
120
|
+
- [ ] [unresolved spike / open question] → [[spike-xxx]]
|
|
121
|
+
|
|
122
|
+
## Links
|
|
123
|
+
- shaping → [[../../shapeup/[feature-slug]/shaping/shaping.md]]
|
|
124
|
+
- breadboard → [[../../shapeup/[feature-slug]/shaping/breadboard.md]]
|
|
125
|
+
- spikes → [[../../shapeup/[feature-slug]/shaping/spike-*.md]]
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## Writer ops — exactly two
|
|
131
|
+
|
|
132
|
+
The digest stays **single-writer** (the running phase). The writer does exactly
|
|
133
|
+
one of two operations — never an arbitrary edit:
|
|
134
|
+
|
|
135
|
+
| Op | When | Effect |
|
|
136
|
+
|---|---|---|
|
|
137
|
+
| **overwrite-head** | On entry to a phase, and on any pre-confirm revision | Rebuild the *Working head* block from the live source artifact. The frozen zone is never touched. |
|
|
138
|
+
| **promote-head** | On the phase's gate confirm | Collapse the working head into a one-line + wikilink entry appended to the *Confirmed* (frozen) zone; open a fresh working head for the next phase. |
|
|
139
|
+
|
|
140
|
+
The frozen zone is **append-only and never rewritten**. A revision loop (GATE 1
|
|
141
|
+
loops back, a spike forces a shape change) is just repeated `overwrite-head` on
|
|
142
|
+
the *current* head — it can never mutate an already-frozen line, because the
|
|
143
|
+
phase that wrote it has already passed its gate.
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## Gate → minimal slice (the consumer view)
|
|
148
|
+
|
|
149
|
+
At each gate, read the **filtered view** below from `digest.md` — not the full
|
|
150
|
+
artifact prose. Confirmed state does not grow; it **shrinks in relevance** (GATE
|
|
151
|
+
3 needs zero S1 prose — it needs the R-list as a frozen checklist). Compaction is
|
|
152
|
+
mostly: *on confirm, demote the block from prose to a frozen one-liner + wikilink.*
|
|
153
|
+
|
|
154
|
+
| Gate | Decision | Minimal slice to read | Accumulated state |
|
|
155
|
+
|---|---|---|---|
|
|
156
|
+
| **0** | Idea has clear user + problem? | raw input only | ~0 — nothing to compact |
|
|
157
|
+
| **1** | R-list right? | problem frame + R-list + **appetite** | small |
|
|
158
|
+
| **2** | Shape ok? | R-list (**frozen**) + shape + rationale + constraints | R demoted to checklist |
|
|
159
|
+
| **3** | Fit check → breadboard? | R-list (frozen) + shape + **fit map** + spike results | S1 prose now useless |
|
|
160
|
+
| **4** | Affordances/wiring right? | R-list (frozen) + places + **affordance table** (`U/N`) | symbol table, no prose |
|
|
161
|
+
| *Pitch* | betting handoff | everything → 5 ingredients | compaction already exists |
|
|
162
|
+
|
|
163
|
+
**Benefit is back-loaded.** GATE 0–1 have almost nothing to compact; the wins are
|
|
164
|
+
at GATE 3–4 and especially the **handoff to ba-pitch-analyzer**. If staging the
|
|
165
|
+
work, build the digest for the B-phases + pitch first.
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## The two roots (by artifact *nature*, not by producer)
|
|
170
|
+
|
|
171
|
+
Everything keys off the feature `<slug>`. Two roots, split by **who needs it**:
|
|
172
|
+
|
|
173
|
+
| Root | Contents | Nature | Git |
|
|
174
|
+
|---|---|---|---|
|
|
175
|
+
| `shapeup/[slug]/shaping/` | shaping · breadboard · spike · pitch · kickoff | **durable source** | commit, shared |
|
|
176
|
+
| `shapeup/[slug]/spec/` | domain model · UC · contracts · tasks | **durable deliverable** | commit, shared |
|
|
177
|
+
| `.shapeup/[slug]/` | run-state · round ledger · gate log · **digest.md** · orient/ · evaluation/ · qa/ · discovery/ledger.md · harness-run.md | **ephemeral / derived** | **gitignore (hidden)** |
|
|
178
|
+
|
|
179
|
+
- The **shared** root `shapeup/[slug]/` holds what the team contributes
|
|
180
|
+
to and reviews — source (shaping) + deliverable (spec). One feature folder, two
|
|
181
|
+
subfolders.
|
|
182
|
+
- The **local** root `.shapeup/[slug]/` is per-run scratch + reports — hidden,
|
|
183
|
+
fully gitignorable, dies with the run. It is derived from the same `<slug>`.
|
|
184
|
+
- `.gitignore`: one line — `.shapeup/`. The whole local root is ignored; no
|
|
185
|
+
carve-out is needed because the one committed report surface, the harvested
|
|
186
|
+
signal feed `shapeup/metrics.jsonl` (written by the tech-lead at SHIP,
|
|
187
|
+
fact-only; see the tech-lead skill's SHIP step), lives in the **shared** root.
|
|
188
|
+
- All paths are **project-relative, resolved from the project root / cwd.** Never
|
|
189
|
+
`/mnt/...` — that is the claude.ai authoring sandbox and dies in a user repo.
|
|
190
|
+
|
|
191
|
+
### Private ≠ hidden report
|
|
192
|
+
|
|
193
|
+
Gitignoring the run workspace must NOT swallow the **report surface**. Shape Up
|
|
194
|
+
mandates *status without asking* — hill position, verdict, ship sign-off, and
|
|
195
|
+
surprise count are signals, not noise. Split inside the workspace:
|
|
196
|
+
- **live scratch** (raw ledger, gate transition log, digest) → ephemeral, hidden;
|
|
197
|
+
- **report surface** (hill / surprise / verdict / sign-off) → harvested at ship
|
|
198
|
+
(the tech-lead's metrics row), surfaced or archived to a `run-summary.md`.
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## Handoff boundary — the digest never crosses a skill
|
|
203
|
+
|
|
204
|
+
**`ba-pitch-analyzer` does NOT read the digest. It reads `pitch.md` / `shaping.md`.**
|
|
205
|
+
|
|
206
|
+
The digest lives in `.shapeup/` — ephemeral, gitignored, run-scoped;
|
|
207
|
+
it dies when the shaping run ends. `pitch.md`/`shaping.md` are durable source,
|
|
208
|
+
committed. Each skill is a stateless reducer reading durable files — no reducer
|
|
209
|
+
may depend on another reducer's ephemeral scratch.
|
|
210
|
+
|
|
211
|
+
> Digest = internal context of **one** shaping run.
|
|
212
|
+
> Pitch = the cross-skill compaction.
|
|
213
|
+
> The digest never crosses a skill boundary.
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## The digest is a sink, not a node — the ripple-check rule
|
|
218
|
+
|
|
219
|
+
The digest carries **NO `shaping: true`** in its frontmatter. It is *outside* the
|
|
220
|
+
ripple graph: working-head regeneration absorbs any upstream change on the next
|
|
221
|
+
phase, so the digest never needs to be rippled into.
|
|
222
|
+
|
|
223
|
+
**Mandatory config:** the ripple-check must **glob-exclude
|
|
224
|
+
`.shapeup/`**. Without the exclude, the check scans the digest as a
|
|
225
|
+
source artifact and ripples incorrectly (the digest links *down* to sources; a
|
|
226
|
+
naive scanner reads those wikilinks as upstream edges and inverts the graph).
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
|
|
230
|
+
## Deferred (`~`)
|
|
231
|
+
|
|
232
|
+
- **Cross-run pitch RAG / vector archive** — semantic search over a *pitch
|
|
233
|
+
archive* across cycles ("have we shaped this before?", reviving passed pitches)
|
|
234
|
+
serves a **human at the betting table**, not an automated gate, so probabilistic
|
|
235
|
+
recall is harmless there. It is a separate infrastructure bet (embedding model,
|
|
236
|
+
store, re-index trigger). Revive as its own bet at a future betting table; its
|
|
237
|
+
home would be `.shapeup/pitch-archive/` + index — a level-up, never a
|
|
238
|
+
gate dependency.
|
|
239
|
+
- **Cross-run pitch archive** under `.shapeup/pitch-archive/` — only if/when
|
|
240
|
+
cross-run discovery lands. (The two-root workspace itself shipped in v2.2.)
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# Framing 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 raw conversation transcript into a structured framing document. Captures **the problem worth solving** and **why it was chosen** over alternatives.
|
|
10
|
+
|
|
11
|
+
**⚠️ GIGO Warning:** Formats and distills only. Does not evaluate whether the thinking is sound. Good conversation in → good document out. Bad in → bad out.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## When to Use
|
|
16
|
+
|
|
17
|
+
- You have a transcript of a real conversation about a problem or opportunity
|
|
18
|
+
- You need a shareable document to align the team on what you're solving
|
|
19
|
+
- Before starting shaping — to record the "why this, why now"
|
|
20
|
+
|
|
21
|
+
**This is a document skill for team contexts.** Not part of the solo shaping workflow.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Phase F1 — Parse Transcript
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
Read the entire transcript before writing anything. Extract:
|
|
29
|
+
- Core problem or observation being discussed
|
|
30
|
+
- Any "why this, not that" reasoning stated
|
|
31
|
+
- Appetite or time constraint if mentioned
|
|
32
|
+
- Explicit no-gos or out-of-scope statements
|
|
33
|
+
- Unresolved questions or open threads
|
|
34
|
+
|
|
35
|
+
DO NOT invent reasoning not present in the transcript.
|
|
36
|
+
If something is unclear: write "[unclear from transcript]" — never guess.
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Phase F2 — Write Framing Document
|
|
42
|
+
|
|
43
|
+
Write `shapeup/[feature-slug]/shaping/frame.md`
|
|
44
|
+
|
|
45
|
+
```markdown
|
|
46
|
+
---
|
|
47
|
+
shaping: true
|
|
48
|
+
feature: [feature-slug]
|
|
49
|
+
doc_type: frame
|
|
50
|
+
status: draft
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
# [Feature Name] — Framing
|
|
54
|
+
|
|
55
|
+
## The Problem
|
|
56
|
+
[2–4 sentences: situation + complication + why it matters now]
|
|
57
|
+
|
|
58
|
+
## Why Now
|
|
59
|
+
[What changed that makes this worth doing now vs later]
|
|
60
|
+
[Omit if not discussed in transcript]
|
|
61
|
+
|
|
62
|
+
## Desired Outcome
|
|
63
|
+
[Success from the user's perspective — observable and specific]
|
|
64
|
+
|
|
65
|
+
## Why This Direction
|
|
66
|
+
[Alternatives considered + rationale for this choice]
|
|
67
|
+
[Omit if alternatives not discussed]
|
|
68
|
+
|
|
69
|
+
## Appetite
|
|
70
|
+
[Time budget if mentioned. Omit if not mentioned.]
|
|
71
|
+
|
|
72
|
+
## Non-Goals
|
|
73
|
+
[Things explicitly decided NOT to solve. Omit if not discussed.]
|
|
74
|
+
|
|
75
|
+
## Open Questions
|
|
76
|
+
[Unresolved threads from the conversation. Omit if none.]
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
*Generated from transcript. Review before distributing.*
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## Phase F3 — Quality Check
|
|
85
|
+
|
|
86
|
+
```
|
|
87
|
+
- [ ] Every claim traces to something said in transcript (not inferred)
|
|
88
|
+
- [ ] No solution details in the Problem section
|
|
89
|
+
- [ ] Non-Goals present only if explicitly discussed
|
|
90
|
+
- [ ] Open Questions lists things unresolved, not new questions invented
|
|
91
|
+
- [ ] "[unclear from transcript]" used for ambiguous parts, not guesses
|
|
92
|
+
```
|