@thebassclef/lite 0.0.1 → 0.1.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.
Files changed (182) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +85 -4
  3. package/dist/cli.cjs +1610 -0
  4. package/dist/cli.js +1587 -0
  5. package/dist/index.cjs +4 -0
  6. package/dist/index.d.ts +2 -0
  7. package/dist/index.js +4 -0
  8. package/package.json +51 -3
  9. package/substrate/.bassclef/lite-manifest.json +1794 -0
  10. package/substrate/.claude/agents/architect.md +70 -0
  11. package/substrate/.claude/agents/builder.md +114 -0
  12. package/substrate/.claude/agents/designer.md +156 -0
  13. package/substrate/.claude/agents/reviewer.md +88 -0
  14. package/substrate/.claude/hooks/artifact-ingestion-gate.sh +357 -0
  15. package/substrate/.claude/hooks/assert-verify-steering.sh +77 -0
  16. package/substrate/.claude/hooks/bassclef-source-config-validate.sh +215 -0
  17. package/substrate/.claude/hooks/bassclef-sync.sh +634 -0
  18. package/substrate/.claude/hooks/compound-noun-scrub.sh +292 -0
  19. package/substrate/.claude/hooks/kiss-expansion-inject.sh +69 -0
  20. package/substrate/.claude/hooks/plain-english-steering.sh +156 -0
  21. package/substrate/.claude/hooks/post-skill-friction-check.sh +177 -0
  22. package/substrate/.claude/hooks/post-skill-telemetry.sh +62 -0
  23. package/substrate/.claude/hooks/pre-build-gate.sh +511 -0
  24. package/substrate/.claude/hooks/pre-commit-gate.sh +452 -0
  25. package/substrate/.claude/hooks/session-end.sh +433 -0
  26. package/substrate/.claude/hooks/session-reflection.sh +303 -0
  27. package/substrate/.claude/hooks/skill-body-grade-gate.sh +219 -0
  28. package/substrate/.claude/hooks/skill-body-intent-drift.sh +107 -0
  29. package/substrate/.claude/hooks/skill-step-list-check.sh +171 -0
  30. package/substrate/.claude/hooks/state-validate.sh +271 -0
  31. package/substrate/.claude/hooks/substrate-clarity-gate.sh +1110 -0
  32. package/substrate/.claude/hooks/temperance-gate.sh +147 -0
  33. package/substrate/.claude/hooks/testing-tier-enforce.sh +233 -0
  34. package/substrate/.claude/hooks/turn-prose-grade-measure.sh +219 -0
  35. package/substrate/.claude/hooks/turn-prose-kiss-check.sh +434 -0
  36. package/substrate/.claude/hooks/vocabulary-migration-check.sh +171 -0
  37. package/substrate/.claude/hooks/whereami-utc-gate.sh +142 -0
  38. package/substrate/.claude/luminaries/alan-cooper.md +170 -0
  39. package/substrate/.claude/luminaries/alistair-cockburn.md +140 -0
  40. package/substrate/.claude/luminaries/amazon-pr-faq.md +34 -0
  41. package/substrate/.claude/luminaries/ash-maurya.md +121 -0
  42. package/substrate/.claude/luminaries/bill-buxton.md +210 -0
  43. package/substrate/.claude/luminaries/charles-sanders-peirce.md +150 -0
  44. package/substrate/.claude/luminaries/david-ogilvy.md +192 -0
  45. package/substrate/.claude/luminaries/don-norman.md +173 -0
  46. package/substrate/.claude/luminaries/edward-tufte.md +179 -0
  47. package/substrate/.claude/luminaries/eric-evans.md +160 -0
  48. package/substrate/.claude/luminaries/frederick-brooks.md +50 -0
  49. package/substrate/.claude/luminaries/gang-of-four.md +157 -0
  50. package/substrate/.claude/luminaries/jason-fried-dhh.md +46 -0
  51. package/substrate/.claude/luminaries/jesse-james-garrett.md +154 -0
  52. package/substrate/.claude/luminaries/john-ousterhout.md +94 -0
  53. package/substrate/.claude/luminaries/karl-popper.md +132 -0
  54. package/substrate/.claude/luminaries/kent-beck.md +168 -0
  55. package/substrate/.claude/luminaries/linus-torvalds.md +218 -0
  56. package/substrate/.claude/luminaries/martin-fowler.md +164 -0
  57. package/substrate/.claude/luminaries/michael-feathers.md +125 -0
  58. package/substrate/.claude/luminaries/michael-nygard.md +118 -0
  59. package/substrate/.claude/luminaries/robert-c-martin.md +164 -0
  60. package/substrate/.claude/luminaries/saltzer-schroeder.md +194 -0
  61. package/substrate/.claude/luminaries/sophia-prater.md +193 -0
  62. package/substrate/.claude/luminaries/stephen-toulmin.md +131 -0
  63. package/substrate/.claude/rules/artifact-ingestion.md +179 -0
  64. package/substrate/.claude/rules/assert-only-after-verify.md +137 -0
  65. package/substrate/.claude/rules/blocked-items.md +146 -0
  66. package/substrate/.claude/rules/branching.md +28 -0
  67. package/substrate/.claude/rules/commit-conventions.md +22 -0
  68. package/substrate/.claude/rules/context-engineering.md +202 -0
  69. package/substrate/.claude/rules/context-management.md +85 -0
  70. package/substrate/.claude/rules/destructive-operations.md +69 -0
  71. package/substrate/.claude/rules/diagnosis.md +38 -0
  72. package/substrate/.claude/rules/guardrails.md +73 -0
  73. package/substrate/.claude/rules/identifier-leak-prevention.md +104 -0
  74. package/substrate/.claude/rules/lite-manifest-schema-change-discipline.md +98 -0
  75. package/substrate/.claude/rules/oo-ad-entry-point.md +117 -0
  76. package/substrate/.claude/rules/operator-facing-prose.md +196 -0
  77. package/substrate/.claude/rules/plain-english-discipline.md +154 -0
  78. package/substrate/.claude/rules/pr-body-shape.md +317 -0
  79. package/substrate/.claude/rules/pr-strategy.md +167 -0
  80. package/substrate/.claude/rules/sdlc-gates.md +149 -0
  81. package/substrate/.claude/rules/session-artifacts.md +236 -0
  82. package/substrate/.claude/rules/state-schema-validation.md +162 -0
  83. package/substrate/.claude/rules/whereami-load-bearing.md +202 -0
  84. package/substrate/.claude/rules/writing-craft-discipline.md +92 -0
  85. package/substrate/.claude/skills/build/SKILL.md +640 -0
  86. package/substrate/.claude/skills/decompose/SKILL.md +280 -0
  87. package/substrate/.claude/skills/diagnose/SKILL.md +297 -0
  88. package/substrate/.claude/skills/howdoi/SKILL.md +105 -0
  89. package/substrate/.claude/skills/ia-model/SKILL.md +108 -0
  90. package/substrate/.claude/skills/interaction-design/SKILL.md +112 -0
  91. package/substrate/.claude/skills/interpret-input/SKILL.md +180 -0
  92. package/substrate/.claude/skills/kiss/SKILL.md +449 -0
  93. package/substrate/.claude/skills/launch/SKILL.md +924 -0
  94. package/substrate/.claude/skills/lean-canvas/SKILL.md +332 -0
  95. package/substrate/.claude/skills/longrun/SKILL.md +426 -0
  96. package/substrate/.claude/skills/luminary/SKILL.md +481 -0
  97. package/substrate/.claude/skills/ogilvy-writing-audit/SKILL.md +177 -0
  98. package/substrate/.claude/skills/onboard-repo/SKILL.md +2190 -0
  99. package/substrate/.claude/skills/pattern-review/SKILL.md +99 -0
  100. package/substrate/.claude/skills/personas/SKILL.md +207 -0
  101. package/substrate/.claude/skills/promote/SKILL.md +283 -0
  102. package/substrate/.claude/skills/requirement/SKILL.md +98 -0
  103. package/substrate/.claude/skills/retro/SKILL.md +117 -0
  104. package/substrate/.claude/skills/riff/SKILL.md +114 -0
  105. package/substrate/.claude/skills/roadmap-reconcile/SKILL.md +163 -0
  106. package/substrate/.claude/skills/session-end/SKILL.md +309 -0
  107. package/substrate/.claude/skills/session-log/SKILL.md +299 -0
  108. package/substrate/.claude/skills/skills/SKILL.md +228 -0
  109. package/substrate/.claude/skills/spec/SKILL.md +105 -0
  110. package/substrate/.claude/skills/sprint/SKILL.md +392 -0
  111. package/substrate/.claude/skills/stage/SKILL.md +384 -0
  112. package/substrate/.claude/skills/state-a-problem/SKILL.md +185 -0
  113. package/substrate/.claude/skills/temperance/SKILL.md +108 -0
  114. package/substrate/.claude/skills/use-case/SKILL.md +417 -0
  115. package/substrate/.claude/skills/user-stories/SKILL.md +268 -0
  116. package/substrate/.claude/skills/value-prop/SKILL.md +251 -0
  117. package/substrate/.claude/skills/verify/SKILL.md +160 -0
  118. package/substrate/.claude/skills/whereami/SKILL.md +307 -0
  119. package/substrate/AGENTS.md +79 -0
  120. package/substrate/CLAUDE-lite.md +85 -0
  121. package/substrate/CODE_OF_CONDUCT.md +28 -0
  122. package/substrate/CONTRIBUTING.md +177 -0
  123. package/substrate/README.md +173 -0
  124. package/substrate/SECURITY.md +19 -0
  125. package/substrate/architecture/decisions/ADR-029-release-pipeline.md +79 -0
  126. package/substrate/architecture/decisions/ADR-031-non-breaking-changes-adopter-discipline.md +139 -0
  127. package/substrate/architecture/decisions/ADR-032-adopter-sync-dispatcher-architecture.md +192 -0
  128. package/substrate/architecture/decisions/ADR-039-release-tagging-scheme.md +145 -0
  129. package/substrate/architecture/decisions/ADR-040-planning-skill-vocabulary-and-lite-profile.md +155 -0
  130. package/substrate/architecture/decisions/ADR-044-unified-skill-body-template.md +162 -0
  131. package/substrate/lib/clean-artifacts-sweep.sh +112 -0
  132. package/substrate/lib/code-comment-discipline.sh +144 -0
  133. package/substrate/lib/composer-preflight.sh +459 -0
  134. package/substrate/lib/hook-inject.sh +255 -0
  135. package/substrate/lib/luminary-pick.sh +96 -0
  136. package/substrate/lib/output-discipline.sh +143 -0
  137. package/substrate/lib/rewrite-check.sh +214 -0
  138. package/substrate/lib/state.sh +1372 -0
  139. package/substrate/lib/telemetry.sh +205 -0
  140. package/substrate/lib/tier-check.sh +138 -0
  141. package/substrate/lib/tier-dependency-audit.sh +933 -0
  142. package/substrate/presence/install/bassclef-hook-connect.sh +178 -0
  143. package/substrate/presence/install/bassclef-sync.dispatcher.template.sh +841 -0
  144. package/substrate/presence/install/bassclef-sync.template.sh +2076 -0
  145. package/substrate/presence/install/schedule-auto-save.cron.sh +88 -0
  146. package/substrate/presence/install/schedule-auto-save.taskscheduler.md +122 -0
  147. package/substrate/scripts/aggregate-telemetry.sh +217 -0
  148. package/substrate/scripts/analyze-tier-dependencies.sh +239 -0
  149. package/substrate/scripts/generate-lite-manifest.sh +489 -0
  150. package/substrate/scripts/generate-tier-manifest.sh +28 -0
  151. package/substrate/scripts/intent-drift-check.sh +456 -0
  152. package/substrate/scripts/lite-manifest-drift-check.sh +146 -0
  153. package/substrate/scripts/render-lite-manifest-doc.sh +150 -0
  154. package/substrate/standards/bassclef-configs-schema.md +232 -0
  155. package/substrate/standards/bassclef-evolution.md +143 -0
  156. package/substrate/standards/bassclef-internal-jargon.md +244 -0
  157. package/substrate/standards/bassclef-managed-sentinel.md +96 -0
  158. package/substrate/standards/bassclef-source-config.md +228 -0
  159. package/substrate/standards/deferred-actions-schema.md +204 -0
  160. package/substrate/standards/docs-sync-allowlist.md +76 -0
  161. package/substrate/standards/graceful-exit.md +227 -0
  162. package/substrate/standards/hook-idempotency.md +102 -0
  163. package/substrate/standards/lite-manifest-schema-changes.md +75 -0
  164. package/substrate/standards/luminary-problem-patterns.md +481 -0
  165. package/substrate/standards/ogilvy-writing-rules.md +225 -0
  166. package/substrate/standards/opener-discipline.md +96 -0
  167. package/substrate/standards/operator-facing-prose-discipline.md +201 -0
  168. package/substrate/standards/project-directory-layout.md +276 -0
  169. package/substrate/standards/release-tagging.md +137 -0
  170. package/substrate/standards/sdlc-compliance.md +286 -0
  171. package/substrate/standards/secrets-lifecycle.md +210 -0
  172. package/substrate/standards/security-scanner-adapter.md +145 -0
  173. package/substrate/standards/skill-output-discipline.md +90 -0
  174. package/substrate/standards/state-spine.md +511 -0
  175. package/substrate/standards/tech-stack-config.md +109 -0
  176. package/substrate/standards/tier-dependency-analysis.md +167 -0
  177. package/substrate/standards/tier-runtime-deps/lite.md +57 -0
  178. package/substrate/standards/tier-tag-schema.md +155 -0
  179. package/substrate/standards/whereami-schema.md +301 -0
  180. package/substrate/standards/writing-guide.md +213 -0
  181. package/substrate/templates/deferred-action-template.md +45 -0
  182. package/substrate/templates/whereami-template.md +101 -0
