bossbuild 0.97.0
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/LICENSE +21 -0
- package/PRINCIPLES.md +70 -0
- package/README.md +213 -0
- package/VERSION +1 -0
- package/bin/boss +3 -0
- package/library/README.md +19 -0
- package/library/agents/.gitkeep +0 -0
- package/library/agents/mentor-venture.md +57 -0
- package/library/hooks/.gitkeep +0 -0
- package/library/hooks/auto-log.js +133 -0
- package/library/hooks/memory-cue.js +82 -0
- package/library/hooks/secrets-guard.js +87 -0
- package/library/memory-seed/README.md +29 -0
- package/library/memory-seed/durable-facts-example.md +16 -0
- package/library/practices/.gitkeep +0 -0
- package/library/practices/agent-security.md +111 -0
- package/library/practices/ai-adoption-culture.md +104 -0
- package/library/practices/ai-ux-patterns.md +246 -0
- package/library/practices/celebration-of-done.md +100 -0
- package/library/practices/conscience-voicing.md +121 -0
- package/library/practices/context-discipline.md +116 -0
- package/library/practices/design-system.md +152 -0
- package/library/practices/git-workflow.md +119 -0
- package/library/practices/harm-taxonomy.md +45 -0
- package/library/practices/quality-ratchet.md +48 -0
- package/library/practices/revalidation.md +57 -0
- package/library/practices/scalable-architecture.md +111 -0
- package/library/practices/ship-it-live.md +149 -0
- package/library/practices/skill-authoring.md +70 -0
- package/library/skills/.gitkeep +0 -0
- package/library/skills/boss-learn/SKILL.md +63 -0
- package/library/skills/boss-sync/SKILL.md +48 -0
- package/package.json +49 -0
- package/registry/CHANGELOG.md +2737 -0
- package/src/board.js +655 -0
- package/src/brain.js +288 -0
- package/src/cli.js +542 -0
- package/src/conscience.js +426 -0
- package/src/insights.js +147 -0
- package/src/learn.js +92 -0
- package/src/map.js +103 -0
- package/src/modes.js +82 -0
- package/src/paths.js +36 -0
- package/src/registry.js +34 -0
- package/src/scaffold.js +138 -0
- package/src/sync.js +292 -0
- package/src/team.js +103 -0
- package/stages/L0-quickstart/manifest.json +12 -0
- package/stages/L0-quickstart/template/.claude/agents/coder-generalist.md +31 -0
- package/stages/L0-quickstart/template/.claude/agents/mentor-venture.md +57 -0
- package/stages/L0-quickstart/template/.claude/agents/pm.md +28 -0
- package/stages/L0-quickstart/template/.claude/hooks/conscience.js +89 -0
- package/stages/L0-quickstart/template/.claude/hooks/lib/loop-runtime.js +507 -0
- package/stages/L0-quickstart/template/.claude/hooks/lib/yaml.js +163 -0
- package/stages/L0-quickstart/template/.claude/hooks/memory-cue.js +82 -0
- package/stages/L0-quickstart/template/.claude/hooks/secrets-guard.js +87 -0
- package/stages/L0-quickstart/template/.claude/rules/your-app-code.md +17 -0
- package/stages/L0-quickstart/template/.claude/settings.json +36 -0
- package/stages/L0-quickstart/template/.claude/skills/boss/SKILL.md +161 -0
- package/stages/L0-quickstart/template/.claude/skills/boss-learn/SKILL.md +63 -0
- package/stages/L0-quickstart/template/.claude/skills/boss-sync/SKILL.md +55 -0
- package/stages/L0-quickstart/template/.claude/skills/canvas/SKILL.md +112 -0
- package/stages/L0-quickstart/template/.claude/skills/comprehend/SKILL.md +72 -0
- package/stages/L0-quickstart/template/.claude/skills/decide/SKILL.md +122 -0
- package/stages/L0-quickstart/template/.claude/skills/feedback/SKILL.md +68 -0
- package/stages/L0-quickstart/template/.claude/skills/import/SKILL.md +73 -0
- package/stages/L0-quickstart/template/.claude/skills/persona/SKILL.md +92 -0
- package/stages/L0-quickstart/template/.claude/skills/prototype/SKILL.md +114 -0
- package/stages/L0-quickstart/template/.claude/skills/triage/SKILL.md +104 -0
- package/stages/L0-quickstart/template/.claude/skills/welcome/SKILL.md +262 -0
- package/stages/L0-quickstart/template/AGENTS.md +31 -0
- package/stages/L0-quickstart/template/CLAUDE.md +57 -0
- package/stages/L0-quickstart/template/docs/IDS.md +42 -0
- package/stages/L0-quickstart/template/docs/ideas/INDEX.md +24 -0
- package/stages/L0-quickstart/template/docs/loops/canvas-loop.md +90 -0
- package/stages/L0-quickstart/template/docs/loops/capture-loop.md +64 -0
- package/stages/L1-mvp/manifest.json +12 -0
- package/stages/L1-mvp/template/.claude/agents/mentor-architect.md +124 -0
- package/stages/L1-mvp/template/.claude/agents/mentor-cofounder.md +85 -0
- package/stages/L1-mvp/template/.claude/agents/mentor-gtm.md +49 -0
- package/stages/L1-mvp/template/.claude/agents/program-manager.md +46 -0
- package/stages/L1-mvp/template/.claude/agents/tester.md +42 -0
- package/stages/L1-mvp/template/.claude/hooks/auto-log.js +133 -0
- package/stages/L1-mvp/template/.claude/rules/feature-context.md +18 -0
- package/stages/L1-mvp/template/.claude/skills/ai-cost/SKILL.md +249 -0
- package/stages/L1-mvp/template/.claude/skills/ai-failure-states/SKILL.md +226 -0
- package/stages/L1-mvp/template/.claude/skills/ai-first-init/SKILL.md +227 -0
- package/stages/L1-mvp/template/.claude/skills/close/SKILL.md +170 -0
- package/stages/L1-mvp/template/.claude/skills/consult/SKILL.md +72 -0
- package/stages/L1-mvp/template/.claude/skills/cost-review/SKILL.md +204 -0
- package/stages/L1-mvp/template/.claude/skills/design-tokens-init/SKILL.md +192 -0
- package/stages/L1-mvp/template/.claude/skills/drift-deep/SKILL.md +170 -0
- package/stages/L1-mvp/template/.claude/skills/evals/SKILL.md +154 -0
- package/stages/L1-mvp/template/.claude/skills/extract/SKILL.md +209 -0
- package/stages/L1-mvp/template/.claude/skills/judge-traces/SKILL.md +68 -0
- package/stages/L1-mvp/template/.claude/skills/log/SKILL.md +64 -0
- package/stages/L1-mvp/template/.claude/skills/practice/SKILL.md +92 -0
- package/stages/L1-mvp/template/.claude/skills/pretotype/SKILL.md +95 -0
- package/stages/L1-mvp/template/.claude/skills/red-team/SKILL.md +137 -0
- package/stages/L1-mvp/template/.claude/skills/revalidate/SKILL.md +51 -0
- package/stages/L1-mvp/template/.claude/skills/ship/SKILL.md +105 -0
- package/stages/L1-mvp/template/.claude/skills/smoke/SKILL.md +43 -0
- package/stages/L1-mvp/template/.claude/skills/spec/SKILL.md +145 -0
- package/stages/L1-mvp/template/claude-append.md +122 -0
- package/stages/L1-mvp/template/docs/loops/ai-failure-state-loop.md +107 -0
- package/stages/L1-mvp/template/docs/loops/coordination-loop.md +116 -0
- package/stages/L1-mvp/template/docs/loops/cost-budget-loop.md +117 -0
- package/stages/L1-mvp/template/docs/loops/cost-review-loop.md +113 -0
- package/stages/L1-mvp/template/docs/loops/design-tokens-loop.md +98 -0
- package/stages/L1-mvp/template/docs/loops/drift-loop.md +149 -0
- package/stages/L1-mvp/template/docs/loops/extraction-loop.md +128 -0
- package/stages/L1-mvp/template/docs/loops/focus-loop.md +106 -0
- package/stages/L1-mvp/template/docs/loops/pretotype-loop.md +88 -0
- package/stages/L1-mvp/template/docs/loops/spec-loop.md +83 -0
- package/stages/L2-v1/manifest.json +12 -0
- package/stages/L2-v1/template/.claude/agents/db-architect.md +91 -0
- package/stages/L2-v1/template/.claude/agents/mentor-business.md +124 -0
- package/stages/L2-v1/template/.claude/agents/mentor-fundraising.md +72 -0
- package/stages/L2-v1/template/.claude/agents/mentor-pitch.md +84 -0
- package/stages/L2-v1/template/.claude/agents/mentor-talent.md +84 -0
- package/stages/L2-v1/template/.claude/agents/ui-designer.md +81 -0
- package/stages/L2-v1/template/.claude/agents/ux-designer.md +87 -0
- package/stages/L2-v1/template/.claude/skills/board/SKILL.md +98 -0
- package/stages/L2-v1/template/.claude/skills/design-review/SKILL.md +77 -0
- package/stages/L2-v1/template/.claude/skills/ux-check/SKILL.md +93 -0
- package/stages/L2-v1/template/claude-append.md +59 -0
- package/stages/L2-v1/template/docs/loops/design-drift-loop.md +108 -0
- package/stages/L3-scale/README.md +13 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: design-tokens-loop
|
|
3
|
+
type: loop
|
|
4
|
+
stage: L1-mvp
|
|
5
|
+
runner_type: hook
|
|
6
|
+
attributed_to: [Brad Frost, Nathan Curtis, Ajesh Shah]
|
|
7
|
+
also_relevant: [Jina Anne, Diana Mounter, Dan Mall, John Maeda]
|
|
8
|
+
entry:
|
|
9
|
+
- count_at_least:
|
|
10
|
+
path_glob: src/**
|
|
11
|
+
pattern: '(className=|style={|css`|styled\.)'
|
|
12
|
+
min: 3
|
|
13
|
+
exit:
|
|
14
|
+
- exists: { path: docs/design/DESIGN_TOKENS.md }
|
|
15
|
+
- count_at_least:
|
|
16
|
+
path_glob: src/**
|
|
17
|
+
pattern: '(token\.|var\(--|colors\.|tokens\.|theme\.)'
|
|
18
|
+
min: 3
|
|
19
|
+
drift_moment: coherence
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
# Loop: design-tokens (MVP)
|
|
23
|
+
|
|
24
|
+
The discipline that **prevents the 47 blues** ([IDEA-010](../../ideas/IDEA-010-scalable-ai-design.md)).
|
|
25
|
+
The most-common AI-generated-UI failure mode: each new screen Claude generates derives its own
|
|
26
|
+
colors, spacing, components — and the codebase grows linearly with screens. This loop catches
|
|
27
|
+
that early, JIT, *only when UI is actually accumulating.*
|
|
28
|
+
|
|
29
|
+
`runner_type: hook` — the conscience hook evaluates this loop on every UserPromptSubmit. But the
|
|
30
|
+
loop is structured so it **doesn't fire on fresh projects** (the entry predicate requires ≥3
|
|
31
|
+
style declarations across `src/`; a brand-new repo has 0). It opens only when the founder has
|
|
32
|
+
started accumulating UI — *the first UI commit inflection* (IDEA-010's "early-start JIT").
|
|
33
|
+
|
|
34
|
+
When open, the conscience surfaces a `coherence` moment (new in v0.21.0 — a flavor of caution
|
|
35
|
+
specific to system-vs-code drift): *"You're putting style into code without a token system. The
|
|
36
|
+
AI doesn't have a reference, so each screen will reinvent colors and spacing — fast-forward to
|
|
37
|
+
the 47 blues. Want me to run `/design-tokens-init` now?"*
|
|
38
|
+
|
|
39
|
+
## Entry artifact
|
|
40
|
+
|
|
41
|
+
`src/` contains ≥3 source files with inline style declarations (matched by a regex covering
|
|
42
|
+
common patterns: Tailwind `className=`, inline `style={}`, css-in-js template literals, styled-
|
|
43
|
+
components syntax). Threshold of 3 is the *"the first UI commit"* signal — one or two are an
|
|
44
|
+
exploratory file; three is the founder starting to *build*. Stack-agnostic enough to catch most
|
|
45
|
+
common React / Vue / Svelte / Solid projects today.
|
|
46
|
+
|
|
47
|
+
For projects in stacks the regex misses, the founder can either:
|
|
48
|
+
- Edit this loop spec's entry pattern to match their stack
|
|
49
|
+
- Or simply run `/design-tokens-init` manually (the loop respects override)
|
|
50
|
+
|
|
51
|
+
## Purpose
|
|
52
|
+
|
|
53
|
+
Scaffold the minimum three-layer design token system *before* drift accumulates. Cohort-aware
|
|
54
|
+
delivery (per `/design-tokens-init`): vibe-coder-newbie gets SHOWING; eng-builder gets OFFERING;
|
|
55
|
+
vibe-virtuoso gets OVERRIDE-FRIENDLY; etc.
|
|
56
|
+
|
|
57
|
+
## Exit artifact
|
|
58
|
+
|
|
59
|
+
`docs/design/DESIGN_TOKENS.md` exists AND code references tokens (≥3 occurrences across `src/`
|
|
60
|
+
of patterns like `token.`, `var(--`, `colors.` (when a tokens module is imported), `tokens.`,
|
|
61
|
+
`theme.` — covers most token-consumption styles). The dual requirement matters: a tokens file
|
|
62
|
+
without any code consuming it is theater, not discipline.
|
|
63
|
+
|
|
64
|
+
## Drift
|
|
65
|
+
|
|
66
|
+
Entry satisfied (≥3 style declarations) AND exit not satisfied (no tokens file OR no token refs)
|
|
67
|
+
→ loop is open → conscience emits `coherence` moment. Confidence scales:
|
|
68
|
+
- 3-5 style declarations: low confidence (might be exploratory)
|
|
69
|
+
- 6-10: medium
|
|
70
|
+
- 11+: high (real drift)
|
|
71
|
+
|
|
72
|
+
The voice (cohort-aware via v0.20's framing): name the drift in one line, offer to scaffold,
|
|
73
|
+
hand the decision back. Override is recorded in devlog per IDEA-008.
|
|
74
|
+
|
|
75
|
+
## How to remix
|
|
76
|
+
|
|
77
|
+
- **Skip:** legitimate when the project's UI is genuinely throwaway (an internal admin script,
|
|
78
|
+
a one-off demo). Override:
|
|
79
|
+
```
|
|
80
|
+
- **OVERRIDE:** skipped `design-tokens-loop` — rationale: <UI is throwaway —
|
|
81
|
+
e.g., admin script for personal use; not user-facing; not maintained beyond
|
|
82
|
+
this build>.
|
|
83
|
+
```
|
|
84
|
+
- **Swap discipline:** Frost-Atomic-Design lineage vs. Curtis-tokens-layer-cake vs. a stack-
|
|
85
|
+
native pattern (e.g., Mantine's theme tokens; Chakra's theme; Tailwind's config). The loop's
|
|
86
|
+
exit predicate checks for token *consumption*, not a specific tool. Stack-aware adapters can
|
|
87
|
+
live in `library/practices/scalable-ai-design/<stack>.md` (v0.24+).
|
|
88
|
+
- **Author your own:** a domain-specific scaling discipline (e.g., a `data-vocabulary-loop` for
|
|
89
|
+
a project where the load-bearing standardization is API field names, not visual style).
|
|
90
|
+
|
|
91
|
+
## When this loop re-opens
|
|
92
|
+
|
|
93
|
+
- Tokens file deleted or renamed without code update → exit predicate fails again
|
|
94
|
+
- New UI added in a way that bypasses tokens (raw hex codes proliferate) → arguably should
|
|
95
|
+
re-open; today's predicate doesn't catch this (it just checks for *some* token consumption).
|
|
96
|
+
The v0.22 design-drift-loop will catch this case.
|
|
97
|
+
- Stack migration (e.g., Mantine → Tailwind) → exit predicate may transiently fail; re-init
|
|
98
|
+
in the new stack
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: drift-loop
|
|
3
|
+
type: loop
|
|
4
|
+
stage: L1-mvp
|
|
5
|
+
runner_type: hook
|
|
6
|
+
attributed_to: [Ajesh Shah (PRINCIPLES — "build faster without fooling themselves")]
|
|
7
|
+
also_relevant: [Eric Ries (validated learning), Ash Maurya (riskiest assumption first), Rob Fitzpatrick (talk to someone before you build)]
|
|
8
|
+
entry:
|
|
9
|
+
- any_file_matches:
|
|
10
|
+
path_glob: docs/ideas/*-canvas.md
|
|
11
|
+
pattern: 'Riskiest assumption:\*\*\s+[^_].*[a-zA-Z0-9]{3,}'
|
|
12
|
+
related_idea_not_matching: '^status:\s+dropped'
|
|
13
|
+
- count_at_least:
|
|
14
|
+
path_glob: docs/devlog.md
|
|
15
|
+
pattern: '^## \d{4}-\d{2}-\d{2}'
|
|
16
|
+
min: 3
|
|
17
|
+
exit:
|
|
18
|
+
- any_file_matches:
|
|
19
|
+
path_glob: docs/ideas/*-canvas.md
|
|
20
|
+
pattern: 'Experiment this week:\*\*\s+[^_].*[a-zA-Z0-9]{3,}'
|
|
21
|
+
related_idea_not_matching: '^status:\s+dropped'
|
|
22
|
+
drift_moment: drift
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
# Loop: drift (MVP) — the work vs. the named risk
|
|
26
|
+
|
|
27
|
+
> *"BOSS helps founders build faster without fooling themselves — compressing the loop from idea
|
|
28
|
+
> to evidence while continuously checking the work against real pain, real workflows, real buyers,
|
|
29
|
+
> real economics, and real distribution."* — PRINCIPLES.md, the why.
|
|
30
|
+
|
|
31
|
+
This is the closest loop to the reason BOSS exists. The other moments catch *structural* gaps —
|
|
32
|
+
no canvas, no budget, no failure-states. This one catches the gap PRINCIPLES.md names first and
|
|
33
|
+
that no predicate can fully see: **you named the bet that could sink this, and then you spent your
|
|
34
|
+
sessions building something else.**
|
|
35
|
+
|
|
36
|
+
It fires in the gap *between* moment #1 (`caution` — no riskiest assumption named yet) and the
|
|
37
|
+
graduation moment (`done` — the riskiest assumption has a validation plan). Caution covers "you
|
|
38
|
+
haven't named the risk." This covers "you named it, you've been building for a few sessions, and
|
|
39
|
+
nothing you've built tests it."
|
|
40
|
+
|
|
41
|
+
## The judgment the predicate can't do (and the model can)
|
|
42
|
+
|
|
43
|
+
The predicate gate is deliberately cheap and structural: *a riskiest assumption is filled in, work
|
|
44
|
+
has accumulated (≥3 devlog entries), and no "Experiment this week" validation plan exists yet.*
|
|
45
|
+
That's all regex can prove. It cannot read the five recent devlog entries and tell whether the work
|
|
46
|
+
is **about** the named risk or **around** it. That semantic comparison — stated bet vs. actual
|
|
47
|
+
work — is the model's job, and it's the whole value of this moment.
|
|
48
|
+
|
|
49
|
+
So the loop **opens the door**; the model walks through it with judgment. When the door is open,
|
|
50
|
+
the conscience hands the model a bounded instruction (read the riskiest-assumption line + the most
|
|
51
|
+
recent ~5 devlog entries + the open FEAT/spec, nothing wider) and asks it to judge: is this work
|
|
52
|
+
testing the risk, or building past it? If drifted, name the specific gap — *"you said X is the bet
|
|
53
|
+
that could sink this; the last sessions built Y and Z; neither tests X"* — and ask what the smallest
|
|
54
|
+
experiment on the risk would be. If the work **is** engaging the risk, stay silent. Silence is the
|
|
55
|
+
correct output when the founder is on-aim.
|
|
56
|
+
|
|
57
|
+
This is the same shape as `extraction-loop` / `/extract`: a cheap heuristic gate fronting a model
|
|
58
|
+
judgment the regex can't make. The difference is host-binding — `/extract` is a skill the founder
|
|
59
|
+
invokes; this fires *unprompted* through the hook, because a founder who has drifted from their own
|
|
60
|
+
stated bet is precisely the founder who won't think to ask whether they've drifted.
|
|
61
|
+
|
|
62
|
+
## Entry artifact
|
|
63
|
+
|
|
64
|
+
Two predicates, both required:
|
|
65
|
+
|
|
66
|
+
1. **A named risk** — at least one active (non-dropped) idea's canvas has a real riskiest-assumption
|
|
67
|
+
line (same predicate `canvas-loop` uses for its exit; the `[^_]` rejects `_(placeholder)_` fills).
|
|
68
|
+
2. **Accumulated work** — `docs/devlog.md` has ≥3 dated entries (`^## YYYY-MM-DD`). Same threshold
|
|
69
|
+
and surface as `extraction-loop`: three sessions in is the inflection where "still building the
|
|
70
|
+
first thing" becomes "have I been building toward the bet?"
|
|
71
|
+
|
|
72
|
+
Confidence scales with devlog overshoot (the runtime reads the count predicate): 3 entries → low,
|
|
73
|
+
4–5 → medium, 6+ → high. More sessions deep without a validation plan = a louder signal.
|
|
74
|
+
|
|
75
|
+
## Purpose
|
|
76
|
+
|
|
77
|
+
Keep the work pointed at the riskiest assumption. The failure mode this prevents is the one
|
|
78
|
+
PRINCIPLES.md opens with: a *pseudo app* — an impressive, polished build that never tested the
|
|
79
|
+
thing most likely to kill it. AI makes that failure cheaper and more convincing every model
|
|
80
|
+
generation; this loop is the counter-pressure.
|
|
81
|
+
|
|
82
|
+
## Exit artifact
|
|
83
|
+
|
|
84
|
+
The canvas's **Experiment this week** line is filled with a real validation plan (not the
|
|
85
|
+
`_(the smallest test…)_` placeholder) — the same artifact the `done` graduation moment looks for.
|
|
86
|
+
Recording how you'll test the risk closes the loop. The good outcome of a drift nudge is the
|
|
87
|
+
founder writing (or running) that experiment.
|
|
88
|
+
|
|
89
|
+
## Drift
|
|
90
|
+
|
|
91
|
+
`entry: satisfied` (risk named AND ≥3 devlog entries) AND `exit: not satisfied` (no validation
|
|
92
|
+
plan recorded) = loop is OPEN → conscience emits the `drift` moment.
|
|
93
|
+
|
|
94
|
+
The model composes the voice (per `boss-voice`: seasoned hand, assume intelligence, never assume
|
|
95
|
+
knowledge), reads only the bounded set named above, and judges before speaking. **Not** a
|
|
96
|
+
"you've been productive!" reward and **not** a generic "you should validate" lecture — the value
|
|
97
|
+
is the *specific* stated-vs-actual comparison. Cohort-aware: returning-founder gets the harder
|
|
98
|
+
"is your conviction here where it needs to be for 12 months" cut; first-product gets "here's what
|
|
99
|
+
'test your riskiest bet' actually means" taught plainly; domain-expert gets the who-could-be-harmed
|
|
100
|
+
lens on the named risk.
|
|
101
|
+
|
|
102
|
+
## Cost (BOSS eating its own dogfood)
|
|
103
|
+
|
|
104
|
+
This moment reads more context than the cheap predicate moments, so it has to respect the same
|
|
105
|
+
discipline `/ai-cost` preaches or BOSS becomes the expensive-AI-app it warns against:
|
|
106
|
+
|
|
107
|
+
- The **predicate gate is the cost control.** The model only reads wider context when the cheap
|
|
108
|
+
Node predicate has already confirmed the precondition. On every other prompt the hook emits
|
|
109
|
+
nothing.
|
|
110
|
+
- The read is **bounded** — riskiest-assumption line + ~5 recent devlog entries + the open FEAT.
|
|
111
|
+
Never "read the whole project." Bounded inputs are structured-output discipline applied to the
|
|
112
|
+
input side.
|
|
113
|
+
- The model fires **at most once per session** and stays silent when on-aim.
|
|
114
|
+
|
|
115
|
+
## How to remix
|
|
116
|
+
|
|
117
|
+
- **Skip / override:** legitimate when the founder is *deliberately* de-risking in a different
|
|
118
|
+
order (e.g. building a thin slice first specifically to make the risk testable). Override grammar:
|
|
119
|
+
```
|
|
120
|
+
- **OVERRIDE:** skipped `drift-loop` — rationale: <e.g. building the minimal slice this week
|
|
121
|
+
precisely so the riskiest-assumption experiment becomes runnable next week; risk is named and
|
|
122
|
+
sequenced, not forgotten>.
|
|
123
|
+
```
|
|
124
|
+
- **Swap discipline:** the "riskiest assumption + one experiment" heartbeat is one framing
|
|
125
|
+
(Maurya / Ries). A `jobs-to-be-done` validation plan, a `Mom Test` interview plan (Fitzpatrick),
|
|
126
|
+
or a `pretotype` demand test (Savoia) are all legitimate exits — note the framing in the canvas.
|
|
127
|
+
- **Author your own:** a domain-specific drift loop (e.g. a `compliance-drift-loop` for a regulated
|
|
128
|
+
product, where the named risk is regulatory and the validation plan is a legal review).
|
|
129
|
+
|
|
130
|
+
## When this loop re-opens
|
|
131
|
+
|
|
132
|
+
- The riskiest assumption changes (a new bet is named) without a fresh experiment line.
|
|
133
|
+
- An experiment ran and *disconfirmed* — the founder clears the validation plan to re-aim.
|
|
134
|
+
|
|
135
|
+
## Known limitation (consistent with `canvas-loop`)
|
|
136
|
+
|
|
137
|
+
`any_file_matches` is satisfied by *any* canvas, so a single graduated idea (risk + experiment
|
|
138
|
+
both filled) closes the loop even if a second active idea has a named risk and no plan. This is the
|
|
139
|
+
same `any`-semantics limitation `canvas-loop` carries; for the common single-active-idea case it's
|
|
140
|
+
correct, and the model — reading the actual canvases when the loop *is* open — can catch the masked
|
|
141
|
+
case anyway. A per-idea drift check would need cross-file pairing the predicate vocabulary doesn't
|
|
142
|
+
have yet; deferred until there's evidence it matters.
|
|
143
|
+
|
|
144
|
+
## Cite
|
|
145
|
+
|
|
146
|
+
PRINCIPLES.md (the why) — *"build faster without fooling themselves… continuously checking the work
|
|
147
|
+
against real pain, real workflows, real buyers."* Ries (validated learning), Maurya (riskiest
|
|
148
|
+
assumption first), Fitzpatrick (talk to someone before you build). The loop is the *when*; the
|
|
149
|
+
model's judgment + `/canvas` / `/pretotype` are the *how*.
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: extraction-loop
|
|
3
|
+
type: loop
|
|
4
|
+
stage: L1-mvp
|
|
5
|
+
runner_type: hook
|
|
6
|
+
attributed_to: [Ajesh Shah (PRINCIPLE #1 — pause to extract patterns)]
|
|
7
|
+
also_relevant: [Brad Frost (atomic design as extraction), Bret Victor (the principle of the principle), Don Norman (affordances emerge from use)]
|
|
8
|
+
entry:
|
|
9
|
+
- count_at_least:
|
|
10
|
+
path_glob: docs/devlog.md
|
|
11
|
+
pattern: '^## \d{4}-\d{2}-\d{2}'
|
|
12
|
+
min: 3
|
|
13
|
+
exit:
|
|
14
|
+
- count_at_least:
|
|
15
|
+
path_glob: docs/extractions/EXTR-*.md
|
|
16
|
+
pattern: '^- \*\*Route:\*\*'
|
|
17
|
+
min: 1
|
|
18
|
+
drift_moment: capture
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
# Loop: extraction (MVP) — PRINCIPLE #1's own discipline
|
|
22
|
+
|
|
23
|
+
> *"BOSS is always scaffolding, but scaffolding is the motion, not the goal. At every natural
|
|
24
|
+
> breakpoint — a mode transition, a shipped feature, the third time the same work repeats —
|
|
25
|
+
> **pause and sort the pattern two ways:** UP into BOSS as a reusable superset practice. DOWN
|
|
26
|
+
> into the app as core functionality."* — PRINCIPLE #1.
|
|
27
|
+
|
|
28
|
+
For 28 releases the conscience has surfaced caution / done / restraint / coherence / cost /
|
|
29
|
+
failure-mode. **PRINCIPLE #1's own discipline had no moment.** Capture-the-reusable was named
|
|
30
|
+
in PRINCIPLES.md but undetected by the system meant to encode the principles. v0.29 closes
|
|
31
|
+
that — not perfectly (predicate-based heuristics can't see *reusability* — only the model can),
|
|
32
|
+
but enough to nudge the founder toward `/extract` at the *breakpoint inflection*.
|
|
33
|
+
|
|
34
|
+
The loop fires the `capture` moment when a founder has accumulated meaningful work
|
|
35
|
+
(heuristic: ≥3 devlog entries) and hasn't yet recorded an extraction decision (an EXTR-NNN
|
|
36
|
+
file). The skill `/extract` is the actual judgment — it reads recent work and proposes
|
|
37
|
+
specific UP / DOWN routes; the loop just **opens the door** at the inflection.
|
|
38
|
+
|
|
39
|
+
This is the first hook-runner loop whose entry is *time-of-work* rather than *predicate-of-
|
|
40
|
+
file-state*. The heuristic is intentionally simple (devlog entry count); we lean on the model
|
|
41
|
+
running `/extract` for the real judgment. The pattern sets a precedent for future moments that
|
|
42
|
+
can't be detected by file regex alone.
|
|
43
|
+
|
|
44
|
+
## Entry artifact
|
|
45
|
+
|
|
46
|
+
`docs/devlog.md` contains ≥3 dated entries (regex: `^## \d{4}-\d{2}-\d{2}`). Threshold of 3
|
|
47
|
+
mirrors PRINCIPLE #1's *"the third time the same work repeats"* signal. Fewer entries = not
|
|
48
|
+
yet at a natural breakpoint; the founder is still in initial-build motion.
|
|
49
|
+
|
|
50
|
+
The devlog is the right surface to gate on because the `/log` skill already produces dated
|
|
51
|
+
entries, the `/close` skill nudges devlog discipline at session end, and the format is
|
|
52
|
+
stable. Future versions may add complementary entry signals (`boss unlock` recently fired;
|
|
53
|
+
FEAT-NNN status flipped to `shipped`; library/ recently grew); for v0.29 the devlog-count
|
|
54
|
+
heuristic is enough to mark the inflection.
|
|
55
|
+
|
|
56
|
+
## Purpose
|
|
57
|
+
|
|
58
|
+
Surface PRINCIPLE #1 at the right time. Not too early (a founder mid-first-build doesn't have
|
|
59
|
+
extractables yet); not too late (by the time copy-paste duplication is everywhere, extraction
|
|
60
|
+
is a refactor cost, not a discipline). Three devlog entries is the *"you've shipped something,
|
|
61
|
+
now look at what's worth keeping"* inflection.
|
|
62
|
+
|
|
63
|
+
When the loop opens, the conscience emits a `capture` moment in its own voice: *"You've been
|
|
64
|
+
in flow for a few sessions. Pause-extract time. Run `/extract` — it'll look at recent work and
|
|
65
|
+
propose 1-3 candidates routed UP (into BOSS's library) or DOWN (into the app's core)."* Never
|
|
66
|
+
blocks; the founder decides.
|
|
67
|
+
|
|
68
|
+
## Exit artifact
|
|
69
|
+
|
|
70
|
+
≥1 file in `docs/extractions/` matching `EXTR-*.md` with at least one `- **Route:**` line
|
|
71
|
+
recorded. The skill `/extract` writes these. The presence of *any* extraction record closes
|
|
72
|
+
the loop — the discipline IS the practice of pausing-and-routing, not the volume of
|
|
73
|
+
extractions.
|
|
74
|
+
|
|
75
|
+
To re-open the loop, the founder OR a future BOSS version refreshes the heuristic. v0.29
|
|
76
|
+
ships the **first-inflection** version of this loop. Future versions may add recurring re-
|
|
77
|
+
opening (e.g., 5+ devlog entries since the most recent extraction); for now, once the
|
|
78
|
+
founder has practiced extraction once, the discipline is theirs.
|
|
79
|
+
|
|
80
|
+
## Drift
|
|
81
|
+
|
|
82
|
+
Entry satisfied (≥3 devlog entries) AND exit not satisfied (no EXTR-NNN files) → loop is
|
|
83
|
+
open → conscience emits `capture` moment.
|
|
84
|
+
|
|
85
|
+
Confidence is **medium by default** (the heuristic is broad; not every 3-devlog moment is a
|
|
86
|
+
real breakpoint), but the skill /extract sharpens this at runtime — if /extract reads recent
|
|
87
|
+
work and finds nothing extractable, it records that fact (`- **Route:** none-yet — nothing
|
|
88
|
+
loadbearing-enough; check again in N entries`) and the loop closes. So the loop opens broadly,
|
|
89
|
+
the judgment narrows.
|
|
90
|
+
|
|
91
|
+
The voice (cohort-aware via v0.20's framing): name the inflection in one line, point at
|
|
92
|
+
`/extract`, hand the decision back. Particularly important to **NOT** sound like a "you've
|
|
93
|
+
been productive!" reward — that's the performative-warmth failure mode the voice work has
|
|
94
|
+
been catching. Plain seasoned-hand: *"three sessions in — worth pausing to see what's worth
|
|
95
|
+
keeping?"*
|
|
96
|
+
|
|
97
|
+
## How to remix
|
|
98
|
+
|
|
99
|
+
- **Skip:** legitimate when the founder is in pure-exploration mode and hasn't shipped
|
|
100
|
+
anything yet (the devlog entries are all *"tried X, didn't work"* — no extractables).
|
|
101
|
+
Override:
|
|
102
|
+
```
|
|
103
|
+
- **OVERRIDE:** skipped `extraction-loop` — rationale: <e.g., devlog entries are all
|
|
104
|
+
exploration / dead-end notes; nothing has stuck enough to be extractable yet; revisit
|
|
105
|
+
after first shipped FEAT>.
|
|
106
|
+
```
|
|
107
|
+
- **Swap discipline:** Frost atomic-design lens (extract atoms → molecules → organisms) vs.
|
|
108
|
+
Ajesh's UP/DOWN router (extract to BOSS library OR to app core) vs. a stack-native pattern
|
|
109
|
+
(e.g., Ruby on Rails *"extract a concern"*). The loop's exit predicate checks for *any*
|
|
110
|
+
extraction record, not a specific framing.
|
|
111
|
+
- **Author your own:** project-specific extraction discipline (e.g., a `prompt-extraction-
|
|
112
|
+
loop` for projects where the load-bearing reusable artifact is prompts, not code; or a
|
|
113
|
+
`schema-extraction-loop` for projects where structured-output schemas keep multiplying).
|
|
114
|
+
|
|
115
|
+
## When this loop re-opens (today: not automatic)
|
|
116
|
+
|
|
117
|
+
v0.29 ships the first-inflection version. The loop closes after one extraction record and
|
|
118
|
+
stays closed. To re-open, the founder deletes/archives old extractions OR a future BOSS
|
|
119
|
+
extends the predicate vocabulary with time-aware checks (*"N devlog entries since last
|
|
120
|
+
extraction"*). The skill `/extract` is re-runnable anytime; the conscience just doesn't auto-
|
|
121
|
+
nudge after the first time.
|
|
122
|
+
|
|
123
|
+
## Cite
|
|
124
|
+
|
|
125
|
+
PRINCIPLE #1 — the rule this loop encodes, finally. *"Pause to extract patterns. UP into BOSS
|
|
126
|
+
as a reusable superset practice. DOWN into the app as core functionality. `/boss-learn` is
|
|
127
|
+
therefore a two-destination router."* The loop is the *when*; `/extract` (and `/boss-learn`)
|
|
128
|
+
are the *how*.
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: focus-loop
|
|
3
|
+
type: loop
|
|
4
|
+
stage: L1-mvp
|
|
5
|
+
runner_type: hook
|
|
6
|
+
attributed_to: [Ajesh Shah (PRINCIPLES — "compress the loop from idea to evidence")]
|
|
7
|
+
also_relevant: [David J. Anderson (Kanban — limit work-in-progress), Jim Benson (Personal Kanban — "stop starting, start finishing"), Eric Ries (validated learning over motion)]
|
|
8
|
+
entry:
|
|
9
|
+
- count_at_least:
|
|
10
|
+
path_glob: docs/ideas/FEAT-*.md
|
|
11
|
+
pattern: '^status:\s*(building|drafting|blocked)'
|
|
12
|
+
min: 4
|
|
13
|
+
exit:
|
|
14
|
+
- count_at_least:
|
|
15
|
+
path_glob: docs/ideas/FEAT-*.md
|
|
16
|
+
pattern: '^status:\s*(shipped|done)'
|
|
17
|
+
min: 1
|
|
18
|
+
drift_moment: focus
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
# Loop: focus (MVP) — the board's own drift signal
|
|
22
|
+
|
|
23
|
+
The board (`boss board`) already projects the work. This loop reads the *shape* of that projection
|
|
24
|
+
for the oldest startup failure there is: **a pile of things started, nothing finished.** Four or more
|
|
25
|
+
FEATs sitting in Building and not one shipped is not productivity — it's motion. AI makes starting the
|
|
26
|
+
next thing nearly free, so "stop starting, start finishing" (Benson) is exactly the discipline that
|
|
27
|
+
erodes first.
|
|
28
|
+
|
|
29
|
+
This is the board → conscience bridge (IDEA-034 Track D). The other MVP moments catch *structural*
|
|
30
|
+
gaps (no budget, no failure-states, a named risk left untested). This one catches a *flow* problem the
|
|
31
|
+
columns make visible: WIP accumulating with no graduation.
|
|
32
|
+
|
|
33
|
+
## The judgment the predicate can't do (and the model can)
|
|
34
|
+
|
|
35
|
+
The predicate gate is deliberately coarse: *≥4 FEATs are in flight and none has shipped.* Regex can
|
|
36
|
+
count columns; it cannot tell whether those four are **scattered abandonment** (each started, then
|
|
37
|
+
dropped for the next shiny thing — the real focus problem) or **four genuinely parallel tracks** a
|
|
38
|
+
small team is legitimately carrying. That call is the model's, and it's the whole value of the moment.
|
|
39
|
+
|
|
40
|
+
So the loop opens the door; the model walks through with judgment. When the door is open, the
|
|
41
|
+
conscience hands the model a bounded instruction — read the board projection (`boss board`, or the
|
|
42
|
+
in-flight FEATs' status + `building_since`), nothing wider — and asks: is this a founder spreading
|
|
43
|
+
themselves thin, or honest parallel work? If it's the former, name the specific pile in one spare line
|
|
44
|
+
and ask which *one* they'd finish first. If it's honest parallel work, stay silent. Silence is the
|
|
45
|
+
correct output when the founder is actually shipping-minded.
|
|
46
|
+
|
|
47
|
+
Same shape as `drift-loop` / `caution-loop`: a cheap structural gate fronting a judgment the regex
|
|
48
|
+
can't make, fired *unprompted* through the hook — because a founder buried in WIP is precisely the one
|
|
49
|
+
who won't stop to ask whether they've over-committed.
|
|
50
|
+
|
|
51
|
+
## Entry artifact
|
|
52
|
+
|
|
53
|
+
**Work-in-progress overload** — `docs/ideas/FEAT-*.md` has ≥4 files whose `status` is `building`,
|
|
54
|
+
`drafting`, or `blocked` (the board's "Building" column). Four is the threshold where the V1 `/board`
|
|
55
|
+
skill says cross-FEAT sequencing starts to matter; below it, the pile isn't yet a smell.
|
|
56
|
+
|
|
57
|
+
Confidence scales with overshoot (the runtime reads the count): 4 in flight → low, ~5–7 → medium,
|
|
58
|
+
8+ → high. The deeper the unfinished pile, the louder the signal.
|
|
59
|
+
|
|
60
|
+
## Exit artifact
|
|
61
|
+
|
|
62
|
+
**At least one shipped FEAT** (`status: shipped` or `done`). Shipping anything closes the loop — the
|
|
63
|
+
founder has proven they can finish, and the never-graduated-pile smell no longer applies. The good
|
|
64
|
+
outcome of a focus nudge is a FEAT crossing into Shipped.
|
|
65
|
+
|
|
66
|
+
## Drift
|
|
67
|
+
|
|
68
|
+
`entry: satisfied` (≥4 in flight) AND `exit: not satisfied` (nothing shipped yet) = loop OPEN →
|
|
69
|
+
conscience emits the `focus` moment. The model composes the voice (per `boss-voice`: seasoned hand,
|
|
70
|
+
assume intelligence), reads only the board, and judges before speaking — **not** a "you're so busy!"
|
|
71
|
+
reward and **not** a generic "limit your WIP" lecture; the value is the specific *which one would you
|
|
72
|
+
finish first* cut. Cohort-aware: returning-founder gets the blunt "you've started five things and
|
|
73
|
+
shipped none — which one is real?"; first-product gets "finishing one beats starting three, here's
|
|
74
|
+
why" taught plainly; indie-hacker gets the calm "small and done beats big and open" frame.
|
|
75
|
+
|
|
76
|
+
## Cost (BOSS eating its own dogfood)
|
|
77
|
+
|
|
78
|
+
- The **predicate gate is the cost control** — the model reads the board only after the cheap Node
|
|
79
|
+
count confirms the pile. Every other prompt the hook emits nothing.
|
|
80
|
+
- The read is **bounded** — the board projection / in-flight FEAT statuses, never the whole project.
|
|
81
|
+
- The model fires **at most once per session** and stays silent when the parallelism is honest.
|
|
82
|
+
|
|
83
|
+
## Known limitation (documented, like drift-loop's)
|
|
84
|
+
|
|
85
|
+
Exit is "≥1 shipped *ever*," so the moment targets the never-finished pile and goes quiet after the
|
|
86
|
+
first ship — even if a large WIP pile rebuilds later. A "shipped *recently*" semantic would need a
|
|
87
|
+
date-windowed count the predicate vocabulary doesn't have yet (the same gap `building_since` aging
|
|
88
|
+
fills on the board side). Deferred until there's evidence the rebuilt-pile case matters; the board's
|
|
89
|
+
own aging flag (`⌛ Nw in build`) already surfaces the stuck items visually in the meantime.
|
|
90
|
+
|
|
91
|
+
## How to remix
|
|
92
|
+
|
|
93
|
+
- **Skip / override:** legitimate when the four-in-flight is real parallel work (e.g. a designer, a
|
|
94
|
+
backend track, and an AI-eval track genuinely running at once). Override grammar:
|
|
95
|
+
```
|
|
96
|
+
- **OVERRIDE:** skipped `focus-loop` — rationale: <e.g. three of these are blocked-on-review, not
|
|
97
|
+
abandoned; the one active build ships this week>.
|
|
98
|
+
```
|
|
99
|
+
- **Tune the threshold:** a solo founder might set `min: 3`; a small team carrying real parallel
|
|
100
|
+
tracks might set `min: 6`. The threshold is the team's honest WIP limit, not a universal number.
|
|
101
|
+
|
|
102
|
+
## Cite
|
|
103
|
+
|
|
104
|
+
PRINCIPLES.md (compress idea→evidence). Benson (*Personal Kanban* — stop starting, start finishing),
|
|
105
|
+
Anderson (Kanban WIP limits), Ries (validated learning over motion). The loop is the *when*; the
|
|
106
|
+
model's judgment + `boss board` + `/close` (ship one) are the *how*.
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: pretotype-loop
|
|
3
|
+
type: loop
|
|
4
|
+
stage: L1-mvp
|
|
5
|
+
runner_type: skill
|
|
6
|
+
attributed_to: [Alberto Savoia, Ash Maurya]
|
|
7
|
+
also_relevant: [Eric Ries, Rob Fitzpatrick]
|
|
8
|
+
entry:
|
|
9
|
+
- any_file_matches:
|
|
10
|
+
path_glob: docs/ideas/*-canvas.md
|
|
11
|
+
pattern: 'Riskiest assumption:\*\*\s+[^_].*[a-zA-Z0-9]{3,}'
|
|
12
|
+
related_idea_not_matching: '^status:\s+dropped'
|
|
13
|
+
exit:
|
|
14
|
+
- count_at_least:
|
|
15
|
+
path_glob: docs/ideas/IDEA-*.md
|
|
16
|
+
pattern: '^## Pretotype log'
|
|
17
|
+
min: 1
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
# Loop: pretotype (MVP)
|
|
21
|
+
|
|
22
|
+
The discipline that gates *build* on *demand-test*. Encodes Savoia's *"make sure you're building
|
|
23
|
+
the right It, before you build It right."*
|
|
24
|
+
|
|
25
|
+
`runner_type: skill` — the `/pretotype` skill is the detector + runner. The loop's purpose is
|
|
26
|
+
*recording* the discipline as a project-level artifact + giving spec-loop a clean dependency to
|
|
27
|
+
declare ("pretotype should have happened before spec," when the project wants to be that strict).
|
|
28
|
+
|
|
29
|
+
This loop is **structural by default** — no `drift_moment` declared. The conscience doesn't nag
|
|
30
|
+
about un-pretotyped ideas at every prompt; that's exactly the over-fires-on-fresh-project failure
|
|
31
|
+
mode the v0.16 evals catch. Instead, the pretotype is *invited* by `/canvas`'s graduation moment
|
|
32
|
+
("Done!") and by the founder's own initiative via `/pretotype`. The loop tracks that it happened.
|
|
33
|
+
|
|
34
|
+
(Future v0.22+: a project could optionally add `drift_moment: caution` to this loop spec if they
|
|
35
|
+
want the conscience to nudge on un-pretotyped ideas accumulating. JIT principle: don't make this
|
|
36
|
+
the default ceremony.)
|
|
37
|
+
|
|
38
|
+
## Entry artifact
|
|
39
|
+
|
|
40
|
+
Canvas-loop has closed (a real riskiest assumption exists). Same entry as spec-loop — both are
|
|
41
|
+
downstream of canvas-loop. Difference: spec-loop produces a FEAT; pretotype-loop produces *demand
|
|
42
|
+
evidence about the FEAT before it's built.* The discipline of *running the pretotype between
|
|
43
|
+
the canvas and the spec* is what this loop encourages.
|
|
44
|
+
|
|
45
|
+
## Purpose
|
|
46
|
+
|
|
47
|
+
Test demand for the bet via a fake-door / wizard-of-oz / Mechanical-Turk / Pinocchio / YouTube
|
|
48
|
+
test / impresario pattern. Record what was tested, the threshold, the result, and the persevere/
|
|
49
|
+
pivot/kill decision. YODA — Your Own Data > Anything (Savoia).
|
|
50
|
+
|
|
51
|
+
The `/pretotype` skill is the runner.
|
|
52
|
+
|
|
53
|
+
## Exit artifact
|
|
54
|
+
|
|
55
|
+
The active idea's file (`docs/ideas/IDEA-NNN.md`) contains a `## Pretotype log` section with
|
|
56
|
+
at least one dated entry recording: pattern, what was tested, threshold (set BEFORE running),
|
|
57
|
+
result, decision. The `count_at_least` exit predicate looks for this section across all idea
|
|
58
|
+
files.
|
|
59
|
+
|
|
60
|
+
## How to remix
|
|
61
|
+
|
|
62
|
+
- **Skip:** legitimate when the founder has external validation already (e.g., a customer
|
|
63
|
+
pre-paid; an existing audience said yes; a similar product validated in the past). Record:
|
|
64
|
+
```
|
|
65
|
+
- **OVERRIDE:** skipped `pretotype-loop` for IDEA-NNN — rationale: <external
|
|
66
|
+
validation cited; what would re-open the loop if the validation turns out
|
|
67
|
+
weaker than thought>.
|
|
68
|
+
```
|
|
69
|
+
- **Swap discipline:** Savoia-pretotype vs. Ries-MVP-experiment vs. Maurya-riskiest-assumption-
|
|
70
|
+
test vs. Fitzpatrick-Mom-Test-conversation. Same loop shape; different practice. Note the
|
|
71
|
+
swap in the idea's pretotype log: `Pattern: mom-test (instead of pretotype)` + the Fitzpatrick
|
|
72
|
+
rationale.
|
|
73
|
+
- **Author your own:** a domain-specific demand test (e.g., regulatory-precedent-check for a
|
|
74
|
+
legal-tech product). The shape stays: tangible/real-time/imminent metric, threshold-before-
|
|
75
|
+
running, decision-after.
|
|
76
|
+
|
|
77
|
+
## When this loop re-opens
|
|
78
|
+
|
|
79
|
+
- The active idea pivoted significantly (riskiest assumption changed) → re-pretotype
|
|
80
|
+
- A previous pretotype result was ambiguous → re-design with a sharper test
|
|
81
|
+
- An external signal contradicts the original pretotype result → re-pretotype
|
|
82
|
+
|
|
83
|
+
## Cross-loop note
|
|
84
|
+
|
|
85
|
+
Pretotype-loop and spec-loop are *parallel*, not strictly sequential. Both depend on canvas-loop.
|
|
86
|
+
A project could pretotype-then-spec (the "test demand first" lineage) OR spec-then-pretotype
|
|
87
|
+
(less common; sometimes you need the spec to *describe* what you're pretotyping). The discipline
|
|
88
|
+
doesn't force order; just records that both happened before significant code lands.
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: spec-loop
|
|
3
|
+
type: loop
|
|
4
|
+
stage: L1-mvp
|
|
5
|
+
runner_type: skill
|
|
6
|
+
attributed_to: [Eric Ries, Marty Cagan]
|
|
7
|
+
also_relevant: [Ash Maurya, Hamel Husain, Jason Liu]
|
|
8
|
+
entry:
|
|
9
|
+
- any_file_matches:
|
|
10
|
+
path_glob: docs/ideas/*-canvas.md
|
|
11
|
+
pattern: 'Riskiest assumption:\*\*\s+[^_].*[a-zA-Z0-9]{3,}'
|
|
12
|
+
related_idea_not_matching: '^status:\s+dropped'
|
|
13
|
+
exit:
|
|
14
|
+
- count_at_least:
|
|
15
|
+
path_glob: docs/ideas/FEAT-*.md
|
|
16
|
+
pattern: '^# '
|
|
17
|
+
min: 1
|
|
18
|
+
drift_moment: restraint
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
# Loop: spec (MVP)
|
|
22
|
+
|
|
23
|
+
The discipline that gates spec writing on canvas validation. Encodes **moment #4 — restraint
|
|
24
|
+
(premature ceremony)** from IDEA-008's collapsed-moments architecture: when the founder reaches
|
|
25
|
+
for `/spec` without canvas-loop having closed, the conscience surfaces a restraint nudge — name
|
|
26
|
+
what's missing, offer to back up, hand the decision back. Never block.
|
|
27
|
+
|
|
28
|
+
`runner_type: skill` because `/spec` itself is the detector (reads canvas-loop state at run time
|
|
29
|
+
and surfaces restraint). The hook doesn't auto-fire restraint nudges on every prompt — that would
|
|
30
|
+
nag any time the founder was in MVP mode with an unfinished canvas. The skill detection is
|
|
31
|
+
cleaner: it fires *when the founder is attempting the downstream loop.*
|
|
32
|
+
|
|
33
|
+
## Entry artifact
|
|
34
|
+
|
|
35
|
+
Canvas-loop has closed for *some* active idea — i.e., at least one canvas exists with a real
|
|
36
|
+
filled riskiest-assumption line, attached to a non-dropped idea. This is the literal Quickstart
|
|
37
|
+
canvas-loop's exit predicate, reused as spec-loop's entry.
|
|
38
|
+
|
|
39
|
+
## Purpose
|
|
40
|
+
|
|
41
|
+
Turn validated ideas into buildable features. The FEAT spec captures: goal, acceptance criteria,
|
|
42
|
+
smoke check, validated learning (Ries — v0.21.0+), evals (Husain — if AI-mediated), out-of-scope.
|
|
43
|
+
A clean handoff to `coder-generalist`.
|
|
44
|
+
|
|
45
|
+
## Exit artifact
|
|
46
|
+
|
|
47
|
+
`docs/ideas/FEAT-NNN-<slug>.md` exists with all required sections. (The exit predicate is loose
|
|
48
|
+
today — `any_file_matches` on `FEAT-*.md` — but the skill's expectation is the full template.
|
|
49
|
+
Future tighter predicate could check for the validated-learning + smoke-check sections being
|
|
50
|
+
filled.)
|
|
51
|
+
|
|
52
|
+
## Drift
|
|
53
|
+
|
|
54
|
+
`entry: not satisfied` (no canvas exists with a real riskiest assumption) AND `/spec is being
|
|
55
|
+
invoked` → moment #4 restraint fires from the skill. The skill reads:
|
|
56
|
+
- The cohort declaration in `.boss/config.json` (for cohort-aware voice composition)
|
|
57
|
+
- The canvas-loop state for the active idea
|
|
58
|
+
- Surfaces a Fitzpatrick-plain nudge: *"There's no canvas yet for this idea — want to pressure-
|
|
59
|
+
test it first? `/canvas IDEA-NNN`. Or, if you've thought it through deeply already, you can
|
|
60
|
+
proceed with the spec and record the override in the devlog."*
|
|
61
|
+
|
|
62
|
+
## How to remix
|
|
63
|
+
|
|
64
|
+
- **Skip:** legitimate — sometimes you've done the validation outside of `/canvas`. Override
|
|
65
|
+
grammar:
|
|
66
|
+
```
|
|
67
|
+
- **OVERRIDE:** proceeded `spec-loop` without `canvas-loop` exit — rationale:
|
|
68
|
+
canvas-equivalent thinking done in <where>; riskiest assumption is <X>;
|
|
69
|
+
test plan is <Y>.
|
|
70
|
+
```
|
|
71
|
+
The override is the contract; the conscience respects it.
|
|
72
|
+
- **Swap discipline:** Maurya-style explicit canvas vs. Cagan-style "discovery-then-delivery"
|
|
73
|
+
vs. Christensen-JTBD framing. Same loop entry shape (some pressure-test artifact exists);
|
|
74
|
+
different practice inside.
|
|
75
|
+
- **Author your own:** a domain-specific validation loop (e.g., a regulatory-canvas-loop for a
|
|
76
|
+
medical product) that satisfies spec-loop's entry differently. Author the loop spec.
|
|
77
|
+
|
|
78
|
+
## When this loop re-opens
|
|
79
|
+
|
|
80
|
+
- A new IDEA gets a canvas → spec-loop is openable for that idea
|
|
81
|
+
- An existing FEAT is revised significantly → re-enter spec-loop for the new shape
|
|
82
|
+
- Validated-learning section fails its experiment (Ries pivot) → re-open the canvas-loop
|
|
83
|
+
upstream first, then re-spec
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "L2-v1",
|
|
3
|
+
"name": "V1",
|
|
4
|
+
"summary": "Ready for a real, shippable v1. The design layer turns on (PRINCIPLES.md #3): three-layer design tokens enforced via design-drift-loop, ui-designer + ux-designer as visual+flow authorities, db-architect for real data shape. /board for cross-FEAT sequencing, /design-review before code, /ux-check after. Plus the next tier of mentors: business (model + pricing), fundraising (whether/when/how), pitch (story + deck), talent (first hires + cadence) — promoted from BOSS-local in v0.15.0 to scaffolded-project templates here.",
|
|
5
|
+
"requires": "L1-mvp",
|
|
6
|
+
"agents": ["ui-designer", "ux-designer", "db-architect", "mentor-business", "mentor-fundraising", "mentor-pitch", "mentor-talent"],
|
|
7
|
+
"skills": ["board", "design-review", "ux-check"],
|
|
8
|
+
"hooks": [],
|
|
9
|
+
"loops": ["design-drift-loop"],
|
|
10
|
+
"unlocksNext": "L3-scale",
|
|
11
|
+
"graduationHint": "When the team grows, the org gets real, and the product council needs to be a thing — boss unlock scale."
|
|
12
|
+
}
|