@thebassclef/lite 0.1.0 → 0.1.3

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 +40 -6
  2. package/dist/cli.js +40 -6
  3. package/dist/index.cjs +1 -1
  4. package/dist/index.d.ts +1 -1
  5. package/dist/index.js +1 -1
  6. package/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,134 @@
1
+ ---
2
+ tier: lite
3
+ description: "Plain check: Before I ship a turn estimate to an adopter, I cite a past bet's actuals + write a range + name the shape."
4
+ ---
5
+
6
+ # Turn-Estimate Grounding
7
+
8
+ **Plain check:** Before I ship a turn estimate to an adopter, I cite a past bet's actuals + write a range + name the shape. Ungrounded numbers do not ship.
9
+
10
+ ---
11
+
12
+ Every turn estimate that lands in adopter-facing prose (goal docs, PR bodies, canvases, ticket bodies) carries three parts:
13
+
14
+ 1. **Source** — cite a past bet's closeout actuals with comparable scope shape (WU count, test-heavy vs docs-heavy, defect diagnosis interludes)
15
+ 2. **Range not point** — write a range (e.g., "40-80 turns") not a point ("60 turns")
16
+ 3. **Plain-language framing** — name the shape driving the number in one sentence
17
+
18
+ Ungrounded turn estimates do not ship to adopter-facing prose. This rule extends the argument shape from `.claude/rules/assert-only-after-verify.md` to numeric claims. It applies at the same reasoning surface — the moment a number gets written down for an adopter to read.
19
+
20
+ ## When this rule fires
21
+
22
+ Every time budget estimate, turn count, or effort range that lands in prose an adopter will read:
23
+
24
+ - `docs/iteration-bets/*.md` frontmatter `appetite:` line
25
+ - `docs/iteration-bets/*.md` body when narrative surfaces a number
26
+ - PR body `Test plan` or `Summary` sections when they cite effort
27
+ - `docs/canvases/*.md` sizing sections
28
+ - Ticket body `Estimate` fields (INVEST format uses S/M/L; this rule fires when a turn count appears instead)
29
+ - Chronicle time-budget actuals sections when they cite the filed number
30
+ - Journal drafts when they cite bet actuals for a past bet
31
+
32
+ Does NOT fire on:
33
+
34
+ - **Chronicle body actuals** for a past bet (backward-looking; the number IS the source itself)
35
+ - **Operator-only surfaces** — internal chronicles, private strategy docs, session-timing markers
36
+ - **Runtime numbers** at checkpoint or closeout time — those cite what happened, not what will happen
37
+
38
+ ## What the rule requires
39
+
40
+ Before any turn estimate ships to adopter-facing prose:
41
+
42
+ 1. **Cite a past bet by path** — one or two bets whose closeout actuals inform this estimate. Format: `bet 2026-07-09c (5 WUs; heavy test setup; ~110 turns actual)`. Path optional but preferred when the calibration goal is recent.
43
+ 2. **Write a range** — the range spans enough to cover the estimate's uncertainty. A 40-80 turn range signals the shape is well-understood but has natural variance. A 200-600 turn range signals real uncertainty and prompts the operator to consider splitting the goal.
44
+ 3. **Name the shape** — one sentence stating what drives the number. Examples: "documentation-heavy; single-file SKILL edit + rule text," "5 WUs riding a shared fixture; each cure ships end-to-end with 10-15 Tier 0 tests," "test-first Beck TDD with 4 substantive WUs sharing a fixture foundation."
45
+
46
+ ## Worked examples
47
+
48
+ ### Anti-pattern (what NOT to do)
49
+
50
+ ```yaml
51
+ appetite: 500-700 turns
52
+ ```
53
+
54
+ Ungrounded. Range too wide. No shape named. Adopter reads this and either dismisses the goal as heavyweight or trusts an ungrounded number.
55
+
56
+ ### Anti-pattern (point estimate)
57
+
58
+ ```yaml
59
+ appetite: 250 turns
60
+ ```
61
+
62
+ Point not range. False precision. No source cited.
63
+
64
+ ### Anti-pattern (source-free range)
65
+
66
+ ```yaml
67
+ appetite: 40-80 turns
68
+ ```
69
+
70
+ Range is fine but ungrounded. Adopter has no way to check if 40-80 is realistic.
71
+
72
+ ### Conformant pattern
73
+
74
+ ```yaml
75
+ appetite: 40-80 turns
76
+ appetite_source: "bet 2026-07-09d (documentation-heavy adopter polish; 2 substantive WUs; ~30 turns actual). Similar shape — single-file SKILL edit + rule text; no new test infrastructure."
77
+ ```
78
+
79
+ Or in narrative form:
80
+
81
+ > **Appetite:** 40-80 turns. Similar shape to bet 09d (~30 turns actual for 2 WUs of single-file SKILL edits + rule text). This bet adds one more WU so the top of the range widens.
82
+
83
+ Both forms carry source + range + shape.
84
+
85
+ ## Trivial-fix exception
86
+
87
+ Fix branches and quick-fix PRs may skip the discipline when the change is under 10 lines AND no goal doc time budget line is being authored. Silence about effort is fine on trivial fixes.
88
+
89
+ ## Adopter-friendly framing
90
+
91
+ Numbers can be honest AND friendly. Instead of:
92
+
93
+ > "This goal needs 500-700 turns"
94
+
95
+ Prefer:
96
+
97
+ > "This bet groups 5 substantive changes. Past bets of this shape landed around 100-350 turns. The wider top of the range covers defect diagnosis interludes that add 30-50 turns per step when they fire."
98
+
99
+ The friendly version:
100
+ - Cites a past shape ("bets of this shape landed around 100-350")
101
+ - Names the shape driver ("5 substantive changes")
102
+ - Explains the top-of-range variance ("defect diagnosis interludes")
103
+
104
+ ## Composes with
105
+
106
+ - `.claude/rules/assert-only-after-verify.md` — parent discipline; this rule extends argument shape to numeric claims
107
+ - `.claude/rules/plain-english-discipline.md` — grade 8 target with grade 10 ceiling; friendly numbers pass the same reading-level test as prose
108
+ - `.claude/rules/pr-body-shape.md` — Test plan and Summary sections that cite effort follow this rule
109
+ - `.claude/rules/pr-title-shape.md` — sister at title surface
110
+ - `.claude/skills/longrun/SKILL.md` Step 1 pre-flight — cites this rule at time budget estimation
111
+ - @luminary stephen-toulmin — argument shape (claim + evidence + why the evidence supports the claim)
112
+ - @luminary karl-popper — falsifiability (grounded estimates check against past actuals; ungrounded ones cannot be checked)
113
+ - Memory `feedback_no_token_estimates.md` — sister at token-estimate surface
114
+ - Memory `feedback_tight_ticket_appetite.md` — calibration for infra tickets
115
+ - Memory `feedback_longrun_appetite_estimates_too_tight.md` — calibration for WU-heavy bets (3-4x off pattern)
116
+
117
+ ## Override
118
+
119
+ `SKIP_TURN_ESTIMATE_GROUNDING=1` — logged via trace-helper. Use only when quoting an external number verbatim (e.g., citing a Shape Up appetite from Basecamp's book).
120
+
121
+ INSTEAD of overriding for routine work: cite the past bet. The cost is one sentence; the discipline compounds across every future adopter who reads a goal doc.
122
+
123
+ ## Refs
124
+
125
+ - sunj-labs/bassclef-upstream#670 — this rule's filing ticket
126
+ - sunj-labs/bassclef-upstream#559 — R8 mechanization umbrella (parent argument-shape work)
127
+ - sunj-labs/bassclef-upstream#582 — assert-verify-steering hook (sister at prose-scan surface)
128
+ - Bet 2026-07-09e — this rule's ship vehicle (eats own dogfood on the time budget line)
129
+ - Toulmin — *The Uses of Argument* (Cambridge, 1958)
130
+ - Popper — *The Logic of Scientific Discovery* (Hutchinson, 1959)
131
+
132
+ ## Retirement condition
133
+
134
+ This rule retires only if goal docs stop surfacing turn estimates in adopter-facing prose. A mechanical layer (Stop hook that scans goal doc frontmatter for ungrounded time budget lines) may ship as a follow-on when methodology drift is observed. Until then, this rule is methodology; the discipline holds at reasoning origin per ADR-035 substrate-as-system tenet.
@@ -0,0 +1,437 @@
1
+ ---
2
+ tier: lite
3
+ description: Long agent responses that mix summary + analysis + enumeration + action become walls of text.
4
+ ---
5
+
6
+ # Visual Hierarchy in Agent Output
7
+
8
+ Long agent responses that mix summary + analysis + enumeration + action
9
+ become walls of text. Operators scan on mobile and multi-pane desktop;
10
+ walls of text force re-reading. Use markdown primitives to create
11
+ scannable separation.
12
+
13
+ ## When this rule fires
14
+
15
+ Fires on any agent response that:
16
+
17
+ - Is longer than ~5 paragraphs, OR
18
+ - Mixes more than one of: summary, analysis, enumeration, actions, questions
19
+
20
+ Does NOT fire on:
21
+
22
+ - Short answers (<3 sentences)
23
+ - Single-action replies
24
+ - Tool-output relays
25
+ - Code diffs or file contents
26
+
27
+ ## The conventions
28
+
29
+ ### 1. TL;DR at the top (when response has conclusions before detail)
30
+
31
+ Set off as a bold callout or blockquote, not a plain paragraph:
32
+
33
+ ```markdown
34
+ > **TL;DR:** one-line conclusion the operator needs even if they read nothing else.
35
+ ```
36
+
37
+ Not every response needs one. Use when the operator benefits from the
38
+ conclusion before the reasoning.
39
+
40
+ ### 2. Section headers for distinct parts
41
+
42
+ Use `##` with consistent category labels:
43
+
44
+ ```markdown
45
+ ## Summary
46
+ ## Analysis
47
+ ## Actions
48
+ ## Next
49
+ ```
50
+
51
+ Pick the labels that match the response shape.
52
+
53
+ INSTEAD of forcing all four headers when only two apply: use only the
54
+ ones that match (e.g., just `## Summary` and `## Next` for a status
55
+ update; just `## Analysis` for a diagnostic).
56
+
57
+ ### 3. Horizontal rules between large sections
58
+
59
+ `---` separates major sections visually. Use when sections are long
60
+ enough that the reader would benefit from a clear break.
61
+
62
+ ### 4. Bold category labels in lists
63
+
64
+ When enumerating buckets (MUST / SHOULD / COULD, Tier 1 / Tier 2,
65
+ Option A / Option B):
66
+
67
+ ```markdown
68
+ **Tier 1 — Must-fix (N)**
69
+ - #NN — title
70
+ - #NN — title
71
+
72
+ **Tier 2 — Should-fix (N)**
73
+ - #NN — title
74
+ ```
75
+
76
+ Category labels in bold, content under them.
77
+
78
+ **Prose enumeration shape.** When a paragraph enumerates 3-5 items
79
+ inline (not as a list), each item opens with a bold lead followed
80
+ by an em-dash and the item's expansion. The bold lead names the
81
+ item; the em-dash separates label from body.
82
+
83
+ **Anti-pattern:** flat prose enumeration with no scan anchors.
84
+
85
+ ```
86
+ The three findings are that CI is stale which means the pipeline
87
+ hasn't run in 48 hours, tests are flaky which produced 5 false
88
+ positives last week, and the marker check is missing which lets
89
+ regressions slip through.
90
+ ```
91
+
92
+ **Conformant:** bold-lead + em-dash per item, blank line between.
93
+
94
+ ```
95
+ - **CI stale** — pipeline hasn't run in 48 hours.
96
+ - **Tests flaky** — 5 false positives last week.
97
+ - **Marker check missing** — regressions slip through.
98
+ ```
99
+
100
+ Same principle as section 10 (bold inline lead for reasoning
101
+ paragraphs). Prose enumeration is a compact form; the bold-lead +
102
+ em-dash carries the anchor without needing full paragraph breaks.
103
+
104
+ ### 5. Code-fence inline quotes and file refs
105
+
106
+ ```markdown
107
+ `.claude/rules/visual-hierarchy.md` — not plain text
108
+ `git status` — not plain text
109
+ ```
110
+
111
+ Consistent across the whole response.
112
+
113
+ ### 6. Questions / confirmation prompts set off from analysis
114
+
115
+ When the response ends with a question for the operator, separate it
116
+ visually from preceding analysis — a `---` rule, a bold header
117
+ (`**Confirm to proceed?**`), or a short blockquote.
118
+
119
+ ### 7. Bulleted wraps use hanging indent
120
+
121
+ When a bullet's text wraps to a second or third line, the wrapped text aligns with the first character after the `- ` marker. Not with column 0. Most markdown renderers do this automatically when the source places the bullet at column 0. Agent output that indents wrapped lines to column 0 breaks the signal. The eye reads the wrapped text as a new paragraph, not as part of the bullet.
122
+
123
+ **Anti-pattern:** continuation text at column 0 — wrapped text
124
+ reads as a new paragraph, not a continuation.
125
+
126
+ ```
127
+ - This is a long bullet whose text wraps to a second line and the
128
+ continuation lands flush left at column 0 which breaks the visual
129
+ signal that it belongs to the bullet above.
130
+ ```
131
+
132
+ **Conformant:** continuation text stays inside the bullet's
133
+ visual column.
134
+
135
+ ```
136
+ - This is a long bullet whose text wraps to a second line, and the
137
+ continuation stays indented to align with the first character
138
+ after the `- ` marker. The eye reads it as one bullet.
139
+ ```
140
+
141
+ The rule is about source shape, not render shape. Write markdown source with `-<space>` at column 0. Let the renderer handle wrapping. Do not manually break lines at fixed column widths in ways that put wrapped text at column 0.
142
+
143
+ **Alignment is the renderer's job too.** Same principle as line-wrap. Terminals left-align by default. That is the right shape. Do not embed CSS, HTML, or padding to force full-justify or center alignment. The rule scopes source shape, not render shape.
144
+
145
+ ### 8. Headers use `##` and `###` for color signals
146
+
147
+ Most terminal + web markdown renderers give `##` and `###` headers a color or weight signal. Bold plain text (`**Section**:`) does not get the same signal. The color difference is what lets the operator's eye jump between sections on a long response.
148
+
149
+ **Anti-pattern:** section labels as bold plain text.
150
+
151
+ ```markdown
152
+ **Analysis:** long paragraph here that runs on and on and the
153
+ reader cannot easily spot where the next section starts.
154
+
155
+ **Recommendation:** more paragraphs.
156
+ ```
157
+
158
+ **Conformant:** section labels as `##` or `###` headers.
159
+
160
+ ```markdown
161
+ ## Analysis
162
+
163
+ Long paragraph here that runs on and on. The `## Analysis` header
164
+ above renders in the harness's header color, giving the eye an
165
+ anchor.
166
+
167
+ ## Recommendation
168
+
169
+ More paragraphs.
170
+ ```
171
+
172
+ Use `##` for top-level sections in a response; `###` for
173
+ subsections. Do not use `#` (H1) in agent output — that heading
174
+ level is reserved for document titles.
175
+
176
+ ### 9. Skill names and file paths use inline code
177
+
178
+ Skill invocations (`/luminary`, `/sprint`, `/kiss`) and file paths
179
+ (`.claude/hooks/foo.sh`, `docs/whereami.md`) render distinctly when
180
+ wrapped in inline code spans (backticks). Prose that names them
181
+ without backticks blends into surrounding text.
182
+
183
+ **Anti-pattern:** skill names and file paths as plain text.
184
+
185
+ ```
186
+ The /luminary skill reads .claude/luminaries/*.md files at every
187
+ session start. Also see the /sprint output and docs/whereami.md.
188
+ ```
189
+
190
+ **Conformant:** skill names and file paths as inline code.
191
+
192
+ ```
193
+ The `/luminary` skill reads `.claude/luminaries/*.md` files at
194
+ every session start. Also see the `/sprint` output and
195
+ `docs/whereami.md`.
196
+ ```
197
+
198
+ Extend the same treatment to:
199
+
200
+ - **Environment variables** — `ANTHROPIC_BASE_URL`, `HOME`,
201
+ `SKIP_TURN_PROSE_GRADE`
202
+ - **CLI commands** — `git status`, `gh pr list`, `bash
203
+ scripts/foo.sh`
204
+ - **Config keys** — `schema_version`, `tier`, `install-class`
205
+ - **Ticket references in code shape** — `#940`, `bassclef#559`
206
+ (only when quoted verbatim from a source; plain prose can drop
207
+ the backticks)
208
+
209
+ Composes with ### 5. Extend ### 5's principle to every skill
210
+ name (with slash prefix), every file path (relative or absolute),
211
+ every env var, every CLI command, and every config key in
212
+ operator-facing prose.
213
+
214
+ ### 10. Bold inline lead for reasoning paragraphs and lists
215
+
216
+ When a response has 2 or more paragraphs of reasoning, each
217
+ paragraph opens with a **short bold lead phrase** (2-4 words)
218
+ that names the paragraph's point. Blank line separates
219
+ paragraphs. The bold lead renders in the terminal's accent color
220
+ — bassclef gold (`--bc-gold` per `design-tokens.css`) or the
221
+ renderer's chosen highlight. The exact shade is renderer-controlled;
222
+ the source shape is `**bold**`.
223
+
224
+ Applies when:
225
+ - Paragraph runs 2+ sentences of reasoning
226
+ - Response has 2+ such paragraphs stacked
227
+ - **Numbered or bulleted list items carry multi-sentence reasoning
228
+ (not one-line items)** — the bold lead sits at the head of each
229
+ item, followed by an em-dash or a period + space, then the body
230
+
231
+ Skips:
232
+ - Single-sentence answers (no anchor needed)
233
+ - Yes/no confirmations
234
+ - One-line list items (they are already their own anchor)
235
+ - Tables (they have their own anchors)
236
+ - Code blocks
237
+
238
+ **Anti-pattern:** wall of reasoning text with no scan anchors.
239
+
240
+ ```
241
+ The subject matter is already structured which lets the description
242
+ inherit that structure. You asked sharp questions which forced short
243
+ answers. There was no hedging pressure so the writing stayed direct.
244
+ ```
245
+
246
+ **Conformant:** bold inline lead per paragraph, blank line between.
247
+
248
+ ```
249
+ **Subject matter already structured.** Bassclef has explicit layers.
250
+ When the thing being described has clear structure, the description
251
+ inherits it.
252
+
253
+ **Sharp questions.** You cut to the decision, not the background.
254
+ That forces short answers because the right answer actually is short.
255
+
256
+ **No hedging pressure.** You pushed back on advice. That established
257
+ that correctness matters more than validation. That removes the padding.
258
+ ```
259
+
260
+ **Conformant for lists carrying reasoning:** bold lead on each item.
261
+
262
+ ```
263
+ 1. **Ishikawa fishbone earned its keep.** Going broad across 6M
264
+ categories before five-whys caught the launchd-dead-file
265
+ mechanism that direct five-whys would have missed.
266
+
267
+ 2. **Operator pause before kickoff was essential.** The 5-lens
268
+ luminary consult grounded the plan; would have wasted the whole
269
+ /longrun otherwise.
270
+
271
+ 3. **Linus lens applied honestly to the cross-OS question.** Forced
272
+ the ADR frame. Producer pays cost. No adopter left behind.
273
+ ```
274
+
275
+ Composes with ### 8 (colored `##` and `###` headers) and ### 4
276
+ (bold category labels in lists). Bold lead phrases work at the
277
+ paragraph scale the way `##` headers work at the section scale.
278
+ Same principle — give the eye a scan anchor.
279
+
280
+ ### 11. Arrow-indent for call chains and pipelines
281
+
282
+ When describing a sequence of steps that flow into each other (a
283
+ tool chain, a pipeline, a call graph), use the `→` arrow prefix
284
+ with two-space indent for sub-steps. Plain text — no code fence.
285
+ The arrow renders in the same accent color as bold leads on most
286
+ terminals.
287
+
288
+ **Anti-pattern:** pipeline as flat prose.
289
+
290
+ ```
291
+ The dispatcher fetches the source config then reads the settings
292
+ then reads the sync template then runs the sync then loads the
293
+ skills.
294
+ ```
295
+
296
+ **Conformant:** arrow-prefixed steps, two-space nest for sub-steps.
297
+
298
+ ```
299
+ → fetch `.bassclef-source.json`
300
+ → read `.claude/settings.json`
301
+ → merge project + operator settings
302
+ → read `presence/install/bassclef-sync.template.sh`
303
+ → run the sync
304
+ → symlink skills
305
+ → symlink rules
306
+ → symlink hooks
307
+ ```
308
+
309
+ Applies when:
310
+ - Response describes a call chain, pipeline, or sequence of at
311
+ least 3 steps
312
+ - Sub-steps nest below a parent step
313
+ - The order matters and the reader needs to trace flow
314
+
315
+ The arrow prefix is a data glyph (per Tufte). It carries the flow
316
+ direction. Composes with ### 5 (inline code for filenames) and
317
+ ### 9 (env vars, CLI commands, config keys in inline code).
318
+
319
+ ### 12. Tables + special characters — prefer card format when in doubt
320
+
321
+ The Claude Code TUI (and some other markdown renderers) has post-processing after markdown parse that can mangle specific characters inside table cells. Standard GFM parsers (pandoc, cmark-gfm) handle these characters cleanly — verified 2026-08-06 with 6-fixture pandoc test on control + apostrophes + escaped pipes + backticks + HTML entities + quotes + backslash. The break happens downstream of GFM, in the renderer itself.
322
+
323
+ Suspect character class (per operator observation + #966 comment thread hypothesis + #1144 filing):
324
+
325
+ - Apostrophe `'` — reported to collapse rows or drop cells in the Claude Code TUI; unconfirmed at markdown-parse layer
326
+ - Raw pipe `|` — will always split a cell unless escaped `\|`; that IS a spec-level defect the author must handle
327
+ - Backtick `` ` `` — starts inline code; if unbalanced across a cell, cascades into neighboring cells
328
+ - HTML entities (`&lt;`, `&gt;`, `&amp;`) — safe at GFM layer but some renderers do double-decode
329
+ - Angle brackets `<>` — some renderers treat as HTML fragments if not entity-encoded
330
+
331
+ **Defensive stance** — three options in order of preference:
332
+
333
+ 1. **Prefer cards for content with special chars.** Per ### 12 sister-rule sections (#966 wide-table cure + #959 prep density card format), authoring-time card format sidesteps the whole class. Use `**Label** — value.` bullets instead of a table when cells contain apostrophes, quotes, or code.
334
+ 2. **If a table is the right shape, escape the suspect chars.** `\|` for pipe, `` `\`` `` for backtick, HTML entities for `<>&`. Apostrophes: try `&#39;` if the TUI break reproduces.
335
+ 3. **Keep tables narrow AND alphanumeric-first.** Per ### 12 sister-rule (#966), tables past 4 columns collapse. Combined with special-char break, wide-plus-special-char is the worst case.
336
+
337
+ **Anti-pattern:** ships a wide table (5+ cols) with cells containing apostrophes.
338
+
339
+ **Conformant:** narrow (≤4 cols) table with alphanumerics only, OR card format for anything with special chars.
340
+
341
+ **INSTEAD-block — per-character cure recipes** (per #1144 body step 3):
342
+
343
+ - Apostrophe `'` in cell text — write as `&#39;` (HTML entity) OR replace with typographic apostrophe `'` (U+2019) OR move content to card
344
+ - Straight double quote `"` in cell text — write as `&quot;` OR replace with typographic quotes `""` (U+201C / U+201D) OR move to card
345
+ - Raw pipe `|` — always write as `\|` inside cells; unescaped pipes split cells at GFM parse time (spec-level)
346
+ - Backslash `\` in cell text — safe when not preceding a pipe; when followed by pipe use `\\|` to keep the backslash literal
347
+ - Angle brackets `<` `>` — write as `&lt;` and `&gt;`; raw brackets sometimes parse as HTML fragments in TUI post-processing
348
+ - Backtick `` ` `` — balance inside cells; unbalanced backticks cascade inline-code state into neighboring cells; when carrying literal backticks use HTML entity `&#96;`
349
+ - Combined `'` + `"` in the same cell — worst case; move to card. Contractions plus quoted phrases collapse rows in the Claude Code TUI per operator screenshots (whereami L30 of 2026-08-13a session)
350
+
351
+ The reproducer at `#1144` characterizes which classes trigger flatten in the current Claude Code TUI. When operator observation surfaces a new class beyond this list, extend the block via a follow-on PR.
352
+
353
+ Composes with sister rules — #966 (wide-column threshold), #967 (section-anchor spacing), #959 (prep density card format).
354
+
355
+ ## What NOT to do
356
+
357
+ - Terminal color codes (renderer-dependent — breaks in different UIs)
358
+ - **Decoration emoji** — do not use emoji for ornament (✨, 🎉, 🚀
359
+ at the head of sections)
360
+ - Nested bold-inside-header (visual noise, no added signal)
361
+ - More than one `#` heading level per response (start at `##`)
362
+ - **Do not embed CSS, HTML, or padding to force alignment or
363
+ justification.** Renderers left-align by default; that is the
364
+ correct shape. Full-justify and center are not source-level
365
+ markdown signals.
366
+
367
+ **Data glyph carve-out** (per Tufte). A glyph that carries data is
368
+ allowed, even encouraged. Examples:
369
+
370
+ - Risk glyphs in tables — `🟢 low` / `🟡 med` / `🔴 high` (encodes
371
+ data on a shared axis)
372
+ - Gate signals emitted by hooks — `🛑 BLOCKED:`, `⚠ ADVISORY:`
373
+ (encodes state)
374
+ - Flow arrows — `→` in call chains (encodes direction)
375
+
376
+ The rule is Tufte's — data-ink is welcome; decoration ink is not.
377
+ A `🎉` at the head of a section is decoration. A `🟢` inside a
378
+ risk column is data.
379
+
380
+ INSTEAD: use plain markdown primitives (bold, italics, blockquotes,
381
+ code fences) for emphasis; let the operator's renderer decide visual
382
+ treatment. Reserve emojis for gate signals the hook itself emits or
383
+ for data glyphs that encode information the reader needs to scan.
384
+
385
+ ## Why this rule exists
386
+
387
+ Captured from operator feedback across multiple sessions (memory entry `feedback_visual_hierarchy.md`). Agent responses with headers like "Key design choices worth calling out" and "Skill summary" blended into surrounding text. On mobile screenshots the eye could not jump to sections. The operator re-read the whole response to find the one they wanted.
388
+
389
+ Visual hierarchy is not cosmetic. It is what makes long responses usable on the surfaces operators actually work on.
390
+
391
+ Sections 7-9 landed 2026-07-26 per ticket #914. Two mobile screenshots the operator shared in session `chronicle/2026-07-26d-cures-2-3-5-shipped.md` motivated the extension. The reference output showed hanging-indent bullets, colored `##` headers, and inline-code skill names as scannable anchors. Bassclef's agent output was missing those three signals. The extension prescribes them at the source shape so any conforming renderer produces the same scannability.
392
+
393
+ Section 10 (bold inline lead) landed 2026-07-27 per ticket #936. Sections 4 (prose enumeration shape), 9 (env vars + CLI + config keys), 10 (numbered and bulleted list reasoning), 11 (arrow-indent pipelines), and the "What NOT to do" data-glyph carve-out landed the same day. Six operator-shared screenshots showed the target output shape — bold leads at paragraph heads, arrow-indent pipelines, inline code for env vars and paths. Bassclef renderers use the accent color from `design-tokens.css` — `--bc-gold` (#F5B83D) for warm highlight, `--bc-orange` (#E85D04) for the master burnt orange. The exact shade is the renderer's choice. The source shape is `**bold**` and inline code fences.
394
+
395
+ ## Applies to
396
+
397
+ - Session-end summaries
398
+ - PR descriptions generated by the agent
399
+ - `/sprint`, `/whereami`, `/whats-the-plan` outputs
400
+ - `/value-prop`, `/feynman`, `/kiss` outputs
401
+ - `/diagnose`, `/architect-review`, `/pattern-review` reports
402
+ - Any gut-check or status report longer than a few sentences
403
+
404
+ ## Does NOT apply to
405
+
406
+ - Short answers (<3 sentences) — keep single-line answers single-line
407
+ - Tool-output relays (commit messages, test output) — don't reformat
408
+ - Code content — never decorate diff blocks
409
+ - When the operator explicitly asks for "just the bullet" / "one line"
410
+
411
+ INSTEAD for the exempt cases: pass the content through verbatim
412
+ (tool output) or match the requested format (operator-specified).
413
+ Visual hierarchy is a tool, not a mandate.
414
+
415
+ ## Relationship to other rules
416
+
417
+ - `commit-conventions.md` — commit messages have their own format
418
+ discipline; this rule doesn't override them
419
+ - `session-artifacts.md` — chronicle + journal entries have their own
420
+ templates; this rule applies to the agent's conversational output
421
+ around them, not the artifacts themselves
422
+ - `artifact-ingestion.md` — "Sources read" blocks satisfy the
423
+ structured-output requirement; they're already compliant with this
424
+ rule
425
+
426
+ ## Enforcement
427
+
428
+ Methodology-level. No hook today. If agent output consistently ignores
429
+ the rule across sessions, a post-response lint could be added as a
430
+ Stop hook — but the first line of defense is the rule loading into
431
+ every session via `additionalDirectories`.
432
+
433
+ ## Override path
434
+
435
+ None needed. The rule prescribes a style; operator may request
436
+ alternative formatting per-response ("just give me the bullet list")
437
+ and the agent complies without rule violation.