@thebassclef/lite 0.1.0 → 0.1.2

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 (163) hide show
  1. package/dist/cli.cjs +2 -0
  2. package/dist/cli.js +2 -0
  3. package/dist/index.cjs +1 -1
  4. package/dist/index.d.ts +1 -1
  5. package/dist/index.js +1 -1
  6. package/package.json +1 -1
  7. package/substrate/.bassclef/lite-manifest.json +999 -92
  8. package/substrate/.claude/hooks/longrun-prep-compounding-axis-check.sh +492 -0
  9. package/substrate/.claude/hooks/longrun-prep-compounding-sequence-check.sh +492 -0
  10. package/substrate/.claude/hooks/pre-commit-gate.sh +1 -2
  11. package/substrate/.claude/hooks/turn-prose-kiss-check.sh +30 -1
  12. package/substrate/.claude/luminaries/glenford-myers.md +230 -0
  13. package/substrate/.claude/luminaries/hunt-thomas.md +115 -0
  14. package/substrate/.claude/luminaries/hyrum-wright.md +94 -0
  15. package/substrate/.claude/luminaries/michael-feathers.md +2 -2
  16. package/substrate/.claude/luminaries/tony-hoare.md +170 -0
  17. package/substrate/.claude/luminaries/vaughn-vernon.md +50 -0
  18. package/substrate/.claude/luminaries/w-edwards-deming.md +158 -0
  19. package/substrate/.claude/rules/accessor-library-discipline.md +138 -0
  20. package/substrate/.claude/rules/adr-discipline.md +120 -0
  21. package/substrate/.claude/rules/api-conventions.md +125 -0
  22. package/substrate/.claude/rules/bootstrap-pair-discipline.md +141 -0
  23. package/substrate/.claude/rules/cold-adopter-harness-discipline.md +129 -0
  24. package/substrate/.claude/rules/compounding-axis-fresh-analysis.md +188 -0
  25. package/substrate/.claude/rules/compounding-sequence-fresh-analysis.md +188 -0
  26. package/substrate/.claude/rules/defensive-bash.md +68 -0
  27. package/substrate/.claude/rules/deferred-actions.md +233 -0
  28. package/substrate/.claude/rules/github-issue-flash-tweet.md +156 -0
  29. package/substrate/.claude/rules/hook-wire-on-author.md +103 -0
  30. package/substrate/.claude/rules/iteration-bet-brief-completeness.md +54 -0
  31. package/substrate/.claude/rules/lite-manifest-schema-change-discipline.md +3 -3
  32. package/substrate/.claude/rules/longrun-prep-plan-doc-compression.md +89 -0
  33. package/substrate/.claude/rules/loop-discipline.md +81 -0
  34. package/substrate/.claude/rules/manual-prod-approval.md +100 -0
  35. package/substrate/.claude/rules/marker-enrichment-discipline.md +99 -0
  36. package/substrate/.claude/rules/mobile-ephemeral-session.md +109 -0
  37. package/substrate/.claude/rules/new-dependency-check.md +51 -0
  38. package/substrate/.claude/rules/option-label-discipline.md +108 -0
  39. package/substrate/.claude/rules/pattern-annotation.md +100 -0
  40. package/substrate/.claude/rules/plain-english-discipline.md +11 -9
  41. package/substrate/.claude/rules/plan-enumeration-needs-value-props.md +211 -0
  42. package/substrate/.claude/rules/pr-title-shape.md +161 -0
  43. package/substrate/.claude/rules/prototype-workflow.md +65 -0
  44. package/substrate/.claude/rules/reserved-skill-names.md +123 -0
  45. package/substrate/.claude/rules/schema-management.md +49 -0
  46. package/substrate/.claude/rules/security.md +37 -0
  47. package/substrate/.claude/rules/skill-composition-declarations.md +124 -0
  48. package/substrate/.claude/rules/skill-description-clarity.md +247 -0
  49. package/substrate/.claude/rules/skill-procedure-step-list.md +137 -0
  50. package/substrate/.claude/rules/stuck-signal-diagnostic.md +140 -0
  51. package/substrate/.claude/rules/substrate-config-schema.md +98 -0
  52. package/substrate/.claude/rules/test-list-discipline.md +175 -0
  53. package/substrate/.claude/rules/test-sufficiency.md +210 -0
  54. package/substrate/.claude/rules/testing-tier-config.md +145 -0
  55. package/substrate/.claude/rules/testing.md +38 -0
  56. package/substrate/.claude/rules/turn-estimate-grounding.md +134 -0
  57. package/substrate/.claude/rules/visual-hierarchy.md +437 -0
  58. package/substrate/.claude/rules/we-dont-break-adopters.md +126 -0
  59. package/substrate/.claude/rules/wu-sequencing-compounds.md +145 -0
  60. package/substrate/.claude/skills/build/SKILL.md +1 -1
  61. package/substrate/.claude/skills/chronicle/SKILL.md +55 -0
  62. package/substrate/.claude/skills/clean-artifacts/SKILL.md +249 -0
  63. package/substrate/.claude/skills/decompose/SKILL.md +1 -1
  64. package/substrate/.claude/skills/diagnose/SKILL.md +1 -1
  65. package/substrate/.claude/skills/feynman/SKILL.md +90 -0
  66. package/substrate/.claude/skills/howdoi/SKILL.md +1 -1
  67. package/substrate/.claude/skills/ia-model/SKILL.md +1 -1
  68. package/substrate/.claude/skills/interaction-design/SKILL.md +1 -1
  69. package/substrate/.claude/skills/interpret-input/SKILL.md +8 -8
  70. package/substrate/.claude/skills/journal/SKILL.md +209 -0
  71. package/substrate/.claude/skills/kiss/SKILL.md +1 -1
  72. package/substrate/.claude/skills/launch/SKILL.md +14 -23
  73. package/substrate/.claude/skills/lean-canvas/SKILL.md +1 -1
  74. package/substrate/.claude/skills/longrun/SKILL.md +45 -8
  75. package/substrate/.claude/skills/luminary/SKILL.md +1 -1
  76. package/substrate/.claude/skills/ogilvy-writing-audit/SKILL.md +1 -1
  77. package/substrate/.claude/skills/onboard-repo/SKILL.md +143 -709
  78. package/substrate/.claude/skills/pattern-review/SKILL.md +1 -1
  79. package/substrate/.claude/skills/personas/SKILL.md +5 -5
  80. package/substrate/.claude/skills/promote/SKILL.md +1 -1
  81. package/substrate/.claude/skills/requirement/SKILL.md +1 -1
  82. package/substrate/.claude/skills/retro/SKILL.md +1 -1
  83. package/substrate/.claude/skills/riff/SKILL.md +1 -1
  84. package/substrate/.claude/skills/roadmap-reconcile/SKILL.md +1 -1
  85. package/substrate/.claude/skills/session-end/SKILL.md +1 -1
  86. package/substrate/.claude/skills/session-log/SKILL.md +3 -3
  87. package/substrate/.claude/skills/skills/SKILL.md +1 -1
  88. package/substrate/.claude/skills/spec/SKILL.md +1 -1
  89. package/substrate/.claude/skills/sprint/SKILL.md +1 -1
  90. package/substrate/.claude/skills/stage/SKILL.md +1 -1
  91. package/substrate/.claude/skills/state-a-problem/SKILL.md +1 -1
  92. package/substrate/.claude/skills/temperance/SKILL.md +1 -1
  93. package/substrate/.claude/skills/use-case/SKILL.md +1 -1
  94. package/substrate/.claude/skills/user-stories/SKILL.md +1 -1
  95. package/substrate/.claude/skills/value-prop/SKILL.md +1 -1
  96. package/substrate/.claude/skills/verify/SKILL.md +1 -1
  97. package/substrate/.claude/skills/visual-review/SKILL.md +503 -0
  98. package/substrate/.claude/skills/whats-the-plan/SKILL.md +202 -0
  99. package/substrate/.claude/skills/whereami/SKILL.md +2 -2
  100. package/substrate/CONTRIBUTING.md +1 -1
  101. package/substrate/README.md +5 -5
  102. package/substrate/lib/prose-scan-boundary.sh +171 -0
  103. package/substrate/lib/tier-check.sh +50 -1
  104. package/substrate/lib/tier-dependency-audit.sh +159 -4
  105. package/substrate/presence/install/bassclef-sync.template.sh +1 -1
  106. package/substrate/scripts/generate-lite-manifest.sh +21 -5
  107. package/substrate/standards/adr-template.md +86 -0
  108. package/substrate/standards/api-conventions/nextjs.md +84 -0
  109. package/substrate/standards/artifact-composition.md +209 -0
  110. package/substrate/standards/bash-hook-safety.md +246 -0
  111. package/substrate/standards/branch-stacking.md +408 -0
  112. package/substrate/standards/code-safety-principles.md +176 -0
  113. package/substrate/standards/composer-prerequisites.md +155 -0
  114. package/substrate/standards/dependency-discipline/cargo.md +39 -0
  115. package/substrate/standards/dependency-discipline/gem.md +43 -0
  116. package/substrate/standards/dependency-discipline/go-mod.md +41 -0
  117. package/substrate/standards/dependency-discipline/npm.md +42 -0
  118. package/substrate/standards/dependency-discipline/pip.md +42 -0
  119. package/substrate/standards/deployment-topology/ec2-tailscale.md +225 -0
  120. package/substrate/standards/deployment-topology.md +69 -0
  121. package/substrate/standards/docs-sync-allowlist.md +4 -4
  122. package/substrate/standards/domain-and-dns.md +145 -0
  123. package/substrate/standards/frontend-stack.md +67 -0
  124. package/substrate/standards/frontmatter-schema.md +154 -0
  125. package/substrate/standards/hook-injection-discipline.md +202 -0
  126. package/substrate/standards/hook-install-class.md +215 -0
  127. package/substrate/standards/input-handler-interface.md +152 -0
  128. package/substrate/standards/lite-manifest-schema-changes.md +60 -0
  129. package/substrate/standards/luminary-matching.md +105 -0
  130. package/substrate/standards/migration-discipline/active-record.md +50 -0
  131. package/substrate/standards/migration-discipline/alembic.md +43 -0
  132. package/substrate/standards/migration-discipline/gorm.md +50 -0
  133. package/substrate/standards/migration-discipline/prisma.md +53 -0
  134. package/substrate/standards/migration-discipline/sqlalchemy.md +51 -0
  135. package/substrate/standards/mobile-ephemeral-session.md +167 -0
  136. package/substrate/standards/model-routing-discipline.md +160 -0
  137. package/substrate/standards/persona-schema.md +229 -0
  138. package/substrate/standards/pluggable-luminaries.md +323 -0
  139. package/substrate/standards/pr-body-discipline.md +115 -0
  140. package/substrate/standards/preview-state-schema.md +189 -0
  141. package/substrate/standards/reserved-skill-names.md +120 -0
  142. package/substrate/standards/scannable-multi-option-output.md +261 -0
  143. package/substrate/standards/sdlc-gates/typescript.md +57 -0
  144. package/substrate/standards/session-board.md +256 -0
  145. package/substrate/standards/state-spine-contract.md +255 -0
  146. package/substrate/standards/steering-hints/kiss-words.md +11 -0
  147. package/substrate/standards/substrate-config-schema.md +267 -0
  148. package/substrate/standards/tier-dependency-analysis.md +1 -1
  149. package/substrate/standards/tier-tag-schema.md +1 -1
  150. package/substrate/standards/two-layer-config.md +99 -0
  151. package/substrate/standards/use-case-format.md +292 -0
  152. package/substrate/standards/user-story-invest.md +268 -0
  153. package/substrate/standards/velocity-and-appetite.md +229 -0
  154. package/substrate/standards/voice-input-pattern.md +119 -0
  155. package/substrate/standards/worktree-management.md +211 -0
  156. package/substrate/templates/chronicle-template.md +75 -0
  157. package/substrate/templates/memory-proposal-template.md +77 -0
  158. package/substrate/templates/persona-template.md +200 -0
  159. package/substrate/templates/pr-faq.md +45 -0
  160. package/substrate/templates/secret-rotation-template.md +162 -0
  161. package/substrate/templates/spec-template.md +131 -0
  162. package/substrate/templates/use-case-template.md +194 -0
  163. package/substrate/templates/user-story-template.md +107 -0
