@thebassclef/lite 1.1.1 → 1.2.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/dist/cli.cjs +23 -6
- package/dist/cli.js +23 -6
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/lite/.claude/bassclef-configs.jsonc +56 -0
- package/dist/lite/.claude/bassclef-orientation.md +120 -0
- package/dist/lite/.claude/hooks/adr-discipline-check.sh +132 -0
- package/dist/lite/.claude/hooks/atomic-pr-check.sh +169 -0
- package/dist/lite/.claude/hooks/auto-save-idle.sh +51 -0
- package/dist/lite/.claude/hooks/bassclef-sync.sh +51 -13
- package/dist/lite/.claude/hooks/bet-doc-gate.sh +283 -0
- package/dist/lite/.claude/hooks/bug-diagnosis.sh +64 -0
- package/dist/lite/.claude/hooks/destructive-command-guard.sh +136 -0
- package/dist/lite/.claude/hooks/file-rename-discipline-check.sh +147 -0
- package/dist/lite/.claude/hooks/hook-classifier-canary.sh +158 -0
- package/dist/lite/.claude/hooks/kiss-default-check.sh +129 -0
- package/dist/lite/.claude/hooks/multi-tenancy-check.sh +83 -0
- package/dist/lite/.claude/hooks/oo-ad-entry-point-check.sh +216 -0
- package/dist/lite/.claude/hooks/operator-private-path-check.sh +203 -0
- package/dist/lite/.claude/hooks/pattern-annotation-validate.sh +142 -0
- package/dist/lite/.claude/hooks/plain-english-steering.sh +15 -1
- package/dist/lite/.claude/hooks/post-write-trace.sh +66 -0
- package/dist/lite/.claude/hooks/pr-body-scrub-check.sh +446 -0
- package/dist/lite/.claude/hooks/pre-commit-identifier-leak-scrub.sh +137 -0
- package/dist/lite/.claude/hooks/pre-gh-pr-body-scrub.sh +192 -0
- package/dist/lite/.claude/hooks/pre-gh-pr-title-scrub.sh +172 -0
- package/dist/lite/.claude/hooks/role-entry-gate.sh +115 -0
- package/dist/lite/.claude/hooks/save-state.sh +268 -0
- package/dist/lite/.claude/hooks/session-reflection.d/08-settings-drift.sh +8 -1
- package/dist/lite/.claude/hooks/session-reflection.d/10-abrupt-stop-recovery.sh +52 -0
- package/dist/lite/.claude/hooks/session-reflection.d/55-orientation-gate.sh +40 -4
- package/dist/lite/.claude/hooks/session-reflection.d/80-hook-heartbeat-check.sh +12 -5
- package/dist/lite/.claude/hooks/session-reflection.d/81-hook-manifest-staleness.sh +18 -2
- package/dist/lite/.claude/hooks/session-reflection.d/91-npm-version-drift.sh +54 -0
- package/dist/lite/.claude/hooks/session-reflection.d/tests/10-abrupt-stop-recovery.test.sh +95 -0
- package/dist/lite/.claude/hooks/session-reflection.sh +62 -15
- package/dist/lite/.claude/hooks/tool-failure-diagnosis.sh +50 -0
- package/dist/lite/.claude/luminaries/andrej-karpathy.md +165 -0
- package/dist/lite/.claude/luminaries/dave-gray.md +155 -0
- package/dist/lite/.claude/luminaries/gary-klein.md +166 -0
- package/dist/lite/.claude/luminaries/kaoru-ishikawa.md +162 -0
- package/dist/lite/.claude/luminaries/lean-product-canvas.md +33 -0
- package/dist/lite/.claude/luminaries/luke-wroblewski.md +224 -0
- package/dist/lite/.claude/luminaries/ryan-singer.md +113 -0
- package/dist/lite/.claude/luminaries/steve-krug.md +168 -0
- package/dist/lite/.claude/luminaries/tony-ulwick.md +134 -0
- package/dist/lite/.claude/rules/arc-level-orientation-before-leaf.md +60 -0
- package/dist/lite/.claude/rules/architect-review-discipline.md +71 -0
- package/dist/lite/.claude/rules/auto-fix-criteria.md +126 -0
- package/dist/lite/.claude/rules/bassclef-hook-drift-blocker.md +144 -0
- package/dist/lite/.claude/rules/bassclef-models-discovery.md +107 -0
- package/dist/lite/.claude/rules/bassclef-workflow-parity.md +104 -0
- package/dist/lite/.claude/rules/cost-governance.md +154 -0
- package/dist/lite/.claude/rules/file-rename-discipline.md +95 -0
- package/dist/lite/.claude/rules/mechanism-fidelity.md +88 -0
- package/dist/lite/.claude/rules/prototype-production-coupling.md +125 -0
- package/dist/lite/.claude/rules/quick-fix-criteria.md +90 -0
- package/dist/lite/.claude/rules/session-artifacts.md +30 -0
- package/dist/lite/.claude/rules/sibling-smoke-after-substrate-change.md +107 -0
- package/dist/lite/.claude/rules/substrate-as-system.md +67 -0
- package/dist/lite/.claude/rules/usability.md +22 -0
- package/dist/lite/.claude/settings.json +20 -0
- package/dist/lite/.claude/skills/agent-research-spawn/SKILL.md +100 -0
- package/dist/lite/.claude/skills/architect-review/SKILL.md +201 -0
- package/dist/lite/.claude/skills/auto-fix/SKILL.md +297 -0
- package/dist/lite/.claude/skills/autonomous/SKILL.md +300 -0
- package/dist/lite/.claude/skills/bind-subdomain/SKILL.md +232 -0
- package/dist/lite/.claude/skills/canvas/SKILL.md +41 -0
- package/dist/lite/.claude/skills/deploy-prod/SKILL.md +106 -0
- package/dist/lite/.claude/skills/docs-sync/SKILL.md +188 -0
- package/dist/lite/.claude/skills/eisenhower/SKILL.md +273 -0
- package/dist/lite/.claude/skills/empathy-map/SKILL.md +168 -0
- package/dist/lite/.claude/skills/frontend-design/SKILL.md +53 -0
- package/dist/lite/.claude/skills/interview-me/SKILL.md +171 -0
- package/dist/lite/.claude/skills/journal-export/SKILL.md +293 -0
- package/dist/lite/.claude/skills/jtbd-tasks/SKILL.md +203 -0
- package/dist/lite/.claude/skills/objectory-decompose/SKILL.md +256 -0
- package/dist/lite/.claude/skills/pick-luminaries/SKILL.md +100 -0
- package/dist/lite/.claude/skills/pre-mortem/SKILL.md +180 -0
- package/dist/lite/.claude/skills/prototype-gallery/SKILL.md +264 -0
- package/dist/lite/.claude/skills/provision-deploy-host/SKILL.md +257 -0
- package/dist/lite/.claude/skills/quick-fix/SKILL.md +273 -0
- package/dist/lite/.claude/skills/release/SKILL.md +311 -0
- package/dist/lite/.claude/skills/release-notes/SKILL.md +202 -0
- package/dist/lite/.claude/skills/rfc/SKILL.md +222 -0
- package/dist/lite/.claude/skills/riff-prototypes/SKILL.md +637 -0
- package/dist/lite/.claude/skills/secrets-bootstrap/SKILL.md +209 -0
- package/dist/lite/.claude/skills/skill/SKILL.md +304 -0
- package/dist/lite/.claude/skills/smoke-test/SKILL.md +100 -0
- package/dist/lite/.claude/skills/state/SKILL.md +204 -0
- package/dist/lite/.claude/skills/substrate-check/SKILL.md +218 -0
- package/dist/lite/.claude/skills/synthetic-user/SKILL.md +381 -0
- package/dist/lite/.claude/skills/task-scenarios/SKILL.md +105 -0
- package/dist/lite/.claude/skills/tier-dependency-audit/SKILL.md +139 -0
- package/dist/lite/.claude/skills/ux-migration/SKILL.md +424 -0
- package/dist/lite/.claude/skills/value-prop-canvas/SKILL.md +297 -0
- package/dist/lite/README.md +5 -1
- package/dist/lite/gitignore +6 -0
- package/dist/lite/lib/bassclef-dir-resolver.sh +85 -0
- package/dist/lite/lib/clone-failure-classifier.sh +59 -0
- package/dist/lite/lib/fixture-builder.sh +190 -0
- package/dist/lite/lib/fresh-install-check.sh +49 -0
- package/dist/lite/lib/hook-heartbeat.sh +0 -1
- package/dist/lite/lib/mechanism-fidelity.sh +569 -0
- package/dist/lite/lib/npm-version-check.sh +112 -0
- package/dist/lite/lib/preview-state.sh +229 -0
- package/dist/lite/lib/session-rescue.sh +0 -1
- package/dist/lite/scripts/generate-lite-manifest.sh +145 -4
- package/dist/lite/scripts/lite-manifest-drift-check.sh +5 -1
- package/dist/lite/standards/architect-review-discipline.md +222 -0
- package/dist/lite/standards/bassclef-platform.md +249 -0
- package/dist/lite/standards/bassclef-test-repos.md +97 -0
- package/dist/lite/standards/bassclef-wiring-manifest.json +25 -1
- package/dist/lite/standards/cold-adopter-harness.md +205 -0
- package/dist/lite/standards/data-management.md +135 -0
- package/dist/lite/standards/frontend-stack/nextjs-prisma.md +124 -0
- package/dist/lite/standards/lite-manifest-schema-changes.md +27 -0
- package/dist/lite/standards/lite-manifest.json +1456 -14
- package/dist/lite/standards/mechanism-fidelity.md +205 -0
- package/dist/lite/standards/operator-private-discipline.md +200 -0
- package/dist/lite/standards/operator-to-public-flow.md +195 -0
- package/dist/lite/standards/prototype-gallery.md +251 -0
- package/dist/lite/standards/pseudonym-key-schema.md +109 -0
- package/dist/lite/standards/sibling-validation-checklist.md +181 -0
- package/dist/lite/standards/slack-notifications.md +161 -0
- package/dist/lite/standards/synthetic-user-testing.md +173 -0
- package/dist/lite/standards/vendor-bindings.md +165 -0
- package/dist/lite/standards/vendor-plugins/frontend-design.md +66 -0
- package/dist/lite/standards/vpc-fit-validation.md +167 -0
- package/dist/lite/templates/gallery-yml.md +113 -0
- package/dist/lite/templates/product-canvas.md +169 -0
- package/dist/lite/templates/value-prop-canvas.md +180 -0
- package/package.json +3 -3
- /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.
|
|
3
|
+
"version": "1.2.0",
|
|
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.
|
|
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.
|
|
50
|
+
"phase_note": "cli 1.2.0 (2026-09-18) — additive minor release. 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. Bundles bassclef v0.45.0 substrate (7 adopter cures + drift hook). Ships the stdout-blocking fix at cli entry (Node async-pipe-write dropped writes on process.exit under CI pipes). Rolls up 1.2.0-alpha.0 + alpha.1 which shipped as previews at @next. Per bassclef-upstream#1749; cli PRs #129, #131, #134."
|
|
51
51
|
},
|
|
52
52
|
"engines": {
|
|
53
53
|
"node": ">=20"
|
|
File without changes
|