@thebassclef/lite 1.1.1 → 1.2.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/dist/cli.cjs +23 -6
  2. package/dist/cli.js +23 -6
  3. package/dist/index.cjs +1 -1
  4. package/dist/index.d.ts +1 -1
  5. package/dist/index.js +1 -1
  6. package/dist/lite/.claude/bassclef-configs.jsonc +56 -0
  7. package/dist/lite/.claude/bassclef-orientation.md +120 -0
  8. package/dist/lite/.claude/hooks/adr-discipline-check.sh +132 -0
  9. package/dist/lite/.claude/hooks/atomic-pr-check.sh +169 -0
  10. package/dist/lite/.claude/hooks/auto-save-idle.sh +51 -0
  11. package/dist/lite/.claude/hooks/bassclef-sync.sh +51 -13
  12. package/dist/lite/.claude/hooks/bet-doc-gate.sh +283 -0
  13. package/dist/lite/.claude/hooks/bug-diagnosis.sh +64 -0
  14. package/dist/lite/.claude/hooks/destructive-command-guard.sh +136 -0
  15. package/dist/lite/.claude/hooks/file-rename-discipline-check.sh +147 -0
  16. package/dist/lite/.claude/hooks/hook-classifier-canary.sh +158 -0
  17. package/dist/lite/.claude/hooks/kiss-default-check.sh +129 -0
  18. package/dist/lite/.claude/hooks/multi-tenancy-check.sh +83 -0
  19. package/dist/lite/.claude/hooks/oo-ad-entry-point-check.sh +216 -0
  20. package/dist/lite/.claude/hooks/operator-private-path-check.sh +203 -0
  21. package/dist/lite/.claude/hooks/pattern-annotation-validate.sh +142 -0
  22. package/dist/lite/.claude/hooks/plain-english-steering.sh +15 -1
  23. package/dist/lite/.claude/hooks/post-write-trace.sh +66 -0
  24. package/dist/lite/.claude/hooks/pr-body-scrub-check.sh +446 -0
  25. package/dist/lite/.claude/hooks/pre-commit-identifier-leak-scrub.sh +137 -0
  26. package/dist/lite/.claude/hooks/pre-gh-pr-body-scrub.sh +192 -0
  27. package/dist/lite/.claude/hooks/pre-gh-pr-title-scrub.sh +172 -0
  28. package/dist/lite/.claude/hooks/role-entry-gate.sh +115 -0
  29. package/dist/lite/.claude/hooks/save-state.sh +268 -0
  30. package/dist/lite/.claude/hooks/session-reflection.d/08-settings-drift.sh +8 -1
  31. package/dist/lite/.claude/hooks/session-reflection.d/10-abrupt-stop-recovery.sh +52 -0
  32. package/dist/lite/.claude/hooks/session-reflection.d/55-orientation-gate.sh +40 -4
  33. package/dist/lite/.claude/hooks/session-reflection.d/80-hook-heartbeat-check.sh +12 -5
  34. package/dist/lite/.claude/hooks/session-reflection.d/81-hook-manifest-staleness.sh +18 -2
  35. package/dist/lite/.claude/hooks/session-reflection.d/91-npm-version-drift.sh +54 -0
  36. package/dist/lite/.claude/hooks/session-reflection.d/tests/10-abrupt-stop-recovery.test.sh +95 -0
  37. package/dist/lite/.claude/hooks/session-reflection.sh +62 -15
  38. package/dist/lite/.claude/hooks/tool-failure-diagnosis.sh +50 -0
  39. package/dist/lite/.claude/luminaries/andrej-karpathy.md +165 -0
  40. package/dist/lite/.claude/luminaries/dave-gray.md +155 -0
  41. package/dist/lite/.claude/luminaries/gary-klein.md +166 -0
  42. package/dist/lite/.claude/luminaries/kaoru-ishikawa.md +162 -0
  43. package/dist/lite/.claude/luminaries/lean-product-canvas.md +33 -0
  44. package/dist/lite/.claude/luminaries/luke-wroblewski.md +224 -0
  45. package/dist/lite/.claude/luminaries/ryan-singer.md +113 -0
  46. package/dist/lite/.claude/luminaries/steve-krug.md +168 -0
  47. package/dist/lite/.claude/luminaries/tony-ulwick.md +134 -0
  48. package/dist/lite/.claude/rules/arc-level-orientation-before-leaf.md +60 -0
  49. package/dist/lite/.claude/rules/architect-review-discipline.md +71 -0
  50. package/dist/lite/.claude/rules/auto-fix-criteria.md +126 -0
  51. package/dist/lite/.claude/rules/bassclef-hook-drift-blocker.md +144 -0
  52. package/dist/lite/.claude/rules/bassclef-models-discovery.md +107 -0
  53. package/dist/lite/.claude/rules/bassclef-workflow-parity.md +104 -0
  54. package/dist/lite/.claude/rules/cost-governance.md +154 -0
  55. package/dist/lite/.claude/rules/file-rename-discipline.md +95 -0
  56. package/dist/lite/.claude/rules/mechanism-fidelity.md +88 -0
  57. package/dist/lite/.claude/rules/prototype-production-coupling.md +125 -0
  58. package/dist/lite/.claude/rules/quick-fix-criteria.md +90 -0
  59. package/dist/lite/.claude/rules/session-artifacts.md +30 -0
  60. package/dist/lite/.claude/rules/sibling-smoke-after-substrate-change.md +107 -0
  61. package/dist/lite/.claude/rules/substrate-as-system.md +67 -0
  62. package/dist/lite/.claude/rules/usability.md +22 -0
  63. package/dist/lite/.claude/settings.json +20 -0
  64. package/dist/lite/.claude/skills/agent-research-spawn/SKILL.md +100 -0
  65. package/dist/lite/.claude/skills/architect-review/SKILL.md +201 -0
  66. package/dist/lite/.claude/skills/auto-fix/SKILL.md +297 -0
  67. package/dist/lite/.claude/skills/autonomous/SKILL.md +300 -0
  68. package/dist/lite/.claude/skills/bind-subdomain/SKILL.md +232 -0
  69. package/dist/lite/.claude/skills/canvas/SKILL.md +41 -0
  70. package/dist/lite/.claude/skills/deploy-prod/SKILL.md +106 -0
  71. package/dist/lite/.claude/skills/docs-sync/SKILL.md +188 -0
  72. package/dist/lite/.claude/skills/eisenhower/SKILL.md +273 -0
  73. package/dist/lite/.claude/skills/empathy-map/SKILL.md +168 -0
  74. package/dist/lite/.claude/skills/frontend-design/SKILL.md +53 -0
  75. package/dist/lite/.claude/skills/interview-me/SKILL.md +171 -0
  76. package/dist/lite/.claude/skills/journal-export/SKILL.md +293 -0
  77. package/dist/lite/.claude/skills/jtbd-tasks/SKILL.md +203 -0
  78. package/dist/lite/.claude/skills/objectory-decompose/SKILL.md +256 -0
  79. package/dist/lite/.claude/skills/pick-luminaries/SKILL.md +100 -0
  80. package/dist/lite/.claude/skills/pre-mortem/SKILL.md +180 -0
  81. package/dist/lite/.claude/skills/prototype-gallery/SKILL.md +264 -0
  82. package/dist/lite/.claude/skills/provision-deploy-host/SKILL.md +257 -0
  83. package/dist/lite/.claude/skills/quick-fix/SKILL.md +273 -0
  84. package/dist/lite/.claude/skills/release/SKILL.md +311 -0
  85. package/dist/lite/.claude/skills/release-notes/SKILL.md +202 -0
  86. package/dist/lite/.claude/skills/rfc/SKILL.md +222 -0
  87. package/dist/lite/.claude/skills/riff-prototypes/SKILL.md +637 -0
  88. package/dist/lite/.claude/skills/secrets-bootstrap/SKILL.md +209 -0
  89. package/dist/lite/.claude/skills/skill/SKILL.md +304 -0
  90. package/dist/lite/.claude/skills/smoke-test/SKILL.md +100 -0
  91. package/dist/lite/.claude/skills/state/SKILL.md +204 -0
  92. package/dist/lite/.claude/skills/substrate-check/SKILL.md +218 -0
  93. package/dist/lite/.claude/skills/synthetic-user/SKILL.md +381 -0
  94. package/dist/lite/.claude/skills/task-scenarios/SKILL.md +105 -0
  95. package/dist/lite/.claude/skills/tier-dependency-audit/SKILL.md +139 -0
  96. package/dist/lite/.claude/skills/ux-migration/SKILL.md +424 -0
  97. package/dist/lite/.claude/skills/value-prop-canvas/SKILL.md +297 -0
  98. package/dist/lite/README.md +5 -1
  99. package/dist/lite/gitignore +6 -0
  100. package/dist/lite/lib/bassclef-dir-resolver.sh +85 -0
  101. package/dist/lite/lib/clone-failure-classifier.sh +59 -0
  102. package/dist/lite/lib/fixture-builder.sh +190 -0
  103. package/dist/lite/lib/fresh-install-check.sh +49 -0
  104. package/dist/lite/lib/hook-heartbeat.sh +0 -1
  105. package/dist/lite/lib/mechanism-fidelity.sh +569 -0
  106. package/dist/lite/lib/npm-version-check.sh +112 -0
  107. package/dist/lite/lib/preview-state.sh +229 -0
  108. package/dist/lite/lib/session-rescue.sh +0 -1
  109. package/dist/lite/scripts/generate-lite-manifest.sh +145 -4
  110. package/dist/lite/scripts/lite-manifest-drift-check.sh +5 -1
  111. package/dist/lite/standards/architect-review-discipline.md +222 -0
  112. package/dist/lite/standards/bassclef-platform.md +249 -0
  113. package/dist/lite/standards/bassclef-test-repos.md +97 -0
  114. package/dist/lite/standards/bassclef-wiring-manifest.json +25 -1
  115. package/dist/lite/standards/cold-adopter-harness.md +205 -0
  116. package/dist/lite/standards/data-management.md +135 -0
  117. package/dist/lite/standards/frontend-stack/nextjs-prisma.md +124 -0
  118. package/dist/lite/standards/lite-manifest-schema-changes.md +27 -0
  119. package/dist/lite/standards/lite-manifest.json +1456 -14
  120. package/dist/lite/standards/mechanism-fidelity.md +205 -0
  121. package/dist/lite/standards/operator-private-discipline.md +200 -0
  122. package/dist/lite/standards/operator-to-public-flow.md +195 -0
  123. package/dist/lite/standards/prototype-gallery.md +251 -0
  124. package/dist/lite/standards/pseudonym-key-schema.md +109 -0
  125. package/dist/lite/standards/sibling-validation-checklist.md +181 -0
  126. package/dist/lite/standards/slack-notifications.md +161 -0
  127. package/dist/lite/standards/synthetic-user-testing.md +173 -0
  128. package/dist/lite/standards/vendor-bindings.md +165 -0
  129. package/dist/lite/standards/vendor-plugins/frontend-design.md +66 -0
  130. package/dist/lite/standards/vpc-fit-validation.md +167 -0
  131. package/dist/lite/templates/gallery-yml.md +113 -0
  132. package/dist/lite/templates/product-canvas.md +169 -0
  133. package/dist/lite/templates/value-prop-canvas.md +180 -0
  134. package/package.json +3 -3
  135. /package/dist/lite/{whereami.md → docs/whereami.md} +0 -0