@@ -0,0 +1,109 @@
1
+ ---
2
+ tier: lite
3
+ globs: ["**/*"]
4
+ description: Mobile/ephemeral session rules — state round-trips through git, no filesystem-only markers, explicit session-end
5
+ ---
6
+
7
+ # Mobile / Ephemeral Session Rule
8
+
9
+ Fires whenever the session is running in an ephemeral environment
10
+ (claude.ai/code mobile sandbox, CI runner, temporary container). See
11
+ `standards/mobile-ephemeral-session.md` for the full standard.
12
+
13
+ ## Detection
14
+
15
+ **Primary signal (required for certainty):**
16
+
17
+ ```bash
18
+ [ "$CLAUDE_EPHEMERAL" = "1" ]
19
+ ```
20
+
21
+ Operator sets this as the first command in mobile / CI / ephemeral
22
+ sessions. Explicit opt-in removes guessing. Put it in a bookmarklet,
23
+ shell init, or session template.
24
+
25
+ **Fallback heuristics** (if primary not set, OR of these):
26
+
27
+ | Check | Signal strength |
28
+ |-------|----------------|
29
+ | `pwd` doesn't start with `/Users/` (macOS operator path) | High |
30
+ | `hostname` doesn't match known operator machines | High |
31
+ | `$HOME` isn't operator's real home | High |
32
+ | `/Applications/Tailscale.app/Contents/MacOS/Tailscale` missing | Medium |
33
+ | `git reflog \| wc -l` is very small (fresh clone) | Medium |
34
+
35
+ If ≥2 fallback signals fire, treat as ephemeral with a surfaced
36
+ warning: "Detected ephemeral mode via heuristics — explicit
37
+ `CLAUDE_EPHEMERAL=1` recommended."
38
+
39
+ **First-session bootstrap**: on the very first mobile session, run
40
+ with heuristics OR explicit flag — observe which signals fire —
41
+ refine this list based on actual claude.ai/code sandbox environment.
42
+ Update this rule after empirical data.
43
+
44
+ ## Rules when ephemeral
45
+
46
+ 1. **All artifacts push immediately.** Auto-save hook does
47
+ `git commit` AND `git push` — not deferred. If push fails, retry
48
+ once with backoff, then surface failure visibly.
49
+
50
+ 2. **Markers go git-tracked, not /tmp.** Any skill or hook that writes
51
+ `/tmp/*` markers MUST also write a git-tracked equivalent. The
52
+ bassclef durable surface is `state/markers/<gate>/...`
53
+ (temperance, diagnose, edit-count, session-timing); `/verify` keeps
54
+ its own pre-existing surface at `state/markers/verify/<branch>.marker`
55
+ for backward-compat with `pre-commit-gate.sh`. In ephemeral mode,
56
+ the git-tracked form is authoritative. Consumers of gate evidence
57
+ (pre-build-gate hook, compliance counter, `/chronicle` gate-evidence
58
+ auto-populate) read whichever form exists; dual-write ensures mobile
59
+ firings survive sandbox teardown.
60
+
61
+ 3. **Session lock has TTL.** Lock at `.claude/SESSION_LOCK` includes
62
+ ISO 8601 timestamp. Locks older than 30 minutes are cleared with
63
+ an announcement ("Clearing stale lock from [timestamp]"). No
64
+ indefinite holds.
65
+
66
+ 4. **Explicit session-end MUST fire.** Stop hook is unreliable in
67
+ ephemeral. Agent must invoke `/session-end` at natural stopping
68
+ points — task complete, context pressure, operator cue.
69
+
70
+ 5. **No credential-bearing tools.** Ephemeral sessions do not hold
71
+ SSH keys, AWS access keys, Tailscale tokens, or long-lived PATs.
72
+ Only fine-grained PATs or GitHub App installation tokens with
73
+ short TTL. Deploy work happens in CI after PR merge, never from
74
+ ephemeral.
75
+
76
+ 6. **Chronicle read at session start.** If project memory isn't
77
+ available (no MCP memory server), read the last 2-3 chronicles
78
+ at session start as context substitute. This is how ephemeral
79
+ sessions recover "what we were working on."
80
+
81
+ 7. **Conservative gating default.** Orchestrator-gated mode requires
82
+ explicit `--ephemeral-ok` flag in ephemeral. Default is operator-
83
+ gated even if orchestrator was requested — ephemeral adds risk
84
+ that deserves confirmation at decision points.
85
+
86
+ ## Failures to surface
87
+
88
+ When any of the following happen, session output must prominently
89
+ report it:
90
+
91
+ - Push failure on auto-save (state loss risk)
92
+ - Stale lock cleared (possible other session running)
93
+ - Chronicle read failed at start (no context recovery)
94
+ - Credential-bearing tool invoked (should not happen; rule violation)
95
+
96
+ ## Rationale
97
+
98
+ Desktop sessions assume the filesystem survives between steps. Mobile
99
+ sessions don't. A rule that lets agents keep working with the same
100
+ skills and hooks — but with ephemeral-safe behavior — is how
101
+ continuity holds.
102
+
103
+ ## Relationship
104
+
105
+ - `standards/mobile-ephemeral-session.md` — full standard with
106
+ all MUST/SHOULD items
107
+ - `.claude/rules/blocked-items.md` — BLOCKED: protocol still applies
108
+ - `.claude/rules/guardrails.md` — "deploy prod requires human approval"
109
+ is reinforced by this rule (ephemeral can't deploy anyway)
@@ -0,0 +1,51 @@
1
+ ---
2
+ tier: lite
3
+ globs: ["package.json", "package-lock.json", "pnpm-lock.yaml", "yarn.lock", "requirements.txt", "pyproject.toml", "poetry.lock", "Gemfile", "Gemfile.lock", "Cargo.toml", "Cargo.lock", "go.mod", "go.sum"]
4
+ description: New dependency check — verify before adding any package; loads per-pkg-manager sibling
5
+ ---
6
+
7
+ # New Dependency Check
8
+
9
+ Before adding any new dependency to the project, verify five universal concerns. Then load the per-package-manager sibling under `standards/dependency-discipline/<pkg_manager>.md` for stack-specific specifics.
10
+
11
+ ## Universal concerns (every package manager)
12
+
13
+ 1. **Stack compatibility** — does it work with the project's framework, language version, build system, and runtime constraints?
14
+ 2. **Bundle / install impact** — what does it add to your build artifact, install footprint, or runtime memory?
15
+ 3. **Runtime compatibility** — does the package make assumptions about the runtime environment (SSR vs CSR, threaded vs async, target architecture)?
16
+ 4. **Maintenance risk** — last publish date, open issues, bus factor. Prefer packages from known maintainers or organizations.
17
+ 5. **Alternatives** — can the need be met without a dependency? Built-in standard library? CSS-only? Native HTML? Small inline helper?
18
+
19
+ ## Per-package-manager siblings
20
+
21
+ Bassclef's loader logic reads `tech_stack.pkg_manager:` from `.claude/bassclef-configs.jsonc` and loads the matching sibling for stack-specific specifics:
22
+
23
+ | Adopter's `pkg_manager` | Sibling loaded |
24
+ |---|---|
25
+ | `npm` / `pnpm` / `yarn` | `standards/dependency-discipline/npm.md` |
26
+ | `pip` / `poetry` | `standards/dependency-discipline/pip.md` |
27
+ | `cargo` | `standards/dependency-discipline/cargo.md` |
28
+ | `gem` | `standards/dependency-discipline/gem.md` |
29
+ | `go-mod` | `standards/dependency-discipline/go-mod.md` |
30
+ | `none` or unset | Universal concerns only |
31
+
32
+ When the matching sibling does not exist (e.g., a stack bassclef has not yet adopted), the rule fires the universal concerns only and surfaces a `/promote` candidate for the missing sibling.
33
+
34
+ ## Process
35
+
36
+ 1. State the package name and what it is for.
37
+ 2. Run the five universal checks above.
38
+ 3. Run the per-PM checks from the matching sibling.
39
+ 4. If red flags surface in any check, propose an alternative.
40
+ 5. If clear, install and add to the project's Approved Dependencies list (or equivalent — see sibling for the exact list name and location).
41
+
42
+ ## Tech stack vocabulary
43
+
44
+ The loader reads `tech_stack.pkg_manager` shipped in bassclef#1127 (WU-2 of bet 2026-06-18a). Adopters set the value at `/onboard-repo` Phase 2.x. When `tech_stack:` block is absent, the universal concerns still apply; sibling-specific guidance is skipped until the operator declares the stack.
45
+
46
+ ## Refs
47
+
48
+ - Path A pattern from bassclef#1133 (ARCH-T0 stack-leakage audit).
49
+ - WU-10 of bet `docs/iteration-bets/2026-06-18a-public-adopter-leverage-longrun.md` ships this catalog split.
50
+ - Sister Path A: bassclef#1133 WU-5 (schema-management → migration-discipline catalog).
51
+ - Reads from bassclef#1127 (tech_stack vocabulary).
@@ -0,0 +1,108 @@
1
+ ---
2
+ tier: lite
3
+ description: When presenting choices for the operator to pick from (shape A vs shape B; option 1 vs option 2; pick a/b/c; tier 1/2/3), labels MUST be characters the operator can easily type…
4
+ ---
5
+
6
+ # Option-label discipline
7
+
8
+ When presenting choices for the operator to pick from (shape A vs shape B; option 1 vs option 2; pick a/b/c; tier 1/2/3), labels MUST be characters the operator can easily type back. Greek letters, special characters, and emoji-as-labels are forbidden because they can't be typed on a standard keyboard — operator has to copy-paste from screen, which wastes turns and disrupts operator-flow at exactly the decision point.
9
+
10
+ ## Allowed
11
+
12
+ - **Lowercase Latin letters** — `a`, `b`, `c`, `d`, `e`, `f` (default for ≤6 choices)
13
+ - **Uppercase Latin letters** — `A`, `B`, `C`, `D` (when distinguishing from inline text matters; default to lowercase otherwise)
14
+ - **Numbers** — `1`, `2`, `3`, `4`, `5`, `6`, `7`, `8`, `9` (default for 7+ choices)
15
+
16
+ ## Forbidden — and what to use instead
17
+
18
+ - Greek letters as labels (`α`, `β`, `γ`, `δ`, `ε`, `ζ`, `η`, `θ`).
19
+ INSTEAD: use `a`, `b`, `c`, `d`, `e`, `f`, `g`, `h` — same ordinal, typeable.
20
+ - Uppercase Greek letters as labels (`Α`, `Β`, `Γ`, `Δ`).
21
+ INSTEAD: use `A`, `B`, `C`, `D` — visually similar on most fonts, typeable.
22
+ - Special characters as labels (`①`, `❶`, `⓵` circled numbers).
23
+ INSTEAD: use plain `1`, `2`, `3`.
24
+ - Emoji as labels (`🅰`, `🅱`).
25
+ INSTEAD: use plain `a`, `b`.
26
+ - Decorative Unicode boxes as labels (`□`, `■`, `▲`, `▼`).
27
+ INSTEAD: use plain `a`/`b`/`1`/`2` — boxes are decoration, not labels.
28
+
29
+ ## Reuse is fine
30
+
31
+ When `a/b/c` was used recently for an earlier decision in the same session, REUSE it for the next decision. Each decision is its own context; operator types `a` referring to the current choice, not the earlier one. The earlier choice's labels do not reserve those letters for the rest of the session.
32
+
33
+ The bad shape: agent feels labels must "differ from earlier" and escalates to Greek/special characters.
34
+ INSTEAD: reuse `a/b/c` freely; if labels MUST differ from a very recent decision (e.g., active comparison still on screen), use uppercase Latin or numbers — never Greek.
35
+
36
+ ## When this rule fires
37
+
38
+ Any operator-facing surface where the agent presents N options for the operator to pick:
39
+
40
+ - `/longrun prep` shape proposal tables (per `.claude/skills/longrun/SKILL.md`)
41
+ - `/sprint` next-work proposals (per `.claude/skills/sprint/SKILL.md`)
42
+ - `AskUserQuestion` menus dispatched from any skill
43
+ - Inline operator prompts in agent turn prose ("Want me to do a, b, or c?")
44
+ - Bet-doc scope-shape enumerations
45
+ - Decision-point menus at /longrun checkpoint or closeout
46
+
47
+ This rule does NOT fire on:
48
+
49
+ - Mathematical / physics / chemistry technical content (Greek letters carry domain semantics).
50
+ INSTEAD of forbidding Greek there: the rule pattern matches `(option|shape|pick|tier|approach|step|item|path|alternative)\s+[α-ωΑ-Ω]` — Greek used as label triggers; Greek used in formulas like `α-decay` or `λ = 600 nm` passes.
51
+ - Quoted strings from external sources (verbatim quotes; Greek letters preserved).
52
+ INSTEAD of stripping: quote markers (backticks + code blocks) are stripped from the scan input before the regex runs.
53
+ - Skill / rule / file names that happen to contain Greek letters (e.g., a luminary file `alpha-design.md`).
54
+ INSTEAD of false-positives on filenames: filename references are inside code spans / backticks and get stripped before scan.
55
+
56
+ ## Why this rule exists
57
+
58
+ Memory `feedback_keyboard_typeable_options.md` (filed 2026-05-03) documented this discipline. The memory body literally warned about its own failure mode: "I used α/β/γ because a/b/c had been 'burned' on an earlier decision in the same session. Operator: 'how am i supposed to type alpha or beta?'"
59
+
60
+ The memory existed for ~7 weeks. On 2026-06-20, the agent violated it during /longrun prep — labeled the second shape proposal α/β/γ/δ after the first used A/B/C/D. Three-layer failure documented in chronicle 2026-06-20c-validate-and-finish-arc.md:
61
+
62
+ 1. Memory loaded into context but a competing local heuristic ("differentiate labels from earlier") won attention at label-pick time
63
+ 2. No mechanism — no rule, no wordlist, no hook check
64
+ 3. Memory-write didn't audit for mechanization opportunity in 2026-05-03 (the meta-discipline `feedback_memory_save_audit_for_adopter_mechanization` was filed 2026-06-20, propagated backward in time)
65
+
66
+ This rule + the mechanical layer (turn-prose-kiss-check hook scan) close the gap.
67
+
68
+ ## Mechanical enforcement
69
+
70
+ `.claude/hooks/turn-prose-kiss-check.sh` Stop hook scans every assistant turn prose for option-label Greek patterns:
71
+
72
+ ```
73
+ (option|shape|pick|tier|approach|step|item|path|alternative)[[:space:]]+[α-ωΑ-Ω]
74
+ ```
75
+
76
+ When matched, the hook emits a BLOCK finding with the offending phrase. Per the per-place strict escalation rule (bassclef#1171), option-label findings can be configured strict via `.claude/bassclef-configs.jsonc` `prose_discipline.kiss_words_strict_places` (add `option_labels` to the array). Default is advisory.
77
+
78
+ The hook ALSO reads `standards/bassclef-internal-jargon.md` BLOCK terms; the wordlist entry for option-label Greek is operator-readable documentation — the regex scan in the hook is the actual mechanical check.
79
+
80
+ ## Override
81
+
82
+ `SKIP_TURN_PROSE_KISS=1 <command>` — per-call (logged via trace-helper). Use only when quoting verbatim text that contains the offending pattern (e.g., quoting a memory file body that includes the literal α/β/γ).
83
+
84
+ INSTEAD of overriding for routine work: rewrite the option labels. The discipline is one of the lowest-cost rules to follow — relabeling takes seconds.
85
+
86
+ ## Composes with
87
+
88
+ - `.claude/rules/plain-english-discipline.md` — master plain-English rule; this is one application at the option-label surface
89
+ - `.claude/rules/operator-facing-prose.md` — gloss + /kiss meta-discipline; sister at adjacent surfaces
90
+ - `.claude/hooks/turn-prose-kiss-check.sh` — mechanical enforcement
91
+ - `standards/bassclef-internal-jargon.md` — wordlist (option-label Greek documented as BLOCK)
92
+ - Memory `feedback_keyboard_typeable_options.md` — the original discipline this rule promotes
93
+ - bassclef#1171 — per-place strict escalation pattern
94
+ - bassclef#1027 — turn-prose discipline parent
95
+
96
+ ## Refs
97
+
98
+ - bassclef#1286 — this rule's filing ticket
99
+ - Memory `feedback_keyboard_typeable_options.md` — the 7-week-old discipline this rule mechanizes
100
+ - Memory `feedback_hooks_beat_methodology_for_substrate_quality.md` — the pattern this rule's filing instantiates
101
+ - Memory `feedback_methodology_holds_before_mechanical.md` — why the methodology-only state was not enough
102
+ - chronicle 2026-06-20c-validate-and-finish-arc.md — three-layer failure documentation
103
+
104
+ ## Retirement condition
105
+
106
+ This rule retires only if bassclef migrates off shell-typeable option labels entirely (e.g., a GUI picker replaces the typed selection). Until then, the discipline of typeable labels persists across every operator-facing surface.
107
+
108
+ Closes bassclef#1286.
@@ -0,0 +1,100 @@
1
+ ---
2
+ tier: lite
3
+ description: "Code that instantiates a named pattern from bassclef's catalog (patterns/<shelf>/<source>/<slug>.md) MUST mark itself with an @pattern <catalog-path> annotation."
4
+ ---
5
+
6
+ # Pattern Annotation — `@pattern` directive
7
+
8
+ Code that instantiates a named pattern from bassclef's catalog (`patterns/<shelf>/<source>/<slug>.md`) MUST mark itself with an `@pattern <catalog-path>` annotation. This is **Layer 1** of pattern-implementation traceability per bassclef#478.
9
+
10
+ Forward (this code uses this pattern) and reverse (this pattern is used here, here, here) lookups become greppable. Operator surfaces — including the future `/pattern-trace` skill (LR5 Layer 3) — read the annotation as the source of truth.
11
+
12
+ ## When this rule fires
13
+
14
+ When writing or editing source code that:
15
+
16
+ - Implements a recognized GoF / Fowler / EIP / POSA / Nygard / Richardson / Vernon DDD pattern, OR
17
+ - Implements a Smarter Patterns AI UX pattern (e.g., Algorithm Effectiveness Rating in a button + tooltip surface), OR
18
+ - Implements any pattern that has a catalog entry under `patterns/<shelf>/<source>/<slug>.md`
19
+
20
+ The annotation goes at the entry-point of the pattern instance: the class declaration for code patterns; the component file's top-level for UX patterns.
21
+
22
+ ## Annotation format
23
+
24
+ ```typescript
25
+ /**
26
+ * @pattern patterns/code/gof/strategy.md
27
+ *
28
+ * Picks among sort algorithms based on user-selected order.
29
+ */
30
+ class SortStrategySelector implements SortStrategy { ... }
31
+ ```
32
+
33
+ ```typescript
34
+ /**
35
+ * @pattern patterns/ux-ai/smarterpatterns/algorithm-effectiveness-rating.md
36
+ *
37
+ * Shows quality prediction next to the Generate Variants button.
38
+ */
39
+ function VariantQualityRating({ inputArtifact }) { ... }
40
+ ```
41
+
42
+ Format rules:
43
+
44
+ - **Always in a comment block** at the top of the function/class/component definition (not in a separate doc, not as a runtime decorator)
45
+ - **Path relative to the repo root**, with full extension (`.md`)
46
+ - **One annotation per pattern instance** — if a class implements two patterns, two annotations
47
+ - **Optional one-line description** below the annotation explaining the local application
48
+
49
+ ## What NOT to do
50
+
51
+ - **Don't annotate without a catalog entry existing.** INSTEAD: dispatch `/agent-research-spawn "<Pattern Name>" patterns/<shelf>/<source>/` to fill the gap, then annotate.
52
+ - **Don't fabricate catalog paths.** INSTEAD: grep the annotation against existing entries; if the path doesn't exist, the annotation is wrong (CI hook in LR5 will catch this; until then, it's a methodology check).
53
+ - **Don't annotate trivial uses.** INSTEAD: annotate the class/function that EMBODIES the pattern, not every place that calls it. A single Strategy implementation gets annotated; every caller that picks a Strategy doesn't.
54
+ - **Don't annotate framework patterns** (e.g., a React component isn't "a Composite pattern instance" just because React uses Composite internally). INSTEAD: annotate when YOUR code is consciously instantiating the pattern as a design choice.
55
+
56
+ ## Why this rule exists
57
+
58
+ Yesterday's POA UX refactor synthesis revealed that bassclef's substrate produces patterns at design time but doesn't know which patterns landed in implementation. The cameo pattern (luminary-as-design-active) only works if the catalog → spec → code → operator-visible chain is intact. Without annotations:
59
+
60
+ - `/pattern-review` operates on grep-against-implementation guesswork
61
+ - The future `/pattern-trace` skill has no source of truth
62
+ - When a luminary "uses Strategy" in a variant, no audit trail confirms the strategy actually shipped
63
+ - Reverse-lookup ("show me everywhere we use Decorator") requires re-reading the codebase
64
+
65
+ The annotation is the inexpensive primitive that makes all of those mechanical.
66
+
67
+ ## Layer 2 — `/spec` "Patterns Used" table
68
+
69
+ Specs that drive Construction work (per `.claude/rules/oo-ad-entry-point.md` requiring `/decompose` evidence) include a "Patterns Used" table mapping each named pattern to its catalog path AND to the file/class that will carry the annotation. This is the spec-side mirror of the code annotation — together they form the bidirectional contract.
70
+
71
+ See `templates/spec-template.md` (this PR also amends it).
72
+
73
+ ## Layer 3 — deferred to LR5
74
+
75
+ Layer 3 ships in bassclef#478 LR5 work:
76
+
77
+ - `state/pattern-implementations/*.json` — state-spine manifest entries auto-populated from grep over annotations
78
+ - Validation hook — fires on Edit/Write of source files; verifies annotated catalog paths exist
79
+ - `/pattern-trace` skill — operator-callable lookup (forward + reverse + audit)
80
+
81
+ Until Layer 3 ships, this rule is methodology-level. Manual grep is the audit path: `git grep -E '@pattern\s+patterns/' src/`.
82
+
83
+ ## Relationship to other rules
84
+
85
+ - `.claude/rules/oo-ad-entry-point.md` — `/decompose` evidence required before Construction; the decomposition output should call out which patterns will be used (feeds Layer 2 table)
86
+ - `.claude/rules/artifact-ingestion.md` — annotations are themselves a "Sources read" surface; the catalog path is a reference the implementation cites
87
+ - `.claude/skills/agent-research-spawn/SKILL.md` — fills catalog gaps when an annotation references a missing entry
88
+ - `.claude/skills/pattern-review/SKILL.md` — reads annotations to focus review on conscious pattern choices
89
+
90
+ ## Override
91
+
92
+ `SKIP_PATTERN_ANNOTATION=1` env var (when Layer 3 hook ships) — for migrations and cases where a pattern is implemented but the catalog hasn't yet caught up. Logged to trace per existing bassclef idiom.
93
+
94
+ Until Layer 3, no mechanical override is needed; this is methodology-level enforcement.
95
+
96
+ ## Retirement
97
+
98
+ This rule retires only if the catalog substrate itself retires. Annotation format may evolve (e.g., to include version numbers when patterns mature) but the discipline of marking conscious pattern choices in code persists.
99
+
100
+ Closes Layer 1 of bassclef#478.
@@ -1,11 +1,13 @@
1
1
  ---
2
2
  tier: lite
3
- description: All bassclef writing skills, rules, luminaries, PR bodies, commit messages, chronicles, journal entries, iteration goals should be plain digestible English at a grade-10…
3
+ description: All bassclef writing should be plain English at grade 8 with grade 10 as the ceiling for simple technical sentences. Drop bassclef-internal jargon. Keep standard tech vocabulary like API, hook, PR, schema.
4
4
  ---
5
5
 
6
6
  # Plain-English Discipline
7
7
 
8
- All bassclef writing — skills, rules, luminaries, PR bodies, commit messages, chronicles, journal entries, iteration goals — should be plain digestible English at a grade-10 reading level. Keep standard technical vocabulary that any digital team would understand. Drop bassclef-internal jargon. Drive for extreme simplicity.
8
+ All bassclef writing — skills, rules, luminaries, PR bodies, commit messages, chronicles, journal entries, iteration goals — should be plain English at grade 8. Grade 10 is the ceiling for simple technical sentences. Above grade 10 needs a clear reason grades 8-10 could not carry the point. Keep standard technical vocabulary that any digital team would understand. Drop bassclef-internal jargon. Drive for extreme simplicity.
9
+
10
+ Per ticket #935 target shift — the aim moved from grade 10 to grade 8 with grade 10 as ceiling. Steering hook + `standards/steering-hints/kiss-words.md` already carry the new bar. This rule body now matches.
9
11
 
10
12
  This rule is the master discipline. Other rules cover narrow surfaces:
11
13
 
@@ -91,15 +93,15 @@ INSTEAD of trying to scrub every word: focus on the highest-leverage substitutio
91
93
  | Surface | Bar | Enforcement |
92
94
  |---|---|---|
93
95
  | Skill description field (frontmatter) | strict (≤280 chars, no jargon, verb-first) | substrate-clarity-gate hook BLOCKs (file-write) |
94
- | Skill body | grade-10 plain English; no bassclef jargon | substrate-clarity-gate + skill-body-grade-gate (FKGL 80% at 8-9, ceiling 10) + compound-noun-scrub (blocklist from standards/bassclef-internal-jargon.md per bassclef-upstream#782) — all BLOCK at PreToolUse Edit/Write |
95
- | Rule body | grade-10 plain English; INSTEAD-block discipline on negations | substrate-clarity-gate + compound-noun-scrub BLOCK at PreToolUse Edit/Write |
96
- | Luminary body | grade-10 plain English; INSTEAD-block discipline on negations | substrate-clarity-gate hook BLOCKs (file-write) |
97
- | PR body | grade-10 plain English; no bassclef jargon | bassclef-pr-ci body-clarity advisory job (comments suggestions) |
96
+ | Skill body | plain English (grade 8 target, ceiling 10); no bassclef jargon | substrate-clarity-gate + skill-body-grade-gate (FKGL 80% at 8-9, ceiling 10) + compound-noun-scrub (blocklist from standards/bassclef-internal-jargon.md per bassclef-upstream#782) — all BLOCK at PreToolUse Edit/Write |
97
+ | Rule body | plain English (grade 8 target, ceiling 10); INSTEAD-block discipline on negations | substrate-clarity-gate + compound-noun-scrub BLOCK at PreToolUse Edit/Write |
98
+ | Luminary body | plain English (grade 8 target, ceiling 10); INSTEAD-block discipline on negations | substrate-clarity-gate hook BLOCKs (file-write) |
99
+ | PR body | plain English (grade 8 target, ceiling 10); no bassclef jargon | bassclef-pr-ci body-clarity advisory job (comments suggestions) |
98
100
  | Commit message | conventional-commits format; plain English in body | commit-conventions rule (methodology) |
99
- | Chronicle | narrative grade-10 plain English | substrate-clarity-gate hook (advisory; new path matcher in WU-7b) |
101
+ | Chronicle | narrative plain English (grade 8 target, ceiling 10) | substrate-clarity-gate hook (advisory; new path matcher in WU-7b) |
100
102
  | journal entry | personal/sensory/story-driven voice (per writing voice memory) | advisory only; voice trumps strict rule |
101
- | Iteration goal body | grade-10 plain English | substrate-clarity-gate hook (advisory) |
102
- | Agent turn prose to operator | grade-10 plain English; no bassclef jargon (banned-word list per "Drop bassclef-internal jargon" table above) | Stop hook `turn-prose-kiss-check.sh` scans the most recent assistant message (bassclef#1051). Toggle in `.claude/bassclef-configs.jsonc` (`prose_discipline.kiss_words_turn_prose`): `true` advisory (default), `"strict"` blocks stop, `false` disables. |
103
+ | Iteration goal body | plain English (grade 8 target, ceiling 10) | substrate-clarity-gate hook (advisory) |
104
+ | Agent turn prose to operator | plain English (grade 8 target, ceiling 10); no bassclef jargon (banned-word list per "Drop bassclef-internal jargon" table above) | Stop hook `turn-prose-kiss-check.sh` scans the most recent assistant message (bassclef#1051). Toggle in `.claude/bassclef-configs.jsonc` (`prose_discipline.kiss_words_turn_prose`): `true` advisory (default), `"strict"` blocks stop, `false` disables. |
103
105
 
104
106
  The hook is the primary backstop. The rule is the reasoning. Skills (`/promote`, `/longrun closeout`, `/chronicle`, `/journal`, `/kiss words`) compose the prevention.
105
107
 
@@ -0,0 +1,211 @@
1
+ ---
2
+ tier: lite
3
+ description: When the agent presents options the operator must pick from or evaluate, the whole proposal opens with a full pitch (claim + 3 reasons) and each option lands as a tweet (claim +…
4
+ ---
5
+
6
+ # Plan Enumeration Needs Value-Props
7
+
8
+ When the agent presents options the operator must pick from or evaluate,
9
+ the whole proposal opens with a full pitch (claim + 3 reasons) and each
10
+ option lands as a tweet (claim + sharpener). **Bare names aren't options.**
11
+ Names are labels; each label needs a value-prop attached.
12
+
13
+ ## Why this rule exists
14
+
15
+ Operator scans on mobile + multi-pane desktop. Bare-name enumeration
16
+ ("Option A. WU-2", "Option B. #334", "Option C. WU-5") forces the
17
+ operator to ask "what's WU-2?" — a follow-up turn that wouldn't be
18
+ needed if the value-prop sat next to the name.
19
+
20
+ Caught 2026-04-27e during /longrun prep — operator: "you need to land
21
+ value props for each scope choice you propose going forward...we
22
+ probably need to constrain/hook that in some way."
23
+
24
+ The /value-prop skill already provides four compression modes (flash,
25
+ tweet, brief, verbose). This rule wires them into how the agent
26
+ presents enumerations, so plan output is scannable in one read.
27
+
28
+ ## When this rule fires
29
+
30
+ Any agent output that enumerates options for the operator — "Pick A or
31
+ B," "scope choices for this /longrun," "which approach do you want,"
32
+ "three sizes:" — fires this rule.
33
+
34
+ Specific surfaces:
35
+
36
+ - `/longrun` (prep + checkpoint) — scope choices for the session
37
+ - `/sprint` — next-work options
38
+ - `/whats-the-plan` — chains of skills the agent intends to run
39
+ - `/shape` — tier alternatives (quick / light / medium / full)
40
+ - `/kiss` — bucket enumerations (MUST / SHOULD / COULD)
41
+ - `/stage` — variant alternatives presented to operator
42
+ - Any ad-hoc agent output where the operator picks among options
43
+
44
+ Does NOT fire on:
45
+
46
+ - Single-action replies (no options to pick from)
47
+ - Tool-output relays (commit messages, test output)
48
+ - Status reports without choice points (e.g., "shipped X")
49
+ - Code content (diffs, file contents)
50
+
51
+ ## What the rule requires
52
+
53
+ ### The whole proposal opens with a full pitch
54
+
55
+ Per `/value-prop` verbose mode: **claim + 3 reasons (why-it-matters)**.
56
+
57
+ ```markdown
58
+ **The /longrun (full pitch):**
59
+
60
+ Make bassclef's roadmap state machine-readable so /sprint and /longrun
61
+ stop reconstructing scope from chronicles + git log.
62
+
63
+ **Why it matters:**
64
+
65
+ 1. First-turn orientation drops from "read three chronicles + git log
66
+ + open PRs + guess" to one read.
67
+ 2. Two parallel sessions can't double-claim work — atomic claim/release
68
+ lands as a primitive.
69
+ 3. Operator stops manually clearing rescue files every session.
70
+ ```
71
+
72
+ Three reasons, plain language, scannable.
73
+
74
+ ### Each option lands as a tweet
75
+
76
+ Per `/value-prop` tweet mode: **claim + sharpener, ≤280 chars**.
77
+
78
+ ```markdown
79
+ **Pick one:**
80
+
81
+ - **A. WU-2 + WU-3 (~50t)** — Roadmap state becomes machine-readable.
82
+ Two parallel sessions can't pick the same work by accident. Claim/
83
+ release primitives ship.
84
+
85
+ - **B. A + #334 (~70t)** — Plus a save-time check that catches agents
86
+ skipping the roadmap. Read-side and write-side determinism in one shot.
87
+
88
+ - **C. Through WU-5 (~100t)** — Plus /sprint and /longrun actually use
89
+ the new reading. End-to-end this session.
90
+ ```
91
+
92
+ Each option's value-prop sits next to its name. Operator reads, picks.
93
+
94
+ ### Bare names aren't options
95
+
96
+ These are NOT acceptable enumeration shapes:
97
+
98
+ ```markdown
99
+ Pick:
100
+ - A
101
+ - B
102
+ - C
103
+ ```
104
+
105
+ ```markdown
106
+ Pick:
107
+ - WU-2
108
+ - #334
109
+ - WU-5
110
+ ```
111
+
112
+ ```markdown
113
+ Three options: WU-A, WU-B, WU-C.
114
+ ```
115
+
116
+ Each option needs a value-prop. If the value-prop is so obvious it
117
+ doesn't need stating, the option probably isn't worth enumerating.
118
+
119
+ ## What the rule allows
120
+
121
+ - **Plain language preferred** (composes with `/kiss words` — folds in what was the standalone `/grade10words` skill per bassclef#340).
122
+ - **Tables when the options share a comparable axis** — e.g., "Tier / Estimate / Buys you" — but each row still needs the value-prop column populated.
123
+ - **Skipping the full pitch when the options are presented in passing** — e.g., "Want me to ship A, B, or C?" mid-conversation. The full pitch is for proposal moments; the tweet-per-option discipline still applies.
124
+ - **Inline alternatives** — "I'll ship X (or Y if you'd rather; Y trades speed for safety)" is fine; the alternative carries its sharpener inline.
125
+
126
+ ## Anti-patterns
127
+
128
+ Direct quotes from sessions where this rule was missing:
129
+
130
+ - "Pick one: A, B, or C" — three letters, no content
131
+ - "WU-2 + WU-3 (~50t)" alone in a list — bare cost without value
132
+ - "We could do this or that" without naming what each buys
133
+ - "Three sizes — pick by how much determinism you want" without saying which size buys what
134
+
135
+ ## How the rule composes with existing skills
136
+
137
+ - `/value-prop` is the primitive — flash/tweet/brief/verbose modes the
138
+ rule references directly.
139
+
140
+ INSTEAD of reinventing the format inline: call the skill. The four
141
+ compression modes already exist; reuse them.
142
+ - `/kiss words` (bassclef#340 folded the planned `/grade10words` into `/kiss`) — substitutes plain language for jargon. Composes orthogonally; an option's tweet should already be in plain language by default.
143
+ - `/feynman` — explanation skill. NOT a substitute for tweet-per-
144
+ option; /feynman is for "explain this concept," not "present these
145
+ choices."
146
+
147
+ ## Verification cue (self-check before output)
148
+
149
+ Before presenting an enumeration, ask:
150
+
151
+ 1. Did I open with a claim + 3 reasons (full pitch)?
152
+ 2. Does each option carry a tweet (claim + sharpener)?
153
+ 3. Are any options just labels / IDs / bare names?
154
+ 4. Plain language? Or am I using "atomic" / "load-bearing" / "blast radius" without justifying?
155
+
156
+ If any answer is wrong, rewrite before posting.
157
+
158
+ ## Eat-our-own-dogfood
159
+
160
+ Every PR body that ships a bassclef-evolution change uses this format
161
+ when it presents alternatives ("Out of scope," "Acceptance," "Test
162
+ plan"). Each line earns its place; bare bullet enumerations get
163
+ upgraded to tweets.
164
+
165
+ Iteration-goal docs follow the same discipline in their "Steps
166
+ enumerated" section.
167
+
168
+ ## Relationship to other rules
169
+
170
+ - `feedback_lead_with_flash.md` (memory) — the operator-feedback
171
+ precedent; this rule codifies it as substrate
172
+ - `visual-hierarchy.md` — long agent output uses tables/headers/HRs;
173
+ this rule adds the value-prop content discipline that makes the
174
+ hierarchy useful
175
+ - `artifact-ingestion.md` — "Sources read" block discipline; this rule
176
+ is the analogous "options presented" discipline
177
+ - `commit-conventions.md` — commit message format; this rule applies
178
+ to PR bodies, agent dialogue, and skill outputs (not commits — those
179
+ have their own format)
180
+ - `sdlc-gates.md` — methodology-level gates; this rule fires before
181
+ any plan-presentation moment
182
+
183
+ ## Enforcement
184
+
185
+ Methodology-level. The rule loads into every session via
186
+ `additionalDirectories`. Agents self-check before posting an enumeration.
187
+
188
+ If post-observation shows agents repeatedly presenting bare-name
189
+ enumerations, a future hook could grep agent output for option-list
190
+ shapes and BLOCK if value-prop content is missing — but the first line
191
+ of defense is the rule loading into every session.
192
+
193
+ ## Override path
194
+
195
+ `SKIP_PLAN_ENUMERATION_RULE=1 <command>` — logged to trace per existing
196
+ bassclef hook idiom. Use only when the enumeration is genuinely
197
+ stylistic / casual ("want coffee or tea?") and the value-prop discipline
198
+ would be ceremony.
199
+
200
+ INSTEAD of using the override for production decisions: write the
201
+ value-prop. Production scope choices always carry weight worth
202
+ articulating.
203
+
204
+ ## Retirement condition
205
+
206
+ If observed across 6 months with zero operator corrections of
207
+ enumeration formatting, this rule is correctly calibrated. If the
208
+ operator stops asking "what does X buy me?" entirely, the rule has
209
+ done its job.
210
+
211
+ Closes bassclef#339.