Breadboarding
Purpose
Produce a Shape Up style breadboard that is concrete enough to guide a build, without collapsing into pixel-perfect UI spec or a full-code hairball.
Based on Shape Up and Ryan Singer's work.
Treat affordances as the simplifying primitive.
- UI affordances: things a user can do (type, click, scroll) or see (states/messages) that matter to the flow.
- Code affordances: things the system can do (call a function, observe an observable, write/read state, navigate) that cause the UI affordances to change.
Use those to build a lightweight model of the current system and the proposed change.
When to use
- Reach the “rough out the elements” stage and need to turn an idea into buildable parts.
- Shape a change to a pre-existing system and need to understand what the system actually does today.
- Compare a new concept against an existing feature and decide whether to duplicate vs extract shared logic.
- Pick up a shaping effort after a gap and need a fast re-orientation: current state, chosen approach, and what’s still unsolved.
Inputs to request or infer
Prefer working with whatever exists. If inputs are missing, use ask-questions-if-underspecified skill
- Appetite / timebox and any hard boundaries.
- Problem statement and success definition.
- Brief (problem, goals, in/out scope). If missing, pause and draft a brief first.
- Requirements list (or a rough list of must-haves).
- Entry point(s): where the user starts, how they discover the feature.
- Existing system context: routes/screens, key components, services, data stores.
- Any comparable feature(s) to analyse for reuse.
Workflow
1) Establish the “right level of abstraction”
- Avoid full wireframes and visual design.
- Prefer words and connections over pictures.
- Focus on “what’s connected to what” (topology) and “what changes state”.
Use the breadboard primitives:
- Places: screens/pages/modals/menus that can be navigated to.
- Affordances: actions and information at a place (buttons, fields, copy, empty/loading states).
- Connection lines: how an affordance moves between places or triggers work.
2) Breadboard the user flow
- Start at the entry place.
- List the minimum affordances needed to serve the use case.
- Draw (describe) connection lines for navigation and “cause/effect” transitions.
Stop when the flow answers these shaping questions:
- Where in the current system does the new thing fit?
- How does a user get to it?
- What are the key components/interactions?
- Where does it take the user next?
3) Inventory UI affordances
Create a numbered list (recommended prefix U):
For each UI affordance, record:
- ID: U1, U2…
- Component / place: where it lives
- Affordance: “search input”, “loading spinner”, “no results message”, etc
- Control: type/click/scroll/render/iterate
- Wires out: what it triggers (calls, navigation, messages)
- Reads (optional): what state/data it depends on
Keep UI affordances at the interaction level, not implementation detail.
4) Inventory code affordances
Create a numbered list (recommended prefix N):
For each code affordance, record:
- ID: N1, N2…
- Component/service: where it lives
- Affordance: function, observable subscription, store write/read
- Control: call/observe/write/read
- Wires out: what it calls, writes, triggers, or returns
Interpretation rule:
- If it’s something that can be “operated” from a whole-system POV to make something happen, it’s an affordance.
5) Build a wiring diagram from affordances
Convert the inventories into a simple directed graph using beautiful-mermaid skill.
- Nodes: places, UI affordances, code affordances, external services, browser events.
- Edges:
- Solid for “wires out”: calls, triggers, writes
- Dashed for “returns/reads”: return values, store reads
Keep it legible:
- Draw only the parts touched by the change.
- Collapse deep internals into a single node when they aren’t central to the shaped behaviour.
- If it becomes a hairball, split into sub-diagrams per place or per flow.
Required output format (both, not either/or):
- Source code: include Mermaid source in a fenced ```mermaid block in the Markdown artefact.
- Static render: generate and save a rendered diagram asset (SVG preferred) via
beautiful-mermaid, and embed it in the Markdown artefact.
- Fallback: also generate a terminal-safe ASCII/Unicode render (
.txt) when practical.
Compatibility note:
- Some Markdown/SVG renderers (for example Zed) do not fully support CSS variables or
color-mix() inside SVG.
- If the render appears as black blocks, post-process the SVG to use literal color values (hex) for fill/stroke/text.
Naming convention (recommended):
<doc-base>-wiring.svg
<doc-base>-wiring.txt
Place static assets adjacent to the breadboard Markdown file so links stay portable.
Use template references/templates/wiring-diagram-mermaid-template.md.
6) Produce a parts list (BOM)
Write a numbered parts list (recommended prefix F for “shape/feature parts”):
- Each part is a buildable chunk with a clear mechanism.
- Include deletes/migrations explicitly (e.g., “remove letters from widget-grid”).
For each part:
- Name the part
- Summarise the mechanism in 1–2 lines
- Call out notable trade-offs (scope cuts, simplifications)
Use references/templates/parts-bom-template.md.
7) Fit check: requirements × concept
Create a simple table:
- Rows: requirements (R0…)
- Columns:
- requirement statement
- status (core goal / must-have / nice-to-have / out / undecided)
- fit with current concept (✅/❌/⚠️)
Then:
- Call out the unsolved requirement(s) as explicit shaping questions.
- Identify the decision needed (product/UX judgement vs technical unknown vs policy).
Use references/templates/fit-check-template.md.
8) Duplicate vs extract analysis (when overlap exists)
When a new change overlaps an existing feature, decide reuse via an affordances overlap rather than vibes.
Steps:
- Identify the comparable feature (existing) and the new concept.
- List shared affordances and divergent affordances.
- Compare requirements that drive divergence (URL shape, guards, state model, pagination mode, etc).
- Estimate the real code coupling cost vs the amount of duplication avoided.
Produce:
- A “Keep Shared vs Duplicate” table
- A recommendation (default bias: duplicate feature-level orchestration; extract infrastructure-level types/utilities)
- 3–5 concrete reasons, with emphasis on:
- divergent requirements
- lines of code vs coupling cost
Use references/templates/extract-vs-duplicate-template.md.
9) Package the breadboard as a single artefact
Output a “Breadboard Pack” as Markdown:
- Current State (what exists today)
- Proposed Breadboard (places, affordances, connections)
- UI Affordances table
- Code Affordances table
- Wiring diagram:
- embedded static image link (
.svg)
- Mermaid code block (source of truth)
- optional
.txt fallback path
- Parts/BOM
- Fit check + unsolved questions
- Rabbit holes / out-of-bounds / cuts
- Optional: extract vs duplicate analysis
Use references/templates/breadboard-pack-template.md.
Quality bar
- Stay rough, but solved: enough detail to unblock building, not enough to constrain visual design.
- Keep a consistent numbering scheme (U*, N*, R*, F*).
- Make every edge in the wiring diagram traceable back to an affordance row.
- Ensure diagram portability: a reader without Mermaid support must still see the static diagram.
- Prefer small, explicit trade-offs over implied complexity.
Bundled resources
references/shapeup-breadboarding-notes.md — summary of Shape Up breadboarding concepts.
references/templates/* — reusable templates for breadboard pack, tables, diagrams, fit checks.
references/templates/brief-template.md — brief template used by the brief skill.
references/examples/letter-search-example.md — an end-to-end example using UI+code affordances.
scripts/render_mermaid_from_edges.py — optional helper: JSON edge list -> Mermaid code (render via beautiful-mermaid)
1---2name: breadboarding3description: This skill should be used when shaping a software change and needing to breadboard the solution at the right level of abstraction (places, affordances, connections), including mapping an existing system via UI + code affordances, producing a wiring diagram, a parts/BOM plan, a fit check, and (when relevant) an extract-vs-duplicate analysis.4---56# Breadboarding78## Purpose910Produce a Shape Up style breadboard that is concrete enough to guide a build, without collapsing into pixel-perfect UI spec or a full-code hairball.1112Based on Shape Up and Ryan Singer's work.1314Treat **affordances** as the simplifying primitive.1516- **UI affordances**: things a user can do (type, click, scroll) or see (states/messages) that matter to the flow.17- **Code affordances**: things the system can do (call a function, observe an observable, write/read state, navigate) that cause the UI affordances to change.1819Use those to build a lightweight model of the current system and the proposed change.2021## When to use2223- Reach the “rough out the elements” stage and need to turn an idea into buildable parts.24- Shape a change to a **pre-existing system** and need to understand what the system actually does today.25- Compare a new concept against an existing feature and decide whether to **duplicate vs extract** shared logic.26- Pick up a shaping effort after a gap and need a fast re-orientation: current state, chosen approach, and what’s still unsolved.2728## Inputs to request or infer2930Prefer working with whatever exists. If inputs are missing, use `ask-questions-if-underspecified` skill3132- Appetite / timebox and any hard boundaries.33- Problem statement and success definition.34- Brief (problem, goals, in/out scope). If missing, pause and draft a brief first.35- Requirements list (or a rough list of must-haves).36- Entry point(s): where the user starts, how they discover the feature.37- Existing system context: routes/screens, key components, services, data stores.38- Any comparable feature(s) to analyse for reuse.3940## Workflow4142### 1) Establish the “right level of abstraction”4344- Avoid full wireframes and visual design.45- Prefer **words** and **connections** over pictures.46- Focus on “what’s connected to what” (topology) and “what changes state”.4748Use the breadboard primitives:4950- **Places**: screens/pages/modals/menus that can be navigated to.51- **Affordances**: actions and information at a place (buttons, fields, copy, empty/loading states).52- **Connection lines**: how an affordance moves between places or triggers work.5354### 2) Breadboard the user flow5556- Start at the entry place.57- List the minimum affordances needed to serve the use case.58- Draw (describe) connection lines for navigation and “cause/effect” transitions.5960Stop when the flow answers these shaping questions:6162- Where in the current system does the new thing fit?63- How does a user get to it?64- What are the key components/interactions?65- Where does it take the user next?6667### 3) Inventory UI affordances6869Create a numbered list (recommended prefix **U**):7071For each UI affordance, record:7273- **ID**: U1, U2…74- **Component / place**: where it lives75- **Affordance**: “search input”, “loading spinner”, “no results message”, etc76- **Control**: type/click/scroll/render/iterate77- **Wires out**: what it triggers (calls, navigation, messages)78- **Reads** (optional): what state/data it depends on7980Keep UI affordances at the interaction level, not implementation detail.8182### 4) Inventory code affordances8384Create a numbered list (recommended prefix **N**):8586For each code affordance, record:8788- **ID**: N1, N2…89- **Component/service**: where it lives90- **Affordance**: function, observable subscription, store write/read91- **Control**: call/observe/write/read92- **Wires out**: what it calls, writes, triggers, or returns9394Interpretation rule:9596- If it’s something that can be “operated” from a whole-system POV to make something happen, it’s an affordance.9798### 5) Build a wiring diagram from affordances99100Convert the inventories into a simple directed graph using `beautiful-mermaid` skill.101102- Nodes: places, UI affordances, code affordances, external services, browser events.103- Edges:104 - **Solid** for “wires out”: calls, triggers, writes105 - **Dashed** for “returns/reads”: return values, store reads106107Keep it legible:108109- Draw only the parts touched by the change.110- Collapse deep internals into a single node when they aren’t central to the shaped behaviour.111- If it becomes a hairball, split into sub-diagrams per place or per flow.112113Required output format (both, not either/or):1141151) **Source code**: include Mermaid source in a fenced ```mermaid block in the Markdown artefact.1162) **Static render**: generate and save a rendered diagram asset (SVG preferred) via `beautiful-mermaid`, and embed it in the Markdown artefact.1173) **Fallback**: also generate a terminal-safe ASCII/Unicode render (`.txt`) when practical.118119Compatibility note:120- Some Markdown/SVG renderers (for example Zed) do not fully support CSS variables or `color-mix()` inside SVG.121- If the render appears as black blocks, post-process the SVG to use literal color values (hex) for fill/stroke/text.122123Naming convention (recommended):124125- `<doc-base>-wiring.svg`126- `<doc-base>-wiring.txt`127128Place static assets adjacent to the breadboard Markdown file so links stay portable.129Use template `references/templates/wiring-diagram-mermaid-template.md`.130131### 6) Produce a parts list (BOM)132133Write a numbered parts list (recommended prefix **F** for “shape/feature parts”):134135- Each part is a buildable chunk with a clear mechanism.136- Include deletes/migrations explicitly (e.g., “remove letters from widget-grid”).137138For each part:139140- Name the part141- Summarise the mechanism in 1–2 lines142- Call out notable trade-offs (scope cuts, simplifications)143144Use `references/templates/parts-bom-template.md`.145146### 7) Fit check: requirements × concept147148Create a simple table:149150- Rows: requirements (R0…)151- Columns:152 - requirement statement153 - status (core goal / must-have / nice-to-have / out / undecided)154 - fit with current concept (✅/❌/⚠️)155156Then:157158- Call out the **unsolved** requirement(s) as explicit shaping questions.159- Identify the decision needed (product/UX judgement vs technical unknown vs policy).160161Use `references/templates/fit-check-template.md`.162163### 8) Duplicate vs extract analysis (when overlap exists)164165When a new change overlaps an existing feature, decide reuse via an **affordances overlap** rather than vibes.166167Steps:168169- Identify the comparable feature (existing) and the new concept.170- List shared affordances and divergent affordances.171- Compare requirements that drive divergence (URL shape, guards, state model, pagination mode, etc).172- Estimate the real code coupling cost vs the amount of duplication avoided.173174Produce:175176- A “Keep Shared vs Duplicate” table177- A recommendation (default bias: duplicate feature-level orchestration; extract infrastructure-level types/utilities)178- 3–5 concrete reasons, with emphasis on:179 - **divergent requirements**180 - **lines of code vs coupling cost**181182Use `references/templates/extract-vs-duplicate-template.md`.183184### 9) Package the breadboard as a single artefact185186Output a “Breadboard Pack” as Markdown:187188- Current State (what exists today)189- Proposed Breadboard (places, affordances, connections)190- UI Affordances table191- Code Affordances table192- Wiring diagram:193 - embedded static image link (`.svg`)194 - Mermaid code block (source of truth)195 - optional `.txt` fallback path196- Parts/BOM197- Fit check + unsolved questions198- Rabbit holes / out-of-bounds / cuts199- Optional: extract vs duplicate analysis200201Use `references/templates/breadboard-pack-template.md`.202203## Quality bar204205- Stay rough, but solved: enough detail to unblock building, not enough to constrain visual design.206- Keep a consistent numbering scheme (U*, N*, R*, F*).207- Make every edge in the wiring diagram traceable back to an affordance row.208- Ensure diagram portability: a reader without Mermaid support must still see the static diagram.209- Prefer small, explicit trade-offs over implied complexity.210211## Bundled resources212213- `references/shapeup-breadboarding-notes.md` — summary of Shape Up breadboarding concepts.214- `references/templates/*` — reusable templates for breadboard pack, tables, diagrams, fit checks.215- `references/templates/brief-template.md` — brief template used by the brief skill.216- `references/examples/letter-search-example.md` — an end-to-end example using UI+code affordances.217- `scripts/render_mermaid_from_edges.py` — optional helper: JSON edge list -> Mermaid code (render via `beautiful-mermaid`)