@@ -0,0 +1,167 @@
1
+ ---
2
+ tier: lite
3
+ description: Rules for validating fit in a Value Proposition Canvas — every Pain Reliever MUST address a named Pain; every Gain Creator MUST produce a named Gain.
4
+ ---
5
+
6
+ # VPC Fit Validation
7
+
8
+ Rules for validating fit in a Value Proposition Canvas — every Pain
9
+ Reliever MUST address a named Pain; every Gain Creator MUST produce a
10
+ named Gain. Orphan entries (Relievers/Creators without a target) fail
11
+ validation. Unaddressed Pains/Gains (coverage gaps) surface as WARN.
12
+
13
+ Skill: `.claude/skills/value-prop-canvas/SKILL.md`.
14
+ Template: `templates/value-prop-canvas.md`.
15
+ Upstream primitive: `.claude/skills/personas/SKILL.md` +
16
+ `standards/persona-schema.md`.
17
+
18
+ ## Why this standard exists
19
+
20
+ VPC's whole purpose is making fit between Customer Profile and Value
21
+ Map diagnostic instead of asserted. Without explicit fit rules, a Pain
22
+ Reliever that doesn't address any named Pain slips into the Value Map
23
+ unchallenged — the classic "feature looking for a problem" failure
24
+ mode. One fit walk per canvas catches these before the canvas gets
25
+ treated as product-market-fit evidence.
26
+
27
+ This standard codifies the walk. Adjacent to
28
+ `.claude/rules/artifact-ingestion.md` philosophy: cite before you
29
+ claim. Same idea at a different level — for VPC, every claim about
30
+ fit must cite the customer-side element it's addressing.
31
+
32
+ ## The fit rules
33
+
34
+ ### Rule 1 — Pain Reliever MUST name Pain(s) it addresses
35
+
36
+ Every Pain Reliever entry MUST reference ≥1 Pain by ID (P1, P2) or by
37
+ exact label. Orphan Pain Relievers (no Pain named) FAIL validation.
38
+
39
+ **Acceptable:**
40
+ ```markdown
41
+ ### PR1 — Shared workspace
42
+ **Addresses:** P1 (Chat history siloed), P2 (Can't share context)
43
+ ```
44
+
45
+ **NOT acceptable:**
46
+ ```markdown
47
+ ### PR3 — AI-powered meeting notes
48
+ Description: automatic meeting summaries with action items.
49
+ ```
50
+
51
+ PR3 has no Pain referenced. Either:
52
+ - Add a Pain to the Customer Profile (e.g., `P4: Meeting context lost between sessions`) and cite it in PR3, OR
53
+ - Drop PR3 from the Value Map
54
+
55
+ Silence is not deferral — the canvas fails validation until resolved.
56
+
57
+ ### Rule 2 — Gain Creator MUST name Gain(s) it produces
58
+
59
+ Symmetric to Rule 1. Every Gain Creator references ≥1 Gain by ID or
60
+ label. Orphans FAIL.
61
+
62
+ ### Rule 3 — Unaddressed Pains produce WARN (coverage gap)
63
+
64
+ A Pain with no Pain Reliever is a coverage gap — the product, as
65
+ scoped, doesn't address this pain. That's not a fit failure (the
66
+ product may deliberately out-of-scope that pain for this iteration);
67
+ it's a deliberate-scope signal for the operator.
68
+
69
+ WARN format:
70
+ ```markdown
71
+ - P3 (Monthly cost scales badly) — UNADDRESSED. Coverage gap: [reason — out of scope this iteration; deferred to pricing workstream].
72
+ ```
73
+
74
+ If WARN count is high (>50% of Pains unaddressed), the canvas carries
75
+ a scope-too-narrow signal: either the Customer Profile is listing
76
+ pains not intended for this product, or the Value Map is incomplete.
77
+ Operator decides which.
78
+
79
+ ### Rule 4 — Unaddressed Gains produce WARN (coverage gap)
80
+
81
+ Symmetric to Rule 3.
82
+
83
+ ### Rule 5 — Every canvas is 1:1 with a persona
84
+
85
+ A VPC covers exactly one persona. Canvases that merge multiple
86
+ personas into a single Customer Profile FAIL validation — the fit
87
+ signal is lost when customer segments are averaged.
88
+
89
+ If the product legitimately serves multiple segments, produce one
90
+ canvas per segment. `/value-prop-canvas` with no args produces N
91
+ canvases for N personas.
92
+
93
+ ## Validation output format
94
+
95
+ `/value-prop-canvas validate` walks every canvas under
96
+ `docs/value-prop-canvas/*.md` and reports:
97
+
98
+ ```markdown
99
+ ## VPC validation
100
+
101
+ **Canvases scanned**: N
102
+
103
+ | File | Orphan PRs | Orphan GCs | Unaddressed Pains | Unaddressed Gains | Status |
104
+ |------|-----------|-----------|-------------------|-------------------|--------|
105
+ | couple-founders.md | 0 | 0 | 1 | 0 | PASS |
106
+ | cofounder-pair.md | 1 | 0 | 0 | 0 | FAIL |
107
+ | operator-advisor.md | 0 | 2 | 2 | 1 | FAIL |
108
+
109
+ **Pass**: [N] | **Warn**: [M] | **Fail**: [K]
110
+ ```
111
+
112
+ Orphans block validation (FAIL). Coverage gaps warn but do not block
113
+ (PASS-WARN indicated via note rather than status change). Rule 5
114
+ violations are FAIL.
115
+
116
+ ## Status semantics
117
+
118
+ | Status | What it means | Action |
119
+ |--------|--------------|--------|
120
+ | **PASS** | No orphans, all Pains/Gains addressed | Canvas usable downstream |
121
+ | **PASS-WARN** | No orphans, but coverage gaps | Canvas usable; gaps are scope signal |
122
+ | **FAIL** | At least one orphan | Canvas NOT usable; resolve before downstream skills consume |
123
+
124
+ Downstream skills (`/value-prop`, `/user-stories`, `/risk-test-synthetic`)
125
+ SHOULD refuse to consume FAIL canvases. PASS-WARN is acceptable
126
+ downstream — the operator has consciously chosen which pains/gains
127
+ are in scope.
128
+
129
+ ## What this standard does NOT cover
130
+
131
+ - **Whether a Pain is "real"** — that's upstream in `/personas`
132
+ evidence-traceability. If a Pain lacks a source trace, the
133
+ persona-level validation WARNs on orphan claim. VPC takes the
134
+ persona as given.
135
+ - **Whether a Pain Reliever is "good"** — that's subjective product
136
+ judgment. VPC validates THAT a reliever addresses a pain, not HOW
137
+ WELL. For quality signal, run `/synthetic-user` Tier 3 or user
138
+ testing.
139
+ - **Aggregation across canvases** — if three personas all have "P1:
140
+ cost" and each canvas's PR1 addresses it, there's no cross-canvas
141
+ fit metric. Aggregation is future work (quorum #55
142
+ `/risk-test-synthetic` touches this space).
143
+
144
+ ## Relationship to other standards
145
+
146
+ | Standard / rule | Connection |
147
+ |-----------------|-----------|
148
+ | `standards/persona-schema.md` | Upstream — personas are the input; evidence-traceability at persona level feeds Pains used here |
149
+ | `.claude/rules/artifact-ingestion.md` | Same philosophy: cite before you claim; at canvas-level rather than file-level |
150
+ | `.claude/skills/value-prop/SKILL.md` | Adjacent skill; uses VPC as evidence when present |
151
+ | `.claude/skills/jtbd-tasks/SKILL.md` | JTBD feeds Customer Jobs; functional jobs especially |
152
+
153
+ ## Future evolution
154
+
155
+ When `/risk-test-synthetic` (quorum #55) promotes, it reads VPC per
156
+ persona AND risk scores per persona-artifact pair. Rule extensions
157
+ likely:
158
+ - Risks per Pain (likelihood × severity from Maurya matrix)
159
+ - Per-persona fit score (% Pains addressed weighted by severity)
160
+
161
+ Those belong in the risk-test standard when that skill lands, not
162
+ here. This standard stays focused on orphan/coverage validation.
163
+
164
+ ## Closes
165
+
166
+ - bassclef #201 (companion to quorum #51)
167
+ - Part of iteration `docs/iteration-bets/2026-04-19e-persona-vpc-promotions.md` Stack-2
@@ -0,0 +1,113 @@
1
+ ---
2
+ tier: lite
3
+ ---
4
+
5
+ # `gallery.yml` — Prototype Variant Metadata Template
6
+
7
+ Per-variant metadata file read by `/prototype-gallery` to render the
8
+ gallery index page. See `standards/prototype-gallery.md` for full
9
+ schema semantics.
10
+
11
+ Place at: `prototypes/<variant-slug>/gallery.yml`
12
+
13
+ ## Template
14
+
15
+ ```yaml
16
+ # Variant title shown on the gallery card. Humanized slug + luminary
17
+ # shorthand is the convention.
18
+ title: "Variant A — Ive + HIG"
19
+
20
+ # Two-line value proposition. Block-scalar (|) preserves newlines.
21
+ # HARD LIMIT: 2 lines. Three or more triggers a warning; the skill
22
+ # may truncate on render. The constraint is intentional — gallery
23
+ # cards optimize for scan, not explanation.
24
+ value_prop: |
25
+ Restrained surfaces. Operator reads the deal in under 3 seconds.
26
+ Strong typographic hierarchy; no decorative affordances.
27
+
28
+ # Luminary names — render as tag pills. Shape matches the
29
+ # primary_luminaries convention in iteration bets (see
30
+ # standards/pluggable-luminaries.md). Primary first if multiple.
31
+ luminaries:
32
+ - Jony Ive
33
+ - Apple HIG
34
+
35
+ # Production date (ISO 8601). Controls default sort order in the
36
+ # gallery (newest first).
37
+ date: 2026-04-20
38
+
39
+ # Lifecycle status:
40
+ # active — shown in gallery (default)
41
+ # archived — hidden; public/prototypes/<slug>/ preserved
42
+ # superseded — hidden; rendered as link to successor in archived section
43
+ status: active
44
+
45
+ # OPTIONAL — only when status: superseded
46
+ # superseded_by: variant-n-norman-prater
47
+
48
+ # OPTIONAL — override default sort order (lower renders first)
49
+ # sort_order: 1
50
+ ```
51
+
52
+ ## Worked example (non-quorum-specific)
53
+
54
+ ```yaml
55
+ title: "Variant N — Norman + Prater"
56
+ value_prop: |
57
+ Affordance-first surfaces with entity-derived navigation.
58
+ Every control answers "what can I do here?" before the operator asks.
59
+ luminaries:
60
+ - Don Norman
61
+ - Sophia Prater
62
+ date: 2026-04-19
63
+ status: active
64
+ ```
65
+
66
+ ## Fallback: README frontmatter
67
+
68
+ If `gallery.yml` is absent, `/prototype-gallery` reads the same schema
69
+ from the variant's `README.md` frontmatter:
70
+
71
+ ```markdown
72
+ ---
73
+ title: "Variant N — Norman + Prater"
74
+ value_prop: |
75
+ Affordance-first surfaces with entity-derived navigation.
76
+ Every control answers "what can I do here?" before the operator asks.
77
+ luminaries:
78
+ - Don Norman
79
+ - Sophia Prater
80
+ date: 2026-04-19
81
+ status: active
82
+ ---
83
+
84
+ # Variant N
85
+
86
+ (README body is ignored by the gallery skill; it's for humans reading
87
+ the variant directly.)
88
+ ```
89
+
90
+ Preferred form is `gallery.yml` — separates gallery metadata from
91
+ README narrative and keeps the skill's read-path narrow.
92
+
93
+ ## Validation rules
94
+
95
+ | Field | Required | Validation |
96
+ |-------|----------|-----------|
97
+ | `title` | Yes | Non-empty string |
98
+ | `value_prop` | Yes | ≤ 2 newline-separated lines |
99
+ | `luminaries` | Yes | Non-empty list of strings |
100
+ | `date` | Yes | ISO 8601 date (YYYY-MM-DD) |
101
+ | `status` | No | One of `active` (default), `archived`, `superseded` |
102
+ | `superseded_by` | Conditional | Required when `status: superseded`; references another variant slug |
103
+ | `sort_order` | No | Integer; lower sorts first |
104
+
105
+ Variants missing any required field block the skill — see
106
+ `.claude/skills/prototype-gallery/SKILL.md` "Rules" section. A gallery
107
+ card without a value prop is worse than no card.
108
+
109
+ ## Relationship
110
+
111
+ - Consumed by: `.claude/skills/prototype-gallery/SKILL.md`
112
+ - Defined in: `standards/prototype-gallery.md`
113
+ - Produced manually OR by `.claude/skills/prototype-variants/SKILL.md` (upstream producer — may emit `gallery.yml` as part of variant scaffold)
@@ -0,0 +1,169 @@
1
+ ---
2
+ tier: lite
3
+ ---
4
+
5
+ # [Initiative Name] — Product Canvas
6
+
7
+ ## How to use this
8
+
9
+ Start at Stage 1. Don't touch Stage 2 until Stage 1 is sharp. Don't touch Stage 2.5 (substrate sequence) until Stage 2 is sharp. Don't touch Stage 3 until you're ready to write a spec. Most ideas die at Stage 1 — that's the point.
10
+
11
+ ---
12
+
13
+ ## Stage 1: Thesis (5 minutes)
14
+
15
+ ### Value Proposition (one sentence)
16
+
17
+ For [customers who ___], [initiative name] [does ___], yielding [___ benefits].
18
+
19
+ ### Audience Scope
20
+
21
+ Tag one. This determines the conviction bar and investment level.
22
+
23
+ | Scope | Definition | Example | Conviction test |
24
+ |-------|-----------|---------|-----------------|
25
+ | **Operator** | Just me / my family | POA-ops, TwoDo, PruneGuice | Would I use this *this week*? |
26
+ | **Domain** | Me + others in the same game | OpenClaw, Deal Pipeline, ETA tooling | Can I describe the problem without referencing my situation and it still makes sense? |
27
+ | **Product** | Public users, potential business | TwoDo (if graduated), deal-sourcing SaaS | Would a stranger pay for this or choose it over alternatives? |
28
+
29
+ Scope: ___
30
+
31
+ **Note:** Things can graduate. TwoDo starts as Operator, becomes Product when the
32
+ value prop stands on its own. Tag what it is *now*, not what you hope it becomes.
33
+
34
+ ### The Problem (one paragraph)
35
+
36
+ What pain exists? Who has it? How do they cope today? What does it cost them?
37
+
38
+ ### The Bet (one paragraph)
39
+
40
+ Why do we believe this solution works? What's the insight others are missing?
41
+
42
+ ### Conviction check
43
+
44
+ - **Operator scope:** Does this pass the "would I use it this week" test? → proceed to Stage 2 or kill it.
45
+ - **Domain scope:** Can you state the problem generically? Has anyone else described this pain in a forum, podcast, or conversation? → proceed or park it.
46
+ - **Product scope:** Write the value prop sentence above to a stranger. Does it land without explanation? → proceed or downgrade to Domain/Operator.
47
+
48
+ ---
49
+
50
+ ## Stage 2: Shape (30 minutes — only if Stage 1 passes conviction check)
51
+
52
+ ### One-Paragraph PR/FAQ
53
+
54
+ Write one paragraph as if announcing this to the world today. If it doesn't excite you, stop here.
55
+
56
+ *Operator scope: this can be informal — a sentence to yourself about what you're building and why.*
57
+ *Domain/Product scope: write it like a stranger will read it.*
58
+
59
+ ### Users / Personas
60
+ Who specifically benefits? (Name real types, not abstractions.)
61
+
62
+ ### Access Scope
63
+ Who needs to reach this, and from where?
64
+ - [ ] Operator only (Tailscale mesh)
65
+ - [ ] Trusted circle (family, partners — Tailscale or authenticated public)
66
+ - [ ] Public (anyone on the internet)
67
+
68
+ ### Surfaces affected
69
+
70
+ Required whenever the bet touches existing operator surfaces. List every
71
+ surface in scope, including ones you believe are unchanged — silence
72
+ defaults existing surfaces into the background.
73
+
74
+ | Surface | Current role | New role in this bet | Change type (shift / expand / unchanged) |
75
+ |---------|--------------|----------------------|------------------------------------------|
76
+
77
+ Canvas fails review if this table is missing OR if a surface is listed
78
+ "unchanged" without rationale.
79
+
80
+ ### Integration surfaces
81
+
82
+ Required for every external system (observability, messaging, payments,
83
+ auth, analytics). Separate the **engine** (data flow) from the **UX
84
+ surface** (where the operator touches it), and state depth.
85
+
86
+ | System | Engine (data in/out) | UX surface (where operator touches it) | Depths (glance / study / explore) |
87
+ |--------|---------------------|----------------------------------------|----------------------------------|
88
+
89
+ Depth definitions:
90
+ - **Glance** — visible in the primary surface, no extra click (e.g. confidence chip)
91
+ - **Study** — one click, stays in app (e.g. inline panel)
92
+ - **Explore** — one click out to the external tool (e.g. vendor dashboard URL)
93
+
94
+ Canvas fails review if any external system is named without an integration-surface row.
95
+
96
+ ### Key Outcomes
97
+ What changes in the world if this works?
98
+
99
+ Every **numeric** outcome MUST carry a one-line instrumentation note:
100
+ "measured via `{event | table | endpoint | query}`". Aspirational targets
101
+ without measurement vehicles are canvas-review failures.
102
+
103
+ - Outcome 1 (measurable) — measured via `…`
104
+ - Outcome 2 (measurable) — measured via `…`
105
+
106
+ ---
107
+
108
+ ## Stage 2.5: Substrate Sequence (MUST — before any Build Sequence)
109
+
110
+ Before scoping the build, enumerate the substrate the work will touch.
111
+ This is the prefunk — a deliberate scan of which skills, rules, hooks,
112
+ agents, and standards the work depends on or extends. Resolves #120
113
+ (was: "new skill /substrate-plan") and #598 (was: "substrate-sequence
114
+ prefunk as standard pre-build artifact for bets") as an artifact-only
115
+ pattern, not a new skill.
116
+
117
+ **Why**: builds that pattern-match on familiar skill names without
118
+ checking the substrate consistently miss rules that would have gated
119
+ the work, or duplicate skills that already exist. The substrate
120
+ sequence is the antidote to "I thought there was a skill for that"
121
+ and "I didn't realize that rule applied here."
122
+
123
+ **Format** (one table, inline in the canvas or in a linked sibling doc):
124
+
125
+ | Layer | Artifacts touched | Dependency type | Notes |
126
+ |-------|------------------|-----------------|-------|
127
+ | Skills | /canvas, /spec, /decompose | reads, extends | — |
128
+ | Rules | artifact-ingestion, prototype-production-coupling | must-satisfy | tokens-first gate fires |
129
+ | Hooks | pre-build-gate, artifact-ingestion-gate | must-satisfy | no changes |
130
+ | Agents | Builder, Reviewer, Designer | invokes | sequential |
131
+ | Standards | project-directory-layout, testing | must-satisfy | — |
132
+
133
+ **Dependency types**:
134
+ - **reads** — the work consumes this artifact as input
135
+ - **extends** — the work modifies or adds to this artifact
136
+ - **invokes** — the work runs this skill/agent as part of execution
137
+ - **must-satisfy** — this rule/hook/standard gates the work
138
+ - **creates** — the work introduces a new artifact of this kind
139
+
140
+ **Checks before moving to Stage 3**:
141
+ 1. Is every skill this references still valid? (check `/skills` catalog)
142
+ 2. Does any "creates" row duplicate an existing skill or rule?
143
+ 3. Are there "must-satisfy" rows whose gates block the planned sequence?
144
+
145
+ If a new skill or rule appears in "creates", run `/promote` or flag to
146
+ operator — don't silently ship new substrate as a side-effect of
147
+ feature work.
148
+
149
+ ---
150
+
151
+ ## Stage 3: Commit (scales with audience scope)
152
+
153
+ **Operator scope:** Skip this stage. Go straight to a spec or just build it.
154
+
155
+ **Domain scope:** Answer Risks & Assumptions. Write a spec. Build it.
156
+
157
+ **Product scope:** Full treatment — risks, constraints, full PR/FAQ, spec with
158
+ deployment questionnaire. This is where you decide on domain, auth, public access,
159
+ and everything in the [spec template](spec-template.md).
160
+
161
+ ### Risks & Assumptions
162
+ What must be true for this to work? What could kill it?
163
+
164
+ ### Constraints
165
+ Budget, timeline, technical, regulatory.
166
+
167
+ ### Full PR/FAQ
168
+ Expand the one-paragraph version into the [full PR/FAQ template](pr-faq.md)
169
+ if this initiative spans multiple specs or involves external users.
@@ -0,0 +1,180 @@
1
+ ---
2
+ tier: lite
3
+ ---
4
+
5
+ # Value Proposition Canvas — [Persona Name]
6
+
7
+ <!--
8
+ Bassclef VPC template. Strategyzer-shaped. Produced by
9
+ /value-prop-canvas skill. Validated by standards/vpc-fit-validation.md.
10
+
11
+ One canvas per persona. NEVER merge multiple personas into one canvas.
12
+
13
+ Delete this comment block after copy-paste.
14
+
15
+ Save location: docs/value-prop-canvas/{persona-slug}.md
16
+ (filename matches the persona's slug)
17
+ -->
18
+
19
+ **Persona:** [slug] ([path to persona file, e.g., `docs/personas/couple-founders.md`])
20
+ **Iteration / feature:** [iteration-bet path, spec path, or feature name]
21
+ **Generated:** [YYYY-MM-DD]
22
+ **Fit validation:** PASS | WARN (coverage gaps, no orphans) | FAIL (orphans present)
23
+
24
+ ---
25
+
26
+ ## Customer Profile
27
+
28
+ <!--
29
+ Derived from persona content. Do NOT invent — if the persona doesn't
30
+ have the data, leave the quadrant thin and let WARN surface the gap.
31
+
32
+ Three flavors of Customer Jobs per Strategyzer:
33
+ - Functional: the practical task they're trying to accomplish
34
+ - Social: how they want to be perceived while doing it
35
+ - Emotional: what feeling state they're trying to reach or avoid
36
+ -->
37
+
38
+ ### Customer Jobs
39
+
40
+ - **[J1]** Functional: [label] — [one line]
41
+ - **[J2]** Social: [label] — [one line]
42
+ - **[J3]** Emotional: [label] — [one line]
43
+ - [Additional jobs as the persona supports]
44
+
45
+ ### Pains
46
+
47
+ <!--
48
+ Pulled from persona's "Pain points" section, preserving source
49
+ traces where present. Each Pain gets an ID for Pain Reliever
50
+ referencing.
51
+ -->
52
+
53
+ - **[P1]** [label] — [one line; include *Source trace: [ref]* if persona had one]
54
+ - **[P2]** [label] — [one line]
55
+ - **[P3+]** as applicable
56
+
57
+ ### Gains
58
+
59
+ <!--
60
+ Pulled from persona's Motivators / "What would make them switch" /
61
+ implicit gains inferable from the persona's goal. Avoid lazy
62
+ inversions (don't just flip each Pain into a "not-Pain" gain —
63
+ gains are desired outcomes often articulated independently).
64
+ -->
65
+
66
+ - **[G1]** [label] — [one line]
67
+ - **[G2]** [label] — [one line]
68
+ - **[G3+]** as applicable
69
+
70
+ ---
71
+
72
+ ## Value Map
73
+
74
+ <!--
75
+ What we ship, and how each element addresses a specific Pain
76
+ or produces a specific Gain. This is the contract side of the fit.
77
+ -->
78
+
79
+ ### Products / Services
80
+
81
+ - [Feature or capability A]
82
+ - [Feature or capability B]
83
+ - [+ as applicable]
84
+
85
+ ### Pain Relievers
86
+
87
+ <!--
88
+ Each MUST name the Pain(s) it addresses. Orphan relievers (no Pain
89
+ named) fail fit-validation — see standards/vpc-fit-validation.md.
90
+ -->
91
+
92
+ - **[PR1]** [label]
93
+ - **Addresses:** [P1], [P2]
94
+ - Description: [one or two lines on the specific product behavior]
95
+
96
+ - **[PR2]** [label]
97
+ - **Addresses:** [P3]
98
+ - Description: [lines]
99
+
100
+ - **[PR3+]** as applicable
101
+
102
+ ### Gain Creators
103
+
104
+ <!--
105
+ Each MUST name the Gain(s) it produces. Orphan creators fail
106
+ fit-validation.
107
+ -->
108
+
109
+ - **[GC1]** [label]
110
+ - **Produces:** [G1], [G2]
111
+ - Description: [one or two lines]
112
+
113
+ - **[GC2]** [label]
114
+ - **Produces:** [G3]
115
+ - Description: [lines]
116
+
117
+ - **[GC3+]** as applicable
118
+
119
+ ---
120
+
121
+ ## Fit summary
122
+
123
+ | Element | Count | Addressed | Unaddressed |
124
+ |---------|-------|-----------|-------------|
125
+ | Pains | [N] | [M] | [K] |
126
+ | Gains | [N] | [M] | [K] |
127
+
128
+ **Status:** [PASS | WARN | FAIL]
129
+
130
+ ---
131
+
132
+ ## Orphans surfaced
133
+
134
+ <!--
135
+ List every Pain Reliever or Gain Creator without a named target.
136
+ Each orphan is a decision: either add the missing Pain/Gain to
137
+ the Customer Profile, or drop the entry from the Value Map.
138
+ Silence is not resolution — the operator must choose.
139
+
140
+ If no orphans: state "None."
141
+ -->
142
+
143
+ - **[Orphan entry]** — [why it's here without a target; proposed resolution: add [P_new] or drop entry]
144
+
145
+ ---
146
+
147
+ ## Coverage gaps
148
+
149
+ <!--
150
+ Pains and Gains that have no Relievers/Creators. These are
151
+ deliberate-scope signals, not fit failures. Operator decides
152
+ whether to extend the Value Map or mark the gap as out-of-scope
153
+ for this iteration.
154
+
155
+ If no gaps: state "None."
156
+ -->
157
+
158
+ - **[P_N]** unaddressed — [reason: out of scope, deferred, future iteration]
159
+ - **[G_N]** unaddressed — [reason]
160
+
161
+ ---
162
+
163
+ ## Notes
164
+
165
+ <!--
166
+ Optional. Edge cases, deferred decisions, open questions for
167
+ the operator or downstream skills.
168
+ -->
169
+
170
+ - [Note 1]
171
+ - [Note 2]
172
+
173
+ ---
174
+
175
+ ## Further reading
176
+
177
+ - Osterwalder et al., *Value Proposition Design* (2014) — bassclef VPC source
178
+ - IxDF — Value Proposition Canvas overview: https://ixdf.org/literature/topics/value-proposition-canvas
179
+ - Strategyzer — VPC tool: https://www.strategyzer.com/library/the-value-proposition-canvas
180
+ - Clayton Christensen, *Competing Against Luck* — JTBD → Customer Jobs mapping
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thebassclef/lite",
3
- "version": "1.1.1",
3
+ "version": "1.2.0-alpha.1",
4
4
  "description": "Bassclef CLI — install and upgrade bassclef in your project with two commands.",
5
5
  "keywords": [
6
6
  "bassclef",
@@ -42,12 +42,12 @@
42
42
  "LICENSE"
43
43
  ],
44
44
  "bassclef": {
45
- "upstream_tag": "v0.42.0",
45
+ "upstream_tag": "v0.45.0",
46
46
  "wiring_manifest_schema_major": 2,
47
47
  "bundle_paths": [
48
48
  "dist/lite/"
49
49
  ],
50
- "phase_note": "cli 1.1.1 (goal 2026-09-17) — init reporting contract per ADR-010. Manifest names every file written; --json moves to stdout and names all catalog families."
50
+ "phase_note": "cli 1.2.0-alpha.1 (2026-09-18) — adds the top-level `.version` field to `.bassclef/init.manifest.json` so v0.45.0's `91-npm-version-drift.sh` hook can compare installed vs npm-latest. Cures the silent-drift class where an adopter on stale lite never sees the update banner. Rolls up the alpha.0 substrate (bassclef v0.45.0 + 5 cli-side PRs) that never published. Per bassclef-upstream#1749; cli PR #129."
51
51
  },
52
52
  "engines": {
53
53
  "node": ">=20"
File without changes