@@ -0,0 +1,104 @@
1
+ ---
2
+ tier: lite
3
+ description: Bassclef commits stay free of operator machine identifiers.
4
+ ---
5
+
6
+ <!-- andon-allow: [A-Za-z][A-Za-z0-9]*-MacBook-(Air|Pro) -->
7
+ <!-- andon-allow: /Users/[a-z][a-z0-9._-]+ -->
8
+ <!-- andon-allow: /home/[a-z][a-z0-9._-]+ -->
9
+
10
+ # Identifier leak prevention
11
+
12
+ Bassclef commits stay free of operator machine identifiers.
13
+
14
+ INSTEAD of committing hostname strings (X-MacBook-Air, DESKTOP-XYZ, X-server-N), absolute paths starting with /Users/ or /home/, or any operator-identifying metadata: rewrite the message or content with placeholders (branch name, `<machine>`, `$HOME`) before commit.
15
+
16
+ This rule is the methodology layer. The mechanical layer is `.claude/hooks/pre-commit-identifier-leak-scrub.sh` (PreToolUse Bash matcher on `git commit`). Both required.
17
+
18
+ ## Why this rule exists
19
+
20
+ Coverage gap surfaced by outside consult on 2026-09-01 (issue sunj-labs/bassclef#1471). Existing leakage scans (release-script andon + operator-private-path-check) target directory references, not identifier strings. Auto-save-checkpoint commits interpolated hostname into every message — 98 such commits landed on bassclef-upstream main + spread to public bassclef via archive snapshots.
21
+
22
+ CCF-3 keeps operator config gitignored and out of git history.
23
+ INSTEAD of assuming that discipline holds at the .gitignore layer alone: enforce at the commit boundary via this hook + rule pair. Both layers close the loop between principle and mechanism.
24
+
25
+ ## When this rule fires
26
+
27
+ Every `git commit` invocation across bassclef and adopter repos. The hook scans:
28
+
29
+ 1. Commit message text (parses `-m "..."` arg)
30
+ 2. Staged content (`git diff --cached`)
31
+
32
+ Fires on PreToolUse Bash matcher when `tool_input.command` starts with `git commit`. Non-git-commit commands pass through cleanly.
33
+
34
+ ## What the rule requires
35
+
36
+ No commit lands with these patterns in message OR staged content:
37
+
38
+ - **Hostname shapes**: `[A-Za-z][A-Za-z0-9]*-MacBook-(Air|Pro)`, `DESKTOP-[A-Z0-9]{4,}`, `*-server-*`, `*-desktop-*`
39
+ - **Absolute paths**: `/Users/<name>`, `/home/<name>`
40
+
41
+ Extension mechanism — future pattern classes added to the hook's `IDENTIFIER_PATTERNS` regex + a corresponding Tier 0 test.
42
+
43
+ ## Anti-patterns
44
+
45
+ **Auto-save-checkpoint commits with hostname suffix.**
46
+
47
+ INSTEAD of interpolating `$(hostname -s)` into the commit message per `save-state.sh` historical L222-225 shape: use branch name + file count only. Session identity moves to commit trailer if debug needed locally.
48
+
49
+ **LAST_SAVE file with `machine:` field.**
50
+
51
+ INSTEAD of writing machine identifier into `.claude/LAST_SAVE`: either gitignore the file OR drop the `machine:` field. This ticket takes both paths — gitignore the file + drop the field.
52
+
53
+ **state/markers/ tracked in git.**
54
+
55
+ INSTEAD of selectively-gitignored marker subdirs (contradicts `session-artifacts.md` L14-25): broad `state/markers/` gitignore + `git rm -r --cached state/markers/` one-time cure. Adopters inheriting the sync run the same cure once.
56
+
57
+ ## Override path
58
+
59
+ `SKIP_IDENTIFIER_LEAK_SCRUB=1 git commit ...` — logged via trace-helper. Rare use cases:
60
+
61
+ - Documentation explaining what patterns to avoid (e.g., this rule body cites the pattern class)
62
+ - Migration scripts that intentionally reference historical hostname strings
63
+ - Emergency rescue where the hook itself misbehaves
64
+
65
+ INSTEAD of routine overrides: rewrite the commit or content. The cost is small; the discipline compounds across every future commit.
66
+
67
+ ## Adopter cure (one-time)
68
+
69
+ Adopters running bassclef-sync after this rule ships see one-time drift. Existing `state/markers/*` files stay tracked in their index but ignored by the new .gitignore.
70
+
71
+ Cure:
72
+
73
+ ```bash
74
+ git rm -r --cached state/markers/
75
+ git commit -m "chore: untrack state markers per bassclef identifier-leak-prevention rule"
76
+ ```
77
+
78
+ The working-tree files stay. Only the git index changes.
79
+
80
+ ## Composes with
81
+
82
+ - `.claude/rules/session-artifacts.md` (L14-25 — state/markers gitignore intent this rule enforces)
83
+ - `.claude/rules/blocked-items.md` (BLOCK protocol the hook fires)
84
+ - `.claude/rules/testing-tier-config.md` (Tier 0 strict TDD on the hook + tests)
85
+ - `.claude/rules/hook-wire-on-author.md` (settings.json wiring discipline)
86
+ - `.claude/rules/bootstrap-pair-discipline.md` (hook + rule + test + wire ship together)
87
+ - `.claude/rules/we-dont-break-adopters.md` (adopter cure documented above)
88
+ - `.claude/hooks/pre-commit-identifier-leak-scrub.sh` (mechanical implementation)
89
+ - `.claude/hooks/tests/pre-commit-identifier-leak-scrub.test.sh` (12-test coverage)
90
+ - @luminary saltzer-schroeder — complete mediation
91
+ - @luminary linus-torvalds — adopter contract (ADR-031)
92
+ - @luminary michael-feathers — characterization tests
93
+ - @luminary michael-nygard — stability pattern (fail-soft on grep missing)
94
+
95
+ ## Refs
96
+
97
+ - Parent ticket: sunj-labs/bassclef#1471
98
+ - Rule intent source: `.claude/rules/session-artifacts.md` L14-25
99
+ - Mechanism gap: `scripts/release-to-bassclef.sh` L257-289 (andon scan scoped to dirs)
100
+ - Hostname source: `.claude/hooks/save-state.sh` L222 + L247
101
+
102
+ ## Retirement condition
103
+
104
+ This rule retires only if bassclef stops committing content that could contain identifiers. Every commit is a potential leak surface, so retirement is unlikely. Pattern set may evolve as new operator-identifying shapes surface; the discipline of scanning at commit time persists.
@@ -0,0 +1,98 @@
1
+ ---
2
+ tier: lite
3
+ description: Every lite-manifest schema change ships a migration-note ledger entry in the same PR. Adopters read the ledger before sync.
4
+ ---
5
+
6
+ # Lite-manifest schema-change discipline
7
+
8
+ Every change to `standards/lite-manifest.schema.json` (schema shape) or to the output shape of `<tier>-manifest.json` (extractor emissions) MUST ship with a matching ledger entry in `standards/lite-manifest-schema-changes.md` in the same PR. The release script blocks the cascade if the ledger has no entry for the outgoing `manifest_version`.
9
+
10
+ This rule is the methodology layer. The mechanical layer is a pre-flight check in `scripts/release-to-bassclef.sh` (Step 3.6, added in goal 2026-09-07c Step 4). Both required.
11
+
12
+ Sister discipline to `.claude/rules/file-rename-discipline.md`. Same shape at a different surface — files there, schema fields here.
13
+
14
+ ## Why this exists
15
+
16
+ `v0.36.0` (2026-09-06) dropped `upstream_commit` from lite-manifest content per sunj-labs/bassclef-upstream#1508. Three bassclef-web scripts crashed at next sync because they read `.upstream_commit` and got `undefined`. No note warned adopters. bassclef-web#269 promoted the pattern.
17
+
18
+ Every adopter of the lite manifest sits on this class. Without a ledger discipline, every future schema change replays the failure.
19
+
20
+ ## When this rule fires
21
+
22
+ Any PR that touches:
23
+
24
+ - `standards/lite-manifest.schema.json` (schema shape)
25
+ - `scripts/generate-lite-manifest.sh` in a way that changes the output shape (adds or removes emitted keys)
26
+
27
+ Skips:
28
+
29
+ - Content-only manifest regens (backfill helper adds descriptions to source files; content_hash changes but no schema shift)
30
+ - Comment-only edits to schema or extractor
31
+
32
+ ## What the rule requires
33
+
34
+ When a PR changes the manifest schema OR output shape:
35
+
36
+ 1. **Ledger entry** — add a new entry to `standards/lite-manifest-schema-changes.md` in the same PR. Format per the ledger's format section. Newest-first ordering.
37
+ 2. **Version bump** — pin the entry to a specific `manifest_version` bump. Per the schema title description policy:
38
+ - Adding an optional field → MINOR bump
39
+ - Adding a required field → MAJOR bump (breaking)
40
+ - Removing a field → MAJOR bump
41
+ - Content-only change → PATCH bump
42
+ 3. **Downstream cure named** — the entry names what adopters need to do. If nothing (backward-compatible add), say so explicitly. If code change (like the v0.36.0 `upstream_commit` removal), name the pattern.
43
+ 4. **Release script pre-flight** — before every `/release`, the script reads the ledger and confirms an entry exists for the outgoing `manifest_version`. Missing entry BLOCKs the cascade.
44
+
45
+ ## Anti-patterns
46
+
47
+ **Schema field added but no ledger entry.** Release script pre-flight BLOCKs.
48
+ INSTEAD: add the entry in the same PR.
49
+
50
+ **Ledger entry written but wrong version bump.** Adopters plan their pin update against the wrong version.
51
+ INSTEAD: correct the bump before merge. AJV validation of the entry format catches inconsistency.
52
+
53
+ **Downstream cure vague (no name for the class).** Adopters at cold-sync can't reason about which script needs fixing.
54
+ INSTEAD: cite the class + link to a reference cure like bassclef-web c9a9da7.
55
+
56
+ **Schema change ships without adopter coordination.** Even with a ledger entry, adopters that exact-pin the manifest_version need advance warning.
57
+ INSTEAD: coord comment on bassclef-web#256 + bassclef-cli#51 BEFORE the release cascade per Linus L6 pre-mortem cure.
58
+
59
+ ## Override
60
+
61
+ `SKIP_LITE_MANIFEST_SCHEMA_LEDGER=1 <command>` — logged via trace-helper. Use only when:
62
+
63
+ - The schema change is a comment-only edit that keeps the shape stable
64
+ - The change reverses a prior entry (a rollback) and the prior entry names both the change and the rollback
65
+ - One-shot migration script that touches the schema during a migration window
66
+
67
+ INSTEAD of overriding for routine work: write the entry. The cost is small (one section in the ledger); the discipline compounds across every adopter that syncs.
68
+
69
+ ## Composes with
70
+
71
+ - `.claude/rules/file-rename-discipline.md` — sister at the file surface
72
+ - `.claude/rules/we-dont-break-adopters.md` — parent discipline (ADR-031)
73
+ - `.claude/rules/cold-adopter-harness-discipline.md` — sibling smoke fires against ledger entries before release
74
+ - `.claude/rules/bootstrap-pair-discipline.md` — this rule + hook + tests + settings wire ship together
75
+ - `.claude/rules/testing-tier-config.md` — Tier 0 strict TDD on ledger format tests
76
+ - `.claude/rules/blocked-items.md` — BLOCK protocol the release-script pre-flight fires
77
+ - `standards/lite-manifest.schema.json` — the schema this ledger tracks
78
+ - `standards/lite-manifest-schema-changes.md` — the ledger this rule enforces
79
+ - `scripts/release-to-bassclef.sh` — release-script pre-flight (Step 3.6)
80
+ - ADR-031 (we-don't-break-adopters)
81
+ - ADR-029 (release pipeline)
82
+ - @luminary linus-torvalds — lead. Adopter contract; the ledger is the operational form of Torvalds's rule at the schema surface
83
+ - @luminary tony-hoare — pre/postcondition contract on schema changes
84
+ - @luminary michael-nygard — stability pattern (block-on-missing-entry)
85
+ - @luminary michael-feathers — characterization test on the ledger format
86
+
87
+ ## Refs
88
+
89
+ - Parent ticket: sunj-labs/bassclef-web#269 (promote: ship migration notes when lite-manifest schema removes or renames fields)
90
+ - Root cause: v0.36.0 upstream_commit removal broke 3 bassclef-web scripts (commit `c9a9da7` on bassclef-web repaired downstream)
91
+ - Goal: `docs/iteration-bets/2026-09-07c-lite-manifest-schema-plus-extractor-plus-backfill-plus-ledger.md`
92
+ - Risk ledger: `docs/risk-ledgers/2026-09-07c-lite-manifest-schema-extractor-backfill-ledger.md` Linus L6 + Hoare H6
93
+ - Sister rule: `.claude/rules/file-rename-discipline.md`
94
+ - @luminary linus-torvalds — Torvalds's rule at the schema surface
95
+
96
+ ## Retirement condition
97
+
98
+ This rule retires only if bassclef stops shipping a lite manifest. Adopter count and change cadence may evolve; the discipline of documenting every schema change at the PR that ships it persists.
@@ -0,0 +1,117 @@
1
+ ---
2
+ tier: lite
3
+ globs: ["src/**/*.ts", "src/**/*.tsx", "src/**/*.js", "src/**/*.py", ".claude/hooks/*.sh", "lib/*.sh", "scripts/*.sh"]
4
+ description: OOA/D entry point — /decompose must fire for all Construction work, not just canvas-driven flow. Extended per bet 24a to cover hook + lib + script code paths per Cockburn ceremony tiering matrix.
5
+ ---
6
+
7
+ # OOA/D Entry Point Rule
8
+
9
+ Construction work that modifies `src/` source files OR substrate code
10
+ (`.claude/hooks/*.sh`, `lib/*.sh`, `scripts/*.sh`) MUST have `/decompose`
11
+ evidence in the session before the first substantive commit. This applies
12
+ regardless of the starting artifact — canvas, spec, epic, defect ticket,
13
+ or bug report.
14
+
15
+ Ceremony scales with code class per Alistair Cockburn's use-case tiering
16
+ (skip / casual / brief / fully-dressed). Table amended per canvas
17
+ `docs/canvases/2026-08-25-ooad-chain-as-substrate-offering.md` Axis 1 —
18
+ adds a skip row at the top and lifts new substrate hook/lib to fully-dressed
19
+ with ADR consult per Ousterhout + Beck + Brooks convergence:
20
+
21
+ | Code class | Ceremony minimum | Artifact path |
22
+ |---|---|---|
23
+ | Typo, comment fix, doc edit | Skip. No chain fires. | — |
24
+ | One-line change inside existing function | Casual use case sentence in commit body | Commit body |
25
+ | Existing code extension (add arg, add case) | Brief use case + /decompose entry-point check | `docs/use-cases/UC-*.md` (brief) |
26
+ | Adopter app code (`src/*.ts`, new module or route) | Fully-dressed use case + /decompose + /spec | `docs/use-cases/UC-*.md` |
27
+ | Substrate hook (new `.claude/hooks/*.sh`) | Fully-dressed use case + /decompose + ADR consult | `docs/use-cases/UC-hook-*.md` |
28
+ | Substrate lib (new `lib/*.sh` module) | Fully-dressed use case + /decompose + ADR consult | `docs/use-cases/UC-lib-*.md` |
29
+ | Adopter-facing script (new `scripts/*.sh`) | Brief use case + Tier 0 tests | `docs/use-cases/UC-script-*.md` |
30
+
31
+ Cockburn's rule — ceremony scales with the audience for the artifact.
32
+ Fully-dressed reads by future maintainers, testers, product folks. Brief
33
+ reads by devs on the same team. Casual reads by the author six weeks later.
34
+
35
+ Bet 24a extended the trigger to substrate code paths so hooks + libs +
36
+ scripts get the same design-first discipline that adopter app code gets.
37
+ Per Feathers legacy-code retrofit — characterization tests come first for
38
+ existing code; brief use case follows the tests.
39
+
40
+ ## Why this rule exists
41
+
42
+ The `/decompose` skill catches the Langfuse-inside-HaikuImputer class
43
+ of mistakes: cross-cutting concerns (observability, testability,
44
+ extensibility, security, cacheability) bolted into implementations
45
+ instead of resolved as Decorators wrapping interfaces.
46
+
47
+ Recurring pattern: when Construction starts from a canvas, the UX
48
+ translation chain (canvas → spec → ia-model → interaction-design →
49
+ sequence diagrams → /decompose) runs naturally. When it starts from
50
+ an epic or bug, agents jump to implementation and skip /decompose
51
+ entirely — reproducing the exact failure mode the skill was built
52
+ to prevent.
53
+
54
+ Evidence:
55
+ - POA 2026-04-09: Langfuse tracing bolted into HaikuImputer instead
56
+ of wrapping AssociationImputer facade
57
+ - POA 2026-04-12: Credit-tracking logic added inline to scraper-api.ts
58
+ instead of ScraperMetricsDecorator wrapping interface (epic #472)
59
+
60
+ Both were epic-driven (no canvas). /decompose was skipped.
61
+
62
+ ## What triggers the rule
63
+
64
+ Creating changes to `src/` files on a Construction branch
65
+ (`feature/*`, `fix/*`) without prior /decompose evidence.
66
+
67
+ ## What satisfies the rule
68
+
69
+ One of:
70
+
71
+ 1. **Decomposition artifact** at `docs/decompositions/[slug].md` or
72
+ inline in the spec, produced by running `/decompose`.
73
+ 2. **Explicit trivial-work deferral**: "Skipped /decompose — trivial
74
+ change, no responsibility reassignment" stated in session.
75
+ 3. **Bug-hotfix deferral**: "Skipped /decompose — hotfix, diagnosis
76
+ identified specific failure site, no cross-cutting concerns
77
+ involved" stated in session.
78
+
79
+ Silence is not deferral (per blocked-items rule).
80
+
81
+ ## Entry-point variants (per /decompose)
82
+
83
+ - State 1 (canvas path): sequence diagrams drive decomposition
84
+ - State 2 (epic/defect): reverse-engineer from spec + current code
85
+ - State 3 (bug/hotfix): decompose the failure site, identify missing
86
+ interface/decorator
87
+
88
+ All three produce the same artifact format; agents must not skip the
89
+ skill just because the input shape differs from State 1.
90
+
91
+ ## Enforcement
92
+
93
+ This rule ships at `tier: lite` — every adopter tier loads the discipline as methodology guidance.
94
+ The mechanical BLOCK layer ships at `tier: standard`:
95
+
96
+ **Methodology layer (all tiers — lite, standard, ultra).**
97
+ Rule loads in session context. Agents self-check at Construction branch creation per the ceremony matrix above.
98
+
99
+ **Mechanical layer (standard, ultra only).**
100
+ Hook at `.claude/hooks/oo-ad-entry-point-check.sh` (bassclef-upstream#1169) fires on PreToolUse Edit/Write against paths in the frontmatter globs. It BLOCKs new-file writes when the required artifacts are missing.
101
+
102
+ The hook checks two conditions:
103
+ - Decomposition — marker at `state/markers/decompose/<branch>.marker` OR any file under `docs/decompositions/`
104
+ - Use case — matching `docs/use-cases/UC-*.md` per code class (UC-hook-*, UC-lib-*, UC-script-*, or unprefixed UC-*)
105
+
106
+ Existing file Edit passes through (Cockburn casual tier — commit body carries the discipline).
107
+ Override: `SKIP_OO_AD_ENTRY_POINT=1` logged via trace-helper.
108
+
109
+ **Lite adopter behavior.** Rule guides ceremony choice; no BLOCK fires on lite. Canvas Axis 1 (docs/canvases/2026-08-25-ooad-chain-as-substrate-offering.md) applied Ousterhout + Beck + Brooks lens — mechanical enforcement fits standard+ scope. INSTEAD of BLOCK on lite: rule guidance shapes agent behavior at construction branch creation. Methodology guidance benefits all adopters; mechanical BLOCK is standard+ scope.
110
+
111
+ ## Relationship to other rules
112
+
113
+ - `sdlc-gates.md` Pre-Build section — temperance + diagnosis gates
114
+ fire before this one
115
+ - `blocked-items.md` — entry-point skip is a BLOCKED condition; resolve
116
+ or explicitly defer
117
+ - `testing.md` — new interfaces identified via /decompose need tests
@@ -0,0 +1,196 @@
1
+ ---
2
+ tier: lite
3
+ description: Any shorthand in operator-facing prose carries a plain-language gloss at first mention per response.
4
+ ---
5
+
6
+ # Operator-facing prose
7
+
8
+ Any shorthand in operator-facing prose carries a plain-language gloss at first mention per response. When editing any SKILL.md file, apply a /kiss pass to the whole file in the same change.
9
+
10
+ This rule is the conversation layer of `standards/operator-facing-prose-discipline.md`. The standard names the principle, the format catalog, and the reasoning about who reads the output. This rule loads into every session via `additionalDirectories` and fires at every operator-facing response.
11
+
12
+ ## When this rule fires
13
+
14
+ Fires on every response the operator reads: skill tool output, turn prose between the agent and the operator, status reports, checkpoint summaries, recommendations.
15
+
16
+ Skips:
17
+ - Raw tool output relays (git, gh, test output passed through)
18
+ - Code blocks
19
+ - File path quotations
20
+ - Reserved skill names (e.g., `/sprint`, `/longrun`) — operator-invocable; the prefix carries the context
21
+
22
+ ## Rule 1 — Gloss at first mention per response
23
+
24
+ Any shorthand label carries a brief inline gloss on first mention per response IF a reader coming in cold would need context to know what the label refers to. Subsequent mentions in the same response can drop the gloss.
25
+
26
+ A shorthand label is any compressed reference — number, letter, category name, path token — that stands in for a longer concept the reader may not carry.
27
+
28
+ ### What an appositive is (Ship 2 amendment 2026-08-20 per bassclef-upstream#1313)
29
+
30
+ An appositive is a comma plus a noun (or noun phrase) that renames, explains, or gives more information about the shorthand. It can appear at ANY mention that carries meaning-signal to the reader — not only the first. Three shapes all satisfy this rule:
31
+
32
+ - **Parenthetical** — `<shorthand> (<noun phrase>)` — e.g., `#1312 (in-line 8th-grade steering for sentence-level grade output)`
33
+ - **Comma phrase** — `<shorthand>, <noun phrase>,` — e.g., `PR #1316, the in-line 8th-grade steering merge,`
34
+ - **Em-dash** — `<shorthand> — <noun phrase> —` — e.g., `Bucket B6 — the schema tests bucket —`
35
+
36
+ **Critical: the appositive text must be understandable to a cold reader.** Using session shorthand INSIDE the appositive (e.g., `#1312 (Ship 1 sentence-level grade output)`) defeats the whole purpose. A cold reader has no idea what "Ship 1" means. The appositive should translate the shorthand into plain concepts the reader already carries — what the ticket delivers, what the merge changes, what the bucket contains.
37
+
38
+ Session-2026-08-19g operator correction (verbatim): "an appositive is not just first gloss; a common definition is a comma + a noun or noun phrase that renames, explains, or gives more information about the shorthand you use". Follow-up correction (same session) after I shipped examples that used session shorthand inside the appositive: my examples "simply extend the obfuscation" — the appositive must land in plain terms, not another compressed reference.
39
+
40
+ Rationale: the `first-mention` scope in the original rule was too narrow. Readers benefit from a comma phrase at any mention where the shorthand carries meaning. The appositive is the moment where the shorthand gets translated, so the translation itself must be in plain vocabulary.
41
+
42
+ Mechanism per bassclef-upstream#1313 Ship 2: `.claude/hooks/turn-prose-kiss-check.sh`, the Stop hook that scans the last message, checks each shorthand match for an adjacent appositive within 40 characters (any of the three shapes above). The hook checks structural presence only — it cannot verify that the appositive text itself is plain. Operator judgment catches shorthand-inside-appositive; the hook catches missing-appositive. Advisory in V1; flips to strict after one calibration cycle with false positive rate under 5%.
43
+
44
+ ### Two shorthand shapes this rule covers
45
+
46
+ **1. Bassclef substrate shorthand families (fixed catalog).** These families always need a gloss because the reference is substrate-specific:
47
+
48
+ - Step refs: `WU-N`, `B1-WU4`, `Bet 2 WU-1`
49
+ - Audit finding refs: `F-X.Y`, `F-D9.1`, `F-D11.1`
50
+ - ADR refs: `ADR-NNN`, `ADR-021`, `ADR-022`
51
+ - GitHub issue and PR refs: `#NNN`, `bassclef#NNN`, `PR #NNN`
52
+ - Leap-of-faith and chain-of-beliefs refs: `LF-N`, `LF1`, `LF5`
53
+ - Phase and iteration refs: `Phase XIV`, `Iteration 2026-05-24c`
54
+
55
+ **2. Session-invented shorthand (open-ended).** Labels that get coined mid-session — audit bucket names, cure path letters, session-position abbreviations, option letters — always need a gloss because the reference exists only in the session that invented it. A reader picking up the response cold has no way to decode the label without help.
56
+
57
+ Examples of session-invented shorthand this rule extends to:
58
+
59
+ - `Bucket 2a`, `Bucket 2b`, `Bucket 3` — audit classification labels
60
+ - `Path A`, `Path B`, `Path C` — cure option letters in a matrix
61
+ - `Part A`, `Part B` — commit-split labels
62
+ - `S2`, `S3`, `S4` — session-position abbreviations in a multi-session sequence
63
+ - `Option a`, `Option b`, `Option F` — decision menu letters
64
+ - `LR-1`, `LR-2` — long-run sequence position
65
+
66
+ Reserved names per bassclef#763 stay as is: `substrate`, `bassclef`, `cameo`, `Studio`, `Band`, `bandleader`.
67
+
68
+ ### Format
69
+
70
+ INSTEAD of unglossed shorthand: gloss inline at first mention. Format: `<shorthand> (<appositive — 3-8 words naming what the shorthand refers to>)`.
71
+
72
+ An appositive is a short phrase right after the label that renames or explains it. It carries the meaning-signal the label alone lacks.
73
+
74
+ ### Worked examples
75
+
76
+ Substrate-family shorthand (unchanged from prior rule):
77
+
78
+ - `B1-WU4 (Tier 0 pitch draft using canvas UVP)` — gloss inline
79
+ - `#774 (Phase XIV rescope proposal)` — gloss inline
80
+ - `F-D9.1 (README hedges audience — audit HIGH)` — gloss inline
81
+
82
+ Session-invented shorthand (added per bassclef-upstream#1267):
83
+
84
+ - `Bucket 2a (audit files with no tier tag at all)` — instead of bare `Bucket 2a`
85
+ - `Path B (inline the skill into its caller)` — instead of bare `Path B`
86
+ - `Part A (reconcile the 20 known missing files)` — instead of bare `Part A`
87
+ - `S2 (Session 2 — Traceability Phase 1 per LR-1 roadmap)` — instead of bare `S2`
88
+ - `Option F (swap bassclef-sync ln -s for cp)` — instead of bare `Option F`
89
+ - `LR-1 (long-run 1 — tier ecosystem sequence)` — instead of bare `LR-1`
90
+
91
+ ### When the gloss adds no signal
92
+
93
+ Skip the gloss when the label is self-explanatory to a cold reader — a full word already carries the meaning. Examples: `Session 2 Traceability` (no gloss needed; the label IS the description); `Option F: bassclef-sync copy swap` (already glossed inline by the phrase after the colon).
94
+
95
+ INSTEAD of mechanical inflation when the gloss makes a sentence unreadable: restructure the sentence. The principle is operator readability, not mechanical glossing.
96
+
97
+ ### Forward-only enforcement
98
+
99
+ Existing prose in chronicles, session logs, and closed PRs stays as is per `.claude/rules/we-dont-break-adopters.md` grace window discipline. Rule applies to new prose from amendment date forward.
100
+
101
+ ## Rule 2 — /kiss pass when editing any SKILL.md
102
+
103
+ When touching any SKILL.md file for any reason, apply a /kiss pass to the entire file in the same change.
104
+
105
+ INSTEAD of shipping a discipline change that itself contains bassclef jargon: rewrite the existing dense language in the same change. Otherwise the discipline breaks itself.
106
+
107
+ Allowlist per bassclef#763 stays: `substrate`, `bassclef`, `cameo`, `Studio`, `Band`, `bandleader`. Everything else: grade-8 English, subject-verb-object, no bassclef compound terms (`load-bearing`, `cross-cutting`, `forcing function`, `substrate-resident`, `operator-locked`, `operating thesis`, `compose-with`, `tier-preset`, `operationalize`, `composer` as a noun).
108
+
109
+ INSTEAD of shipping the edit with the jargon intact when scope is tight: file a dedicated /kiss-pass PR. The next reader inherits the failure otherwise.
110
+
111
+ ## Rule 3 — Skill dispatch citation on /longrun surfaces
112
+
113
+ Per bassclef-upstream#374 (V2 of #366) and bassclef-upstream#750 (V3 opener discipline). Every /longrun surface where the agent talks with the operator MUST open with three blocks per `standards/opener-discipline.md`:
114
+
115
+ - Problem (via `/state-a-problem brief`)
116
+ - Value prop (via `/value-prop tweet`)
117
+ - Evidence (source + warrant per `.claude/rules/assert-only-after-verify.md`)
118
+
119
+ Every named surface also cites the dispatched skill inline (e.g., "via `/value-prop tweet`", "(per `/temperance`)", "drafted by `/state-a-problem brief`") OR carries a short discipline-marker line ahead of the prose.
120
+
121
+ Named surfaces this rule covers:
122
+
123
+ - `longrun_prep_proposal` — `/longrun prep` Step 0 opener + Step 1 pre-flight + Step 1.5/1.6/1.7 shape proposals
124
+ - `longrun_checkpoint` — `/longrun checkpoint` opener + status report
125
+ - `longrun_closeout` — `/longrun closeout` opener + retro lead-in
126
+ - `status_update` — any /longrun status update or progress report between steps
127
+
128
+ The agent touches `state/markers/turn-prose-surface/<surface>.marker` BEFORE posting the named surface. The Stop hook `turn-prose-kiss-check.sh` reads the marker and scans the latest assistant message for the skill dispatch citation. ADVISORY in V1 (per bassclef-upstream#374 acceptance); BLOCK in V2 after one calibration cycle.
129
+
130
+ INSTEAD of writing prose without citing the dispatched skill: dispatch the skill (`/state-a-problem brief`, `/value-prop tweet`, `/kiss words`, `/temperance`, `/luminary`) and cite it inline. Touching the marker without dispatching the skill is the failure pattern this rule closes (bet 25k chronicle § "What didn't work — the diagnosis interlude" named 5 surfaces this rule covers).
131
+
132
+ Surface citation format examples:
133
+
134
+ - Problem lead: `> **Problem (via `/state-a-problem brief`)**: <who + what + when + why now + outcome>`
135
+ - Value prop: `> **Value prop (via `/value-prop tweet`)**: <claim + sharpener>`
136
+ - Evidence: `> **Evidence**: Source `<path or ticket>`. Warrant: <one sentence tying source to claim>.`
137
+ - Temperance answer: `**/temperance** fired at <surface>. <scope-decision>. <drift-trigger>.`
138
+ - Luminary pick: `**/luminary** primary lens `<slug>` — <one line on what the lens caught>.`
139
+ - Status update: opens with `> **Checkpoint via `/longrun checkpoint`**: <one line>` OR carries a `## /temperance + /luminary + /loop discipline` block per bet 25k.
140
+
141
+ Grace window per `.claude/rules/we-dont-break-adopters.md` — the prior opener shape (`/value-prop flash` + `/kiss words`) keeps working through 2026-10-31. New sessions open with the three blocks. Sessions from before the rewrite still open with tweet + KISS.
142
+
143
+ ## Why this rule exists
144
+
145
+ The operator works across gaps between sessions. A morning /sprint response that references `B1-WU4` without a gloss forces the operator to remember the reference from yesterday, reconstruct it from the substrate, or ask the agent to expand it. All three cost operator time.
146
+
147
+ The /kiss-pass-on-SKILL.md-edits rule closes the second-order gap. When the substrate says "operator-facing output should be plain" and its own body carries dense bassclef jargon, the discipline breaks itself.
148
+
149
+ INSTEAD of relying on operator vigilance to catch unglossed refs and dense SKILL.md prose: the substrate enforces clarity at authoring time. Operator time saved compounds across every reference in every response.
150
+
151
+ ## Composes with
152
+
153
+ - `.claude/rules/plain-english-discipline.md` — master plain-English rule; this rule extends with the gloss and the /kiss-pass second-order rule
154
+ - `.claude/rules/skill-description-clarity.md` — narrow case at the skill description field
155
+ - `.claude/rules/github-issue-flash-tweet.md` — flash-tweet-then-detail discipline for GitHub issue bodies
156
+ - `.claude/rules/context-engineering.md` — INSTEAD-block discipline for negations
157
+ - `.claude/rules/visual-hierarchy.md` — formatting discipline for long agent output
158
+ - `standards/operator-facing-prose-discipline.md` — companion standard with the full reasoning and the format catalog
159
+ - `standards/pr-body-discipline.md` — applies the gloss and the /kiss pass to PR bodies (criterion 3 of the scrub)
160
+
161
+ ## 5-layer defense for prose discipline (added bet 27c WU-9)
162
+
163
+ The prose-discipline rules and mechanisms form 5 layers per ADR-035 (hooks as steering). Each layer fires at a different surface. Together the layers act as belt and suspenders — they cover failure modes that any single layer would miss.
164
+
165
+ | Layer | Surface | Mechanism | What it catches |
166
+ |---|---|---|---|
167
+ | 1. Per-edit on substrate paths | PreToolUse `Edit\|Write` on `.claude/skills/*/SKILL.md` + `.claude/rules/*.md` + `.claude/luminaries/*.md` | `substrate-clarity-gate.sh` | Skill description over 280 chars, missing INSTEAD-block, jargon BLOCK terms (bassclef#382) |
168
+ | 2. Per-edit on PR body | PreToolUse `Bash` matching `gh pr create` or `gh pr edit --body` | `pre-gh-pr-body-scrub.sh` | BLOCK terms in PR body before push (bassclef#1176) |
169
+ | 3. Per-edit on issue body and commit msg | PreToolUse `Bash` matching `gh issue create` or `git commit` | `pre-gh-issue-body-scrub.sh` + `pre-git-commit-msg-scrub.sh` | BLOCK terms before issue file or commit lands (bassclef#1177) |
170
+ | 4. Per-turn-end (operator prose) | Stop event | `turn-prose-kiss-check.sh` | BLOCK terms in the latest assistant message; surface-marker-driven strict escalation (bassclef#1051 + #1304) — cured via bet 27c PR #427 for path resolution under operator install |
171
+ | 5. Per-PR (CI) | PR body clarity + scrub jobs | `.github/workflows/bassclef-pr-ci.yml` jobs | Backstop for PR body BLOCK terms that bypassed layer 2 |
172
+
173
+ Together: layers 1-3 catch at write time. Layer 4 catches at turn end. Layer 5 catches at PR review. The kiss path-resolution cure (PR #427) closed the silent fail under operator-install layout that broke layer 4. The substrate-as-system rule (ADR-035) commits to all 5 layers staying operational. Mechanism-fidelity verification (bet 27c WU-4, WU-5, WU-6) audits the operational state.
174
+
175
+ ## Override
176
+
177
+ `SKIP_OPERATOR_FACING_PROSE=1 <command>` — for genuine cases (quoting an exact phrase from memory or an external doc; mid-debugging session where formality breaks flow). Logged via trace-helper. Use rarely.
178
+
179
+ INSTEAD of overriding the /kiss pass on SKILL.md edits when scope is tight: file a dedicated /kiss-pass PR per Rule 2 above. The second-order rule holds without exception.
180
+
181
+ ## Surfaced in
182
+
183
+ - /sprint 2026-05-30 morning session — operator returned after an overnight gap and surfaced that shorthand references in /sprint output need a plain-language gloss for cross-session orientation.
184
+ - Same session — operator surfaced the second-order rule: if we are already authoring SKILL.md updates for the gloss rule, the existing jargon in those files gets rewritten in the same pass.
185
+
186
+ ## Refs
187
+
188
+ - bassclef#790 — parent ticket (this rule + companion standard)
189
+ - bassclef#785 — tweet-style descriptions in /longrun summary tables
190
+ - bassclef#780 — glossary + substrate-quote discipline (session-start glossary; this rule adds the at-mention gloss)
191
+ - bassclef#763 — /kiss reserved-name allowlist
192
+ - bassclef#767 — /kiss hook coverage at artifact-write surfaces
193
+ - bassclef#779 — /kiss interactive-session anchoring at turn-counter boundaries
194
+ - bassclef#786 — /kiss PR-body hook enforcement decision
195
+ - bassclef#787 — PR-body scrub discipline (this rule's criterion 3 surface)
196
+ - bassclef#739 — substrate-coherence CI (mechanical enforcement target)