@thebassclef/lite 1.0.3 → 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 +92 -6
- package/dist/cli.js +92 -6
- 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,90 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
description: Adopter-observable body content across SKILLs plus rules plus luminaries plus docs does not carry bassclef persona names (Sam, Louis, Jamie, Morgan). Persona names are internal orientation words. Adopters have zero context on them.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Persona-name leak scrub
|
|
7
|
+
|
|
8
|
+
Adopter-facing content does not carry bassclef persona names. Persona slugs (Sam, Louis, Jamie, Morgan) orient bassclef prose internally. Adopters read SKILL descriptions on `docs.bassclef.dev`, plus SKILL bodies, rule bodies, luminary bodies, and adopter-facing docs. They have no context on who Sam is.
|
|
9
|
+
|
|
10
|
+
This rule closes bassclef-web#327 (V1 description scope) and bassclef-web#339 (V2 body scope).
|
|
11
|
+
|
|
12
|
+
## When this rule fires
|
|
13
|
+
|
|
14
|
+
Every Edit or Write or MultiEdit on any of these adopter-observable path classes:
|
|
15
|
+
|
|
16
|
+
- `.claude/skills/*/SKILL.md` (description AND body prose)
|
|
17
|
+
- `.claude/rules/*.md` (body prose)
|
|
18
|
+
- `.claude/luminaries/*.md` (body prose)
|
|
19
|
+
- `docs/*.md` (adopter-facing documentation)
|
|
20
|
+
- `docs-site/content/*.{md,mdx}` (docs.bassclef.dev source)
|
|
21
|
+
|
|
22
|
+
The hook `.claude/hooks/persona-name-scrub-check.sh` scans the full new_string (Edit), content (Write), or joined edits[].new_string (MultiEdit). Fenced code blocks and inline backticked spans strip before the regex to cure false positives.
|
|
23
|
+
|
|
24
|
+
Skips:
|
|
25
|
+
- Persona files themselves (`docs/personas/*.md` — that IS where personas live)
|
|
26
|
+
- Non-matching paths (source code, README, config)
|
|
27
|
+
- Non-Edit tool calls (Bash, Read, Grep)
|
|
28
|
+
|
|
29
|
+
## V2 body scope shipped
|
|
30
|
+
|
|
31
|
+
V1 (bassclef-web#327, shipped 2026-09-12d): description-only scope. Hook scanned the `description:` frontmatter line only.
|
|
32
|
+
|
|
33
|
+
V2 (bassclef-web#339, shipped 2026-09-13c): body scope. Hook scans the full new_string plus joined MultiEdit edits[]. Covers SKILL bodies, rule bodies, luminary bodies, and adopter-facing `docs/*.md` plus `docs-site/content/*.{md,mdx}`.
|
|
34
|
+
|
|
35
|
+
V2 stays ADVISORY per ADR-031 grace window through 2026-10-31. V3 BLOCK flip deferred pending one calibration cycle.
|
|
36
|
+
|
|
37
|
+
## What the rule requires
|
|
38
|
+
|
|
39
|
+
Adopter-observable content does not carry any of these proper nouns as unquoted words:
|
|
40
|
+
- Sam
|
|
41
|
+
- Louis
|
|
42
|
+
- Jamie
|
|
43
|
+
- Morgan
|
|
44
|
+
|
|
45
|
+
Substitute per context — writer, picker, reviewer, operator, adopter.
|
|
46
|
+
|
|
47
|
+
Backtick a persona name when it names a variable or a quoted external reference. Fenced code blocks and inline backtick spans strip before the regex.
|
|
48
|
+
|
|
49
|
+
## Anti-patterns
|
|
50
|
+
|
|
51
|
+
**Description says "Sam writes formal use cases."** Adopter has no context on Sam.
|
|
52
|
+
INSTEAD: "The writer produces formal use cases."
|
|
53
|
+
|
|
54
|
+
**Description says "Louis picks a marketing variant."**
|
|
55
|
+
INSTEAD: "The picker chooses a marketing variant."
|
|
56
|
+
|
|
57
|
+
**Description says "Written for a Sam-style persona."**
|
|
58
|
+
INSTEAD: drop the phrase or say "Written for a writer-style adopter."
|
|
59
|
+
|
|
60
|
+
**SKILL body Procedure step says "Sam runs /value-prop first, then Louis reviews the output."** Adopter body reader gets zero context.
|
|
61
|
+
INSTEAD: "The writer runs /value-prop first. The reviewer then reads the output."
|
|
62
|
+
|
|
63
|
+
**Rule body cites "This composes with Sam's authoring path."** Adopter rule reader gets zero context.
|
|
64
|
+
INSTEAD: "This composes with the writer authoring path."
|
|
65
|
+
|
|
66
|
+
**Luminary body pin says "Jamie applies this lens on marketing surfaces."** Adopter luminary reader gets zero context.
|
|
67
|
+
INSTEAD: "The picker applies this lens on marketing surfaces."
|
|
68
|
+
|
|
69
|
+
**docs/*.md guide says "Morgan owns the release pipeline."** Adopter docs reader gets zero context.
|
|
70
|
+
INSTEAD: "The release engineer owns the release pipeline." OR name the actual role.
|
|
71
|
+
|
|
72
|
+
**docs-site/*.mdx page renders "Sam and Louis are the primary readers."** Adopter docs.bassclef.dev reader gets zero context.
|
|
73
|
+
INSTEAD: "The writer and the picker are the primary readers." OR describe the audience in role terms.
|
|
74
|
+
|
|
75
|
+
## Override
|
|
76
|
+
|
|
77
|
+
`SKIP_PERSONA_NAME_SCRUB=1 <command>` — logged via trace-helper. Rare cases:
|
|
78
|
+
- Migration script that intentionally references personas
|
|
79
|
+
- Quoted external text
|
|
80
|
+
- Emergency rescue
|
|
81
|
+
|
|
82
|
+
## Composes with
|
|
83
|
+
|
|
84
|
+
- `.claude/rules/plain-english-discipline.md` — master rule; this rule extends to persona proper nouns
|
|
85
|
+
- `.claude/rules/skill-description-clarity.md` — description field discipline
|
|
86
|
+
- `.claude/rules/bootstrap-pair-discipline.md` — rule + hook + tests + wire ship together
|
|
87
|
+
- `.claude/rules/we-dont-break-adopters.md` — V1 ADVISORY default preserves adopter behavior during grace
|
|
88
|
+
- `standards/bassclef-internal-jargon.md` — sister wordlist (generic jargon, not proper nouns)
|
|
89
|
+
- @luminary linus-torvalds — adopter contract
|
|
90
|
+
- @luminary michael-nygard — V1 ADVISORY stability
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
description: All bassclef writing should be plain English at grade 8 with grade 10 as the ceiling for simple technical sentences. Drop bassclef-internal jargon. Keep standard tech vocabulary like API, hook, PR, schema.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Plain-English Discipline
|
|
7
|
+
|
|
8
|
+
All bassclef writing — skills, rules, luminaries, PR bodies, commit messages, chronicles, journal entries, iteration goals — should be plain English at grade 8. Grade 10 is the ceiling for simple technical sentences. Above grade 10 needs a clear reason grades 8-10 could not carry the point. Keep standard technical vocabulary that any digital team would understand. Drop bassclef-internal jargon. Drive for extreme simplicity.
|
|
9
|
+
|
|
10
|
+
Per ticket #935 target shift — the aim moved from grade 10 to grade 8 with grade 10 as ceiling. Steering hook + `standards/steering-hints/kiss-words.md` already carry the new bar. This rule body now matches.
|
|
11
|
+
|
|
12
|
+
This rule is the master discipline. Other rules cover narrow surfaces:
|
|
13
|
+
|
|
14
|
+
- `skill-description-clarity.md` — skill description field (≤280 chars, verb-first, no jargon)
|
|
15
|
+
- `github-issue-flash-tweet.md` — GitHub issue body shape (flash + tweet + detail)
|
|
16
|
+
- `visual-hierarchy.md` — long agent output formatting
|
|
17
|
+
- `context-engineering.md` — INSTEAD-block discipline (the pairing rule for negations)
|
|
18
|
+
|
|
19
|
+
This rule extends those into a unified bar across every writing surface in bassclef.
|
|
20
|
+
|
|
21
|
+
## Why this matters
|
|
22
|
+
|
|
23
|
+
Agent volume keeps climbing. Skills produce more PRs, more chronicles, more draft text. Humans review the output to figure out what's happening with the code. If the writing isn't simple, review collapses. The operator stops trusting the output. The substrate's value compounds in the wrong direction.
|
|
24
|
+
|
|
25
|
+
INSTEAD of writing for "people who know bassclef": write for a senior engineer with no bassclef context. They should grok every PR body, chronicle, and skill description in 60 seconds.
|
|
26
|
+
|
|
27
|
+
## Keep standard technical vocabulary
|
|
28
|
+
|
|
29
|
+
These are common digital-team words. They stay as-is.
|
|
30
|
+
|
|
31
|
+
INSTEAD of expanding them into multi-sentence explanations: use them directly. The reader already knows what an API or schema is.
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
API, SDK, CLI, GUI, HTTP, REST, JSON, YAML, schema, regex, hook,
|
|
35
|
+
repo, branch, commit, PR, MR, CI, CD, workflow, action, artifact,
|
|
36
|
+
function, class, method, property, field, constant, variable, enum,
|
|
37
|
+
database, query, index, migration, transaction, cache, queue, lock,
|
|
38
|
+
container, image, pod, cluster, node, runner, build, deploy, rollback,
|
|
39
|
+
test, assert, mock, stub, fixture, snapshot, regression,
|
|
40
|
+
auth, token, secret, credential, scope, permission, role,
|
|
41
|
+
file, directory, path, glob, pattern, prefix, suffix
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
If a term is in this list, it's fine to use directly. Operator can extend the list when more standard vocabulary surfaces.
|
|
45
|
+
|
|
46
|
+
## Drop bassclef-internal jargon
|
|
47
|
+
|
|
48
|
+
These need substitution because they require bassclef context to parse:
|
|
49
|
+
|
|
50
|
+
| Bassclef jargon | Plain English alternatives |
|
|
51
|
+
|---|---|
|
|
52
|
+
| substrate | the framework / bassclef / the rules |
|
|
53
|
+
| primitive | building block |
|
|
54
|
+
| load-bearing | required / essential |
|
|
55
|
+
| composer | runs / chains / combines |
|
|
56
|
+
| tier-preset | preset / size |
|
|
57
|
+
| compose-with | uses / builds on |
|
|
58
|
+
| scope-bounded | small / tight |
|
|
59
|
+
| operationalize | do / ship |
|
|
60
|
+
| blast radius | impact / what it can break |
|
|
61
|
+
| INSTEAD-block discipline | the pairing rule |
|
|
62
|
+
| stuck-signal | repeated warning |
|
|
63
|
+
| substrate-defect | bug in the rules |
|
|
64
|
+
|
|
65
|
+
These words exist for a reason inside bassclef's design discussions. They belong in design docs, not in PR bodies, chronicles, or any writing aimed at humans without bassclef context.
|
|
66
|
+
|
|
67
|
+
## Drive for extreme simplicity
|
|
68
|
+
|
|
69
|
+
INSTEAD of long sentences and qualifying clauses: short sentences, active voice, concrete examples.
|
|
70
|
+
|
|
71
|
+
| Anti-pattern | INSTEAD |
|
|
72
|
+
|---|---|
|
|
73
|
+
| Long sentences (>30 words) | Break into 2-3 short sentences. Each carries one idea. |
|
|
74
|
+
| Passive voice ("the file was created by the agent") | Active voice ("the agent created the file") |
|
|
75
|
+
| Hedging words ("perhaps", "could potentially", "in some cases") | Direct statement. Either it does or it doesn't. |
|
|
76
|
+
| Buzz adjectives ("comprehensive", "robust", "leverages") | Drop them. Or replace with concrete data. |
|
|
77
|
+
| Methodology references ("Phase 14 of buildable-spec chain") | Either explain the term inline OR drop the reference |
|
|
78
|
+
| Multi-clause noun phrases ("the per-tier deploy-host adapter schema split") | Full plain sentence ("we split the deploy-host adapter schema by tier") |
|
|
79
|
+
|
|
80
|
+
Extreme simplicity is not the same as dumbing down. It means saying the thing once, in the shortest sentence that carries the point.
|
|
81
|
+
|
|
82
|
+
## What this rule does NOT require
|
|
83
|
+
|
|
84
|
+
- Replacing every instance of a banned word — only when context allows. If a word is unavoidable (e.g., quoting a memory file's name), it stays.
|
|
85
|
+
- Hand-paraphrasing technical terms — API stays API. Schema stays schema. Hook stays hook.
|
|
86
|
+
- Grade-school reading level — grade 8 is the aim (per ticket #935; grade 10 stays as the ceiling for simple technical sentences). Operator-readable, not dumbed down.
|
|
87
|
+
- Multi-paragraph expansion of every term — that is contortion, the opposite of what this rule asks for.
|
|
88
|
+
|
|
89
|
+
INSTEAD of trying to scrub every word: focus on the highest-leverage substitutions (bassclef jargon, long sentences, passive voice).
|
|
90
|
+
|
|
91
|
+
## When this rule fires
|
|
92
|
+
|
|
93
|
+
| Surface | Bar | Enforcement |
|
|
94
|
+
|---|---|---|
|
|
95
|
+
| Skill description field (frontmatter) | strict (≤280 chars, no jargon, verb-first) | substrate-clarity-gate hook BLOCKs (file-write) |
|
|
96
|
+
| Skill body | plain English (grade 8 target, ceiling 10); no bassclef jargon | substrate-clarity-gate + skill-body-grade-gate (FKGL 80% at 8-9, ceiling 10) + compound-noun-scrub (blocklist from standards/bassclef-internal-jargon.md per bassclef-upstream#782) — all BLOCK at PreToolUse Edit/Write |
|
|
97
|
+
| Rule body | plain English (grade 8 target, ceiling 10); INSTEAD-block discipline on negations | substrate-clarity-gate + compound-noun-scrub BLOCK at PreToolUse Edit/Write |
|
|
98
|
+
| Luminary body | plain English (grade 8 target, ceiling 10); INSTEAD-block discipline on negations | substrate-clarity-gate hook BLOCKs (file-write) |
|
|
99
|
+
| PR body | plain English (grade 8 target, ceiling 10); no bassclef jargon | bassclef-pr-ci body-clarity advisory job (comments suggestions) |
|
|
100
|
+
| Commit message | conventional-commits format; plain English in body | commit-conventions rule (methodology) |
|
|
101
|
+
| Chronicle | narrative plain English (grade 8 target, ceiling 10) | substrate-clarity-gate hook (advisory; new path matcher in WU-7b) |
|
|
102
|
+
| journal entry | personal/sensory/story-driven voice (per writing voice memory) | advisory only; voice trumps strict rule |
|
|
103
|
+
| Iteration goal body | plain English (grade 8 target, ceiling 10) | substrate-clarity-gate hook (advisory) |
|
|
104
|
+
| Agent turn prose to operator | plain English (grade 8 target, ceiling 10); no bassclef jargon (banned-word list per "Drop bassclef-internal jargon" table above) | Stop hook `turn-prose-kiss-check.sh` scans the most recent assistant message (bassclef#1051). Toggle in `.claude/bassclef-configs.jsonc` (`prose_discipline.kiss_words_turn_prose`): `true` advisory (default), `"strict"` blocks stop, `false` disables. |
|
|
105
|
+
|
|
106
|
+
The hook is the primary backstop. The rule is the reasoning. Skills (`/promote`, `/longrun closeout`, `/chronicle`, `/journal`, `/kiss words`) compose the prevention.
|
|
107
|
+
|
|
108
|
+
**Compound-noun blocklist architecture (V2, bassclef-upstream#782 shipped 2026-07-20 goal 20a Session 2).** The `compound-noun-scrub.sh` hook reads a blocklist from `standards/bassclef-internal-jargon.md` at fire time. Only BLOCK-tier hyphenated compounds trigger. Standard tech compounds (`pre-commit`, `real-time`, `data-driven`) pass automatically because they are not in the blocklist. New invented compounds pass by default until the operator adds a row to the wordlist file. The wordlist is the single operator-editable source of truth. Both `compound-noun-scrub.sh` and `turn-prose-kiss-check.sh` read from the same file — one source of truth, two hook surfaces. Override at hook: `SKIP_COMPOUND_NOUN_SCRUB=1`. Override path at wordlist: `BASSCLEF_JARGON_WORDLIST=<path>` (test-only). Missing wordlist file fails safe (exit 0 with stderr warning).
|
|
109
|
+
|
|
110
|
+
**Turn prose IS hook-reachable via the Stop event** (bassclef#1051 closed bassclef#1027's wrong-premise reading). Claude Code's Stop hook receives `transcript_path` in stdin and can read the most recent assistant message. The `turn-prose-kiss-check.sh` hook fires after every assistant turn, scans the last message against BLOCK terms from `standards/bassclef-internal-jargon.md`, and surfaces findings per the toggle. The per-adopter toggle (`prose_discipline.kiss_words_turn_prose` in `.claude/bassclef-configs.jsonc`): `true` (default) advisory — exit 0, findings to stderr surface at next turn; `"strict"` — exit 2, block stop, force a rewrite turn; `false` disables. The discipline applies to every substantive reply, every status update, every summary — anywhere the agent writes to the operator between tool calls.
|
|
111
|
+
|
|
112
|
+
## Override path
|
|
113
|
+
|
|
114
|
+
`SKIP_PLAIN_ENGLISH=1 <command>` — logged via trace-helper. Use rarely. Examples of legitimate overrides:
|
|
115
|
+
|
|
116
|
+
- Quoting an exact phrase from a memory file or external doc
|
|
117
|
+
- Migrating legacy text where rewriting would lose the audit trail
|
|
118
|
+
- Code blocks where the bassclef jargon IS the variable name
|
|
119
|
+
|
|
120
|
+
Override discipline: silence is not deferral. If you can't pair the override with a one-line reason, the rule probably applies.
|
|
121
|
+
|
|
122
|
+
For turn prose specifically, the override is the per-adopter toggle in `.claude/bassclef-configs.jsonc` — `prose_discipline.kiss_words_turn_prose: false` — not a per-command flag. Turn prose has no command to wrap, so the bypass lives at the configuration layer instead.
|
|
123
|
+
|
|
124
|
+
## Composes with
|
|
125
|
+
|
|
126
|
+
- `skill-description-clarity.md` — narrow case at description surface
|
|
127
|
+
- `github-issue-flash-tweet.md` — narrow case at issue-body surface
|
|
128
|
+
- `context-engineering.md` — INSTEAD-block discipline (foundational)
|
|
129
|
+
- `visual-hierarchy.md` — formatting discipline for long output
|
|
130
|
+
- `commit-conventions.md` — commit message format (separate concern)
|
|
131
|
+
- `pr-strategy.md` — atomic PR rule (separate concern; both ship in Phase II Trim the Fat)
|
|
132
|
+
- `.claude/bassclef-configs.jsonc` — `prose_discipline.kiss_words_turn_prose` toggle backs the turn-prose row in the surfaces table (bassclef#1027)
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
description: When the agent presents options the operator must pick from or evaluate, the whole proposal opens with a full pitch (claim + 3 reasons) and each option lands as a tweet (claim +…
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Plan Enumeration Needs Value-Props
|
|
7
|
+
|
|
8
|
+
When the agent presents options the operator must pick from or evaluate,
|
|
9
|
+
the whole proposal opens with a full pitch (claim + 3 reasons) and each
|
|
10
|
+
option lands as a tweet (claim + sharpener). **Bare names aren't options.**
|
|
11
|
+
Names are labels; each label needs a value-prop attached.
|
|
12
|
+
|
|
13
|
+
## When this rule fires
|
|
14
|
+
|
|
15
|
+
Any agent output that enumerates options for the operator — "Pick A or
|
|
16
|
+
B," "scope choices for this /longrun," "which approach do you want,"
|
|
17
|
+
"three sizes:" — fires this rule.
|
|
18
|
+
|
|
19
|
+
Specific surfaces:
|
|
20
|
+
|
|
21
|
+
- `/longrun` (prep + checkpoint) — scope choices for the session
|
|
22
|
+
- `/sprint` — next-work options
|
|
23
|
+
- `/whats-the-plan` — chains of skills the agent intends to run
|
|
24
|
+
- `/shape` — tier alternatives (quick / light / medium / full)
|
|
25
|
+
- `/kiss` — bucket enumerations (MUST / SHOULD / COULD)
|
|
26
|
+
- `/stage` — variant alternatives presented to operator
|
|
27
|
+
- Any ad-hoc agent output where the operator picks among options
|
|
28
|
+
|
|
29
|
+
Does NOT fire on:
|
|
30
|
+
|
|
31
|
+
- Single-action replies (no options to pick from)
|
|
32
|
+
- Tool-output relays (commit messages, test output)
|
|
33
|
+
- Status reports without choice points (e.g., "shipped X")
|
|
34
|
+
- Code content (diffs, file contents)
|
|
35
|
+
|
|
36
|
+
## What the rule requires
|
|
37
|
+
|
|
38
|
+
### The whole proposal opens with a full pitch
|
|
39
|
+
|
|
40
|
+
Per `/value-prop` verbose mode: **claim + 3 reasons (why-it-matters)**.
|
|
41
|
+
|
|
42
|
+
```markdown
|
|
43
|
+
**The /longrun (full pitch):**
|
|
44
|
+
|
|
45
|
+
Make bassclef's roadmap state machine-readable so /sprint and /longrun
|
|
46
|
+
stop reconstructing scope from chronicles + git log.
|
|
47
|
+
|
|
48
|
+
**Why it matters:**
|
|
49
|
+
|
|
50
|
+
1. First-turn orientation drops from "read three chronicles + git log
|
|
51
|
+
+ open PRs + guess" to one read.
|
|
52
|
+
2. Two parallel sessions can't double-claim work — atomic claim/release
|
|
53
|
+
lands as a primitive.
|
|
54
|
+
3. Operator stops manually clearing rescue files every session.
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Three reasons, plain language, scannable.
|
|
58
|
+
|
|
59
|
+
### Each option lands as a tweet
|
|
60
|
+
|
|
61
|
+
Per `/value-prop` tweet mode: **claim + sharpener, ≤280 chars**.
|
|
62
|
+
|
|
63
|
+
```markdown
|
|
64
|
+
**Pick one:**
|
|
65
|
+
|
|
66
|
+
- **A. WU-2 + WU-3 (~50t)** — Roadmap state becomes machine-readable.
|
|
67
|
+
Two parallel sessions can't pick the same work by accident. Claim/
|
|
68
|
+
release primitives ship.
|
|
69
|
+
|
|
70
|
+
- **B. A + #334 (~70t)** — Plus a save-time check that catches agents
|
|
71
|
+
skipping the roadmap. Read-side and write-side determinism in one shot.
|
|
72
|
+
|
|
73
|
+
- **C. Through WU-5 (~100t)** — Plus /sprint and /longrun actually use
|
|
74
|
+
the new reading. End-to-end this session.
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Each option's value-prop sits next to its name. Operator reads, picks.
|
|
78
|
+
|
|
79
|
+
### Bare names aren't options
|
|
80
|
+
|
|
81
|
+
These are NOT acceptable enumeration shapes:
|
|
82
|
+
|
|
83
|
+
```markdown
|
|
84
|
+
Pick:
|
|
85
|
+
- A
|
|
86
|
+
- B
|
|
87
|
+
- C
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
```markdown
|
|
91
|
+
Pick:
|
|
92
|
+
- WU-2
|
|
93
|
+
- #334
|
|
94
|
+
- WU-5
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
```markdown
|
|
98
|
+
Three options: WU-A, WU-B, WU-C.
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Each option needs a value-prop. If the value-prop is so obvious it
|
|
102
|
+
doesn't need stating, the option probably isn't worth enumerating.
|
|
103
|
+
|
|
104
|
+
## What the rule allows
|
|
105
|
+
|
|
106
|
+
- **Plain language preferred** (composes with `/kiss words` — folds in what was the standalone `/grade10words` skill per bassclef#340).
|
|
107
|
+
- **Tables when the options share a comparable axis** — e.g., "Tier / Estimate / Buys you" — but each row still needs the value-prop column populated.
|
|
108
|
+
- **Skipping the full pitch when the options are presented in passing** — e.g., "Want me to ship A, B, or C?" mid-conversation. The full pitch is for proposal moments; the tweet-per-option discipline still applies.
|
|
109
|
+
- **Inline alternatives** — "I'll ship X (or Y if you'd rather; Y trades speed for safety)" is fine; the alternative carries its sharpener inline.
|
|
110
|
+
|
|
111
|
+
## Anti-patterns
|
|
112
|
+
|
|
113
|
+
Direct quotes from sessions where this rule was missing:
|
|
114
|
+
|
|
115
|
+
- "Pick one: A, B, or C" — three letters, no content
|
|
116
|
+
- "WU-2 + WU-3 (~50t)" alone in a list — bare cost without value
|
|
117
|
+
- "We could do this or that" without naming what each buys
|
|
118
|
+
- "Three sizes — pick by how much determinism you want" without saying which size buys what
|
|
119
|
+
|
|
120
|
+
## How the rule composes with existing skills
|
|
121
|
+
|
|
122
|
+
- `/value-prop` is the primitive — flash/tweet/brief/verbose modes the
|
|
123
|
+
rule references directly.
|
|
124
|
+
|
|
125
|
+
INSTEAD of reinventing the format inline: call the skill. The four
|
|
126
|
+
compression modes already exist; reuse them.
|
|
127
|
+
- `/kiss words` (bassclef#340 folded the planned `/grade10words` into `/kiss`) — substitutes plain language for jargon. Composes orthogonally; an option's tweet should already be in plain language by default.
|
|
128
|
+
- `/feynman` — explanation skill. NOT a substitute for tweet-per-
|
|
129
|
+
option; /feynman is for "explain this concept," not "present these
|
|
130
|
+
choices."
|
|
131
|
+
|
|
132
|
+
## Verification cue (self-check before output)
|
|
133
|
+
|
|
134
|
+
Before presenting an enumeration, ask:
|
|
135
|
+
|
|
136
|
+
1. Did I open with a claim + 3 reasons (full pitch)?
|
|
137
|
+
2. Does each option carry a tweet (claim + sharpener)?
|
|
138
|
+
3. Are any options just labels / IDs / bare names?
|
|
139
|
+
4. Plain language? Or am I using "atomic" / "load-bearing" / "blast radius" without justifying?
|
|
140
|
+
|
|
141
|
+
If any answer is wrong, rewrite before posting.
|
|
142
|
+
|
|
143
|
+
## Relationship to other rules
|
|
144
|
+
|
|
145
|
+
- `feedback_lead_with_flash.md` (memory) — the operator-feedback
|
|
146
|
+
precedent; this rule codifies it as substrate
|
|
147
|
+
- `visual-hierarchy.md` — long agent output uses tables/headers/HRs;
|
|
148
|
+
this rule adds the value-prop content discipline that makes the
|
|
149
|
+
hierarchy useful
|
|
150
|
+
- `artifact-ingestion.md` — "Sources read" block discipline; this rule
|
|
151
|
+
is the analogous "options presented" discipline
|
|
152
|
+
- `commit-conventions.md` — commit message format; this rule applies
|
|
153
|
+
to PR bodies, agent dialogue, and skill outputs (not commits — those
|
|
154
|
+
have their own format)
|
|
155
|
+
- `sdlc-gates.md` — methodology-level gates; this rule fires before
|
|
156
|
+
any plan-presentation moment
|
|
157
|
+
|
|
158
|
+
## Enforcement
|
|
159
|
+
|
|
160
|
+
Methodology-level. The rule loads into every session via
|
|
161
|
+
`additionalDirectories`. Agents self-check before posting an enumeration.
|
|
162
|
+
|
|
163
|
+
If post-observation shows agents repeatedly presenting bare-name
|
|
164
|
+
enumerations, a future hook could grep agent output for option-list
|
|
165
|
+
shapes and BLOCK if value-prop content is missing — but the first line
|
|
166
|
+
of defense is the rule loading into every session.
|
|
167
|
+
|
|
168
|
+
## Override path
|
|
169
|
+
|
|
170
|
+
`SKIP_PLAN_ENUMERATION_RULE=1 <command>` — logged to trace per existing
|
|
171
|
+
bassclef hook idiom. Use only when the enumeration is genuinely
|
|
172
|
+
stylistic / casual ("want coffee or tea?") and the value-prop discipline
|
|
173
|
+
would be ceremony.
|
|
174
|
+
|
|
175
|
+
INSTEAD of using the override for production decisions: write the
|
|
176
|
+
value-prop. Production scope choices always carry weight worth
|
|
177
|
+
articulating.
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
description: Every PR body opens with a ## Problem section drafted by /state-a-problem brief + --- + ## Goal.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# PR Body Shape Contract
|
|
7
|
+
|
|
8
|
+
Every PR body opens with a `## Problem` section drafted by `/state-a-problem brief` + `---` + `## Goal`. Detail comes AFTER. Operators and reviewers scan on mobile and multi-pane desktop. Without a problem-grounded opener, readers re-derive the reason for the PR every time. The skill is the contract. Hand-rolling reproduces the failure pattern bet 25k closed (see `docs/iteration-bets/2026-06-25k-discipline-visibility-and-pr-body-scrub-fix.md` § WU-1 L66 diagnosis).
|
|
9
|
+
|
|
10
|
+
This rule closes two gaps:
|
|
11
|
+
|
|
12
|
+
- **Mechanical.** Bassclef enforces what NOT to include in PR bodies (jargon BLOCK list + operator-private paths + strategic framing via `pr-body-scrub-check.sh`). No prior contract said what MUST appear at the opener.
|
|
13
|
+
- **Methodology.** The prior Flash + Tweet pair (bassclef#906) was solution-framed twice — neither stated user pain. bassclef#1178 retires the pair at PR + issue surfaces and replaces both with a single `## Problem` section that centers user pain before solution.
|
|
14
|
+
|
|
15
|
+
Sister to `.claude/rules/github-issue-flash-tweet.md` at the issue surface.
|
|
16
|
+
|
|
17
|
+
## Format contract
|
|
18
|
+
|
|
19
|
+
Every PR body MUST open with:
|
|
20
|
+
|
|
21
|
+
```markdown
|
|
22
|
+
**Problem (≤500 chars):** <Who + What + When + Why now + Outcome — framework implicit; drafted by /state-a-problem brief>
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Goal
|
|
27
|
+
|
|
28
|
+
<What this PR ships, in one paragraph. Why now.>
|
|
29
|
+
|
|
30
|
+
## Evidence
|
|
31
|
+
|
|
32
|
+
- Source: <file path, ticket number, commit SHA — what backs the claim>
|
|
33
|
+
- Warrant: <one sentence tying the source to the claim>
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Format rules:
|
|
37
|
+
|
|
38
|
+
- **Problem label is bold and enclosed in `**`** — a visual scan handle, not body prose
|
|
39
|
+
- **Length limit enforced** — Problem ≤500 chars (matches `/state-a-problem brief` mode cap)
|
|
40
|
+
- **Plain language** — no bassclef jargon in the Problem section. The Problem section is the FIRST place a reader meets the work. Jargon here destroys orientation. `/state-a-problem` runs `/kiss --grade10` inline by default so the rule is hard to violate
|
|
41
|
+
- **Horizontal rule** (`---`) separates Problem from the structured body
|
|
42
|
+
- **`## Goal` is the first section after the rule** — not `## Summary`, not `## What this PR ships`, not `## Why this matters`. Goal is the agreed label
|
|
43
|
+
- **`## Evidence` follows Goal** — cites the source that backs the claim in Goal. Per `.claude/rules/assert-only-after-verify.md` — every operator-facing assertion carries source + warrant. Per `standards/opener-discipline.md` — the three-block opener extends to PR body via Problem + Goal + Evidence
|
|
44
|
+
- **One paragraph per** — Problem is 3-4 sentences; Goal is one paragraph; Evidence is one bullet source + one bullet warrant
|
|
45
|
+
|
|
46
|
+
## Required sections (in order)
|
|
47
|
+
|
|
48
|
+
After Problem + `---`:
|
|
49
|
+
|
|
50
|
+
| Section | Required? | Purpose |
|
|
51
|
+
|---|---|---|
|
|
52
|
+
| `## Goal` | **MUST** | One paragraph. What this PR ships. Why now |
|
|
53
|
+
| `## Evidence` | **MUST** | Source + warrant per `.claude/rules/assert-only-after-verify.md`. Cites what backs the Goal claim |
|
|
54
|
+
| `## Summary` | MUST when scope >1 file | Bullet list of substantive changes |
|
|
55
|
+
| `## Test plan` | MUST | Checklist of how reviewer verifies |
|
|
56
|
+
| `## Out of scope` | SHOULD | What this PR explicitly does NOT do |
|
|
57
|
+
| `## /temperance + /luminary + /loop discipline` | **MUST under /longrun dispatch** | The three-skill cycle this PR ran (see below) |
|
|
58
|
+
| `## Refs` | SHOULD | Issue numbers, related PRs, source chronicles |
|
|
59
|
+
|
|
60
|
+
Other sections (Bundle justification, Inventory findings, Migration notes) appear between Goal and Test plan as needed. Drop sections that do not apply (e.g., Out of scope on a doc-only PR).
|
|
61
|
+
|
|
62
|
+
## /temperance + /luminary + /loop discipline section (per bassclef-upstream#366)
|
|
63
|
+
|
|
64
|
+
Every PR authored under `/longrun` dispatch MUST carry a section with the literal header `## /temperance + /luminary + /loop discipline`. The section makes the per-PR cycle named in `.claude/rules/loop-discipline.md` visible at PR review time.
|
|
65
|
+
|
|
66
|
+
The header string is fixed and case-sensitive. The hook `pr-body-loop-discipline-check.sh` greps for it exactly. The section body names three things, one per bullet:
|
|
67
|
+
|
|
68
|
+
- **/temperance** fired at `<surface>`. Scope decision answer in one line. Drift trigger in one line.
|
|
69
|
+
- **/luminary** primary lens `<luminary-slug>` — one line on what the lens caught. Supporting lenses optional.
|
|
70
|
+
- **/loop** iteration count `<N>`. Outcome — RED then GREEN, OR rework cycle if any.
|
|
71
|
+
|
|
72
|
+
The fixed shape lets the grep check pass cleanly. It also gives readers a scannable three-line surface to verify discipline at PR review.
|
|
73
|
+
|
|
74
|
+
Why this section exists: bets 25h + 25i + 25j ran the discipline floor. Markers landed under `state/markers/temperance/`, `state/markers/luminary/`, and `state/markers/loop/` per branch. But the PR bodies stayed silent. The operator caught the gap mid-goal 25j: "I'm not seeing /luminary listed for PR review and /loop iteration through to closure." The mechanical floor was correct. The visible bar was missing. This section closes the bar the moment a reader scans the PR.
|
|
75
|
+
|
|
76
|
+
Forward-only enforcement. Already-merged PRs stay as is. Trivial-fix PRs under 3 files MAY skip the section per the Problem-section exception below.
|
|
77
|
+
|
|
78
|
+
## What NOT to do
|
|
79
|
+
|
|
80
|
+
- **Don't open with a section header** before Problem. INSTEAD: Problem is the headline. Section headers come after the `---` rule.
|
|
81
|
+
- **Don't fall back to Flash + Tweet** — the V1 shape was solution-framed twice; neither stated user pain. INSTEAD: draft the Problem section via `/state-a-problem brief` mode. The skill produces the contract. The Who/What/When/Why-now/Outcome framework is implicit in the sentence shape it returns.
|
|
82
|
+
- **Don't replace `## Goal` with synonyms.** INSTEAD: `## Goal` is the bassclef first section label after Problem. Reviewers and substrate-coherence checks grep for it.
|
|
83
|
+
- **Don't bury the claim in `## Why this is needed` or `## Context` before Goal.** INSTEAD: the claim is the Problem + Goal pair. Context goes after.
|
|
84
|
+
- **Don't use bassclef jargon in Problem or Goal.** INSTEAD: substitute plain English per `.claude/rules/plain-english-discipline.md` and `standards/bassclef-internal-jargon.md`. `/state-a-problem` runs `/kiss --grade10` inline by default. Hand-rolled drafts run `/kiss --grade10` separately before push.
|
|
85
|
+
|
|
86
|
+
## Trivial-fix exception
|
|
87
|
+
|
|
88
|
+
PRs with scope under 3 files AND no new SKILL.md AND no new rule MAY skip the Problem section. Trivial fixes (typo, env-var, off-by-one, one-line) often have no user-pain framing worth a section. The shape contract still requires `## Goal` as the opener in that case.
|
|
89
|
+
|
|
90
|
+
The CI shape check skips the Problem requirement when the touched-file count is under 3 AND no SKILL.md or rule file is in the change.
|
|
91
|
+
|
|
92
|
+
## Ticket-close keyword discipline (bassclef#974)
|
|
93
|
+
|
|
94
|
+
When PR title carries `feat(#NNN):` or `fix(#NNN):` pattern, the body MUST include a `Closes #NNN` (or `Fixes #NNN` / `Resolves #NNN`) keyword. GitHub auto-closes tickets only when the closing keyword appears in the PR body — title alone does not trigger the close. Without the keyword, tickets stay open even after PRs merge, and the state-spine drifts from shipping reality.
|
|
95
|
+
|
|
96
|
+
Per whereami#28b diagnose — of the last 20 merged PRs at 2026-07-29, only 4 carried a closing keyword in the body. 16 shipped work but left the ticket open (including #934 and #935 which required manual backfill during Session 28b).
|
|
97
|
+
|
|
98
|
+
The `Refs` section is a good home for the keyword. Example:
|
|
99
|
+
|
|
100
|
+
```markdown
|
|
101
|
+
## Vocabulary discipline at authoring time (bassclef#915)
|
|
102
|
+
|
|
103
|
+
Per bassclef#915 V1: PR body authoring is a `/kiss` surface. Before invoking `gh pr create` (or `gh pr edit --body-file`), the agent runs `/kiss` words discipline against the body. It substitutes BLOCK and ADVISE-PHRASE terms from `standards/bassclef-internal-jargon.md`.
|
|
104
|
+
|
|
105
|
+
- **BLOCK terms** — substitute per `/kiss --grade10` table; PR-body-scrub Rule 1 catches what slips
|
|
106
|
+
- **ADVISE terms** — substitute per `/kiss --grade10` table; PR-body-scrub does not block on these
|
|
107
|
+
- **ADVISE-PHRASE terms** — substitute or rephrase; PR-body-scrub Rule 5 emits advisory CI annotations on hits (does not block)
|
|
108
|
+
- **ALLOW terms** (reserved per bassclef#763 — substrate, bassclef, cameo, Studio, Band, bandleader) — preserve
|
|
109
|
+
|
|
110
|
+
V2 pre-push hook for `/kiss`-on-PR-body authoring ships per bassclef#1176 (PR #1179 merged 2026-06-18). Local PreToolUse Bash hook scrubs PR body before `gh pr create` reaches GitHub.
|
|
111
|
+
|
|
112
|
+
## When this rule fires
|
|
113
|
+
|
|
114
|
+
Every NEW PR body authored via:
|
|
115
|
+
|
|
116
|
+
- `gh pr create` — local PreToolUse hook fires (bassclef#1176); CI hook fires as backstop (bassclef#739)
|
|
117
|
+
- `gh pr edit` (body rewrite) — same shape contract applies
|
|
118
|
+
- Manual operator authoring via GitHub web UI — `.github/pull_request_template.md` auto-fills the shape; operator amends
|
|
119
|
+
|
|
120
|
+
Existing PRs are NOT retroactively backfilled. Forward-only enforcement keeps the discipline visible at the PR-creation surface where it lands.
|
|
121
|
+
|
|
122
|
+
## Mechanical enforcement
|
|
123
|
+
|
|
124
|
+
V1 shipped methodology + `.github/pull_request_template.md` template + the rule (bassclef#906). V2 shipped local + CI Bash-matcher hooks for jargon scrub (bassclef#1176 + bassclef#1177). V3 (this bassclef#1178 amendment) ships:
|
|
125
|
+
|
|
126
|
+
- Shape contract enforces `## Problem` opener at feature-scope PRs
|
|
127
|
+
- `pr-body-scrub-check.sh` extended with a shape check that flags a missing `## Problem` section on feature-scope PRs
|
|
128
|
+
- `/state-a-problem brief` skill drafts the section (runs `/kiss --grade10` inline by default)
|
|
129
|
+
- `.github/pull_request_template.md` template updated to show the Problem-section shape
|
|
130
|
+
|
|
131
|
+
V4 (bassclef#974) ships Rule 7 — ticket-close keyword advisory. Local + CI hook layers extended:
|
|
132
|
+
|
|
133
|
+
- `pre-gh-pr-body-scrub.sh` extracts PR title, passes as `$PR_TITLE` env var
|
|
134
|
+
- `pr-body-scrub-check.sh` Rule 7 checks title-vs-body correlation for closing keyword
|
|
135
|
+
- 4 new Tier 0 tests pin behavior (Tests 27-30 in `.claude/hooks/tests/pre-gh-pr-body-scrub.test.sh`)
|
|
136
|
+
- Advisory in V1; V2 may flip to BLOCK after calibration
|
|
137
|
+
|
|
138
|
+
## Override path
|
|
139
|
+
|
|
140
|
+
`SKIP_PR_BODY_SHAPE=1 <command>` — for genuinely-not-PR-body cases (e.g., release-tag PRs, automated bot PRs, dependabot updates where the bot controls the body format). Logged via trace-helper.
|
|
141
|
+
|
|
142
|
+
INSTEAD of overriding for tight scope: write the Problem section. Three sentences carrying the framework cost less than reviewer re-derivation.
|
|
143
|
+
|
|
144
|
+
## Summary
|
|
145
|
+
|
|
146
|
+
Add `/longrun` skill for autonomous long-running sessions...
|
|
147
|
+
|
|
148
|
+
## Why this is needed
|
|
149
|
+
|
|
150
|
+
Recurring pattern observed over March-April 2026 sessions...
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
Reviewer reads title → "Summary" header → 3 paragraphs to find the claim. Claim is buried. User pain stays unstated.
|
|
154
|
+
|
|
155
|
+
### Anti-pattern (V1 Flash + Tweet — superseded by bassclef#1178)
|
|
156
|
+
|
|
157
|
+
```markdown
|
|
158
|
+
**Flash (≤180 chars):** Add `/longrun` skill — autonomous sessions paced by checkpoints and closeout discipline.
|
|
159
|
+
|
|
160
|
+
**Tweet (≤280 chars):** Sessions over 50 turns drift without checkpoints. `/longrun` adds prep / checkpoint / closeout modes.
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
Better than no shape. But solution-framed twice. Reader still does not know WHY this work exists — only WHAT it does.
|
|
164
|
+
|
|
165
|
+
### Conformant pattern (bassclef#1178 — Problem opener)
|
|
166
|
+
|
|
167
|
+
```markdown
|
|
168
|
+
**Problem (≤500 chars):** Today autonomous sessions over 50 turns drift without structured checkpoints — operators return mid-session to mid-stream context, no anchor on what shipped, what's blocked, or what's next. The /longrun skill adds prep / checkpoint / closeout modes that pace the session against named phase boundaries. The change we want is sessions over 50 turns that return clean state every time, not a context-archaeology task on every wake.
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
## Goal
|
|
173
|
+
|
|
174
|
+
Ship `/longrun` skill so autonomous sessions running >50 turns or across compaction boundaries have substrate-enforced pacing.
|
|
175
|
+
|
|
176
|
+
## Summary
|
|
177
|
+
|
|
178
|
+
- New `.claude/skills/longrun/SKILL.md` with three modes
|
|
179
|
+
- ...
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
Reviewer gets user pain → solution → diff in 60 seconds. Detail follows for those who want depth.
|
|
183
|
+
|
|
184
|
+
## Composes with
|
|
185
|
+
|
|
186
|
+
- `.claude/skills/state-a-problem/SKILL.md` — drafts the Problem section in brief mode (≤500 chars); runs `/kiss --grade10` inline by default
|
|
187
|
+
- `.claude/rules/github-issue-flash-tweet.md` (bassclef#484 — amended by bassclef#1178) — sister rule at issue-body surface
|
|
188
|
+
- `.claude/rules/plain-english-discipline.md` (bassclef#790) — plain language requirement for Problem and Goal
|
|
189
|
+
- `standards/pr-body-discipline.md` (bassclef#787) — scrub discipline at same surface
|
|
190
|
+
- `.claude/rules/operator-facing-prose.md` (bassclef#790) — operator-facing prose discipline
|
|
191
|
+
- `.claude/hooks/pr-body-scrub-check.sh` — sibling mechanical surface (CI hook); extended in bassclef#1178 with shape check
|
|
192
|
+
- `.claude/hooks/pre-gh-pr-body-scrub.sh` — local pre-push hook (bassclef#1176)
|
|
193
|
+
- `.github/pull_request_template.md` — auto-fill at PR-creation surface; updated for the Problem shape
|
|
194
|
+
- bassclef#915 — phrase-shaped advisory perimeter (sister at vocabulary surface)
|
|
195
|
+
- bassclef#907 — `/kiss` overhaul (single source of truth wordlist)
|