@thebassclef/lite 1.0.4 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.cjs +65 -0
- package/dist/cli.js +65 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/lite/.claude/agents/architect.md +70 -0
- package/dist/lite/.claude/agents/builder.md +114 -0
- package/dist/lite/.claude/agents/designer.md +156 -0
- package/dist/lite/.claude/agents/reviewer.md +88 -0
- package/dist/lite/.claude/hooks/bassclef-sync.sh +85 -27
- package/dist/lite/.claude/hooks/longrun-prep-compounding-axis-check.sh +492 -0
- package/dist/lite/.claude/hooks/longrun-prep-render-check.sh +236 -0
- package/dist/lite/.claude/hooks/persona-name-scrub-check.sh +105 -0
- package/dist/lite/.claude/hooks/skill-step-list-check.sh +171 -0
- package/dist/lite/.claude/luminaries/alan-cooper.md +170 -0
- package/dist/lite/.claude/luminaries/alistair-cockburn.md +140 -0
- package/dist/lite/.claude/luminaries/amazon-pr-faq.md +34 -0
- package/dist/lite/.claude/luminaries/andreas-zeller.md +74 -0
- package/dist/lite/.claude/luminaries/ash-maurya.md +121 -0
- package/dist/lite/.claude/luminaries/bill-buxton.md +210 -0
- package/dist/lite/.claude/luminaries/charles-sanders-peirce.md +150 -0
- package/dist/lite/.claude/luminaries/david-ogilvy.md +192 -0
- package/dist/lite/.claude/luminaries/don-norman.md +173 -0
- package/dist/lite/.claude/luminaries/edward-tufte.md +179 -0
- package/dist/lite/.claude/luminaries/eric-evans.md +160 -0
- package/dist/lite/.claude/luminaries/frederick-brooks.md +50 -0
- package/dist/lite/.claude/luminaries/gang-of-four.md +157 -0
- package/dist/lite/.claude/luminaries/glenford-myers.md +230 -0
- package/dist/lite/.claude/luminaries/hunt-thomas.md +115 -0
- package/dist/lite/.claude/luminaries/hyrum-wright.md +94 -0
- package/dist/lite/.claude/luminaries/jason-fried-dhh.md +46 -0
- package/dist/lite/.claude/luminaries/jesse-james-garrett.md +154 -0
- package/dist/lite/.claude/luminaries/john-ousterhout.md +94 -0
- package/dist/lite/.claude/luminaries/karl-popper.md +132 -0
- package/dist/lite/.claude/luminaries/kent-beck.md +168 -0
- package/dist/lite/.claude/luminaries/linus-torvalds.md +218 -0
- package/dist/lite/.claude/luminaries/martin-fowler.md +164 -0
- package/dist/lite/.claude/luminaries/michael-feathers.md +125 -0
- package/dist/lite/.claude/luminaries/michael-nygard.md +118 -0
- package/dist/lite/.claude/luminaries/robert-c-martin.md +164 -0
- package/dist/lite/.claude/luminaries/saltzer-schroeder.md +194 -0
- package/dist/lite/.claude/luminaries/sophia-prater.md +193 -0
- package/dist/lite/.claude/luminaries/stephen-toulmin.md +131 -0
- package/dist/lite/.claude/luminaries/tony-hoare.md +170 -0
- package/dist/lite/.claude/luminaries/vaughn-vernon.md +50 -0
- package/dist/lite/.claude/luminaries/w-edwards-deming.md +158 -0
- package/dist/lite/.claude/rules/accessor-library-discipline.md +110 -0
- package/dist/lite/.claude/rules/adr-discipline.md +96 -0
- package/dist/lite/.claude/rules/api-conventions.md +115 -0
- package/dist/lite/.claude/rules/artifact-ingestion.md +137 -0
- package/dist/lite/.claude/rules/assert-only-after-verify.md +111 -0
- package/dist/lite/.claude/rules/blocked-items.md +139 -0
- package/dist/lite/.claude/rules/bootstrap-pair-discipline.md +106 -0
- package/dist/lite/.claude/rules/branching.md +28 -0
- package/dist/lite/.claude/rules/cold-adopter-harness-discipline.md +93 -0
- package/dist/lite/.claude/rules/commit-conventions.md +22 -0
- package/dist/lite/.claude/rules/compounding-axis-fresh-analysis.md +173 -0
- package/dist/lite/.claude/rules/compounding-sequence-fresh-analysis.md +173 -0
- package/dist/lite/.claude/rules/context-engineering.md +155 -0
- package/dist/lite/.claude/rules/context-management.md +85 -0
- package/dist/lite/.claude/rules/defensive-bash.md +52 -0
- package/dist/lite/.claude/rules/deferred-actions.md +233 -0
- package/dist/lite/.claude/rules/destructive-operations.md +69 -0
- package/dist/lite/.claude/rules/diagnosis.md +38 -0
- package/dist/lite/.claude/rules/github-issue-flash-tweet.md +114 -0
- package/dist/lite/.claude/rules/guardrails.md +73 -0
- package/dist/lite/.claude/rules/hook-wire-on-author.md +77 -0
- package/dist/lite/.claude/rules/identifier-leak-prevention.md +73 -0
- package/dist/lite/.claude/rules/iteration-bet-brief-completeness.md +43 -0
- package/dist/lite/.claude/rules/lite-manifest-schema-change-discipline.md +79 -0
- package/dist/lite/.claude/rules/longrun-prep-plan-doc-compression.md +77 -0
- package/dist/lite/.claude/rules/loop-discipline.md +71 -0
- package/dist/lite/.claude/rules/manual-prod-approval.md +100 -0
- package/dist/lite/.claude/rules/marker-enrichment-discipline.md +72 -0
- package/dist/lite/.claude/rules/mobile-ephemeral-session.md +109 -0
- package/dist/lite/.claude/rules/new-dependency-check.md +44 -0
- package/dist/lite/.claude/rules/oo-ad-entry-point.md +95 -0
- package/dist/lite/.claude/rules/operator-facing-prose.md +177 -0
- package/dist/lite/.claude/rules/option-label-discipline.md +82 -0
- package/dist/lite/.claude/rules/pattern-annotation.md +83 -0
- package/dist/lite/.claude/rules/persona-name-leak-scrub.md +90 -0
- package/dist/lite/.claude/rules/plain-english-discipline.md +132 -0
- package/dist/lite/.claude/rules/plan-enumeration-needs-value-props.md +177 -0
- package/dist/lite/.claude/rules/pr-body-shape.md +195 -0
- package/dist/lite/.claude/rules/pr-strategy.md +142 -0
- package/dist/lite/.claude/rules/pr-title-shape.md +90 -0
- package/dist/lite/.claude/rules/prototype-workflow.md +53 -0
- package/dist/lite/.claude/rules/reserved-skill-names.md +103 -0
- package/dist/lite/.claude/rules/schema-management.md +42 -0
- package/dist/lite/.claude/rules/sdlc-gates.md +149 -0
- package/dist/lite/.claude/rules/security.md +37 -0
- package/dist/lite/.claude/rules/session-artifacts.md +236 -0
- package/dist/lite/.claude/rules/skill-composition-declarations.md +105 -0
- package/dist/lite/.claude/rules/skill-description-clarity.md +196 -0
- package/dist/lite/.claude/rules/skill-procedure-step-list.md +119 -0
- package/dist/lite/.claude/rules/sprint-prep-preset-picker.md +76 -0
- package/dist/lite/.claude/rules/state-schema-validation.md +156 -0
- package/dist/lite/.claude/rules/stuck-signal-diagnostic.md +111 -0
- package/dist/lite/.claude/rules/substrate-config-schema.md +85 -0
- package/dist/lite/.claude/rules/test-list-discipline.md +129 -0
- package/dist/lite/.claude/rules/test-sufficiency.md +186 -0
- package/dist/lite/.claude/rules/testing-tier-config.md +125 -0
- package/dist/lite/.claude/rules/testing.md +38 -0
- package/dist/lite/.claude/rules/turn-estimate-grounding.md +82 -0
- package/dist/lite/.claude/rules/visual-hierarchy.md +427 -0
- package/dist/lite/.claude/rules/we-dont-break-adopters.md +103 -0
- package/dist/lite/.claude/rules/whereami-load-bearing.md +184 -0
- package/dist/lite/.claude/rules/writing-craft-discipline.md +72 -0
- package/dist/lite/.claude/rules/wu-sequencing-compounds.md +119 -0
- package/dist/lite/.claude/skills/build/SKILL.md +640 -0
- package/dist/lite/.claude/skills/chronicle/SKILL.md +55 -0
- package/dist/lite/.claude/skills/clean-artifacts/SKILL.md +249 -0
- package/dist/lite/.claude/skills/decompose/SKILL.md +280 -0
- package/dist/lite/.claude/skills/diagnose/SKILL.md +297 -0
- package/dist/lite/.claude/skills/feynman/SKILL.md +90 -0
- package/dist/lite/.claude/skills/howdoi/SKILL.md +105 -0
- package/dist/lite/.claude/skills/ia-model/SKILL.md +108 -0
- package/dist/lite/.claude/skills/interaction-design/SKILL.md +112 -0
- package/dist/lite/.claude/skills/interpret-input/SKILL.md +180 -0
- package/dist/lite/.claude/skills/journal/SKILL.md +209 -0
- package/dist/lite/.claude/skills/kiss/SKILL.md +449 -0
- package/dist/lite/.claude/skills/launch/SKILL.md +915 -0
- package/dist/lite/.claude/skills/lean-canvas/SKILL.md +332 -0
- package/dist/lite/.claude/skills/longrun/SKILL.md +512 -0
- package/dist/lite/.claude/skills/luminary/SKILL.md +481 -0
- package/dist/lite/.claude/skills/ogilvy-writing-audit/SKILL.md +177 -0
- package/dist/lite/.claude/skills/onboard-repo/SKILL.md +1640 -0
- package/dist/lite/.claude/skills/pattern-review/SKILL.md +99 -0
- package/dist/lite/.claude/skills/personas/SKILL.md +207 -0
- package/dist/lite/.claude/skills/promote/SKILL.md +283 -0
- package/dist/lite/.claude/skills/requirement/SKILL.md +98 -0
- package/dist/lite/.claude/skills/retro/SKILL.md +117 -0
- package/dist/lite/.claude/skills/riff/SKILL.md +114 -0
- package/dist/lite/.claude/skills/roadmap-reconcile/SKILL.md +163 -0
- package/dist/lite/.claude/skills/session-end/SKILL.md +309 -0
- package/dist/lite/.claude/skills/session-log/SKILL.md +299 -0
- package/dist/lite/.claude/skills/skills/SKILL.md +228 -0
- package/dist/lite/.claude/skills/spec/SKILL.md +105 -0
- package/dist/lite/.claude/skills/sprint/SKILL.md +418 -0
- package/dist/lite/.claude/skills/stage/SKILL.md +384 -0
- package/dist/lite/.claude/skills/state-a-problem/SKILL.md +185 -0
- package/dist/lite/.claude/skills/temperance/SKILL.md +108 -0
- package/dist/lite/.claude/skills/use-case/SKILL.md +417 -0
- package/dist/lite/.claude/skills/user-stories/SKILL.md +268 -0
- package/dist/lite/.claude/skills/value-prop/SKILL.md +251 -0
- package/dist/lite/.claude/skills/verify/SKILL.md +160 -0
- package/dist/lite/.claude/skills/visual-review/SKILL.md +503 -0
- package/dist/lite/.claude/skills/whats-the-plan/SKILL.md +202 -0
- package/dist/lite/.claude/skills/whereami/SKILL.md +307 -0
- package/dist/lite/AGENTS.md +79 -0
- package/dist/lite/CLAUDE-lite.md +85 -0
- package/dist/lite/CODE_OF_CONDUCT.md +28 -0
- package/dist/lite/CONTRIBUTING.md +177 -0
- package/dist/lite/README.md +173 -0
- package/dist/lite/SECURITY.md +19 -0
- package/dist/lite/architecture/decisions/ADR-029-release-pipeline.md +79 -0
- package/dist/lite/architecture/decisions/ADR-031-non-breaking-changes-adopter-discipline.md +139 -0
- package/dist/lite/architecture/decisions/ADR-032-adopter-sync-dispatcher-architecture.md +192 -0
- package/dist/lite/architecture/decisions/ADR-039-release-tagging-scheme.md +145 -0
- package/dist/lite/architecture/decisions/ADR-040-planning-skill-vocabulary-and-lite-profile.md +155 -0
- package/dist/lite/architecture/decisions/ADR-044-unified-skill-body-template.md +162 -0
- package/dist/lite/lib/clean-artifacts-sweep.sh +112 -0
- package/dist/lite/lib/code-comment-discipline.sh +144 -0
- package/dist/lite/lib/composer-preflight.sh +459 -0
- package/dist/lite/lib/deferred-actions.sh +146 -0
- package/dist/lite/lib/hook-header-parser.sh +61 -0
- package/dist/lite/lib/hook-heartbeat.sh +152 -0
- package/dist/lite/lib/hook-inject.sh +255 -0
- package/dist/lite/lib/hook-installer.sh +195 -0
- package/dist/lite/lib/luminary-pick.sh +96 -0
- package/dist/lite/lib/output-discipline.sh +143 -0
- package/dist/lite/lib/prose-scan-boundary.sh +171 -0
- package/dist/lite/lib/rewrite-check.sh +214 -0
- package/dist/lite/lib/session-rescue.sh +151 -0
- package/dist/lite/lib/source-graph-walker.sh +277 -0
- package/dist/lite/lib/state.sh +1372 -0
- package/dist/lite/lib/telemetry.sh +205 -0
- package/dist/lite/lib/tier-check.sh +187 -0
- package/dist/lite/lib/tier-dependency-audit.sh +1088 -0
- package/dist/lite/presence/install/bassclef-hook-connect.sh +178 -0
- package/dist/lite/presence/install/bassclef-sync.dispatcher.template.sh +841 -0
- package/dist/lite/presence/install/bassclef-sync.template.sh +2278 -0
- package/dist/lite/presence/install/schedule-auto-save.cron.sh +88 -0
- package/dist/lite/presence/install/schedule-auto-save.taskscheduler.md +122 -0
- package/dist/lite/scripts/aggregate-telemetry.sh +217 -0
- package/dist/lite/scripts/analyze-tier-dependencies.sh +239 -0
- package/dist/lite/scripts/generate-lite-manifest.sh +505 -0
- package/dist/lite/scripts/generate-tier-manifest.sh +28 -0
- package/dist/lite/scripts/intent-drift-check.sh +456 -0
- package/dist/lite/scripts/lite-manifest-drift-check.sh +146 -0
- package/dist/lite/scripts/render-lite-manifest-doc.sh +150 -0
- package/dist/lite/standards/adr-template.md +86 -0
- package/dist/lite/standards/api-conventions/nextjs.md +84 -0
- package/dist/lite/standards/artifact-composition.md +209 -0
- package/dist/lite/standards/bash-hook-safety.md +246 -0
- package/dist/lite/standards/bassclef-configs-schema.md +232 -0
- package/dist/lite/standards/bassclef-evolution.md +143 -0
- package/dist/lite/standards/bassclef-internal-jargon.md +244 -0
- package/dist/lite/standards/bassclef-managed-sentinel.md +96 -0
- package/dist/lite/standards/bassclef-source-config.md +228 -0
- package/dist/lite/standards/branch-stacking.md +408 -0
- package/dist/lite/standards/code-safety-principles.md +176 -0
- package/dist/lite/standards/composer-prerequisites.md +155 -0
- package/dist/lite/standards/deferred-actions-schema.md +204 -0
- package/dist/lite/standards/dependency-discipline/cargo.md +39 -0
- package/dist/lite/standards/dependency-discipline/gem.md +43 -0
- package/dist/lite/standards/dependency-discipline/go-mod.md +41 -0
- package/dist/lite/standards/dependency-discipline/npm.md +42 -0
- package/dist/lite/standards/dependency-discipline/pip.md +42 -0
- package/dist/lite/standards/deployment-topology/ec2-tailscale.md +225 -0
- package/dist/lite/standards/deployment-topology.md +69 -0
- package/dist/lite/standards/docs-sync-allowlist.md +76 -0
- package/dist/lite/standards/domain-and-dns.md +145 -0
- package/dist/lite/standards/frontend-stack.md +67 -0
- package/dist/lite/standards/frontmatter-schema.md +154 -0
- package/dist/lite/standards/graceful-exit.md +227 -0
- package/dist/lite/standards/hook-idempotency.md +102 -0
- package/dist/lite/standards/hook-injection-discipline.md +202 -0
- package/dist/lite/standards/hook-install-class.md +215 -0
- package/dist/lite/standards/input-handler-interface.md +152 -0
- package/dist/lite/standards/lite-manifest-schema-changes.md +180 -0
- package/dist/lite/standards/lite-manifest.json +2797 -0
- package/dist/lite/standards/luminary-matching.md +105 -0
- package/dist/lite/standards/luminary-problem-patterns.md +481 -0
- package/dist/lite/standards/migration-discipline/active-record.md +50 -0
- package/dist/lite/standards/migration-discipline/alembic.md +43 -0
- package/dist/lite/standards/migration-discipline/gorm.md +50 -0
- package/dist/lite/standards/migration-discipline/prisma.md +53 -0
- package/dist/lite/standards/migration-discipline/sqlalchemy.md +51 -0
- package/dist/lite/standards/mobile-ephemeral-session.md +167 -0
- package/dist/lite/standards/model-routing-discipline.md +160 -0
- package/dist/lite/standards/ogilvy-writing-rules.md +225 -0
- package/dist/lite/standards/opener-discipline.md +96 -0
- package/dist/lite/standards/operator-facing-prose-discipline.md +201 -0
- package/dist/lite/standards/persona-schema.md +229 -0
- package/dist/lite/standards/pluggable-luminaries.md +323 -0
- package/dist/lite/standards/pr-body-discipline.md +115 -0
- package/dist/lite/standards/preview-state-schema.md +189 -0
- package/dist/lite/standards/project-directory-layout.md +276 -0
- package/dist/lite/standards/release-tagging.md +137 -0
- package/dist/lite/standards/reserved-skill-names.md +120 -0
- package/dist/lite/standards/scannable-multi-option-output.md +265 -0
- package/dist/lite/standards/sdlc-compliance.md +286 -0
- package/dist/lite/standards/sdlc-gates/typescript.md +57 -0
- package/dist/lite/standards/secrets-lifecycle.md +210 -0
- package/dist/lite/standards/security-scanner-adapter.md +145 -0
- package/dist/lite/standards/session-board.md +256 -0
- package/dist/lite/standards/skill-output-discipline.md +121 -0
- package/dist/lite/standards/state-spine-contract.md +255 -0
- package/dist/lite/standards/state-spine.md +511 -0
- package/dist/lite/standards/steering-hints/kiss-words.md +11 -0
- package/dist/lite/standards/substrate-config-schema.md +267 -0
- package/dist/lite/standards/tech-stack-config.md +109 -0
- package/dist/lite/standards/tier-dependency-analysis.md +167 -0
- package/dist/lite/standards/tier-runtime-deps/lite.md +57 -0
- package/dist/lite/standards/tier-tag-schema.md +155 -0
- package/dist/lite/standards/two-layer-config.md +99 -0
- package/dist/lite/standards/use-case-format.md +292 -0
- package/dist/lite/standards/user-story-invest.md +268 -0
- package/dist/lite/standards/velocity-and-appetite.md +229 -0
- package/dist/lite/standards/voice-input-pattern.md +119 -0
- package/dist/lite/standards/whereami-schema.md +301 -0
- package/dist/lite/standards/worktree-management.md +211 -0
- package/dist/lite/standards/writing-guide.md +213 -0
- package/dist/lite/templates/chronicle-template.md +75 -0
- package/dist/lite/templates/deferred-action-template.md +45 -0
- package/dist/lite/templates/memory-proposal-template.md +77 -0
- package/dist/lite/templates/persona-template.md +200 -0
- package/dist/lite/templates/pr-faq.md +45 -0
- package/dist/lite/templates/secret-rotation-template.md +162 -0
- package/dist/lite/templates/spec-template.md +131 -0
- package/dist/lite/templates/use-case-template.md +194 -0
- package/dist/lite/templates/user-story-template.md +107 -0
- package/dist/lite/templates/whereami-template.md +101 -0
- package/package.json +1 -1
|
@@ -0,0 +1,427 @@
|
|
|
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
|
+
## Applies to
|
|
386
|
+
|
|
387
|
+
- Session-end summaries
|
|
388
|
+
- PR descriptions generated by the agent
|
|
389
|
+
- `/sprint`, `/whereami`, `/whats-the-plan` outputs
|
|
390
|
+
- `/value-prop`, `/feynman`, `/kiss` outputs
|
|
391
|
+
- `/diagnose`, `/architect-review`, `/pattern-review` reports
|
|
392
|
+
- Any gut-check or status report longer than a few sentences
|
|
393
|
+
|
|
394
|
+
## Does NOT apply to
|
|
395
|
+
|
|
396
|
+
- Short answers (<3 sentences) — keep single-line answers single-line
|
|
397
|
+
- Tool-output relays (commit messages, test output) — don't reformat
|
|
398
|
+
- Code content — never decorate diff blocks
|
|
399
|
+
- When the operator explicitly asks for "just the bullet" / "one line"
|
|
400
|
+
|
|
401
|
+
INSTEAD for the exempt cases: pass the content through verbatim
|
|
402
|
+
(tool output) or match the requested format (operator-specified).
|
|
403
|
+
Visual hierarchy is a tool, not a mandate.
|
|
404
|
+
|
|
405
|
+
## Relationship to other rules
|
|
406
|
+
|
|
407
|
+
- `commit-conventions.md` — commit messages have their own format
|
|
408
|
+
discipline; this rule doesn't override them
|
|
409
|
+
- `session-artifacts.md` — chronicle + journal entries have their own
|
|
410
|
+
templates; this rule applies to the agent's conversational output
|
|
411
|
+
around them, not the artifacts themselves
|
|
412
|
+
- `artifact-ingestion.md` — "Sources read" blocks satisfy the
|
|
413
|
+
structured-output requirement; they're already compliant with this
|
|
414
|
+
rule
|
|
415
|
+
|
|
416
|
+
## Enforcement
|
|
417
|
+
|
|
418
|
+
Methodology-level. No hook today. If agent output consistently ignores
|
|
419
|
+
the rule across sessions, a post-response lint could be added as a
|
|
420
|
+
Stop hook — but the first line of defense is the rule loading into
|
|
421
|
+
every session via `additionalDirectories`.
|
|
422
|
+
|
|
423
|
+
## Override path
|
|
424
|
+
|
|
425
|
+
None needed. The rule prescribes a style; operator may request
|
|
426
|
+
alternative formatting per-response ("just give me the bullet list")
|
|
427
|
+
and the agent complies without rule violation.
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
description: "Bassclef adopts Linus Torvalds's rule: we do not break adopters."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# We don't break adopters
|
|
7
|
+
|
|
8
|
+
Bassclef adopts Linus Torvalds's rule: **we do not break adopters**. Every change to a surface adopters see must keep their existing setup working. When a change would break an adopter, bassclef pays the migration cost. Adopters never pay for bassclef's internal cleanup.
|
|
9
|
+
|
|
10
|
+
**Adopter-count threshold (per ADR-041, added 2026-07-17):** the mechanism for keeping adopters working scales with adopter count.
|
|
11
|
+
|
|
12
|
+
- **N ≤ 24 active adopters** (current: 5) — substrate renames ship immediate. Old vocabulary in prior artifacts (session logs, past goal docs, chronicles, closed PRs) reads through `standards/vocabulary-migration.json`. No compat-shim SKILL stubs per rename. No 90-day grace window on prose. The operator Slacks each adopter about renames as they ship.
|
|
13
|
+
- **N ≥ 25 active adopters** — the full compat-shim discipline returns: rename ships with compat alias, fixture, migration manifest, 90-day grace window on prose, adopter changelog entry.
|
|
14
|
+
|
|
15
|
+
Adopter count read from `standards/bassclef-source-consumers.json` and `.claude/rules/sibling-smoke-after-substrate-change.md` (sibling-smoke rule ships at standard tier). A backlog ticket tracks the counter mechanism (see ADR-041 Decision 4).
|
|
16
|
+
|
|
17
|
+
**Behavior changes stay under full discipline regardless of adopter count.** API contract changes, schema shape changes, and hook filename changes still ship with compat shims — the translation table cannot help there. Only vocabulary renames (word-for-word substitution) qualify for the translation-table path.
|
|
18
|
+
|
|
19
|
+
This rule is the methodology layer. The mechanical layer (CI test that clones a representative adopter and verifies their sync hook against the proposed bassclef HEAD; pre-rename validation; the bassclef-source-redirect registry) is Phase 2 work tracked under bassclef#1360.
|
|
20
|
+
|
|
21
|
+
## When this rule fires
|
|
22
|
+
|
|
23
|
+
Any change to bassclef-upstream or public bassclef that touches an **adopter-observable surface**:
|
|
24
|
+
|
|
25
|
+
**Filesystem surfaces:**
|
|
26
|
+
- Filesystem paths under `~/src/sunj-labs/` that adopter repos symlink into (`canonical/`, `bassclef/`, etc.)
|
|
27
|
+
- Symlink targets inside `<adopter>/.claude/hooks/` or `<adopter>/.claude/skills/`
|
|
28
|
+
- Filenames referenced by adopter `.claude/settings.json` (e.g., the bassclef-sync filename (renamed from a former canonical name per ADR-031))
|
|
29
|
+
- Schema shape of state-spine files (entity types, required frontmatter fields, marker formats)
|
|
30
|
+
- `settings.json` `additionalDirectories` path conventions
|
|
31
|
+
- Repo names and sync URLs in `.bassclef-source.json`
|
|
32
|
+
- Hook filenames, agent names, skill directory names that adopter automation invokes
|
|
33
|
+
|
|
34
|
+
**gh API surfaces (per bassclef-upstream#404):**
|
|
35
|
+
- Label names — rename affects `gh issue list --label X`, `gh pr list --label X`, saved filter URLs, and webhook payloads
|
|
36
|
+
- Label descriptions — visible on hover in GitHub UI + in `gh label list` output; carry brand vocabulary adopters quote
|
|
37
|
+
- Repo description — visible on repo home page + in `gh repo view --json description` + at discovery surfaces
|
|
38
|
+
- Repo topics — discovery + search surface
|
|
39
|
+
- Milestone titles + descriptions — adopters filter by these
|
|
40
|
+
- Project descriptions (gh projects v2) — when used for cross-repo coordination
|
|
41
|
+
|
|
42
|
+
Use `scripts/migrate-gh-surfaces.sh` (sister to `migrate-adopter-references.sh`) to sweep gh API surfaces during a rename event. Defaults to `--dry-run`; operator runs `--apply` after confirming the proposed diff.
|
|
43
|
+
|
|
44
|
+
Does NOT fire on:
|
|
45
|
+
- Internal bassclef refactors that don't change any of the above (private/methodology docs, operator-private content)
|
|
46
|
+
- Strict additions (new skills/rules/hooks that don't replace existing surfaces)
|
|
47
|
+
- gh API surfaces internal to a repo (issue body content, PR review comments, individual issue numbers — those have their own discipline)
|
|
48
|
+
|
|
49
|
+
## What the rule requires
|
|
50
|
+
|
|
51
|
+
When a substrate change touches an adopter-observable surface:
|
|
52
|
+
|
|
53
|
+
1. **Compatibility shim** — the old surface must keep working. Filesystem rename → leave a symlink at the old path. Filename rename → keep an alias or a one-line forwarding stub at the old name. Schema field rename → continue accepting both during the deprecation window.
|
|
54
|
+
2. **Migration manifest** — file at `docs/operator-private/forward-port-registry/migrations/<date>-<change-slug>.md` documenting: what changed, what the shim is, when adopters can safely remove it, the path forward.
|
|
55
|
+
3. **Adopter changelog entry** — when /release ships the change to public bassclef, the PR body's Summary section names the rename + the shim + when the shim retires.
|
|
56
|
+
4. **Deprecation period** — minimum one /release cycle between "shim in place + old surface deprecated" and "shim removable / breaking change ships." Documented explicitly per change.
|
|
57
|
+
5. **Override path** — if a breaking change is genuinely unavoidable, file an ADR explaining why, AND add a `**BREAKING:**` section to the next /release's PR body, AND set the deprecation period to ≥3 release cycles for any high-blast-radius surface.
|
|
58
|
+
|
|
59
|
+
## Anti-patterns
|
|
60
|
+
|
|
61
|
+
These shapes violate the rule:
|
|
62
|
+
|
|
63
|
+
- **Silent rename** — old name removed, no shim, adopters discover when they `git pull` and something disappears. (Exactly what tonight's `mv canonical bassclef` did before the rescue symlink.)
|
|
64
|
+
- **"It works on my machine" testing** — substrate-renames tested only against the operator's own setup, not against adopter sync paths.
|
|
65
|
+
- **Breaking change disguised as feature work** — a feat: commit that happens to rename a public schema field; adopters' parsers break silently.
|
|
66
|
+
- **One-shot fallback** — the existing `bassclef-sync.sh` line `if [ -d $CWD/../bassclef ]; then ... else $CWD/../canonical` is a one-shot fallback, NOT a compat shim. It papers over the rename for new clones; it doesn't help adopters who already have stale symlinks.
|
|
67
|
+
|
|
68
|
+
INSTEAD of any of those: leave the old surface in place as a redirect/symlink/alias; deprecate it explicitly with a date; ship the migration manifest; surface the change in the adopter changelog.
|
|
69
|
+
|
|
70
|
+
## How this composes with existing substrate
|
|
71
|
+
|
|
72
|
+
- `architecture/decisions/ADR-024-forward-port-registry.md` — Strategy A-clean (replace adopter-facing names, no grace period) was the prior default. **This rule supersedes that for adopter-observable surfaces** — compat shims and grace periods are now required. Operator-internal rewrites (chronicles, ADRs, iteration-bets) keep Strategy A-clean.
|
|
73
|
+
- `architecture/decisions/ADR-019-reference-vs-vendor-distribution.md` — reference-binding adopters (HTTP API, agent-read URLs) need URL-stability; vendor-binding adopters need filesystem-path-stability. This rule covers both.
|
|
74
|
+
- `architecture/decisions/ADR-029-release-pipeline.md` — every /release that touches an adopter-observable surface MUST include a migration-manifest reference in the PR body.
|
|
75
|
+
- `architecture/decisions/ADR-030-adopter-inbox-flow.md` — adopters file issues when something silently breaks; this rule makes those issues a defect signal, not an acceptable channel.
|
|
76
|
+
- `architecture/decisions/ADR-031-non-breaking-changes-adopter-discipline.md` — the architectural decision that adopts this rule as Tier 1.
|
|
77
|
+
- `architecture/dual-repo-flow.md` — contains the "Non-breaking changes to adopters" section that this rule operationalizes.
|
|
78
|
+
|
|
79
|
+
## Override path
|
|
80
|
+
|
|
81
|
+
`SKIP_ADOPTER_COMPAT=1 <command>` — for genuinely-exceptional cases. Logged via trace-helper. Use only when:
|
|
82
|
+
|
|
83
|
+
- The breaking change ships under an explicit ADR with `**BREAKING:**` PR body section
|
|
84
|
+
- Deprecation period ≥3 /release cycles has elapsed since the deprecation announcement
|
|
85
|
+
- A migration manifest exists with documented automated remediation
|
|
86
|
+
|
|
87
|
+
INSTEAD of overriding for routine work: write the compat shim. The cost is small (one symlink, one alias, one forwarding stub); the adopter trust compounds across every future release.
|
|
88
|
+
|
|
89
|
+
## Composes with
|
|
90
|
+
|
|
91
|
+
- `@luminary linus-torvalds` — anchor for the discipline (we don't break userspace)
|
|
92
|
+
- `@luminary hyrum-wright` — theoretical foundation (with enough users, all observable behaviors are depended on)
|
|
93
|
+
- `@luminary michael-nygard` — circuit-breaker / stability-pattern shape
|
|
94
|
+
- `@luminary vaughn-vernon` — anticorruption layer between bassclef-internal renames and adopter-observable state
|
|
95
|
+
- `@luminary frederick-brooks` — conceptual integrity vs migration cost trade-off
|
|
96
|
+
- `.claude/rules/destructive-operations.md` — sister discipline at the local-action layer
|
|
97
|
+
- `.claude/rules/sdlc-gates.md` — temperance gate must fire before any rename touching adopter-observable surfaces
|
|
98
|
+
|
|
99
|
+
## When the discipline costs more than the rename benefit
|
|
100
|
+
|
|
101
|
+
Sometimes the migration cost will exceed the rename benefit. That's a signal NOT to do the rename. Adopter compatibility is the constraint that disciplines bassclef-internal refactoring — if a rename can't be made non-breaking, the rename probably isn't worth doing. This is Brooks's conceptual-integrity discipline as a budget, not as a license.
|
|
102
|
+
|
|
103
|
+
Closes the methodology gap surfaced 2026-06-21. Phase 2 mechanical layer tracked at bassclef#1360.
|