@thebassclef/lite 1.1.1 → 1.2.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/dist/cli.cjs +23 -6
  2. package/dist/cli.js +23 -6
  3. package/dist/index.cjs +1 -1
  4. package/dist/index.d.ts +1 -1
  5. package/dist/index.js +1 -1
  6. package/dist/lite/.claude/bassclef-configs.jsonc +56 -0
  7. package/dist/lite/.claude/bassclef-orientation.md +120 -0
  8. package/dist/lite/.claude/hooks/adr-discipline-check.sh +132 -0
  9. package/dist/lite/.claude/hooks/atomic-pr-check.sh +169 -0
  10. package/dist/lite/.claude/hooks/auto-save-idle.sh +51 -0
  11. package/dist/lite/.claude/hooks/bassclef-sync.sh +51 -13
  12. package/dist/lite/.claude/hooks/bet-doc-gate.sh +283 -0
  13. package/dist/lite/.claude/hooks/bug-diagnosis.sh +64 -0
  14. package/dist/lite/.claude/hooks/destructive-command-guard.sh +136 -0
  15. package/dist/lite/.claude/hooks/file-rename-discipline-check.sh +147 -0
  16. package/dist/lite/.claude/hooks/hook-classifier-canary.sh +158 -0
  17. package/dist/lite/.claude/hooks/kiss-default-check.sh +129 -0
  18. package/dist/lite/.claude/hooks/multi-tenancy-check.sh +83 -0
  19. package/dist/lite/.claude/hooks/oo-ad-entry-point-check.sh +216 -0
  20. package/dist/lite/.claude/hooks/operator-private-path-check.sh +203 -0
  21. package/dist/lite/.claude/hooks/pattern-annotation-validate.sh +142 -0
  22. package/dist/lite/.claude/hooks/plain-english-steering.sh +15 -1
  23. package/dist/lite/.claude/hooks/post-write-trace.sh +66 -0
  24. package/dist/lite/.claude/hooks/pr-body-scrub-check.sh +446 -0
  25. package/dist/lite/.claude/hooks/pre-commit-identifier-leak-scrub.sh +137 -0
  26. package/dist/lite/.claude/hooks/pre-gh-pr-body-scrub.sh +192 -0
  27. package/dist/lite/.claude/hooks/pre-gh-pr-title-scrub.sh +172 -0
  28. package/dist/lite/.claude/hooks/role-entry-gate.sh +115 -0
  29. package/dist/lite/.claude/hooks/save-state.sh +268 -0
  30. package/dist/lite/.claude/hooks/session-reflection.d/08-settings-drift.sh +8 -1
  31. package/dist/lite/.claude/hooks/session-reflection.d/10-abrupt-stop-recovery.sh +52 -0
  32. package/dist/lite/.claude/hooks/session-reflection.d/55-orientation-gate.sh +40 -4
  33. package/dist/lite/.claude/hooks/session-reflection.d/80-hook-heartbeat-check.sh +12 -5
  34. package/dist/lite/.claude/hooks/session-reflection.d/81-hook-manifest-staleness.sh +18 -2
  35. package/dist/lite/.claude/hooks/session-reflection.d/91-npm-version-drift.sh +54 -0
  36. package/dist/lite/.claude/hooks/session-reflection.d/tests/10-abrupt-stop-recovery.test.sh +95 -0
  37. package/dist/lite/.claude/hooks/session-reflection.sh +62 -15
  38. package/dist/lite/.claude/hooks/tool-failure-diagnosis.sh +50 -0
  39. package/dist/lite/.claude/luminaries/andrej-karpathy.md +165 -0
  40. package/dist/lite/.claude/luminaries/dave-gray.md +155 -0
  41. package/dist/lite/.claude/luminaries/gary-klein.md +166 -0
  42. package/dist/lite/.claude/luminaries/kaoru-ishikawa.md +162 -0
  43. package/dist/lite/.claude/luminaries/lean-product-canvas.md +33 -0
  44. package/dist/lite/.claude/luminaries/luke-wroblewski.md +224 -0
  45. package/dist/lite/.claude/luminaries/ryan-singer.md +113 -0
  46. package/dist/lite/.claude/luminaries/steve-krug.md +168 -0
  47. package/dist/lite/.claude/luminaries/tony-ulwick.md +134 -0
  48. package/dist/lite/.claude/rules/arc-level-orientation-before-leaf.md +60 -0
  49. package/dist/lite/.claude/rules/architect-review-discipline.md +71 -0
  50. package/dist/lite/.claude/rules/auto-fix-criteria.md +126 -0
  51. package/dist/lite/.claude/rules/bassclef-hook-drift-blocker.md +144 -0
  52. package/dist/lite/.claude/rules/bassclef-models-discovery.md +107 -0
  53. package/dist/lite/.claude/rules/bassclef-workflow-parity.md +104 -0
  54. package/dist/lite/.claude/rules/cost-governance.md +154 -0
  55. package/dist/lite/.claude/rules/file-rename-discipline.md +95 -0
  56. package/dist/lite/.claude/rules/mechanism-fidelity.md +88 -0
  57. package/dist/lite/.claude/rules/prototype-production-coupling.md +125 -0
  58. package/dist/lite/.claude/rules/quick-fix-criteria.md +90 -0
  59. package/dist/lite/.claude/rules/session-artifacts.md +30 -0
  60. package/dist/lite/.claude/rules/sibling-smoke-after-substrate-change.md +107 -0
  61. package/dist/lite/.claude/rules/substrate-as-system.md +67 -0
  62. package/dist/lite/.claude/rules/usability.md +22 -0
  63. package/dist/lite/.claude/settings.json +20 -0
  64. package/dist/lite/.claude/skills/agent-research-spawn/SKILL.md +100 -0
  65. package/dist/lite/.claude/skills/architect-review/SKILL.md +201 -0
  66. package/dist/lite/.claude/skills/auto-fix/SKILL.md +297 -0
  67. package/dist/lite/.claude/skills/autonomous/SKILL.md +300 -0
  68. package/dist/lite/.claude/skills/bind-subdomain/SKILL.md +232 -0
  69. package/dist/lite/.claude/skills/canvas/SKILL.md +41 -0
  70. package/dist/lite/.claude/skills/deploy-prod/SKILL.md +106 -0
  71. package/dist/lite/.claude/skills/docs-sync/SKILL.md +188 -0
  72. package/dist/lite/.claude/skills/eisenhower/SKILL.md +273 -0
  73. package/dist/lite/.claude/skills/empathy-map/SKILL.md +168 -0
  74. package/dist/lite/.claude/skills/frontend-design/SKILL.md +53 -0
  75. package/dist/lite/.claude/skills/interview-me/SKILL.md +171 -0
  76. package/dist/lite/.claude/skills/journal-export/SKILL.md +293 -0
  77. package/dist/lite/.claude/skills/jtbd-tasks/SKILL.md +203 -0
  78. package/dist/lite/.claude/skills/objectory-decompose/SKILL.md +256 -0
  79. package/dist/lite/.claude/skills/pick-luminaries/SKILL.md +100 -0
  80. package/dist/lite/.claude/skills/pre-mortem/SKILL.md +180 -0
  81. package/dist/lite/.claude/skills/prototype-gallery/SKILL.md +264 -0
  82. package/dist/lite/.claude/skills/provision-deploy-host/SKILL.md +257 -0
  83. package/dist/lite/.claude/skills/quick-fix/SKILL.md +273 -0
  84. package/dist/lite/.claude/skills/release/SKILL.md +311 -0
  85. package/dist/lite/.claude/skills/release-notes/SKILL.md +202 -0
  86. package/dist/lite/.claude/skills/rfc/SKILL.md +222 -0
  87. package/dist/lite/.claude/skills/riff-prototypes/SKILL.md +637 -0
  88. package/dist/lite/.claude/skills/secrets-bootstrap/SKILL.md +209 -0
  89. package/dist/lite/.claude/skills/skill/SKILL.md +304 -0
  90. package/dist/lite/.claude/skills/smoke-test/SKILL.md +100 -0
  91. package/dist/lite/.claude/skills/state/SKILL.md +204 -0
  92. package/dist/lite/.claude/skills/substrate-check/SKILL.md +218 -0
  93. package/dist/lite/.claude/skills/synthetic-user/SKILL.md +381 -0
  94. package/dist/lite/.claude/skills/task-scenarios/SKILL.md +105 -0
  95. package/dist/lite/.claude/skills/tier-dependency-audit/SKILL.md +139 -0
  96. package/dist/lite/.claude/skills/ux-migration/SKILL.md +424 -0
  97. package/dist/lite/.claude/skills/value-prop-canvas/SKILL.md +297 -0
  98. package/dist/lite/README.md +5 -1
  99. package/dist/lite/gitignore +6 -0
  100. package/dist/lite/lib/bassclef-dir-resolver.sh +85 -0
  101. package/dist/lite/lib/clone-failure-classifier.sh +59 -0
  102. package/dist/lite/lib/fixture-builder.sh +190 -0
  103. package/dist/lite/lib/fresh-install-check.sh +49 -0
  104. package/dist/lite/lib/hook-heartbeat.sh +0 -1
  105. package/dist/lite/lib/mechanism-fidelity.sh +569 -0
  106. package/dist/lite/lib/npm-version-check.sh +112 -0
  107. package/dist/lite/lib/preview-state.sh +229 -0
  108. package/dist/lite/lib/session-rescue.sh +0 -1
  109. package/dist/lite/scripts/generate-lite-manifest.sh +145 -4
  110. package/dist/lite/scripts/lite-manifest-drift-check.sh +5 -1
  111. package/dist/lite/standards/architect-review-discipline.md +222 -0
  112. package/dist/lite/standards/bassclef-platform.md +249 -0
  113. package/dist/lite/standards/bassclef-test-repos.md +97 -0
  114. package/dist/lite/standards/bassclef-wiring-manifest.json +25 -1
  115. package/dist/lite/standards/cold-adopter-harness.md +205 -0
  116. package/dist/lite/standards/data-management.md +135 -0
  117. package/dist/lite/standards/frontend-stack/nextjs-prisma.md +124 -0
  118. package/dist/lite/standards/lite-manifest-schema-changes.md +27 -0
  119. package/dist/lite/standards/lite-manifest.json +1456 -14
  120. package/dist/lite/standards/mechanism-fidelity.md +205 -0
  121. package/dist/lite/standards/operator-private-discipline.md +200 -0
  122. package/dist/lite/standards/operator-to-public-flow.md +195 -0
  123. package/dist/lite/standards/prototype-gallery.md +251 -0
  124. package/dist/lite/standards/pseudonym-key-schema.md +109 -0
  125. package/dist/lite/standards/sibling-validation-checklist.md +181 -0
  126. package/dist/lite/standards/slack-notifications.md +161 -0
  127. package/dist/lite/standards/synthetic-user-testing.md +173 -0
  128. package/dist/lite/standards/vendor-bindings.md +165 -0
  129. package/dist/lite/standards/vendor-plugins/frontend-design.md +66 -0
  130. package/dist/lite/standards/vpc-fit-validation.md +167 -0
  131. package/dist/lite/templates/gallery-yml.md +113 -0
  132. package/dist/lite/templates/product-canvas.md +169 -0
  133. package/dist/lite/templates/value-prop-canvas.md +180 -0
  134. package/package.json +3 -3
  135. /package/dist/lite/{whereami.md → docs/whereami.md} +0 -0
