@thebassclef/lite 0.1.3 → 1.0.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 +216 -137
- package/dist/cli.js +218 -139
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/lite/.bassclef-source.json +10 -0
- package/dist/lite/.claude/settings.json +212 -0
- package/dist/lite/CLAUDE.md +41 -0
- package/dist/lite/gitignore +58 -0
- package/dist/lite/standards/bassclef-wiring-manifest.json +497 -0
- package/dist/lite/whereami.md +24 -0
- package/package.json +8 -2
- package/substrate/.bassclef/lite-manifest.json +0 -2701
- package/substrate/.claude/agents/architect.md +0 -70
- package/substrate/.claude/agents/builder.md +0 -114
- package/substrate/.claude/agents/designer.md +0 -156
- package/substrate/.claude/agents/reviewer.md +0 -88
- package/substrate/.claude/hooks/artifact-ingestion-gate.sh +0 -357
- package/substrate/.claude/hooks/assert-verify-steering.sh +0 -77
- package/substrate/.claude/hooks/bassclef-source-config-validate.sh +0 -215
- package/substrate/.claude/hooks/bassclef-sync.sh +0 -634
- package/substrate/.claude/hooks/compound-noun-scrub.sh +0 -292
- package/substrate/.claude/hooks/kiss-expansion-inject.sh +0 -69
- package/substrate/.claude/hooks/longrun-prep-compounding-axis-check.sh +0 -492
- package/substrate/.claude/hooks/longrun-prep-compounding-sequence-check.sh +0 -492
- package/substrate/.claude/hooks/plain-english-steering.sh +0 -156
- package/substrate/.claude/hooks/post-skill-friction-check.sh +0 -177
- package/substrate/.claude/hooks/post-skill-telemetry.sh +0 -62
- package/substrate/.claude/hooks/pre-build-gate.sh +0 -511
- package/substrate/.claude/hooks/pre-commit-gate.sh +0 -451
- package/substrate/.claude/hooks/session-end.sh +0 -433
- package/substrate/.claude/hooks/session-reflection.sh +0 -303
- package/substrate/.claude/hooks/skill-body-grade-gate.sh +0 -219
- package/substrate/.claude/hooks/skill-body-intent-drift.sh +0 -107
- package/substrate/.claude/hooks/skill-step-list-check.sh +0 -171
- package/substrate/.claude/hooks/state-validate.sh +0 -271
- package/substrate/.claude/hooks/substrate-clarity-gate.sh +0 -1110
- package/substrate/.claude/hooks/temperance-gate.sh +0 -147
- package/substrate/.claude/hooks/testing-tier-enforce.sh +0 -233
- package/substrate/.claude/hooks/turn-prose-grade-measure.sh +0 -219
- package/substrate/.claude/hooks/turn-prose-kiss-check.sh +0 -463
- package/substrate/.claude/hooks/vocabulary-migration-check.sh +0 -171
- package/substrate/.claude/hooks/whereami-utc-gate.sh +0 -142
- package/substrate/.claude/luminaries/alan-cooper.md +0 -170
- package/substrate/.claude/luminaries/alistair-cockburn.md +0 -140
- package/substrate/.claude/luminaries/amazon-pr-faq.md +0 -34
- package/substrate/.claude/luminaries/ash-maurya.md +0 -121
- package/substrate/.claude/luminaries/bill-buxton.md +0 -210
- package/substrate/.claude/luminaries/charles-sanders-peirce.md +0 -150
- package/substrate/.claude/luminaries/david-ogilvy.md +0 -192
- package/substrate/.claude/luminaries/don-norman.md +0 -173
- package/substrate/.claude/luminaries/edward-tufte.md +0 -179
- package/substrate/.claude/luminaries/eric-evans.md +0 -160
- package/substrate/.claude/luminaries/frederick-brooks.md +0 -50
- package/substrate/.claude/luminaries/gang-of-four.md +0 -157
- package/substrate/.claude/luminaries/glenford-myers.md +0 -230
- package/substrate/.claude/luminaries/hunt-thomas.md +0 -115
- package/substrate/.claude/luminaries/hyrum-wright.md +0 -94
- package/substrate/.claude/luminaries/jason-fried-dhh.md +0 -46
- package/substrate/.claude/luminaries/jesse-james-garrett.md +0 -154
- package/substrate/.claude/luminaries/john-ousterhout.md +0 -94
- package/substrate/.claude/luminaries/karl-popper.md +0 -132
- package/substrate/.claude/luminaries/kent-beck.md +0 -168
- package/substrate/.claude/luminaries/linus-torvalds.md +0 -218
- package/substrate/.claude/luminaries/martin-fowler.md +0 -164
- package/substrate/.claude/luminaries/michael-feathers.md +0 -125
- package/substrate/.claude/luminaries/michael-nygard.md +0 -118
- package/substrate/.claude/luminaries/robert-c-martin.md +0 -164
- package/substrate/.claude/luminaries/saltzer-schroeder.md +0 -194
- package/substrate/.claude/luminaries/sophia-prater.md +0 -193
- package/substrate/.claude/luminaries/stephen-toulmin.md +0 -131
- package/substrate/.claude/luminaries/tony-hoare.md +0 -170
- package/substrate/.claude/luminaries/vaughn-vernon.md +0 -50
- package/substrate/.claude/luminaries/w-edwards-deming.md +0 -158
- package/substrate/.claude/rules/accessor-library-discipline.md +0 -138
- package/substrate/.claude/rules/adr-discipline.md +0 -120
- package/substrate/.claude/rules/api-conventions.md +0 -125
- package/substrate/.claude/rules/artifact-ingestion.md +0 -179
- package/substrate/.claude/rules/assert-only-after-verify.md +0 -137
- package/substrate/.claude/rules/blocked-items.md +0 -146
- package/substrate/.claude/rules/bootstrap-pair-discipline.md +0 -141
- package/substrate/.claude/rules/branching.md +0 -28
- package/substrate/.claude/rules/cold-adopter-harness-discipline.md +0 -129
- package/substrate/.claude/rules/commit-conventions.md +0 -22
- package/substrate/.claude/rules/compounding-axis-fresh-analysis.md +0 -188
- package/substrate/.claude/rules/compounding-sequence-fresh-analysis.md +0 -188
- package/substrate/.claude/rules/context-engineering.md +0 -202
- package/substrate/.claude/rules/context-management.md +0 -85
- package/substrate/.claude/rules/defensive-bash.md +0 -68
- package/substrate/.claude/rules/deferred-actions.md +0 -233
- package/substrate/.claude/rules/destructive-operations.md +0 -69
- package/substrate/.claude/rules/diagnosis.md +0 -38
- package/substrate/.claude/rules/github-issue-flash-tweet.md +0 -156
- package/substrate/.claude/rules/guardrails.md +0 -73
- package/substrate/.claude/rules/hook-wire-on-author.md +0 -103
- package/substrate/.claude/rules/identifier-leak-prevention.md +0 -104
- package/substrate/.claude/rules/iteration-bet-brief-completeness.md +0 -54
- package/substrate/.claude/rules/lite-manifest-schema-change-discipline.md +0 -98
- package/substrate/.claude/rules/longrun-prep-plan-doc-compression.md +0 -89
- package/substrate/.claude/rules/loop-discipline.md +0 -81
- package/substrate/.claude/rules/manual-prod-approval.md +0 -100
- package/substrate/.claude/rules/marker-enrichment-discipline.md +0 -99
- package/substrate/.claude/rules/mobile-ephemeral-session.md +0 -109
- package/substrate/.claude/rules/new-dependency-check.md +0 -51
- package/substrate/.claude/rules/oo-ad-entry-point.md +0 -117
- package/substrate/.claude/rules/operator-facing-prose.md +0 -196
- package/substrate/.claude/rules/option-label-discipline.md +0 -108
- package/substrate/.claude/rules/pattern-annotation.md +0 -100
- package/substrate/.claude/rules/plain-english-discipline.md +0 -156
- package/substrate/.claude/rules/plan-enumeration-needs-value-props.md +0 -211
- package/substrate/.claude/rules/pr-body-shape.md +0 -317
- package/substrate/.claude/rules/pr-strategy.md +0 -167
- package/substrate/.claude/rules/pr-title-shape.md +0 -161
- package/substrate/.claude/rules/prototype-workflow.md +0 -65
- package/substrate/.claude/rules/reserved-skill-names.md +0 -123
- package/substrate/.claude/rules/schema-management.md +0 -49
- package/substrate/.claude/rules/sdlc-gates.md +0 -149
- package/substrate/.claude/rules/security.md +0 -37
- package/substrate/.claude/rules/session-artifacts.md +0 -236
- package/substrate/.claude/rules/skill-composition-declarations.md +0 -124
- package/substrate/.claude/rules/skill-description-clarity.md +0 -247
- package/substrate/.claude/rules/skill-procedure-step-list.md +0 -137
- package/substrate/.claude/rules/state-schema-validation.md +0 -162
- package/substrate/.claude/rules/stuck-signal-diagnostic.md +0 -140
- package/substrate/.claude/rules/substrate-config-schema.md +0 -98
- package/substrate/.claude/rules/test-list-discipline.md +0 -175
- package/substrate/.claude/rules/test-sufficiency.md +0 -210
- package/substrate/.claude/rules/testing-tier-config.md +0 -145
- package/substrate/.claude/rules/testing.md +0 -38
- package/substrate/.claude/rules/turn-estimate-grounding.md +0 -134
- package/substrate/.claude/rules/visual-hierarchy.md +0 -437
- package/substrate/.claude/rules/we-dont-break-adopters.md +0 -126
- package/substrate/.claude/rules/whereami-load-bearing.md +0 -202
- package/substrate/.claude/rules/writing-craft-discipline.md +0 -92
- package/substrate/.claude/rules/wu-sequencing-compounds.md +0 -145
- package/substrate/.claude/skills/build/SKILL.md +0 -640
- package/substrate/.claude/skills/chronicle/SKILL.md +0 -55
- package/substrate/.claude/skills/clean-artifacts/SKILL.md +0 -249
- package/substrate/.claude/skills/decompose/SKILL.md +0 -280
- package/substrate/.claude/skills/diagnose/SKILL.md +0 -297
- package/substrate/.claude/skills/feynman/SKILL.md +0 -90
- package/substrate/.claude/skills/howdoi/SKILL.md +0 -105
- package/substrate/.claude/skills/ia-model/SKILL.md +0 -108
- package/substrate/.claude/skills/interaction-design/SKILL.md +0 -112
- package/substrate/.claude/skills/interpret-input/SKILL.md +0 -180
- package/substrate/.claude/skills/journal/SKILL.md +0 -209
- package/substrate/.claude/skills/kiss/SKILL.md +0 -449
- package/substrate/.claude/skills/launch/SKILL.md +0 -915
- package/substrate/.claude/skills/lean-canvas/SKILL.md +0 -332
- package/substrate/.claude/skills/longrun/SKILL.md +0 -463
- package/substrate/.claude/skills/luminary/SKILL.md +0 -481
- package/substrate/.claude/skills/ogilvy-writing-audit/SKILL.md +0 -177
- package/substrate/.claude/skills/onboard-repo/SKILL.md +0 -1624
- package/substrate/.claude/skills/pattern-review/SKILL.md +0 -99
- package/substrate/.claude/skills/personas/SKILL.md +0 -207
- package/substrate/.claude/skills/promote/SKILL.md +0 -283
- package/substrate/.claude/skills/requirement/SKILL.md +0 -98
- package/substrate/.claude/skills/retro/SKILL.md +0 -117
- package/substrate/.claude/skills/riff/SKILL.md +0 -114
- package/substrate/.claude/skills/roadmap-reconcile/SKILL.md +0 -163
- package/substrate/.claude/skills/session-end/SKILL.md +0 -309
- package/substrate/.claude/skills/session-log/SKILL.md +0 -299
- package/substrate/.claude/skills/skills/SKILL.md +0 -228
- package/substrate/.claude/skills/spec/SKILL.md +0 -105
- package/substrate/.claude/skills/sprint/SKILL.md +0 -392
- package/substrate/.claude/skills/stage/SKILL.md +0 -384
- package/substrate/.claude/skills/state-a-problem/SKILL.md +0 -185
- package/substrate/.claude/skills/temperance/SKILL.md +0 -108
- package/substrate/.claude/skills/use-case/SKILL.md +0 -417
- package/substrate/.claude/skills/user-stories/SKILL.md +0 -268
- package/substrate/.claude/skills/value-prop/SKILL.md +0 -251
- package/substrate/.claude/skills/verify/SKILL.md +0 -160
- package/substrate/.claude/skills/visual-review/SKILL.md +0 -503
- package/substrate/.claude/skills/whats-the-plan/SKILL.md +0 -202
- package/substrate/.claude/skills/whereami/SKILL.md +0 -307
- package/substrate/AGENTS.md +0 -79
- package/substrate/CLAUDE-lite.md +0 -85
- package/substrate/CODE_OF_CONDUCT.md +0 -28
- package/substrate/CONTRIBUTING.md +0 -177
- package/substrate/README.md +0 -173
- package/substrate/SECURITY.md +0 -19
- package/substrate/architecture/decisions/ADR-029-release-pipeline.md +0 -79
- package/substrate/architecture/decisions/ADR-031-non-breaking-changes-adopter-discipline.md +0 -139
- package/substrate/architecture/decisions/ADR-032-adopter-sync-dispatcher-architecture.md +0 -192
- package/substrate/architecture/decisions/ADR-039-release-tagging-scheme.md +0 -145
- package/substrate/architecture/decisions/ADR-040-planning-skill-vocabulary-and-lite-profile.md +0 -155
- package/substrate/architecture/decisions/ADR-044-unified-skill-body-template.md +0 -162
- package/substrate/lib/clean-artifacts-sweep.sh +0 -112
- package/substrate/lib/code-comment-discipline.sh +0 -144
- package/substrate/lib/composer-preflight.sh +0 -459
- package/substrate/lib/hook-inject.sh +0 -255
- package/substrate/lib/luminary-pick.sh +0 -96
- package/substrate/lib/output-discipline.sh +0 -143
- package/substrate/lib/prose-scan-boundary.sh +0 -171
- package/substrate/lib/rewrite-check.sh +0 -214
- package/substrate/lib/state.sh +0 -1372
- package/substrate/lib/telemetry.sh +0 -205
- package/substrate/lib/tier-check.sh +0 -187
- package/substrate/lib/tier-dependency-audit.sh +0 -1088
- package/substrate/presence/install/bassclef-hook-connect.sh +0 -178
- package/substrate/presence/install/bassclef-sync.dispatcher.template.sh +0 -841
- package/substrate/presence/install/bassclef-sync.template.sh +0 -2076
- package/substrate/presence/install/schedule-auto-save.cron.sh +0 -88
- package/substrate/presence/install/schedule-auto-save.taskscheduler.md +0 -122
- package/substrate/scripts/aggregate-telemetry.sh +0 -217
- package/substrate/scripts/analyze-tier-dependencies.sh +0 -239
- package/substrate/scripts/generate-lite-manifest.sh +0 -505
- package/substrate/scripts/generate-tier-manifest.sh +0 -28
- package/substrate/scripts/intent-drift-check.sh +0 -456
- package/substrate/scripts/lite-manifest-drift-check.sh +0 -146
- package/substrate/scripts/render-lite-manifest-doc.sh +0 -150
- package/substrate/standards/adr-template.md +0 -86
- package/substrate/standards/api-conventions/nextjs.md +0 -84
- package/substrate/standards/artifact-composition.md +0 -209
- package/substrate/standards/bash-hook-safety.md +0 -246
- package/substrate/standards/bassclef-configs-schema.md +0 -232
- package/substrate/standards/bassclef-evolution.md +0 -143
- package/substrate/standards/bassclef-internal-jargon.md +0 -244
- package/substrate/standards/bassclef-managed-sentinel.md +0 -96
- package/substrate/standards/bassclef-source-config.md +0 -228
- package/substrate/standards/branch-stacking.md +0 -408
- package/substrate/standards/code-safety-principles.md +0 -176
- package/substrate/standards/composer-prerequisites.md +0 -155
- package/substrate/standards/deferred-actions-schema.md +0 -204
- package/substrate/standards/dependency-discipline/cargo.md +0 -39
- package/substrate/standards/dependency-discipline/gem.md +0 -43
- package/substrate/standards/dependency-discipline/go-mod.md +0 -41
- package/substrate/standards/dependency-discipline/npm.md +0 -42
- package/substrate/standards/dependency-discipline/pip.md +0 -42
- package/substrate/standards/deployment-topology/ec2-tailscale.md +0 -225
- package/substrate/standards/deployment-topology.md +0 -69
- package/substrate/standards/docs-sync-allowlist.md +0 -76
- package/substrate/standards/domain-and-dns.md +0 -145
- package/substrate/standards/frontend-stack.md +0 -67
- package/substrate/standards/frontmatter-schema.md +0 -154
- package/substrate/standards/graceful-exit.md +0 -227
- package/substrate/standards/hook-idempotency.md +0 -102
- package/substrate/standards/hook-injection-discipline.md +0 -202
- package/substrate/standards/hook-install-class.md +0 -215
- package/substrate/standards/input-handler-interface.md +0 -152
- package/substrate/standards/lite-manifest-schema-changes.md +0 -135
- package/substrate/standards/luminary-matching.md +0 -105
- package/substrate/standards/luminary-problem-patterns.md +0 -481
- package/substrate/standards/migration-discipline/active-record.md +0 -50
- package/substrate/standards/migration-discipline/alembic.md +0 -43
- package/substrate/standards/migration-discipline/gorm.md +0 -50
- package/substrate/standards/migration-discipline/prisma.md +0 -53
- package/substrate/standards/migration-discipline/sqlalchemy.md +0 -51
- package/substrate/standards/mobile-ephemeral-session.md +0 -167
- package/substrate/standards/model-routing-discipline.md +0 -160
- package/substrate/standards/ogilvy-writing-rules.md +0 -225
- package/substrate/standards/opener-discipline.md +0 -96
- package/substrate/standards/operator-facing-prose-discipline.md +0 -201
- package/substrate/standards/persona-schema.md +0 -229
- package/substrate/standards/pluggable-luminaries.md +0 -323
- package/substrate/standards/pr-body-discipline.md +0 -115
- package/substrate/standards/preview-state-schema.md +0 -189
- package/substrate/standards/project-directory-layout.md +0 -276
- package/substrate/standards/release-tagging.md +0 -137
- package/substrate/standards/reserved-skill-names.md +0 -120
- package/substrate/standards/scannable-multi-option-output.md +0 -261
- package/substrate/standards/sdlc-compliance.md +0 -286
- package/substrate/standards/sdlc-gates/typescript.md +0 -57
- package/substrate/standards/secrets-lifecycle.md +0 -210
- package/substrate/standards/security-scanner-adapter.md +0 -145
- package/substrate/standards/session-board.md +0 -256
- package/substrate/standards/skill-output-discipline.md +0 -90
- package/substrate/standards/state-spine-contract.md +0 -255
- package/substrate/standards/state-spine.md +0 -511
- package/substrate/standards/steering-hints/kiss-words.md +0 -11
- package/substrate/standards/substrate-config-schema.md +0 -267
- package/substrate/standards/tech-stack-config.md +0 -109
- package/substrate/standards/tier-dependency-analysis.md +0 -167
- package/substrate/standards/tier-runtime-deps/lite.md +0 -57
- package/substrate/standards/tier-tag-schema.md +0 -155
- package/substrate/standards/two-layer-config.md +0 -99
- package/substrate/standards/use-case-format.md +0 -292
- package/substrate/standards/user-story-invest.md +0 -268
- package/substrate/standards/velocity-and-appetite.md +0 -229
- package/substrate/standards/voice-input-pattern.md +0 -119
- package/substrate/standards/whereami-schema.md +0 -301
- package/substrate/standards/worktree-management.md +0 -211
- package/substrate/standards/writing-guide.md +0 -213
- package/substrate/templates/chronicle-template.md +0 -75
- package/substrate/templates/deferred-action-template.md +0 -45
- package/substrate/templates/memory-proposal-template.md +0 -77
- package/substrate/templates/persona-template.md +0 -200
- package/substrate/templates/pr-faq.md +0 -45
- package/substrate/templates/secret-rotation-template.md +0 -162
- package/substrate/templates/spec-template.md +0 -131
- package/substrate/templates/use-case-template.md +0 -194
- package/substrate/templates/user-story-template.md +0 -107
- package/substrate/templates/whereami-template.md +0 -101
|
@@ -1,192 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
tier: lite
|
|
3
|
-
adr: ADR-032
|
|
4
|
-
title: Adopter sync dispatcher architecture — bootstrap + sync impl two-stage rocket
|
|
5
|
-
status: accepted
|
|
6
|
-
date: 2026-06-22
|
|
7
|
-
deciders: operator + bassclef agent
|
|
8
|
-
references:
|
|
9
|
-
- {type: issue, id: bassclef-upstream#261, anchor: dispatcher hardening umbrella}
|
|
10
|
-
- {type: file, id: docs/iteration-bets/2026-06-22b-dispatcher-hardening-rename-orientation.md, anchor: WU-3 Layer 2 two-stage rocket}
|
|
11
|
-
- {type: adr, id: ADR-031, anchor: non-breaking-changes-adopter-discipline}
|
|
12
|
-
- {type: adr, id: ADR-019, anchor: reference-vs-vendor-distribution}
|
|
13
|
-
description: "POA's session-start on 2026-06-22 morning fired CANONICAL SYNC FAILED — token env var $CANONICAL_TOKEN not set."
|
|
14
|
-
---
|
|
15
|
-
|
|
16
|
-
# ADR-032 — Adopter sync dispatcher architecture
|
|
17
|
-
|
|
18
|
-
## Context
|
|
19
|
-
|
|
20
|
-
POA's session-start on 2026-06-22 morning fired `CANONICAL SYNC FAILED — token env var $CANONICAL_TOKEN not set`. The diagnosis (Five Whys) showed the error was misleading. The actual cause was the substrate rename canonical → bassclef on 2026-06-20 moved a template the vendored dispatcher hardcoded — Path 1 fell through silently; Path 2 fired the auth error as a side effect. ADR-031 (we don't break adopters) was violated.
|
|
21
|
-
|
|
22
|
-
Every adopter on the operator's machine carries a vendored dispatcher dated May-3 (4.7KB). The current substrate ships a much-evolved dispatcher (`thin-pointer-2026-06-13`, 256 lines, 9.6KB) that fixes the template-name issue and adds plain-language error reporting, auto-sync flag handling, and richer auth. **But the May-3 vintage stays vendored until something refreshes it.** Every substrate-side improvement is invisible to adopters whose dispatcher pre-dates the improvement.
|
|
23
|
-
|
|
24
|
-
The architecture in `strategy/templates/` already has a two-stage shape implicitly:
|
|
25
|
-
|
|
26
|
-
- `bassclef-sync.dispatcher.template.sh` (256 lines) — what gets vendored into the adopter
|
|
27
|
-
- `bassclef-sync.template.sh` (1290 lines) — the "big template" that does the actual sync work (skill symlinks, hook wiring, settings.json merge, env-var setup, etc.)
|
|
28
|
-
|
|
29
|
-
The dispatcher finds the big template (sibling fast-path OR curl fallback) and exec's it. The split exists. What's missing:
|
|
30
|
-
|
|
31
|
-
1. **No explicit ADR** — the split is implicit in code; new maintainers must read the source to understand the contract
|
|
32
|
-
2. **The dispatcher is still doing too much** — auto_sync flag check, plain-language error printing, and auth handling all evolve with substrate; each evolution requires re-vendoring across every adopter
|
|
33
|
-
3. **No version-detection helper** — Layer 3 self-heal (WU-4 of bet 2026-06-22b) needs a mechanism to detect adopter dispatcher version drift; current parsing is ad-hoc
|
|
34
|
-
4. **Modality coverage isn't documented** — sibling adopters, curl-fallback adopters, mobile-ephemeral sandboxes, and (future) npm-distribution adopters all use the dispatcher differently; the contract should be explicit
|
|
35
|
-
|
|
36
|
-
This ADR makes the architecture explicit, names the minimum dispatcher responsibilities, and sets up Layer 3 self-heal (WU-4) and future migration to npm distribution (per #266).
|
|
37
|
-
|
|
38
|
-
## Decision
|
|
39
|
-
|
|
40
|
-
bassclef adopts a **two-stage rocket** as the essential pattern for adopter sync:
|
|
41
|
-
|
|
42
|
-
**Stage 1 — Bootstrap (`bassclef-sync.dispatcher.template.sh`)**: vendored into every adopter's `.claude/hooks/bassclef-sync.sh`. Knows only how to find or fetch Stage 2. Almost never changes once stable.
|
|
43
|
-
|
|
44
|
-
**Stage 2 — Sync impl (`bassclef-sync.template.sh`)**: lives in bassclef-upstream; ships to public bassclef via `/release`. Does all the substrate work — symlink wiring, settings.json merge, hook installation, env-var setup. Evolves freely with the substrate.
|
|
45
|
-
|
|
46
|
-
The contract between stages:
|
|
47
|
-
|
|
48
|
-
- Bootstrap reads stdin (Claude Code hook input), finds Stage 2 via the modality-appropriate path, and exec's it with the same stdin piped through
|
|
49
|
-
- Bootstrap is responsible for stage discovery; Stage 2 is responsible for all substrate work
|
|
50
|
-
- Stage 2 changes never require bootstrap updates UNLESS the bootstrap protocol itself changes (rare; same compat-shim discipline as adopter-observable surfaces per ADR-031)
|
|
51
|
-
|
|
52
|
-
## Bootstrap minimum responsibilities
|
|
53
|
-
|
|
54
|
-
The bootstrap MUST do exactly these things:
|
|
55
|
-
|
|
56
|
-
1. Read stdin (JSON from Claude Code hook event); parse `$CWD`
|
|
57
|
-
2. Check sentinel `.no-bassclef-sync` (opt-out) and short-circuit if present
|
|
58
|
-
3. Check `auto_sync` field in `.bassclef-source.json`; short-circuit with one-line note if OFF
|
|
59
|
-
4. **Find Stage 2** via modality-ordered fallback:
|
|
60
|
-
- **Path 1 — Sibling**: `$CWD/../bassclef/strategy/templates/bassclef-sync.template.sh` (desktop dev, multi-repo workspace)
|
|
61
|
-
- **Path 2 — Cache**: `~/.cache/bassclef/<version>/bassclef-sync.template.sh` if present and fresh (mobile-ephemeral re-runs within session)
|
|
62
|
-
- **Path 3 — Fetch from `source_url`** in `.bassclef-source.json` (cloud, CI, fresh sandbox, mobile-ephemeral first-run)
|
|
63
|
-
5. Exec Stage 2 with stdin piped through; return its exit code
|
|
64
|
-
6. On total failure (no path succeeds): emit a plain-language error with three resolution paths (public adopter / local dev / private fork); exit 0 so SessionStart hooks don't crash
|
|
65
|
-
|
|
66
|
-
The bootstrap MUST NOT do:
|
|
67
|
-
|
|
68
|
-
- Any substrate work (symlinks, hook wiring, settings.json mutation) — that's Stage 2
|
|
69
|
-
- Schema parsing beyond the minimum needed for path 3 (`source_url`, `auth_method`, `token_env`)
|
|
70
|
-
- Plain-language error printing for any failure mode that Stage 2 could have surfaced
|
|
71
|
-
|
|
72
|
-
Total target line count: **~80 lines including comments + error message** (down from current 256). The current dispatcher's auto_sync flag handling can stay if it keeps the bootstrap small enough; the elaborate plain-language error printer (~50 lines) is a future-refactor candidate to move into Stage 2.
|
|
73
|
-
|
|
74
|
-
## Sync impl responsibilities
|
|
75
|
-
|
|
76
|
-
Stage 2 does all the heavy lifting that currently lives in `bassclef-sync.template.sh`:
|
|
77
|
-
|
|
78
|
-
- Environment detection (cloud vs desktop vs CI vs mobile-ephemeral)
|
|
79
|
-
- Fetch bassclef tree if not present (sibling > S3 > git clone)
|
|
80
|
-
- Validate tree non-empty
|
|
81
|
-
- Symlink skills / hooks / luminaries / rules / agents / lib into adopter's `.claude/`
|
|
82
|
-
- Wire bassclef-managed PreToolUse hooks into adopter's `.claude/settings.json` (idempotent jq merge)
|
|
83
|
-
- Wire user-level hooks into `~/.claude/` for cloud/CI modality
|
|
84
|
-
- Maintain `.gitignore` block for bassclef symlinks
|
|
85
|
-
- Auto-wire bassclef GitHub Actions workflows
|
|
86
|
-
- Emit session-start banner with status
|
|
87
|
-
|
|
88
|
-
Stage 2 evolves freely with the substrate. Adopters get the current Stage 2 on every session-start (because the bootstrap finds it fresh each time). No vendoring drift.
|
|
89
|
-
|
|
90
|
-
## Modality coverage
|
|
91
|
-
|
|
92
|
-
The bootstrap protocol must serve four adopter modalities:
|
|
93
|
-
|
|
94
|
-
| Modality | Stage 2 source | Notes |
|
|
95
|
-
|---|---|---|
|
|
96
|
-
| **Sibling-adopter** (desktop dev) | `$CWD/../bassclef/strategy/templates/` | Path 1; fastest; offline-capable; default for operator workstations |
|
|
97
|
-
| **Cloud / CI-adopter** | `source_url` curl-fetch + cache | Path 3; tarball extracted to `~/bassclef-fresh/` (current) or `~/.cache/bassclef/<version>/` (proposed) |
|
|
98
|
-
| **Mobile-ephemeral sandbox** | `source_url` curl-fetch every session | Path 3 only; no sibling; cache survives within session but not across (per `mobile-ephemeral-session.md`); MUST complete in <5 seconds |
|
|
99
|
-
| **npm-adopter** (future, per #266) | `source_url` pointing at npm tarball URL `https://registry.npmjs.org/bassclef/-/bassclef-<version>.tgz` | Path 3 with new URL pattern; bypasses S3; semver-aware; no npm CLI needed (curl-fetch the tarball directly) |
|
|
100
|
-
|
|
101
|
-
The bootstrap's `source_url` field is provider-agnostic by design. Same code path serves GitHub release tarballs, Azure DevOps, GitLab, S3, and (future) npm tarball URLs. Adopters change providers by editing one field.
|
|
102
|
-
|
|
103
|
-
## Versioning protocol
|
|
104
|
-
|
|
105
|
-
Both stages carry an explicit version string near the top:
|
|
106
|
-
|
|
107
|
-
- Bootstrap: `BASSCLEF_SYNC_VERSION=thin-pointer-YYYY-MM-DD` (e.g., `thin-pointer-2026-06-13`)
|
|
108
|
-
- Sync impl: `BASSCLEF_SYNC_VERSION=YYYY-MM-DD-vN` (e.g., `2026-05-07-v1`)
|
|
109
|
-
|
|
110
|
-
The bootstrap version is the **bootstrap protocol version** — what shape of contract the bootstrap implements. The sync impl version is the **substrate evolution version**. They evolve on independent cadences:
|
|
111
|
-
|
|
112
|
-
- Sync impl versions advance every release cycle (often weekly)
|
|
113
|
-
- Bootstrap versions advance only when the bootstrap protocol itself changes (rarely; ideally never after this ADR)
|
|
114
|
-
|
|
115
|
-
A **version-detection helper** in the bootstrap (added in WU-3) exposes its own version to other code that wants to compare against bassclef's current. Layer 3 self-heal (WU-4) uses this helper to decide whether to refresh an adopter's vendored bootstrap. The helper:
|
|
116
|
-
|
|
117
|
-
- Bash function `__bassclef_dispatcher_version` returning the version string
|
|
118
|
-
- Greppable from outside: `grep -m1 'BASSCLEF_SYNC_VERSION=' "$VENDORED_PATH" | cut -d= -f2`
|
|
119
|
-
- Comparison logic uses lexicographic ordering on date-stamped strings (YYYY-MM-DD is sortable)
|
|
120
|
-
|
|
121
|
-
## Consequences
|
|
122
|
-
|
|
123
|
-
### Easier
|
|
124
|
-
|
|
125
|
-
- **Substrate evolution is invisible to adopter dispatchers.** Auto_sync flag UX, plain-language error wording, hook-wiring strategies all change in Stage 2 — adopters pick up changes on next session-start without re-vendoring.
|
|
126
|
-
- **Modality migration is one config change.** Moving from S3 to npm is `source_url` edit; adopter dispatcher unchanged.
|
|
127
|
-
- **Mobile-ephemeral is a first-class modality.** Cache strategy in Stage 2 keeps repeat-fetches under <5s budget; bootstrap stays sub-1s.
|
|
128
|
-
- **Layer 3 self-heal becomes mechanical.** Bootstrap version-detection helper exposes a stable interface; self-heal reads + compares + rewrites.
|
|
129
|
-
- **Future renames are non-events.** If `bassclef-sync.template.sh` ever moves or renames, only Stage 2 path changes — bootstrap still finds it via the source_url config.
|
|
130
|
-
|
|
131
|
-
### Harder
|
|
132
|
-
|
|
133
|
-
- **Bootstrap protocol changes become expensive.** Any change to the bootstrap interface (new sentinel, new path, new modality) requires version bump + Layer 3 self-heal cycle to propagate. This is the same cost any adopter-observable change carries per ADR-031.
|
|
134
|
-
- **Two-version-string maintenance.** Each release reviews both versions for changes. Tier 0 strict-TDD on the version-detection helper catches drift.
|
|
135
|
-
- **Plain-language errors that surface during fetch failure stay in the bootstrap.** Bootstrap can't ask Stage 2 to format errors when Stage 2 isn't fetchable. The ~50-line error printer is the irreducible price of useful failure messages.
|
|
136
|
-
|
|
137
|
-
## Implementation status (current → target)
|
|
138
|
-
|
|
139
|
-
| Capability | Current (thin-pointer-2026-06-13) | Target (post-WU-3) |
|
|
140
|
-
|---|---|---|
|
|
141
|
-
| Path 1 sibling fast-path | ✓ shipped | unchanged |
|
|
142
|
-
| Path 3 curl fallback | ✓ shipped | unchanged |
|
|
143
|
-
| Auto_sync flag check | ✓ shipped (in bootstrap) | Defer move to Stage 2; methodology-acceptable |
|
|
144
|
-
| Plain-language error printer | ✓ shipped (in bootstrap, ~50 lines) | Keep in bootstrap (fetch failure can't reach Stage 2) |
|
|
145
|
-
| Path 2 cache | NOT shipped | Future-refactor; not urgent (mobile-ephemeral fetches every session today) |
|
|
146
|
-
| Version-detection helper | NOT shipped (version string grep-parseable but ad-hoc) | **WU-3 ships this** |
|
|
147
|
-
| npm tarball URL support | NOT shipped (works via source_url naturally; needs documentation) | Document in this ADR; no code change |
|
|
148
|
-
|
|
149
|
-
**WU-3 ships**: this ADR + version-detection helper in the bootstrap + Tier 0 strict-TDD covering the helper. Aggressive bootstrap refactor (moving auto_sync, moving error printer) is deferred to a future bet; the current shape is stable and working for non-May-3-vintage adopters.
|
|
150
|
-
|
|
151
|
-
**WU-4 ships**: Layer 3 self-heal extending `migrate-adopter-references.sh` to detect bootstrap version drift via the WU-3 helper and refresh stale vendored bootstraps.
|
|
152
|
-
|
|
153
|
-
## Alternatives considered
|
|
154
|
-
|
|
155
|
-
### Alternative 1 — Single fat dispatcher
|
|
156
|
-
|
|
157
|
-
Keep one ~1500-line script that does everything. Rejected: same vendoring-drift problem we already have; every change requires re-vendoring across every adopter.
|
|
158
|
-
|
|
159
|
-
### Alternative 2 — Pure HTTP fetcher (no sibling fast-path)
|
|
160
|
-
|
|
161
|
-
Bootstrap is curl-only; no sibling check. Every session-start fetches from `source_url`. Rejected: breaks offline desktop dev; defeats the speed advantage sibling adopters have; weakens the "bassclef works without internet" property that matters for sustained dev work.
|
|
162
|
-
|
|
163
|
-
### Alternative 3 — Plugin / dynamic-load architecture
|
|
164
|
-
|
|
165
|
-
Bootstrap exposes hooks; Stage 2 registers handlers; richer composition. Rejected: bash isn't a plugin runtime; the indirection costs more than the modality-table this ADR ships; over-engineering for the actual problem.
|
|
166
|
-
|
|
167
|
-
### Alternative 4 — npm-install-only
|
|
168
|
-
|
|
169
|
-
Bootstrap requires `npm install bassclef` at session-start. Rejected: mobile-ephemeral sandboxes typically don't have npm CLI; would force adopters to install node tooling even for substrate-only use. The curl-the-npm-tarball-URL approach captures npm's CDN + semver benefits without requiring npm CLI.
|
|
170
|
-
|
|
171
|
-
## Luminaries
|
|
172
|
-
|
|
173
|
-
- @luminary michael-nygard — **Bulkhead pattern**. Bootstrap failure (can't find Stage 2) doesn't cascade into substrate failure. The bulkhead between vendored adopter code and substrate evolution is the architectural insight.
|
|
174
|
-
- @luminary vaughn-vernon — **Anticorruption Layer**. Bootstrap is the ACL between adopter harness expectations (vendored Bash script in `.claude/hooks/`) and bassclef internal evolution (renames, refactors, new modalities). Adopter harness sees a stable surface; substrate evolves freely behind it.
|
|
175
|
-
- @luminary john-ousterhout — **Deep modules**. Bootstrap has a wide interface (anything Claude Code's hook system can pipe in via stdin) but minimal logic; Stage 2 has a narrow interface (`exec`'d from bootstrap with stdin pipe) but deep functionality. The deep module is the substrate; the shallow exposed surface is the bootstrap.
|
|
176
|
-
- @luminary linus-torvalds — **We don't break userspace**. Bootstrap protocol changes are vanishingly rare; when they happen, they ship with compat shims and version detection (per ADR-031).
|
|
177
|
-
- @luminary hyrum-wright — **All observable behaviors become contracts**. Bootstrap's stdin shape, exit-code semantics, and emitted output are all observable to adopter harnesses. The ADR names them as contracts so future maintainers don't accidentally break them.
|
|
178
|
-
|
|
179
|
-
## Refs
|
|
180
|
-
|
|
181
|
-
- bassclef-upstream#261 — dispatcher hardening umbrella ticket
|
|
182
|
-
- bassclef-upstream#266 — npm distribution / S3 deprecation (this ADR explicitly serves)
|
|
183
|
-
- bassclef-upstream#1330 — cold-adopter install.sh missing (the pre-bootstrap step that installs the dispatcher this ADR governs; see architecture doc Subsystem 5)
|
|
184
|
-
- ADR-031 — non-breaking-changes-adopter-discipline (compat shim discipline this ADR composes with)
|
|
185
|
-
- ADR-019 — reference-vs-vendor-distribution (modality coverage)
|
|
186
|
-
- ADR-029 — release pipeline (how Stage 2 ships to public + how install.sh ships once shipped)
|
|
187
|
-
- `strategy/templates/bassclef-sync.dispatcher.template.sh` — current bootstrap (256 lines)
|
|
188
|
-
- `strategy/templates/bassclef-sync.template.sh` — current sync impl (1290 lines)
|
|
189
|
-
- `architecture/tier-system-and-release-flow.md` § "Subsystem 5 — Cold-adopter install bootstrap" — end-to-end view of the pre-dispatcher install step
|
|
190
|
-
- `.claude/rules/we-dont-break-adopters.md` — methodology layer
|
|
191
|
-
- POA 2026-06-22 morning chronicle — failure observation + Five Whys
|
|
192
|
-
- Bet `docs/iteration-bets/2026-06-22b-dispatcher-hardening-rename-orientation.md` (WU-3)
|
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
tier: lite
|
|
3
|
-
adr: ADR-039
|
|
4
|
-
title: Release tagging scheme — semver on both upstream and public bassclef
|
|
5
|
-
status: proposed
|
|
6
|
-
date: 2026-07-04
|
|
7
|
-
deciders: operator + bassclef agent
|
|
8
|
-
supersedes: none
|
|
9
|
-
references:
|
|
10
|
-
- {type: adr, id: ADR-029, anchor: release pipeline contract}
|
|
11
|
-
- {type: adr, id: ADR-031, anchor: we-don't-break-adopters discipline}
|
|
12
|
-
- {type: standard, id: standards/release-tagging.md, anchor: the standard this ADR governs}
|
|
13
|
-
- {type: skill, id: .claude/skills/release/SKILL.md, anchor: the operator surface that cuts tags}
|
|
14
|
-
- {type: script, id: scripts/release-to-bassclef.sh, anchor: the release pipeline}
|
|
15
|
-
- {type: issue, id: sunj-labs/bassclef-upstream#614, anchor: filing ticket for the first tag}
|
|
16
|
-
- {type: bet, id: docs/iteration-bets/2026-07-03b-wave-1-launch-prep.md, anchor: this ADR's parent bet WU-1}
|
|
17
|
-
- {type: roadmap, id: docs/roadmaps/2026-06-28-early-adopter-launch.md, anchor: Phase XI Batten Down; Wave 1 launch prep}
|
|
18
|
-
luminaries:
|
|
19
|
-
primary:
|
|
20
|
-
- linus-torvalds # kernel version discipline; adopters pin a tag and trust it
|
|
21
|
-
- frederick-brooks # conceptual integrity across versions
|
|
22
|
-
supporting:
|
|
23
|
-
- michael-nygard # stability patterns — the release page IS the adopter-facing steady state
|
|
24
|
-
- hyrum-wright # every observable version becomes a contract with enough adopters
|
|
25
|
-
description: Bassclef ships from sunj-labs/bassclef-upstream (the source-of-truth repo where all substrate work happens) to sunj-labs/bassclef (the public downstream repo adopters pull from).
|
|
26
|
-
---
|
|
27
|
-
|
|
28
|
-
# ADR-039 — Release tagging on both upstream and public bassclef
|
|
29
|
-
|
|
30
|
-
## Sources read
|
|
31
|
-
|
|
32
|
-
- `docs/iteration-bets/2026-07-03b-wave-1-launch-prep.md` L1-80 — parent bet; WU-1 scope names "ADR filed on the bassclef-upstream vs public bassclef tagging split"
|
|
33
|
-
- sunj-labs/bassclef-upstream#614 (ticket body via `gh issue view`) — filing ticket; names four deliverables including this ADR + operator confirmation on the tag name
|
|
34
|
-
- `standards/release-tagging.md` (drafted in this same PR) — the standard this ADR governs
|
|
35
|
-
- `.claude/skills/release/SKILL.md` L1-100 — current release pipeline surface + Step 4 that already tags the source with `release-YYYY-MM-DD-<sha>` marker (distinct from semver tags)
|
|
36
|
-
- `architecture/decisions/ADR-029-release-pipeline.md` — parent architecture (referenced; not re-read tonight since it hasn't changed since prior read on 2026-06-25)
|
|
37
|
-
- `architecture/decisions/ADR-031-non-breaking-changes-adopter-discipline.md` — we-don't-break-adopters; major bumps signal what would otherwise break adopters
|
|
38
|
-
- `architecture/decisions/ADR-035-substrate-as-system-and-hooks-as-steering-surfaces.md` L1-30 — ADR format reference
|
|
39
|
-
- `docs/whereami.md` L1-100 — release pipeline current status (7 commits ahead of public, no open PR)
|
|
40
|
-
|
|
41
|
-
## What I'm NOT reading (with reason)
|
|
42
|
-
|
|
43
|
-
- Full ADR-029 body — the pipeline mechanics did not change; this ADR extends with tag cutting, not rewrites the pipeline
|
|
44
|
-
- Public bassclef repo state — deferred to release moment; this ADR is a decision, not a live release
|
|
45
|
-
|
|
46
|
-
## Context
|
|
47
|
-
|
|
48
|
-
Bassclef ships from `sunj-labs/bassclef-upstream` (the source-of-truth repo where all substrate work happens) to `sunj-labs/bassclef` (the public downstream repo adopters pull from). The pipeline runs per ADR-029 — `scripts/release-to-bassclef.sh` opens a PR against public bassclef; the operator merges.
|
|
49
|
-
|
|
50
|
-
Before this ADR the pipeline carried no semver tags. `scripts/release-to-bassclef.sh` cuts a per-release marker tag on upstream (`release-YYYY-MM-DD-<sha>`) that names which SHA a release built from, but the marker tag is not a version adopters can pin, roll back to, or read a changelog against.
|
|
51
|
-
|
|
52
|
-
Wave 1 adopter dispatch is pending. Adopters need a version anchor for support requests, rollback, and changelog reads. Semver is the widely-known scheme that lets adopters read a version number and know what changed (major = break, minor = new surface, patch = cure).
|
|
53
|
-
|
|
54
|
-
The question this ADR answers: **do tags cut on bassclef-upstream, public bassclef, or both?**
|
|
55
|
-
|
|
56
|
-
## Decision
|
|
57
|
-
|
|
58
|
-
Cut tags on both repos with the same name. `/release` dispatches:
|
|
59
|
-
|
|
60
|
-
1. Tag `bassclef-upstream` `main` at the source SHA with the semver name (e.g., `v0.1.0`)
|
|
61
|
-
2. Open the `/release` PR against public bassclef (existing pipeline)
|
|
62
|
-
3. Operator merges the PR
|
|
63
|
-
4. Tag `bassclef` `main` at the merged commit with the same semver name (`v0.1.0`)
|
|
64
|
-
|
|
65
|
-
Both repos carry `v0.1.0` at the release moment. Adopters read the public tag. Operators trace back through the matching upstream tag when investigating "which cut point shipped this rule / hook / skill".
|
|
66
|
-
|
|
67
|
-
The prior per-release marker tag (`release-YYYY-MM-DD-<sha>`) stays in place on upstream — it serves a different purpose (naming which SHA a release built from) and pre-dates this ADR. Semver tags name what adopters get; marker tags name pipeline mechanics. Both patterns co-exist.
|
|
68
|
-
|
|
69
|
-
## Alternatives considered
|
|
70
|
-
|
|
71
|
-
**Alternative A — Tag public bassclef only.** Adopters see one clean version stream; operators lose the ability to trace back to the upstream cut point cheaply.
|
|
72
|
-
|
|
73
|
-
Rejected because: operators do this trace every time they investigate "when did we ship this rule". `git log` on upstream needs a tag anchor to be cheap.
|
|
74
|
-
|
|
75
|
-
**Alternative B — Tag bassclef-upstream only.** Operator-facing version stream is complete; adopters have no version to pin against.
|
|
76
|
-
|
|
77
|
-
Rejected because: adopters pull from public bassclef; their `.bassclef-source.json` `git_ref` field needs a tag on public bassclef, not upstream.
|
|
78
|
-
|
|
79
|
-
**Alternative C — Different tag names on each repo (e.g., `v0.1.0-upstream` and `v0.1.0-public`).** Names the split explicitly.
|
|
80
|
-
|
|
81
|
-
Rejected because: adds cognitive load without payoff. Both tags name the same release moment; same name is cleaner.
|
|
82
|
-
|
|
83
|
-
**Alternative D — Tag both repos with the same name (chosen).** Adopter pull surface and operator trace surface both satisfied. One release moment, one version name, two tags.
|
|
84
|
-
|
|
85
|
-
## Consequences
|
|
86
|
-
|
|
87
|
-
### Enables
|
|
88
|
-
|
|
89
|
-
- Adopters pin `.bassclef-source.json` `git_ref` to a semver tag
|
|
90
|
-
- Rollback: adopters set `git_ref` to a prior tag and re-sync
|
|
91
|
-
- Changelog reads: adopters diff between two tags for what changed
|
|
92
|
-
- Operator trace: `git log v0.1.0..v0.2.0` on upstream lists every PR that shipped between two releases
|
|
93
|
-
- Public bassclef GitHub Releases page renders per-version pages adopters browse
|
|
94
|
-
|
|
95
|
-
### Requires
|
|
96
|
-
|
|
97
|
-
- `/release` SKILL amendment — Step 6 adds "cut semver tag on both repos after PR merge"
|
|
98
|
-
- Release notes drafted per `standards/release-tagging.md` grouping
|
|
99
|
-
- Operator confirms tag name at Step 2 (dry-run) — the SKILL surfaces the proposed name; operator confirms or overrides
|
|
100
|
-
|
|
101
|
-
### Costs
|
|
102
|
-
|
|
103
|
-
- Two tag-cutting steps per release instead of one — small
|
|
104
|
-
- Release notes drafting adds ~5-10 minutes per release — offset by adopters no longer asking "what changed" questions in support channels
|
|
105
|
-
|
|
106
|
-
### Risks
|
|
107
|
-
|
|
108
|
-
- **Tag name collision if `/release` fires twice on the same day** — mitigation: the semver scheme uses monotonic version numbers, not date-based; two same-day releases just bump patch (v0.1.1 then v0.1.2)
|
|
109
|
-
- **Adopter pins the wrong repo's tag** — mitigation: `.bassclef-source.json` schema names `source_url` explicitly pointing at public bassclef; the ADR names public as the adopter-facing tag surface
|
|
110
|
-
|
|
111
|
-
## Composes with
|
|
112
|
-
|
|
113
|
-
- `standards/release-tagging.md` — the semver policy + release-notes shape this ADR governs
|
|
114
|
-
- `scripts/release-to-bassclef.sh` — the pipeline that will fire the two tag cuts
|
|
115
|
-
- `.claude/skills/release/SKILL.md` — the operator surface that dispatches
|
|
116
|
-
- ADR-029 release pipeline — the parent architecture
|
|
117
|
-
- ADR-031 we-don't-break-adopters — major bumps signal what would otherwise break adopters
|
|
118
|
-
- `@luminary linus-torvalds` — Linux kernel version discipline; every observable version becomes a contract
|
|
119
|
-
- `@luminary hyrum-wright` — with enough adopters, every version tag becomes load-bearing
|
|
120
|
-
- `@luminary michael-nygard` — the release page is the adopter-facing steady state
|
|
121
|
-
|
|
122
|
-
## Refs
|
|
123
|
-
|
|
124
|
-
- sunj-labs/bassclef-upstream#614 — filing ticket
|
|
125
|
-
- sunj-labs/bassclef-upstream#819 — backfill ticket (closed 2026-07-30 per Amendment below)
|
|
126
|
-
- `docs/iteration-bets/2026-07-03b-wave-1-launch-prep.md` — parent bet WU-1
|
|
127
|
-
- `docs/roadmaps/2026-06-28-early-adopter-launch.md` — Phase XI Batten Down
|
|
128
|
-
- ADR-029 release pipeline
|
|
129
|
-
- ADR-031 we-don't-break-adopters
|
|
130
|
-
|
|
131
|
-
## Amendment 2026-07-30 — pre-split tag boundary
|
|
132
|
-
|
|
133
|
-
Bassclef-upstream repo was created 2026-06-01 via bulk-import from the older canonical repo (commit `2608a5db`). Public bassclef had already cut tags v0.3.0 through v0.16.0 before that date. Those tags exist only on public bassclef; the upstream repo did not exist yet.
|
|
134
|
-
|
|
135
|
-
**Decision.** Pre-split tags (v0.3.0 through v0.16.0) are NOT backfilled on upstream. The two histories are distinct. Cutting fake upstream tags at the initial-import commit would misrepresent history.
|
|
136
|
-
|
|
137
|
-
**Post-split tags** (v0.17.0 onward) ARE backfilled on upstream at the closest matching upstream commit. Backfilled 2026-07-30: v0.17.0 and v0.18.0 at commit `981a84cf`.
|
|
138
|
-
|
|
139
|
-
**Adopter guidance.** Adopters running early tags (v0.3.0-v0.16.0) reference public bassclef's history for those versions. Upstream tag history starts at v0.17.0. Versions v0.19.0 and later are cut on both repos per the two-tag discipline.
|
|
140
|
-
|
|
141
|
-
Per #819 Option A chosen 2026-07-30.
|
|
142
|
-
|
|
143
|
-
## Retirement
|
|
144
|
-
|
|
145
|
-
This ADR retires only if the two-repo split retires (very unlikely; the split is bassclef's architecture). Semver policy may evolve; the two-tag discipline persists.
|
package/substrate/architecture/decisions/ADR-040-planning-skill-vocabulary-and-lite-profile.md
DELETED
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
tier: lite
|
|
3
|
-
description: Two adopter-facing signals converged in July 2026 and drove this decision.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# ADR-040: Planning-Skill Vocabulary Rewrite and Bassclef-Lite Profile
|
|
7
|
-
|
|
8
|
-
## Status
|
|
9
|
-
|
|
10
|
-
ACCEPTED — Decision 4 SUPERSEDED by ADR-044 on 2026-07-19
|
|
11
|
-
|
|
12
|
-
## Date
|
|
13
|
-
|
|
14
|
-
2026-07-17
|
|
15
|
-
|
|
16
|
-
## Supersession note
|
|
17
|
-
|
|
18
|
-
Decision 4 (SKILL body shape template) is superseded by ADR-044 as of 2026-07-19. Decisions 1, 2, 3, and 5 remain in force. The convergence memo at the operator-private consultation path documents the substrate-clarity gaps ADR-040 D4 left open (INSTEAD-block regression + missing progressive disclosure + missing examples + missing test cases + missing persona-explicit discriminator). Existing SKILL bodies written under ADR-040 D4 read through 2026-10-31 per `.claude/rules/we-dont-break-adopters.md` grace window; new bodies land under ADR-044.
|
|
19
|
-
|
|
20
|
-
## Context
|
|
21
|
-
|
|
22
|
-
Two adopter-facing signals converged in July 2026 and drove this decision.
|
|
23
|
-
|
|
24
|
-
**Signal 1 — jargon leak in planning skill output.** The operator caught bassclef-internal shorthand ("R8 check", "SHOULD-tier gate", "shape a", "bet 16b", "arc walk", "parent chain", "ADR-consult") in three consecutive /longrun prep sessions. The prior cure (bet 2026-07-16b) rewrote /longrun column headers to plain English but left the surrounding prose full of the same shorthand. The vocabulary itself was borrowed from Ryan Singer's Shape Up book — bet, appetite, workunit, parent bet, arc, circuit breaker. Adopters who have not read Shape Up cannot decode the words.
|
|
25
|
-
|
|
26
|
-
**Signal 2 — adopter architecture review.** An outside architect reviewed the bassclef codebase in July 2026. Findings — bassclef positions as a solo-dev framework but ships enterprise-team complexity. Roughly 120k tokens of rules and guidance load before the user starts working. 70+ skills and 70+ rules where a new user needs only 10-15. Bassclef jargon specifically named — "Temperance, Chronicle, Luminaries, Work Units". Recommended target — under 30k always-loaded context, 60 seconds to first value, 10-15 core capabilities in a light profile.
|
|
27
|
-
|
|
28
|
-
Twelve luminary consultations plus one adopter usage scan surfaced the decisions this ADR pins.
|
|
29
|
-
|
|
30
|
-
## Decision
|
|
31
|
-
|
|
32
|
-
Bassclef ships a lite version alongside the full framework. The rewrite of planning and retrospective skill bodies is the first step. Four rules govern the rewrite. A two-repo release architecture ships the lite version to adopters who want the smaller surface.
|
|
33
|
-
|
|
34
|
-
### Decision 1 — Vocabulary rename table
|
|
35
|
-
|
|
36
|
-
Neutral technical terms borrowed from Shape Up rename to plain English. Brand-carrying names stay as skill names but get plain-English descriptions.
|
|
37
|
-
|
|
38
|
-
| Current | Rename decision | Reason |
|
|
39
|
-
|---|---|---|
|
|
40
|
-
| bet | goal | Cooper (adopter vocabulary); Morville (findability); Singer confirms rename safe (governance meaning is dead code for solo adopters) |
|
|
41
|
-
| appetite | time budget | Singer (preserve fixed-time-variable-scope contract); Norman (plain-English signifier) |
|
|
42
|
-
| workunit | step | Evans/Vernon (adopter's word); Singer confirms not his vocabulary |
|
|
43
|
-
| parent bet | parent goal | Consistency with bet → goal |
|
|
44
|
-
| arc | thread | Cooper (mental model); Morville (findability) |
|
|
45
|
-
| chronicle | ~~session log~~ RETRACTED 2026-08-16 — chronicle preserved as brand-carrying English word per goal 2026-08-16a Louis-lens consult (see Amendment 2026-08-16 below) |
|
|
46
|
-
| circuit breaker (Singer's) | hard stop and re-decide | Names both parts of Singer's mechanism per his file line 61 |
|
|
47
|
-
| shape (as label for operator choices — "shape a", "shape b", "pick shape α") | option (as label — "option a", "option b", "pick option c") | Cooper (keyboard-typeable operator vocabulary); Krug (self-evident label); folds in to `.claude/rules/option-label-discipline.md` |
|
|
48
|
-
| /temperance | **keep as skill name; description reads plain** | Dunford (unique-attribute positioning; produces different behavior than a generic name would) |
|
|
49
|
-
| /luminary | **keep as skill name; description reads plain** | Same reasoning as /temperance |
|
|
50
|
-
| /kiss | **keep as skill name; description reads plain** | Brand-carrying acronym for "keep it simple" |
|
|
51
|
-
|
|
52
|
-
Terms to keep and gloss plain at first mention per response — fat marker sketch (Singer says the vividness matters), hill chart (metaphor carries meaning), rabbit hole (already plain English).
|
|
53
|
-
|
|
54
|
-
Old vocabulary keeps working as a compatibility layer through 2026-10-31 grace window per `.claude/rules/we-dont-break-adopters.md`.
|
|
55
|
-
|
|
56
|
-
### Decision 2 — Reading grade
|
|
57
|
-
|
|
58
|
-
Grade 10 ceiling for all adopter-facing surfaces. Grade 8-9 aspiration for anything a solo adopter must understand on first read. Grade level is a floor per Norman — a page can pass grade 10 and still fail obvious-on-sight if the words are unfamiliar. Both checks apply.
|
|
59
|
-
|
|
60
|
-
### Decision 3 — Retire the value-prop "flash" mode
|
|
61
|
-
|
|
62
|
-
`/value-prop` keeps three modes — tweet, brief, verbose. The flash mode (180-character claim-only output) retires. Per Toulmin, flash carries only the claim and fails the minimum argument shape (claim + evidence + warrant). Per Ousterhout, flash is a shallow interface with no hidden work. Per Beck, the minimum planning artifact is goal + steps + done-markers — not a fragment. The compression discipline (short opening line) folds into brief and verbose modes as the opening sentence.
|
|
63
|
-
|
|
64
|
-
### Decision 4 — SKILL body shape template (SUPERSEDED by ADR-044 on 2026-07-19)
|
|
65
|
-
|
|
66
|
-
Every rewritten planning skill body follows this structure per Amazon PR-FAQ, Cooper, Krug, and Beck convergence:
|
|
67
|
-
|
|
68
|
-
1. H1 with plain-English skill name.
|
|
69
|
-
2. One-paragraph mock announcement — what the reader gets. No bassclef jargon.
|
|
70
|
-
3. One-paragraph "when to use it" — the discriminator.
|
|
71
|
-
4. FAQ section — 4-6 anticipated adopter questions with 2-3 sentence answers.
|
|
72
|
-
5. Details below the fold — protocol for readers who need to run or maintain the skill.
|
|
73
|
-
|
|
74
|
-
Target length — 200 to 300 lines per skill body. Down from 800-plus in /longrun today.
|
|
75
|
-
|
|
76
|
-
### Decision 5 — Two-repo release architecture
|
|
77
|
-
|
|
78
|
-
bassclef-upstream (this repo) stays as the source of truth. Two downstream repos serve two audiences:
|
|
79
|
-
|
|
80
|
-
- **bassclef** (existing) — full release. Portfolio operators, contributors, adopters who want the whole framework.
|
|
81
|
-
- **bassclef-lite** (new) — curated subset. ~26 core skills grouped by cluster (revised 2026-08-04 per bet 2026-08-04g), ~15 core rules, ~5-10 core hooks, a light CLAUDE.md. For solo devs who want first value in 60 seconds without loading the full framework.
|
|
82
|
-
|
|
83
|
-
Existing infrastructure supports this — the `lite` tier already exists in the taxonomy per `CLAUDE.md` line 40; the release script at `scripts/release-to-bassclef.sh` already reads and filters by the tier field (lines 275-338). Zero primitives currently carry `tier: lite` (curation has not happened yet). Creating bassclef-lite requires curation plus one release script extension plus a new GitHub repo.
|
|
84
|
-
|
|
85
|
-
**Skill-count target revision (2026-08-04, bet 2026-08-04g).** The original 10-15 target came from the July 2026 outside architect review — "10-15 core capabilities in a light profile." Cooper walk session 2026-08-02c ran that target through 33 rows of persona-fit judgment. Result: ~26 skills at lite grouped by 5 clusters (3 verbs + 7 discovery + 6 strategy utilities + 5 gates + 3 lifecycle + 2 atomic use-case/user-stories), plus operator Cooper walk overrides that KEEP a few discipline-forward skills (interaction-design, ia-model, ogilvy-writing-audit, pattern-review) at lite via Check 5 discipline. Net range at post-full-reframe: 30-34 skills. Ten of ten luminaries converged on the reframe per canvas `docs/canvases/2026-08-02-porcelain-plumbing-reframe.md` §"Luminary sanity check". Ticket #1050 comment 5160626302 carries operator sign-off on the revised categories. The original 10-15 flat count is superseded by the ~26 clustered count — porcelain-plus-plumbing model gives Sam the same bandwidth relief (3 verbs orient the entry) without paying the discipline cost of dropping named use-case, pre-mortem, and gate skills.
|
|
86
|
-
|
|
87
|
-
**Ongoing calibration mechanism — `/manifest-align`.** The Cooper walk was a one-time manual pass calibrated by operator judgment. `/manifest-align` (shipped 2026-08-02 per PR #1035) is the ongoing mechanism. It scores every skill against Sam + Louis persona-plus-canvas query vectors using Voyage `voyage-3-lite` cosine embeddings. Runs surface adds and demote candidates in a dated grid at `docs/curation/`. Each run cross-references the current lite-manifest so the ~26 (or 30-34 range) count moves as new adopter personas ship or canvases update. `/manifest-align` runs at ultra tier (needs Voyage keys); results feed operator judgment at the next Cooper walk cycle. The count in this ADR is a snapshot; `/manifest-align` is how it stays honest across the substrate's lifetime.
|
|
88
|
-
|
|
89
|
-
Adopters point their sync at bassclef OR bassclef-lite via `.bassclef-source.json`.
|
|
90
|
-
|
|
91
|
-
## Amendment 2026-08-16 — chronicle preserved
|
|
92
|
-
|
|
93
|
-
Goal `2026-08-16a-786-vocab-root-cures` ran a Louis-only consult (see `docs/personas/2026-07-12-bet11c-louis.md`; consult notes kept operator-internal). Louis reads "chronicle" as familiar English, guesses the skill purpose correctly on first pass, and distrusts rename cascades that touch his repo. The word carries brand voice comparable to `/luminary` and `/kiss`.
|
|
94
|
-
|
|
95
|
-
**Amendment scope:**
|
|
96
|
-
|
|
97
|
-
- **Word "chronicle" preserved** in prose. Removed from the Decision 1 rename table above (struck through). Added to `standards/vocabulary-migration.json` `preserved_names` alongside `/luminary`, `/temperance`, `/kiss`.
|
|
98
|
-
- **Directory `chronicle/` stays.** Ticket #1207 (`chronicle/` → `session-log/`) closes as won't-do per Option X of the parent goal decision.
|
|
99
|
-
- **SKILL names unchanged.** Both `/chronicle` and `/session-log` continue to resolve. `/session-log` remains the primary alias per its `SKILL.md` frontmatter; `/chronicle` continues as the compat alias. Either name may be flipped as primary in a future amendment if operator preference shifts.
|
|
100
|
-
- **Wordlist entry removed.** `standards/bassclef-internal-jargon.md` L133 (`chronicle (in prose) | session log | ADVISE`) deleted; new ALLOW row added.
|
|
101
|
-
- **Hook reminder trimmed.** `.claude/hooks/plain-english-steering.sh` L110-121 UserPromptSubmit reminder drops the chronicle rename line. Five D1 renames remain in the reminder: bet → goal, WU → step, parent bet → parent goal, arc → thread, appetite → time budget.
|
|
102
|
-
|
|
103
|
-
The remaining five D1 renames stay in effect. The parent goal 2026-08-16a ships Option P1 (full commit) on the remaining five via downstream sessions per #841 sweep + wordlist flip + #1142 structural rename.
|
|
104
|
-
|
|
105
|
-
## Consequences
|
|
106
|
-
|
|
107
|
-
### Positive
|
|
108
|
-
|
|
109
|
-
- Adopters get a coherent adopter-release story with plain English AND simple vocabulary AND a light profile in one release cycle
|
|
110
|
-
- Two-tier vocabulary treatment preserves bassclef's opinionated voice at the brand-carrying names (/temperance, /luminary, /kiss) while removing jargon from technical terms
|
|
111
|
-
- The 30k always-loaded context target is reachable via lite curation (drop from 76 rules to ~15 lite-tagged rules)
|
|
112
|
-
- The 60-second first-value target is reachable via Amazon-shape skill bodies (announcement first, protocol below the fold)
|
|
113
|
-
- Adopters who want the full framework keep the current bassclef release; nothing lost
|
|
114
|
-
- Ticket #707 embedding gap (16-18 luminaries without embeddings) does not block lite — lite uses standard-tier LLM matcher which works against files not embeddings
|
|
115
|
-
|
|
116
|
-
### Negative
|
|
117
|
-
|
|
118
|
-
- The rewrite is real work — roughly 1200-2100 turns across four tickets (Scope A rewrite, Scope B rewrite, lite curation, lite release infrastructure)
|
|
119
|
-
- Grace window through 2026-10-31 for old vocabulary means bassclef carries dual-vocabulary support cost during migration
|
|
120
|
-
- Two-repo architecture doubles the release workflow surface (bassclef and bassclef-lite both need release runs)
|
|
121
|
-
- Adopters mid-flight who read chronicles from before the rename see the old vocabulary; migration mapping table documents the equivalences
|
|
122
|
-
|
|
123
|
-
### Risks
|
|
124
|
-
|
|
125
|
-
- Wrong picks in the lite ~26 could ship a version that fails adopter first-use. Mitigation — POA + twoDo skill-usage scan grounds the pick in real usage data. Post-reframe: Cooper walk 33-row judgment (session 2026-08-02c) plus 10-luminary consensus (canvas 2026-08-02) plus operator sign-off (ticket #1050) triangulate the count.
|
|
126
|
-
- Rewrite drift — new capability might get added during the rewrite (Brooks warning). Mitigation — Tidy First discipline; vocabulary rename ships alone; no new capability
|
|
127
|
-
- Sam persona might not be the primary reader we think they are. Mitigation — feedback from actual first-week adopters of bassclef-lite drives the next iteration
|
|
128
|
-
|
|
129
|
-
## Alternatives considered
|
|
130
|
-
|
|
131
|
-
- **Rename Shape Up vocabulary in the SKILL bodies without renaming /temperance and /luminary as skill names** — chose this path per Dunford consultation. Skill names carry brand positioning; renaming loses differentiation.
|
|
132
|
-
- **Keep Shape Up vocabulary and gloss it at first mention** — rejected. Twelve consultations converged on rename. Glossing forever carries reader cost every session.
|
|
133
|
-
- **One rewrite ticket covering all planning skills at once** — rejected. Operator directive to split scope A and scope B into separate tickets. Reduces per-ticket size; preserves feedback opportunities between.
|
|
134
|
-
- **Skip lite version; only rewrite** — rejected. Adam Sharpe's review and the lite profile canvas make the lite version the strategic move; the rewrite is one step of shipping it.
|
|
135
|
-
|
|
136
|
-
## Sources read
|
|
137
|
-
|
|
138
|
-
- Twelve luminary consultation notes (operator-private) — phase 1 consolidated proposal, Ryan Singer through Taiichi Ohno round, April Dunford brand voice vs accessibility, POA + twoDo adopter skill-usage scan
|
|
139
|
-
- Strategy notes (operator-private) — outside architect review that set the strategic targets, lite profile canvas, author-time simplicity sister discipline
|
|
140
|
-
- `sunj-labs/bassclef-upstream#738` — parent ticket
|
|
141
|
-
- `sunj-labs/bassclef-upstream#737` — narrow prose-cure ticket (folded into #738)
|
|
142
|
-
- `.claude/rules/plain-english-discipline.md` — master rule the rewrite satisfies
|
|
143
|
-
- `.claude/rules/we-dont-break-adopters.md` — governs the grace window
|
|
144
|
-
- `standards/bassclef-internal-jargon.md` — wordlist source of truth
|
|
145
|
-
- `CLAUDE.md` line 40 — tier taxonomy including `lite`
|
|
146
|
-
- `scripts/release-to-bassclef.sh` lines 275-338 — existing tier-filter infrastructure
|
|
147
|
-
|
|
148
|
-
## References
|
|
149
|
-
|
|
150
|
-
- Ticket #738 — parent ticket carrying the phased rewrite
|
|
151
|
-
- Ticket #737 — folded; closed as duplicate of #738
|
|
152
|
-
- Ticket #707 — luminary embedding backfill (does not block lite)
|
|
153
|
-
- ADR-031 — non-breaking-changes-adopter discipline (governs the grace window)
|
|
154
|
-
- ADR-029 — release pipeline (extends to cover bassclef-lite target)
|
|
155
|
-
- Follow-on tickets (to file after this ADR) — Scope B rewrite, lite curation, lite release infrastructure, CLAUDE.md staleness cure
|