@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.
- package/dist/cli.cjs +2 -0
- package/dist/cli.js +2 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/substrate/.bassclef/lite-manifest.json +999 -92
- package/substrate/.claude/hooks/longrun-prep-compounding-axis-check.sh +492 -0
- package/substrate/.claude/hooks/longrun-prep-compounding-sequence-check.sh +492 -0
- package/substrate/.claude/hooks/pre-commit-gate.sh +1 -2
- package/substrate/.claude/hooks/turn-prose-kiss-check.sh +30 -1
- package/substrate/.claude/luminaries/glenford-myers.md +230 -0
- package/substrate/.claude/luminaries/hunt-thomas.md +115 -0
- package/substrate/.claude/luminaries/hyrum-wright.md +94 -0
- package/substrate/.claude/luminaries/michael-feathers.md +2 -2
- package/substrate/.claude/luminaries/tony-hoare.md +170 -0
- package/substrate/.claude/luminaries/vaughn-vernon.md +50 -0
- package/substrate/.claude/luminaries/w-edwards-deming.md +158 -0
- package/substrate/.claude/rules/accessor-library-discipline.md +138 -0
- package/substrate/.claude/rules/adr-discipline.md +120 -0
- package/substrate/.claude/rules/api-conventions.md +125 -0
- package/substrate/.claude/rules/bootstrap-pair-discipline.md +141 -0
- package/substrate/.claude/rules/cold-adopter-harness-discipline.md +129 -0
- package/substrate/.claude/rules/compounding-axis-fresh-analysis.md +188 -0
- package/substrate/.claude/rules/compounding-sequence-fresh-analysis.md +188 -0
- package/substrate/.claude/rules/defensive-bash.md +68 -0
- package/substrate/.claude/rules/deferred-actions.md +233 -0
- package/substrate/.claude/rules/github-issue-flash-tweet.md +156 -0
- package/substrate/.claude/rules/hook-wire-on-author.md +103 -0
- package/substrate/.claude/rules/iteration-bet-brief-completeness.md +54 -0
- package/substrate/.claude/rules/lite-manifest-schema-change-discipline.md +3 -3
- package/substrate/.claude/rules/longrun-prep-plan-doc-compression.md +89 -0
- package/substrate/.claude/rules/loop-discipline.md +81 -0
- package/substrate/.claude/rules/manual-prod-approval.md +100 -0
- package/substrate/.claude/rules/marker-enrichment-discipline.md +99 -0
- package/substrate/.claude/rules/mobile-ephemeral-session.md +109 -0
- package/substrate/.claude/rules/new-dependency-check.md +51 -0
- package/substrate/.claude/rules/option-label-discipline.md +108 -0
- package/substrate/.claude/rules/pattern-annotation.md +100 -0
- package/substrate/.claude/rules/plain-english-discipline.md +11 -9
- package/substrate/.claude/rules/plan-enumeration-needs-value-props.md +211 -0
- package/substrate/.claude/rules/pr-title-shape.md +161 -0
- package/substrate/.claude/rules/prototype-workflow.md +65 -0
- package/substrate/.claude/rules/reserved-skill-names.md +123 -0
- package/substrate/.claude/rules/schema-management.md +49 -0
- package/substrate/.claude/rules/security.md +37 -0
- package/substrate/.claude/rules/skill-composition-declarations.md +124 -0
- package/substrate/.claude/rules/skill-description-clarity.md +247 -0
- package/substrate/.claude/rules/skill-procedure-step-list.md +137 -0
- package/substrate/.claude/rules/stuck-signal-diagnostic.md +140 -0
- package/substrate/.claude/rules/substrate-config-schema.md +98 -0
- package/substrate/.claude/rules/test-list-discipline.md +175 -0
- package/substrate/.claude/rules/test-sufficiency.md +210 -0
- package/substrate/.claude/rules/testing-tier-config.md +145 -0
- package/substrate/.claude/rules/testing.md +38 -0
- package/substrate/.claude/rules/turn-estimate-grounding.md +134 -0
- package/substrate/.claude/rules/visual-hierarchy.md +437 -0
- package/substrate/.claude/rules/we-dont-break-adopters.md +126 -0
- package/substrate/.claude/rules/wu-sequencing-compounds.md +145 -0
- package/substrate/.claude/skills/build/SKILL.md +1 -1
- package/substrate/.claude/skills/chronicle/SKILL.md +55 -0
- package/substrate/.claude/skills/clean-artifacts/SKILL.md +249 -0
- package/substrate/.claude/skills/decompose/SKILL.md +1 -1
- package/substrate/.claude/skills/diagnose/SKILL.md +1 -1
- package/substrate/.claude/skills/feynman/SKILL.md +90 -0
- package/substrate/.claude/skills/howdoi/SKILL.md +1 -1
- package/substrate/.claude/skills/ia-model/SKILL.md +1 -1
- package/substrate/.claude/skills/interaction-design/SKILL.md +1 -1
- package/substrate/.claude/skills/interpret-input/SKILL.md +8 -8
- package/substrate/.claude/skills/journal/SKILL.md +209 -0
- package/substrate/.claude/skills/kiss/SKILL.md +1 -1
- package/substrate/.claude/skills/launch/SKILL.md +14 -23
- package/substrate/.claude/skills/lean-canvas/SKILL.md +1 -1
- package/substrate/.claude/skills/longrun/SKILL.md +45 -8
- package/substrate/.claude/skills/luminary/SKILL.md +1 -1
- package/substrate/.claude/skills/ogilvy-writing-audit/SKILL.md +1 -1
- package/substrate/.claude/skills/onboard-repo/SKILL.md +143 -709
- package/substrate/.claude/skills/pattern-review/SKILL.md +1 -1
- package/substrate/.claude/skills/personas/SKILL.md +5 -5
- package/substrate/.claude/skills/promote/SKILL.md +1 -1
- package/substrate/.claude/skills/requirement/SKILL.md +1 -1
- package/substrate/.claude/skills/retro/SKILL.md +1 -1
- package/substrate/.claude/skills/riff/SKILL.md +1 -1
- package/substrate/.claude/skills/roadmap-reconcile/SKILL.md +1 -1
- package/substrate/.claude/skills/session-end/SKILL.md +1 -1
- package/substrate/.claude/skills/session-log/SKILL.md +3 -3
- package/substrate/.claude/skills/skills/SKILL.md +1 -1
- package/substrate/.claude/skills/spec/SKILL.md +1 -1
- package/substrate/.claude/skills/sprint/SKILL.md +1 -1
- package/substrate/.claude/skills/stage/SKILL.md +1 -1
- package/substrate/.claude/skills/state-a-problem/SKILL.md +1 -1
- package/substrate/.claude/skills/temperance/SKILL.md +1 -1
- package/substrate/.claude/skills/use-case/SKILL.md +1 -1
- package/substrate/.claude/skills/user-stories/SKILL.md +1 -1
- package/substrate/.claude/skills/value-prop/SKILL.md +1 -1
- package/substrate/.claude/skills/verify/SKILL.md +1 -1
- package/substrate/.claude/skills/visual-review/SKILL.md +503 -0
- package/substrate/.claude/skills/whats-the-plan/SKILL.md +202 -0
- package/substrate/.claude/skills/whereami/SKILL.md +2 -2
- package/substrate/CONTRIBUTING.md +1 -1
- package/substrate/README.md +5 -5
- package/substrate/lib/prose-scan-boundary.sh +171 -0
- package/substrate/lib/tier-check.sh +50 -1
- package/substrate/lib/tier-dependency-audit.sh +159 -4
- package/substrate/presence/install/bassclef-sync.template.sh +1 -1
- package/substrate/scripts/generate-lite-manifest.sh +21 -5
- package/substrate/standards/adr-template.md +86 -0
- package/substrate/standards/api-conventions/nextjs.md +84 -0
- package/substrate/standards/artifact-composition.md +209 -0
- package/substrate/standards/bash-hook-safety.md +246 -0
- package/substrate/standards/branch-stacking.md +408 -0
- package/substrate/standards/code-safety-principles.md +176 -0
- package/substrate/standards/composer-prerequisites.md +155 -0
- package/substrate/standards/dependency-discipline/cargo.md +39 -0
- package/substrate/standards/dependency-discipline/gem.md +43 -0
- package/substrate/standards/dependency-discipline/go-mod.md +41 -0
- package/substrate/standards/dependency-discipline/npm.md +42 -0
- package/substrate/standards/dependency-discipline/pip.md +42 -0
- package/substrate/standards/deployment-topology/ec2-tailscale.md +225 -0
- package/substrate/standards/deployment-topology.md +69 -0
- package/substrate/standards/docs-sync-allowlist.md +4 -4
- package/substrate/standards/domain-and-dns.md +145 -0
- package/substrate/standards/frontend-stack.md +67 -0
- package/substrate/standards/frontmatter-schema.md +154 -0
- package/substrate/standards/hook-injection-discipline.md +202 -0
- package/substrate/standards/hook-install-class.md +215 -0
- package/substrate/standards/input-handler-interface.md +152 -0
- package/substrate/standards/lite-manifest-schema-changes.md +60 -0
- package/substrate/standards/luminary-matching.md +105 -0
- package/substrate/standards/migration-discipline/active-record.md +50 -0
- package/substrate/standards/migration-discipline/alembic.md +43 -0
- package/substrate/standards/migration-discipline/gorm.md +50 -0
- package/substrate/standards/migration-discipline/prisma.md +53 -0
- package/substrate/standards/migration-discipline/sqlalchemy.md +51 -0
- package/substrate/standards/mobile-ephemeral-session.md +167 -0
- package/substrate/standards/model-routing-discipline.md +160 -0
- package/substrate/standards/persona-schema.md +229 -0
- package/substrate/standards/pluggable-luminaries.md +323 -0
- package/substrate/standards/pr-body-discipline.md +115 -0
- package/substrate/standards/preview-state-schema.md +189 -0
- package/substrate/standards/reserved-skill-names.md +120 -0
- package/substrate/standards/scannable-multi-option-output.md +261 -0
- package/substrate/standards/sdlc-gates/typescript.md +57 -0
- package/substrate/standards/session-board.md +256 -0
- package/substrate/standards/state-spine-contract.md +255 -0
- package/substrate/standards/steering-hints/kiss-words.md +11 -0
- package/substrate/standards/substrate-config-schema.md +267 -0
- package/substrate/standards/tier-dependency-analysis.md +1 -1
- package/substrate/standards/tier-tag-schema.md +1 -1
- package/substrate/standards/two-layer-config.md +99 -0
- package/substrate/standards/use-case-format.md +292 -0
- package/substrate/standards/user-story-invest.md +268 -0
- package/substrate/standards/velocity-and-appetite.md +229 -0
- package/substrate/standards/voice-input-pattern.md +119 -0
- package/substrate/standards/worktree-management.md +211 -0
- package/substrate/templates/chronicle-template.md +75 -0
- package/substrate/templates/memory-proposal-template.md +77 -0
- package/substrate/templates/persona-template.md +200 -0
- package/substrate/templates/pr-faq.md +45 -0
- package/substrate/templates/secret-rotation-template.md +162 -0
- package/substrate/templates/spec-template.md +131 -0
- package/substrate/templates/use-case-template.md +194 -0
- 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 (`<`, `>`, `&`) — 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 `'` 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 `'` (HTML entity) OR replace with typographic apostrophe `'` (U+2019) OR move content to card
|
|
344
|
+
- Straight double quote `"` in cell text — write as `"` 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 `<` and `>`; 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 ```
|
|
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.
|