@@ -0,0 +1,311 @@
1
+ ---
2
+ name: release
3
+ description: "Ship framework files from bassclef-upstream to public bassclef, filtered by tier. Dry-runs first, reports tier counts plus andon scan plus sibling smoke evidence. On operator confirm runs the live release and opens a PR. Per ADR-029."
4
+ problem: "Framework files ship from upstream to public bassclef through many manual steps. Dry-run catches slip past."
5
+ value: "Ships framework files from bassclef-upstream to public bassclef. Filtered by tier. Dry-runs first."
6
+ inputs: [Optional tier filter, Dry-run or apply flag]
7
+ outputs: [Files shipped, Dry-run diff, Public PR, Tag drop]
8
+ tier: lite
9
+ user_invocable: true
10
+ disable_model_invocation: false
11
+ modes: [default, --dry-run, --skip-dry-run]
12
+ composes_with: [verify, state-a-problem, value-prop, kiss]
13
+ ---
14
+ <!-- andon-allow: operator-private -->
15
+ <!-- andon-allow: bassclef-upstream -->
16
+
17
+ # /release
18
+
19
+ ## What you get
20
+
21
+ A staged path to ship framework files from bassclef-upstream to public bassclef.
22
+
23
+ `/release` runs a dry-run first. It reports the tier filter result. It reports the andon scan. It reports the sibling smoke evidence. It waits for your confirmation. Then it runs `/verify`. Then it executes the live release.
24
+
25
+ The live step does five things. It tags the source SHA. It rsyncs the filtered set to the target. It commits on a release branch in public bassclef. It opens a PR. After you merge the PR, it cuts semver tags on both repos with matching names.
26
+
27
+ Per ADR-040 Decision 5, a second target — `bassclef-lite` — ships alongside `bassclef` for solo adopters. Same pipeline. Different tier filter. Both targets share the andon scan and sibling smoke discipline.
28
+
29
+ ## When to use it
30
+
31
+ - You shipped one or more framework changes locally and want them in public bassclef.
32
+ - A session closed a goal whose acceptance includes "shipped to public."
33
+ - You are preparing Doors Open and need to prove the pipeline works.
34
+
35
+ Adopter sessions do not run `/release`. Adopters read the public bassclef release page and pull via `bassclef-sync`. Only bassclef-upstream sessions ship releases.
36
+
37
+ ## When NOT to use
38
+
39
+ Do not use `/release` to file evolution tickets. That is `/promote`. Do not use it to sync docs. That is `/docs-sync`. Do not use it on a dirty source tree. Commit or stash first. Do not use it when a prior release PR is still open on public. The new one would stack cumulatively.
40
+
41
+ ## FAQ
42
+
43
+ ### What are the steps of a release?
44
+
45
+ 1. Dry-run — reports tier counts, andon scan, target dir, sibling smoke prompt.
46
+ 2. Sibling smoke evidence — you paste PASS / FAIL / DEFERRED per the sibling-smoke rule.
47
+ 3. Operator confirmation — you approve or decline the ship.
48
+ 4. `/verify` — post-build check against the changes.
49
+ 5. Live release — tag source, rsync filtered set, commit + push release branch, open PR.
50
+ 6. PR body amend — replace the template stub with the recap drafted before Step 1.
51
+ 7. Report — surface the PR URL.
52
+ 8. Semver tag on both repos after the PR merges.
53
+
54
+ ### Why dry-run first?
55
+
56
+ The dry-run reports what the live release will do. It does not touch public bassclef. You see tier counts. You see andon scan hits. You see the target directory. You see the sibling smoke evidence prompt.
57
+
58
+ If andon trips, the dry-run stops. It asks you to fix the offending file. Retag `tier: private`. Or scrub the leak. Or add `# andon-allow: <term>` header. Then retry.
59
+
60
+ ### What is the sibling smoke evidence step?
61
+
62
+ Per the sibling-smoke rule, some releases need a real Claude Code session on a sibling repo before shipping. This applies to releases touching adopter-observable files — hooks, rules, skills, agents, lib, schemas, sync templates.
63
+
64
+ You paste one of:
65
+
66
+ ```
67
+ PASS: Sibling smoke: ran <sibling-repo> SessionStart at <ISO>; clean — <observation>
68
+ FAIL: Sibling smoke: ran <sibling-repo> SessionStart at <ISO>; FAIL — <observation>
69
+ DEFERRED: <rationale>; follow-on tracked at #<NNN>
70
+ ```
71
+
72
+ Silence is not deferral. The default is "run the smoke before /release."
73
+
74
+ - **PASS** — proceed to Step 3.
75
+ - **FAIL** — STOP. The release holds until the fix ships and a follow-up smoke confirms PASS.
76
+ - **DEFERRED** — proceed only when the rationale names a non-blocking case (pure no-behavior rename). Cite a follow-on ticket. Otherwise STOP.
77
+
78
+ V1 is ADVISORY. Silence is logged as a discipline miss but does not block dispatch. V2 flips to BLOCK once one calibration cycle ships.
79
+
80
+ ### What does the live release step actually do?
81
+
82
+ The script `scripts/release-to-bassclef.sh` does six things:
83
+
84
+ 1. Pre-flight — dirty-tree guard on source AND target.
85
+ 2. Tags source — `release-YYYY-MM-DD-<sha>`.
86
+ 3. Re-runs tier filter and andon scan. Defense in depth. Files may have changed since dry-run.
87
+ 4. rsyncs the filtered set to the target with a constrained `--delete`.
88
+ 5. Commits in the target on `release/YYYY-MM-DD-<sha>` branch.
89
+ 6. Pushes the branch and opens a PR against public bassclef `main`.
90
+
91
+ For the bassclef-lite target (per ADR-040 D5), a sibling branch opens with `tier: lite | standard` filter. It uses a distinct release tag suffix.
92
+
93
+ ### What does the PR body amend step do?
94
+
95
+ The script writes a template body with the stub "Operator amends with the substantive changes in this release window." Adopters reading the PR see this stub instead of the actual story.
96
+
97
+ Step 4.5 replaces the stub with the recap drafted before Step 1. The recap carries Problem + Summary + Test plan sections. It composes `/state-a-problem brief` + `/value-prop tweet` + session log entries.
98
+
99
+ The step reads the just-opened PR body. It scans for the stub. If the stub is present, it amends via `gh pr edit`. Step 5 does not fire until the amendment lands OR `SKIP_RELEASE_PR_AMEND=1` is set.
100
+
101
+ ### How do the semver tags work after the PR merges?
102
+
103
+ Per ADR-039 and the release-tagging standard, after you merge the release PR:
104
+
105
+ 1. Draft the tag name. The skill reads the change set and proposes a bump per semver policy.
106
+ - **Major** — adopter-visible breaking change (rename, tier vocab, ADR-031 level).
107
+ - **Minor** — new substrate surface.
108
+ - **Patch** — cure only.
109
+ 2. Draft release notes. Group by rule / hook / skill / standard / luminary / agent / ADR / cure. One line per PR with links. Apply `/kiss --grade10` to the body BEFORE writing to file per bassclef-upstream#634. The `pre-gh-release-body-scrub.sh` hook fires on `gh release create`. Unscrubbed notes BLOCK the call.
110
+ 3. Cut the tag on both repos with the same name. `bassclef-upstream` is the source of truth. The tag on public `bassclef` (and `bassclef-lite`) is what adopters see. The GitHub Release page publishes on public bassclef only.
111
+
112
+ First tag ever cut is `v0.1.0`. Confirm the tag name at Step 2 before the pipeline runs.
113
+
114
+ ### What does /release refuse to do?
115
+
116
+ - Dirty source tree. Commit or stash first.
117
+ - Dirty target tree. Commit or stash in `~/src/sunj-labs/bassclef/` first.
118
+ - Andon scan hit per ADR-029. Andon is required, not advisory.
119
+ - Invalid tier value on any file. Must be `private | basic | premium | public | lite | standard`.
120
+ - Tag collision. A release tag already exists at this SHA. Release was already cut today.
121
+
122
+ ## Details below the fold
123
+
124
+ ### Procedure — full
125
+
126
+ **Step 1 — Dry-run.**
127
+
128
+ ```bash
129
+ bash scripts/release-to-bassclef.sh --dry-run
130
+ ```
131
+
132
+ Output reports source SHA. Would-be release tag. Tier bucket counts. Andon result. Target dir. Sibling smoke evidence prompt.
133
+
134
+ If andon trips, STOP. Cure per FAQ above.
135
+
136
+ **Step 1.5 — Sibling smoke evidence.** Paste PASS / FAIL / DEFERRED per the FAQ.
137
+
138
+ **Step 2 — Operator confirmation.** Surface the dry-run summary. Ask: "Ship $count_inc files (tier=basic|public) to public bassclef on branch release-YYYY-MM-DD-<sha>?" Decline stops. Approve proceeds.
139
+
140
+ **Step 3 — /verify.** Run `/verify`. It runs the check against your changes (substrate-clarity-gate on edits, etc.). It catches anything the dry-run missed.
141
+
142
+ **Step 4 — Live release.** `bash scripts/release-to-bassclef.sh`. See FAQ for what the script does.
143
+
144
+ **Step 4.5 — Amend PR body.** Read the just-opened PR body. Scan for the template stub. If present, amend via `gh pr edit --body-file <recap-file>`. Re-read to confirm the stub is gone. Step 5 does not fire until this lands.
145
+
146
+ **Step 5 — Report.** Surface the PR URL. You review and merge in public bassclef.
147
+
148
+ **Step 6 — Cut semver tags.** After the PR merges, draft release notes. Run `/kiss` on the notes. Then run the automation script (per bassclef-upstream#1005).
149
+
150
+ The script does the rest. It reads the notes. It infers the semver bump. It cuts tags on both repos. It creates the GitHub Release page.
151
+
152
+ ```bash
153
+ # Dry-run first — always
154
+ RELEASE_STEP6_DRY_RUN=1 bash scripts/release-step6.sh release-notes-<version>.md
155
+
156
+ # Confirm the proposed tag, then live
157
+ bash scripts/release-step6.sh release-notes-<version>.md
158
+ ```
159
+
160
+ Override env vars:
161
+
162
+ - `RELEASE_STEP6_OVERRIDE_VERSION=v0.23.0` — skip the auto-bump. Use for major bumps.
163
+ - `RELEASE_STEP6_TITLE="Custom title"` — override the title.
164
+ - `SOURCE_REPO=<path>` and `TARGET_REPO=<path>` — override repo paths.
165
+
166
+ The script fails fast on three cases. Missing notes file. Empty delta since last tag. Tag collision on source. See `.claude/hooks/tests/release-step6.test.sh` for the 6 covered cases.
167
+
168
+ **Manual fallback:** if the script is not available, run `git tag` on both repos and `gh release create --latest` manually. See `standards/release-tagging.md` for the exact commands.
169
+
170
+ ### Self-check step — before drafting the recap
171
+
172
+ Before drafting the recap that feeds Step 4.5:
173
+
174
+ 1. Read your draft against `standards/bassclef-internal-jargon.md` BLOCK terms.
175
+ 2. Rewrite any BLOCK matches in plain English.
176
+ 3. Compose the Problem section via `/state-a-problem brief`. The draft carries `/kiss --grade10` inline by default.
177
+ 4. Compose the flash claim via `/value-prop tweet`.
178
+ 5. Write the recap file.
179
+
180
+ The `pre-gh-release-body-scrub.sh` hook is the safety net at the GitHub Release page. This self-check catches misses at the PR body surface.
181
+
182
+ ### Modes
183
+
184
+ - Default — dry-run then confirm then ship. Best for adopters and first runs.
185
+ - `/release --skip-dry-run` — jump straight to live. Use only when you just ran a dry-run and want to skip the duplicate.
186
+ - `/release --dry-run` — dry-run only. The live release does not fire under this flag.
187
+ INSTEAD of skipping the live step when you intend to ship: use the default mode.
188
+
189
+ ### Override paths
190
+
191
+ - `BASSCLEF_PUBLIC_DIR=<path>` — override target dir. Falls back to a default path.
192
+ - `SKIP_ANDON=1` — bypass andon scan.
193
+ INSTEAD of bypassing in production: cure the offending file. Re-run the dry-run.
194
+ - `SKIP_SIBLING_SMOKE=1` — bypass Step 1.5 sibling-smoke prompt.
195
+ INSTEAD of bypassing routinely: run the smoke. Or defer with a follow-on ticket.
196
+ - `SKIP_RELEASE_PR_AMEND=1` — allow Step 5 to fire with the stub still present.
197
+ INSTEAD of habitually skipping the amend: draft the recap before Step 1.
198
+ - `SKIP_RELEASE_TAG=1` — skip Step 6 for infrastructure fixes that ship before the next planned release window.
199
+
200
+ ### Reads
201
+
202
+ - `.claude/skills/*/SKILL.md`, `.claude/luminaries/*.md`, `.claude/rules/*.md`, `.claude/hooks/*.sh`, `architecture/decisions/*.md`, `standards/*.md` — files carrying `tier:` field
203
+ - `standards/bassclef-internal-jargon.md` — andon scan term source (BLOCK tier)
204
+ - `CLAUDE.md`, `substrate.config.md` — top-level docs shipped as-is
205
+
206
+ ### Writes
207
+
208
+ - `~/src/sunj-labs/bassclef/` (or `BASSCLEF_PUBLIC_DIR`) — filtered framework via rsync
209
+ - (Per ADR-040 D5) `~/src/sunj-labs/bassclef-lite/` — the lite tier subset, once the sibling repo ships
210
+ - A new branch and PR in public bassclef (and in bassclef-lite, per D5)
211
+ - A git tag `release-YYYY-MM-DD-<sha>` in bassclef-upstream
212
+
213
+ ### Grace window on old vocabulary
214
+
215
+ Old vocabulary still works through 2026-10-31 per ADR-031 and the we-dont-break-adopters rule. Old terms — `bet`, `appetite`, `step`, `chronicle`. The `/chronicle` skill name still resolves alongside `/session-log`.
216
+
217
+ ## Examples
218
+
219
+ <!-- FKGL-EXEMPT: sample dry-run output -->
220
+
221
+ **Dry-run summary (clean):**
222
+
223
+ ```
224
+ === /release dry-run ===
225
+ Source SHA: 2ceb53b7
226
+ Would-be tag: release-2026-07-19-2ceb53b7
227
+ Files by tier:
228
+ include (basic + public + untagged): 47
229
+ exclude (private + upstream): 23
230
+ Andon scan: CLEAN
231
+ Target dir: ~/src/sunj-labs/bassclef/
232
+ ```
233
+
234
+ **Andon trip (STOP):**
235
+
236
+ ```
237
+ === /release dry-run ===
238
+ Andon scan: 2 HITS
239
+ - standards/foo.md line 42: BLOCK term hit
240
+ - .claude/rules/bar.md line 8: BLOCK term hit
241
+ STOP.
242
+ ```
243
+
244
+ <!-- /FKGL-EXEMPT -->
245
+
246
+ ## Anti-patterns and INSTEAD
247
+
248
+ | Anti-pattern | INSTEAD |
249
+ |---|---|
250
+ | Skip dry-run and go straight to live | Run dry-run first. The andon scan and tier counts protect against leaks |
251
+ | Merge past an andon hit by setting SKIP_ANDON | Fix the file (retag or scrub or allowlist) and run dry-run again |
252
+ | Silence a FAIL sibling-smoke and dispatch anyway | Hold the release. Ship the cure first. Confirm smoke PASS on the next run |
253
+ | Skip Step 4.5 and let the release PR ship with the template stub | Amend the PR body with the drafted recap so adopters read the real story |
254
+ | Fire /release when a prior release PR is open on public | Wait for the prior PR to merge. Otherwise the new PR would stack cumulatively |
255
+
256
+ ## Composes with
257
+
258
+ - `/verify` — Step 3 runs verify against the changes before live release.
259
+ - `/state-a-problem` — drafts the recap for Step 4.5 PR body amendment.
260
+ - `/value-prop` — flash summary for the same recap.
261
+ - `/kiss` — applied at Step 2b before release notes write.
262
+
263
+ ## Distinct from
264
+
265
+ - `/promote` — files a `bassclef-evolution` ticket for framework change proposals. `/release` ships changes already decided. `/promote` proposes them.
266
+ - `/docs-sync` — syncs adopter docs to GitHub Wiki. Separate channel. Not the release pipeline.
267
+
268
+ ## Rules
269
+
270
+ - Do not write to public bassclef without a clean andon scan. INSTEAD, fix any hits before dispatch.
271
+ - Do not dispatch live release with a dirty source or target tree. INSTEAD, commit or stash first.
272
+ - Do not skip Step 1.5 without explicit operator deferral. INSTEAD, run the smoke or file a follow-on ticket.
273
+ - Do not skip Step 4.5. Adopters read the PR body first. INSTEAD, amend the stub before Step 5.
274
+ - Always cut semver tags on both repos with the same name at Step 6.
275
+
276
+ ## Test cases
277
+
278
+ <!-- FKGL-EXEMPT: structured test spec -->
279
+ | ID | Prompt | Expected behavior |
280
+ |---|---|---|
281
+ | T1 | `/release` on a clean tree with no adopter-observable changes | Dry-run reports counts + CLEAN andon; sibling-smoke prompt fires; operator confirmation gates live |
282
+ | T2 | `/release` when standards/foo.md contains a BLOCK term | Andon trips; STOP; message names line + term |
283
+ | T3 | `/release --dry-run` | Dry-run only; live release does not fire |
284
+ | T4 | `/release --skip-dry-run` when just ran dry-run | Live release fires without repeating dry-run |
285
+ | T5 | `/release` when a prior release PR is open on public | STOP with a stack warning |
286
+ | T6 | Sibling smoke returns FAIL | Release held; PR does not open until cure ships |
287
+ <!-- /FKGL-EXEMPT -->
288
+
289
+ ## Sources read
290
+
291
+ - ADR-029 release pipeline
292
+ - ADR-039 release tagging policy
293
+ - ADR-040 planning-skill vocabulary and lite profile (Decision 5 — two-repo release)
294
+ - `.claude/rules/sibling-smoke-after-substrate-change.md`
295
+ - `.claude/rules/plain-english-discipline.md`
296
+ - `.claude/rules/we-dont-break-adopters.md`
297
+ - `standards/tier-tag-schema.md`
298
+ - `standards/release-tagging.md`
299
+ - `standards/bassclef-internal-jargon.md`
300
+ - `scripts/release-to-bassclef.sh`
301
+ - bassclef-upstream#634 — /kiss on release notes
302
+ - bassclef-upstream#694 — PR body amend at Step 4.5
303
+ - bassclef-upstream#545 V2 — sibling-smoke prompt at Step 1.5
304
+
305
+ ## Why this skill exists
306
+
307
+ Cross-repo releases without discipline leak private content into public. They mismatch tags across repos. They ship template stubs that adopters read as the release story. `/release` enforces the pipeline. Leaks get caught before writes. Tags match on both repos. Adopters read the real recap. Without `/release`, cross-repo shipping is manual clickops or bypasses the andon gate.
308
+
309
+ ## Output discipline
310
+
311
+ Dispatch `/kiss words --rewrite` on your skill output before you return it. See `standards/skill-output-discipline.md` for the contract.
@@ -0,0 +1,202 @@
1
+ ---
2
+ tier: lite
3
+ name: release-notes
4
+ description: "Draft a weekly changelog for two audiences \u2014 internal team (what shipped) and users (what's new for you). Pushes to Google Docs."
5
+ problem: "Weekly releases ship without a written record. Users miss what changed. Team misses what shipped."
6
+ value: "Drafts a weekly changelog for two audiences \u2014 internal team and users. Plain English."
7
+ inputs: [Time range or release tag ref]
8
+ outputs: [Internal changelog, User-facing changelog, Highlights section]
9
+ user_invocable: true
10
+ disable_model_invocation: false
11
+ ---
12
+
13
+ # Release Notes — Weekly Changelog
14
+
15
+ Two audiences, two documents, one cadence. Run weekly or at version tags.
16
+
17
+ ## Two audiences
18
+
19
+ ### Internal (project team)
20
+
21
+ What shipped, what changed, what to watch out for. Technical, specific,
22
+ complete. This is the changelog developers and operators read.
23
+
24
+ **Tone**: direct, technical, links to commits and issues.
25
+
26
+ ### External (users)
27
+
28
+ What's new and why you care. No jargon, no implementation details.
29
+ This is what someone adopting the product reads.
30
+
31
+ **Tone**: plain language, benefit-first, "you can now..." framing.
32
+
33
+ ## When to run
34
+
35
+ - **Weekly**: Every Monday (or first session of the week), covering the
36
+ prior week's work. This is the primary cadence.
37
+ - **At version tags**: When tagging a release (v0.7.0, v1.0.0), write
38
+ release notes for the tag covering everything since the last tag.
39
+ - **Session-end**: The session-end skill triggers release notes as a MAY
40
+ tier item. For per-session notes, write the internal version only —
41
+ external notes aggregate weekly.
42
+
43
+ ## Procedure
44
+
45
+ ### 1. Gather changes
46
+
47
+ ```bash
48
+ # Since last release notes
49
+ LAST_NOTES=$(ls docs/release-notes/*.md 2>/dev/null | grep -v .gitkeep | sort | tail -1)
50
+ LAST_DATE=$(basename "$LAST_NOTES" .md | cut -c1-10)
51
+
52
+ # Commits since then
53
+ git log --oneline --since="$LAST_DATE"
54
+
55
+ # Tags since then
56
+ git tag --sort=-creatordate | head -5
57
+
58
+ # Chronicles since then (richer context than commits)
59
+ ls chronicle/ | sort | tail -10 # bassclef
60
+ ls docs/chronicle/ | sort | tail -10 # app repos
61
+ ```
62
+
63
+ ### 2. Write internal changelog
64
+
65
+ For each meaningful change (skip auto-saves, checkpoint commits):
66
+
67
+ ```markdown
68
+ # Changelog — Week of YYYY-MM-DD
69
+
70
+ ## New
71
+ - **[Feature name]** — what it does, why it matters. ([commit](hash), closes #NNN)
72
+
73
+ ## Changed
74
+ - **[What changed]** — what's different, what to watch out for. ([commit](hash))
75
+
76
+ ## Fixed
77
+ - **[What was broken]** — what the symptom was, what fixed it. ([commit](hash))
78
+
79
+ ## Versioning
80
+ - Tagged: vX.Y.Z — [milestone summary]
81
+
82
+ ## Stats
83
+ - Commits: N
84
+ - Issues closed: N (#NNN, #NNN)
85
+ - New skills/standards: N
86
+ - Chronicles: N
87
+ ```
88
+
89
+ ### 3. Write external release notes
90
+
91
+ For each user-facing change:
92
+
93
+ ```markdown
94
+ # What's New — Week of YYYY-MM-DD
95
+
96
+ ### [Feature name in plain language]
97
+
98
+ **What you can do now**: [one sentence — what's new or different]
99
+
100
+ **Why it matters**: [one sentence — what problem this solves]
101
+
102
+ **How to try it**: [one sentence — where to go, what to do]
103
+ ```
104
+
105
+ Rules for external notes:
106
+ - No technical jargon. "Broadened bassclef evolution check" → "Settings changes are now automatically flagged for review across all repos"
107
+ - No implementation details. Skip refactors, CI changes, internal tooling
108
+ - No feature names that aren't visible to users
109
+ - Test: could someone who's never seen the codebase understand this?
110
+
111
+ ### 4. Save locally
112
+
113
+ ```
114
+ docs/release-notes/YYYY-MM-DD-internal.md
115
+ docs/release-notes/YYYY-MM-DD-external.md
116
+ ```
117
+
118
+ ### 5. Push to Google Docs
119
+
120
+ Read `changelog_doc_id` from `substrate.config.md`.
121
+ If configured:
122
+
123
+ ```bash
124
+ # Internal changelog
125
+ cd ~/src/your-org/your-app && npx tsx scripts/push-to-gdoc.ts \
126
+ --file [internal changelog path] \
127
+ --doc-id [changelog_doc_id from substrate.config.md]
128
+ ```
129
+
130
+ External release notes go to a GitHub Release (if tagging) or to the
131
+ same doc with a clear section header. The Google Doc is the internal
132
+ team's running record; GitHub Releases are the external-facing artifact.
133
+
134
+ If `changelog_doc_id` is not set, changelogs stay local.
135
+
136
+ ### 5a. Defer push when capabilities missing
137
+
138
+ If `changelog_doc_id` is configured but the current session cannot push
139
+ (missing `gcloud-auth` / `google-docs-write` capability — typical in
140
+ ephemeral-mobile, cloud-web, or a desktop session where the SA key is
141
+ absent), DO NOT silently skip. Write a deferred-action entry so the
142
+ next capable session picks up the push.
143
+
144
+ ```bash
145
+ TS=$(date -u +"%Y-%m-%dT%H-%M-%SZ")
146
+ ID="${TS}-release-notes-gdoc-push"
147
+ cp templates/deferred-action-template.md \
148
+ "docs/deferred-actions/${ID}.md"
149
+ # Fill frontmatter:
150
+ # pending_action: push-release-notes-to-gdoc
151
+ # requires_capability: [gcloud-auth, google-docs-write]
152
+ # priority: medium
153
+ # origin_skill: /release-notes
154
+ # resolves_when: |
155
+ # Google Doc <changelog_doc_id> reflects docs/release-notes/<period>-internal.md
156
+ # Fill body sections (Context, Command, On completion, Cross-refs).
157
+ git add "docs/deferred-actions/${ID}.md"
158
+ git commit -m "chore: defer release-notes gdoc-push (<period>)"
159
+ ```
160
+
161
+ See `.claude/rules/deferred-actions.md` and
162
+ `standards/deferred-actions-schema.md`. Silent skip is a rule violation
163
+ (session-artifacts.md — silence is not deferral).
164
+
165
+ ### 6. GitHub Release (at version tags only)
166
+
167
+ When a version tag exists for this period:
168
+
169
+ ```bash
170
+ gh release create vX.Y.Z \
171
+ --title "vX.Y.Z — [milestone summary]" \
172
+ --notes-file docs/release-notes/YYYY-MM-DD-external.md
173
+ ```
174
+
175
+ ## Backfill
176
+
177
+ If release notes haven't been written in more than a week:
178
+
179
+ 1. Check when the last release notes were written
180
+ 2. Group missing weeks by date range
181
+ 3. Write one internal + one external per missing week, oldest first
182
+ 4. Push in chronological order (oldest first — same rule as journal entries)
183
+
184
+ ## Config
185
+
186
+ The `changelog_doc_id` field in `substrate.config.md` is requested when
187
+ a new repo inherits bassclef. If not configured, changelogs stay local
188
+ in `docs/release-notes/`.
189
+
190
+ ## Session-end integration
191
+
192
+ The session-end skill lists release notes as a MAY tier item (step 10).
193
+ At weekly boundaries or version tags, the agent should proactively run
194
+ /release-notes rather than waiting for session-end to maybe trigger it.
195
+
196
+ The session-start hook should check: "When were release notes last
197
+ written? If >7 days, flag it." This is the real enforcement — session-end
198
+ is too unreliable for weekly cadence.
199
+
200
+ ## Output discipline
201
+
202
+ Dispatch `/kiss words --rewrite` on your skill output before you return it. See `standards/skill-output-discipline.md` for the contract.