@thebassclef/lite 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/dist/cli.cjs +2 -0
  2. package/dist/cli.js +2 -0
  3. package/dist/index.cjs +1 -1
  4. package/dist/index.d.ts +1 -1
  5. package/dist/index.js +1 -1
  6. package/package.json +1 -1
  7. package/substrate/.bassclef/lite-manifest.json +999 -92
  8. package/substrate/.claude/hooks/longrun-prep-compounding-axis-check.sh +492 -0
  9. package/substrate/.claude/hooks/longrun-prep-compounding-sequence-check.sh +492 -0
  10. package/substrate/.claude/hooks/pre-commit-gate.sh +1 -2
  11. package/substrate/.claude/hooks/turn-prose-kiss-check.sh +30 -1
  12. package/substrate/.claude/luminaries/glenford-myers.md +230 -0
  13. package/substrate/.claude/luminaries/hunt-thomas.md +115 -0
  14. package/substrate/.claude/luminaries/hyrum-wright.md +94 -0
  15. package/substrate/.claude/luminaries/michael-feathers.md +2 -2
  16. package/substrate/.claude/luminaries/tony-hoare.md +170 -0
  17. package/substrate/.claude/luminaries/vaughn-vernon.md +50 -0
  18. package/substrate/.claude/luminaries/w-edwards-deming.md +158 -0
  19. package/substrate/.claude/rules/accessor-library-discipline.md +138 -0
  20. package/substrate/.claude/rules/adr-discipline.md +120 -0
  21. package/substrate/.claude/rules/api-conventions.md +125 -0
  22. package/substrate/.claude/rules/bootstrap-pair-discipline.md +141 -0
  23. package/substrate/.claude/rules/cold-adopter-harness-discipline.md +129 -0
  24. package/substrate/.claude/rules/compounding-axis-fresh-analysis.md +188 -0
  25. package/substrate/.claude/rules/compounding-sequence-fresh-analysis.md +188 -0
  26. package/substrate/.claude/rules/defensive-bash.md +68 -0
  27. package/substrate/.claude/rules/deferred-actions.md +233 -0
  28. package/substrate/.claude/rules/github-issue-flash-tweet.md +156 -0
  29. package/substrate/.claude/rules/hook-wire-on-author.md +103 -0
  30. package/substrate/.claude/rules/iteration-bet-brief-completeness.md +54 -0
  31. package/substrate/.claude/rules/lite-manifest-schema-change-discipline.md +3 -3
  32. package/substrate/.claude/rules/longrun-prep-plan-doc-compression.md +89 -0
  33. package/substrate/.claude/rules/loop-discipline.md +81 -0
  34. package/substrate/.claude/rules/manual-prod-approval.md +100 -0
  35. package/substrate/.claude/rules/marker-enrichment-discipline.md +99 -0
  36. package/substrate/.claude/rules/mobile-ephemeral-session.md +109 -0
  37. package/substrate/.claude/rules/new-dependency-check.md +51 -0
  38. package/substrate/.claude/rules/option-label-discipline.md +108 -0
  39. package/substrate/.claude/rules/pattern-annotation.md +100 -0
  40. package/substrate/.claude/rules/plain-english-discipline.md +11 -9
  41. package/substrate/.claude/rules/plan-enumeration-needs-value-props.md +211 -0
  42. package/substrate/.claude/rules/pr-title-shape.md +161 -0
  43. package/substrate/.claude/rules/prototype-workflow.md +65 -0
  44. package/substrate/.claude/rules/reserved-skill-names.md +123 -0
  45. package/substrate/.claude/rules/schema-management.md +49 -0
  46. package/substrate/.claude/rules/security.md +37 -0
  47. package/substrate/.claude/rules/skill-composition-declarations.md +124 -0
  48. package/substrate/.claude/rules/skill-description-clarity.md +247 -0
  49. package/substrate/.claude/rules/skill-procedure-step-list.md +137 -0
  50. package/substrate/.claude/rules/stuck-signal-diagnostic.md +140 -0
  51. package/substrate/.claude/rules/substrate-config-schema.md +98 -0
  52. package/substrate/.claude/rules/test-list-discipline.md +175 -0
  53. package/substrate/.claude/rules/test-sufficiency.md +210 -0
  54. package/substrate/.claude/rules/testing-tier-config.md +145 -0
  55. package/substrate/.claude/rules/testing.md +38 -0
  56. package/substrate/.claude/rules/turn-estimate-grounding.md +134 -0
  57. package/substrate/.claude/rules/visual-hierarchy.md +437 -0
  58. package/substrate/.claude/rules/we-dont-break-adopters.md +126 -0
  59. package/substrate/.claude/rules/wu-sequencing-compounds.md +145 -0
  60. package/substrate/.claude/skills/build/SKILL.md +1 -1
  61. package/substrate/.claude/skills/chronicle/SKILL.md +55 -0
  62. package/substrate/.claude/skills/clean-artifacts/SKILL.md +249 -0
  63. package/substrate/.claude/skills/decompose/SKILL.md +1 -1
  64. package/substrate/.claude/skills/diagnose/SKILL.md +1 -1
  65. package/substrate/.claude/skills/feynman/SKILL.md +90 -0
  66. package/substrate/.claude/skills/howdoi/SKILL.md +1 -1
  67. package/substrate/.claude/skills/ia-model/SKILL.md +1 -1
  68. package/substrate/.claude/skills/interaction-design/SKILL.md +1 -1
  69. package/substrate/.claude/skills/interpret-input/SKILL.md +8 -8
  70. package/substrate/.claude/skills/journal/SKILL.md +209 -0
  71. package/substrate/.claude/skills/kiss/SKILL.md +1 -1
  72. package/substrate/.claude/skills/launch/SKILL.md +14 -23
  73. package/substrate/.claude/skills/lean-canvas/SKILL.md +1 -1
  74. package/substrate/.claude/skills/longrun/SKILL.md +45 -8
  75. package/substrate/.claude/skills/luminary/SKILL.md +1 -1
  76. package/substrate/.claude/skills/ogilvy-writing-audit/SKILL.md +1 -1
  77. package/substrate/.claude/skills/onboard-repo/SKILL.md +143 -709
  78. package/substrate/.claude/skills/pattern-review/SKILL.md +1 -1
  79. package/substrate/.claude/skills/personas/SKILL.md +5 -5
  80. package/substrate/.claude/skills/promote/SKILL.md +1 -1
  81. package/substrate/.claude/skills/requirement/SKILL.md +1 -1
  82. package/substrate/.claude/skills/retro/SKILL.md +1 -1
  83. package/substrate/.claude/skills/riff/SKILL.md +1 -1
  84. package/substrate/.claude/skills/roadmap-reconcile/SKILL.md +1 -1
  85. package/substrate/.claude/skills/session-end/SKILL.md +1 -1
  86. package/substrate/.claude/skills/session-log/SKILL.md +3 -3
  87. package/substrate/.claude/skills/skills/SKILL.md +1 -1
  88. package/substrate/.claude/skills/spec/SKILL.md +1 -1
  89. package/substrate/.claude/skills/sprint/SKILL.md +1 -1
  90. package/substrate/.claude/skills/stage/SKILL.md +1 -1
  91. package/substrate/.claude/skills/state-a-problem/SKILL.md +1 -1
  92. package/substrate/.claude/skills/temperance/SKILL.md +1 -1
  93. package/substrate/.claude/skills/use-case/SKILL.md +1 -1
  94. package/substrate/.claude/skills/user-stories/SKILL.md +1 -1
  95. package/substrate/.claude/skills/value-prop/SKILL.md +1 -1
  96. package/substrate/.claude/skills/verify/SKILL.md +1 -1
  97. package/substrate/.claude/skills/visual-review/SKILL.md +503 -0
  98. package/substrate/.claude/skills/whats-the-plan/SKILL.md +202 -0
  99. package/substrate/.claude/skills/whereami/SKILL.md +2 -2
  100. package/substrate/CONTRIBUTING.md +1 -1
  101. package/substrate/README.md +5 -5
  102. package/substrate/lib/prose-scan-boundary.sh +171 -0
  103. package/substrate/lib/tier-check.sh +50 -1
  104. package/substrate/lib/tier-dependency-audit.sh +159 -4
  105. package/substrate/presence/install/bassclef-sync.template.sh +1 -1
  106. package/substrate/scripts/generate-lite-manifest.sh +21 -5
  107. package/substrate/standards/adr-template.md +86 -0
  108. package/substrate/standards/api-conventions/nextjs.md +84 -0
  109. package/substrate/standards/artifact-composition.md +209 -0
  110. package/substrate/standards/bash-hook-safety.md +246 -0
  111. package/substrate/standards/branch-stacking.md +408 -0
  112. package/substrate/standards/code-safety-principles.md +176 -0
  113. package/substrate/standards/composer-prerequisites.md +155 -0
  114. package/substrate/standards/dependency-discipline/cargo.md +39 -0
  115. package/substrate/standards/dependency-discipline/gem.md +43 -0
  116. package/substrate/standards/dependency-discipline/go-mod.md +41 -0
  117. package/substrate/standards/dependency-discipline/npm.md +42 -0
  118. package/substrate/standards/dependency-discipline/pip.md +42 -0
  119. package/substrate/standards/deployment-topology/ec2-tailscale.md +225 -0
  120. package/substrate/standards/deployment-topology.md +69 -0
  121. package/substrate/standards/docs-sync-allowlist.md +4 -4
  122. package/substrate/standards/domain-and-dns.md +145 -0
  123. package/substrate/standards/frontend-stack.md +67 -0
  124. package/substrate/standards/frontmatter-schema.md +154 -0
  125. package/substrate/standards/hook-injection-discipline.md +202 -0
  126. package/substrate/standards/hook-install-class.md +215 -0
  127. package/substrate/standards/input-handler-interface.md +152 -0
  128. package/substrate/standards/lite-manifest-schema-changes.md +60 -0
  129. package/substrate/standards/luminary-matching.md +105 -0
  130. package/substrate/standards/migration-discipline/active-record.md +50 -0
  131. package/substrate/standards/migration-discipline/alembic.md +43 -0
  132. package/substrate/standards/migration-discipline/gorm.md +50 -0
  133. package/substrate/standards/migration-discipline/prisma.md +53 -0
  134. package/substrate/standards/migration-discipline/sqlalchemy.md +51 -0
  135. package/substrate/standards/mobile-ephemeral-session.md +167 -0
  136. package/substrate/standards/model-routing-discipline.md +160 -0
  137. package/substrate/standards/persona-schema.md +229 -0
  138. package/substrate/standards/pluggable-luminaries.md +323 -0
  139. package/substrate/standards/pr-body-discipline.md +115 -0
  140. package/substrate/standards/preview-state-schema.md +189 -0
  141. package/substrate/standards/reserved-skill-names.md +120 -0
  142. package/substrate/standards/scannable-multi-option-output.md +261 -0
  143. package/substrate/standards/sdlc-gates/typescript.md +57 -0
  144. package/substrate/standards/session-board.md +256 -0
  145. package/substrate/standards/state-spine-contract.md +255 -0
  146. package/substrate/standards/steering-hints/kiss-words.md +11 -0
  147. package/substrate/standards/substrate-config-schema.md +267 -0
  148. package/substrate/standards/tier-dependency-analysis.md +1 -1
  149. package/substrate/standards/tier-tag-schema.md +1 -1
  150. package/substrate/standards/two-layer-config.md +99 -0
  151. package/substrate/standards/use-case-format.md +292 -0
  152. package/substrate/standards/user-story-invest.md +268 -0
  153. package/substrate/standards/velocity-and-appetite.md +229 -0
  154. package/substrate/standards/voice-input-pattern.md +119 -0
  155. package/substrate/standards/worktree-management.md +211 -0
  156. package/substrate/templates/chronicle-template.md +75 -0
  157. package/substrate/templates/memory-proposal-template.md +77 -0
  158. package/substrate/templates/persona-template.md +200 -0
  159. package/substrate/templates/pr-faq.md +45 -0
  160. package/substrate/templates/secret-rotation-template.md +162 -0
  161. package/substrate/templates/spec-template.md +131 -0
  162. package/substrate/templates/use-case-template.md +194 -0
  163. package/substrate/templates/user-story-template.md +107 -0
@@ -0,0 +1,188 @@
1
+ ---
2
+ tier: lite
3
+ description: "When /longrun prep proposes scope shapes, each shape's compounding-sequence row comes from fresh analysis."
4
+ ---
5
+
6
+ # Compounding-Axis Fresh Analysis
7
+
8
+ When `/longrun` prep proposes scope shapes, each shape's compounding-sequence row comes from fresh analysis. Hand-off documents do not satisfy Step 1.5 of the `/longrun` SKILL. That includes `docs/whereami.md`'s `next_longrun_queue` recommended order, an audit doc's `next_pending`, and a prior chronicle's pickup suggestion. Each shape gets its own row from the agent's own analysis at prep time.
9
+
10
+ This rule is the methodology layer. The mechanical layer is `.claude/hooks/longrun-prep-compounding-sequence-check.sh`. That Stop hook is wired in `.claude/settings.json`. Tests at `.claude/hooks/tests/longrun-prep-compounding-sequence-check.test.sh`.
11
+
12
+ The hook scans the latest assistant message when `state/markers/turn-prose-surface/longrun_prep_proposal.marker` is touched. It BLOCKs the stop (exit 2) when the compounding-sequence column headers are missing. Hook accepts EITHER shape per PR #1591 (bassclef#1555 PR-1): the new 6-axis frame (default, per plan doc `docs/next-session-plan-2026-09-09-compounding-axis-refactor.md`) OR the legacy 5-axis frame (grace window through 2026-10-31 per ADR-031). Backward compat opt-out: `COMPOUNDING_AXIS_TOGGLE=advisory` reverts to V1 (finding to stderr; exit 0).
13
+
14
+ **V2 strict landed 2026-06-30.** The first `/longrun` prep after V1 ship surfaced only 3 of 5 columns at the operator-facing table. The hook caught the miss as designed. But it emitted ADVISORY to stderr. The agent could not see its own advisory in conversation. The operator could not see it on mobile. The operator asked "compounding sequence miss intact from the last substrate fix?" — that proved the visibility gap. The hook ships V2 strict as the next calibration step per ADR-035 (substrate-as-system — the mechanism must close the loop).
15
+
16
+ ## Why this rule exists
17
+
18
+ Bet 30b filed under five catches of one class in 36 hours. The pattern: the agent emits operator-facing assertions without re-reading the data the assertion claims. One catch was that evening's `/longrun` prep. The agent shipped three scope shapes ordered by size rather than by how often each shape's work would fire after shipping. The agent treated whereami's `next_longrun_queue` recommended order as a stand-in for fresh analysis. Operator caught the miss and asked why the analysis step was skipped.
19
+
20
+ The hook caught nothing. The agent touched the surface marker AFTER writing the proposal, not before. The Stop hook fired at the next Stop event with a different latest assistant message — not the proposal where the column was missing.
21
+
22
+ This rule extends the discipline beyond hook coverage:
23
+
24
+ 1. **Fresh analysis** — each scope candidate gets a per-shape compounding row authored at prep time, not copied from a hand-off doc
25
+ 2. **Marker touch BEFORE the surface** — the marker is the agent's commit to writing the compounding-aware proposal next; touching after defeats the hook's check (cross-reference `.claude/rules/operator-facing-prose.md` Rule 3)
26
+ 3. **Marker cleanup AFTER the surface (paired with V2 strict)** — the agent removes the marker once the prep proposal has landed AND the operator has confirmed scope. The marker's purpose is satisfied at that point. Without cleanup under V2 strict, every post-prep Stop event blocks. The hook scans every assistant message. Most post-prep turns (status updates, commit summaries, WU work) do not carry a shape proposal table. Cleanup is the bootstrap pair V1 advisory hid (exit 0 forgave the gap).
27
+ 4. **R8 underlying pattern (per bet 30b risk ledger)** — the agent does not label a substrate artifact (risk ledger, decomposition, audit, ADR-consult, sources-read citation) without doing the underlying work that produces it. Naming the artifact ≠ producing it.
28
+
29
+ ## When this rule fires
30
+
31
+ Every `/longrun` prep that proposes scope shapes:
32
+
33
+ - `/longrun prep` (operator types) — Step 1.5 compounding-sequence analysis per shape candidate
34
+ - `/sprint` next-work proposals when scope-shape options are surfaced (sister surface; same shape contract)
35
+ - Bet doc authoring — when the goal doc's `## Steps` section enumerates a per-shape table, the same axis applies
36
+
37
+ The rule does NOT fire on:
38
+
39
+ - Single-shape continuation prep where the operator has already confirmed scope (no shape PICK happening; per-shape compounding still applies per memory `feedback-compounding-sequence-mandatory-every-prep-surface`)
40
+ - WU-sequencing inside a chosen shape (covered by sister rule `.claude/rules/wu-sequencing-compounds.md` for Step 1.7 INTRA-shape)
41
+
42
+ ## What the rule requires
43
+
44
+ Before the operator picks a scope shape:
45
+
46
+ 1. **Touch the surface marker FIRST** — `mkdir -p state/markers/turn-prose-surface && touch state/markers/turn-prose-surface/longrun_prep_proposal.marker` BEFORE writing the proposal. The marker tells the Stop hook the next message is a prep proposal subject to the column-presence check.
47
+ 2. **Per-option compounding row** — each option candidate carries 6 axes per `/longrun` SKILL Step 1.5 (new default per bassclef#1555). Per `#1193` cure, Step 1.5 prescribes the `### Compounding value per option` section explicitly. The 6 axes read as practical decision fields for Sam (Saturday evaluator) and Louis (context switcher) per plan doc `docs/next-session-plan-2026-09-09-compounding-axis-refactor.md` L36-45.
48
+
49
+ The 6-axis default (new; per bassclef#1555 PR-2):
50
+
51
+ | Axis | Source | Standard values |
52
+ |---|---|---|
53
+ | Deliverable | Plain sentence | What ships when this option lands |
54
+ | Problem | `/state-a-problem brief` | ≤500 chars; framework implicit |
55
+ | Value prop | `/value-prop tweet` | ≤280 chars; claim + sharpener |
56
+ | Turns | Grounded range | Cite past goal actuals per `.claude/rules/turn-estimate-grounding.md` |
57
+ | Risk | 🟢 / 🟡 / 🔴 | Low / medium / high |
58
+ | Shipping priority | Q1 / Q2 / Q3 / Q4 or blank | Blank prompts `Run /eisenhower to prioritize?` |
59
+
60
+ The 5-axis legacy (grace window through 2026-10-31 per ADR-031; hook accepts both shapes):
61
+
62
+ | Plain-English (preferred per ADR-040 D4) | Compressed (grace only) | Standard values |
63
+ |---|---|---|
64
+ | Where the payoff shows up | Compounding surface | per-PR / per-release / per-session / per-adopter / per-quarter |
65
+ | How often it fires | Compounding rate | continuous / frequent / per-session / per-adopter / per-quarter |
66
+ | What must be true first | Foundation prerequisites | none / specific goal / ticket / config flag |
67
+ | Does this teach a shape later work reuses | Inverse-dependency | yes (names the later work) / no |
68
+ | What breaks if we ship this half-done | Risk class | low / medium / high |
69
+
70
+ R8 catch preservation: Deliverable + Problem + Value prop force fresh per-option analysis. `/state-a-problem` and `/value-prop` are themselves cognitive tools that resist copy-paste. The distinct-values check per option (bassclef#564) applies to whichever shape the prep uses.
71
+ 3. **Fresh analysis** — the column values come from the agent's reading of the shape itself, not from a hand-off doc's recommended order. If the agent reads a hand-off doc and the order matches its own analysis, the row matches by coincidence, not by copy. If the order DOESN'T match, the rule surfaces the conflict to the operator.
72
+ 4. **Recommended shape rationale** cites the compounding sequence + adopter-benefit mechanism (per sister rule for Step 1.6 bassclef-upstream#1302) explicitly.
73
+ 5. **Remove the surface marker AFTER scope confirmation** — once the prep proposal has landed AND the operator has confirmed scope (or the proposal is being abandoned), remove `state/markers/turn-prose-surface/longrun_prep_proposal.marker`. The marker's purpose is satisfied. Leaving it present makes every post-prep Stop event block under V2 strict default. Most subsequent turns (status updates, commit summaries, WU work) do not carry a shape proposal table.
74
+
75
+ ```bash
76
+ rm -f state/markers/turn-prose-surface/longrun_prep_proposal.marker
77
+ ```
78
+
79
+ This step is mandatory at the prep→execution handoff. Hook auto-cleanup deferred to a follow-on (substrate-evolution ticket) — the rule names the discipline; the agent removes the marker today.
80
+
81
+ ## Postcondition contract (per Hoare)
82
+
83
+ Per bassclef-upstream#564 + luminary consultation (Ousterhout / Hoare / Feathers / Saltzer-Schroeder / Beck):
84
+
85
+ **Precondition:** the /longrun prep proposes 2+ candidate shapes, each with a distinct scope.
86
+
87
+ **Postcondition:** for every option O in the candidate set, for every axis A in the axis list of the shape the prep uses (6-axis default OR 5-axis legacy), the prep output contains a non-empty value V(O, A). The rendering satisfies the postcondition in one of two accepted shapes (per bassclef-upstream#1376):
88
+
89
+ - **Per-option shape (pre-existing default).** V(O, A) renders under O's section as bullets or table rows. Each option gets a full section. Not only in a header row shared across options.
90
+ - **Per-recommended-only shape (bassclef-upstream#1376 addition).** The prep opens with `**Recommend:** Option X`. V(recommended, A) renders under the recommended option's section as bullets. V(other, A) renders as scan-table row cells — one cell per axis per non-recommended option. Reader lands the recommended card fast; other options stay auditable from the scan-table row.
91
+
92
+ The 6-axis default is: Deliverable, Problem, Value prop, Turns, Risk, Shipping priority. The 5-axis legacy (grace window through 2026-10-31) is: Where the payoff shows up, How often it fires, What must be true first, Does this teach a shape later work reuses, What breaks if we ship this half-done. Hook accepts either shape per PR #1591.
93
+
94
+ The postcondition is stronger than the message-level check V2 ships. V2 verifies that the column names appear anywhere in the message. V3 (bassclef-upstream#564; ships with this rule amendment) verifies that each option section carries all axes of the chosen shape as distinct values. A single header row with axis names but no per-option values fails the postcondition. That is the R8 pattern this cure closes.
95
+
96
+ Per `#1193` cure — the hook regex accepts both `Shape a-c` and `Option a-e` for the per-shape check during the grace window through 2026-10-31 per `.claude/rules/we-dont-break-adopters.md`. After that date only `Option [a-z]` matches. SKILL `#830` renamed the label; the rule postcondition applies equally to both vocabularies.
97
+
98
+ **When shapes legitimately share an axis value** (e.g., all three shapes have `Risk class: low` because the work is small), the values still render per shape — same text under three sections. Rendering satisfies the postcondition. The check does not flag legitimate convergence.
99
+
100
+ ## Anti-patterns
101
+
102
+ These shapes fail this rule.
103
+
104
+ **Agent ships scope shapes WITHOUT compounding-sequence columns.** Tonight's failure (caught by operator). Cure: include the columns; touch the marker BEFORE the proposal.
105
+
106
+ **Agent ships scope shapes with columns COPIED from whereami's `next_longrun_queue` or an audit's `next_pending`.** The columns are present but the fresh-analysis precondition is violated (R2 Hoare — mechanically unverifiable from output). Cure: re-analyze each shape independently; surface conflict if hand-off order disagrees with fresh order.
107
+
108
+ **Agent touches the surface marker AFTER writing the proposal.** Tonight's failure mode. The hook fires at the next Stop event with the marker-touch message as the latest assistant message — not the proposal. Cure: touch marker BEFORE proposal.
109
+
110
+ **Agent leaves the surface marker present after scope confirmation.** Under V2 strict default this blocks every subsequent Stop event because the hook scans every assistant message and most post-prep turns do not carry a shape proposal table. Cure: remove the marker at the prep→execution handoff per step 5 above.
111
+
112
+ **Agent labels a "risk ledger" / "decomposition" / "audit" / "sources-read" without doing the underlying work (R8 underlying pattern).** The label is the assertion; the work that produces it is the data the assertion claims. Tonight's risk-ledger catch by operator. Cure: cite the file path of the produced artifact in agent output; not just the label.
113
+
114
+ INSTEAD of any of these: do the work first; touch the marker; write the proposal with the compounding row populated from fresh analysis; cite produced artifacts by file path.
115
+
116
+ ## Hand-off documents that do NOT satisfy
117
+
118
+ These all carry useful context but do not substitute for fresh analysis:
119
+
120
+ - `docs/whereami.md` `next_longrun_queue` — operator + prior session's pickup suggestion; not compounding-derived
121
+ - audit doc `next_pending` field — sequenced by audit author; may not match current compounding priorities
122
+ - prior chronicle's "next pickup" suggestion — operator-facing handoff narrative; not analysis
123
+ - prior goal doc's `next_bet` field — sequencing intent; not analysis
124
+ - memory entry `feedback_*` — prior discipline; relevant context but not a substitute for the per-shape row
125
+
126
+ Agent reads all of these for context. Agent then writes fresh compounding analysis per shape. The two activities are distinct.
127
+
128
+ ## Override
129
+
130
+ `SKIP_COMPOUNDING_AXIS_CHECK=1 <command>` — bypass the hook for one call (already exists; logged via trace-helper). The rule's methodology layer has no override — fresh analysis is the precondition; without it, the proposal is incomplete.
131
+
132
+ For trivial single-shape continuation prep where the operator has already confirmed scope: the rule applies but cost is small (one row in the goal doc); no override needed.
133
+
134
+ ## Composes with
135
+
136
+ - `.claude/rules/wu-sequencing-compounds.md` — sister at Step 1.7 INTRA-shape (per-step produces/consumes)
137
+ - `.claude/rules/operator-facing-prose.md` Rule 3 — marker touch BEFORE the named surface (this rule's mechanism precondition)
138
+ - `.claude/rules/blocked-items.md` — BLOCKED protocol the hook fires under V2 strict
139
+ - `.claude/rules/substrate-as-system.md` — every rule has a mechanism + every mechanism has a rule; this rule pairs the existing `longrun-prep-compounding-sequence-check.sh` mechanism with its rule body
140
+ - `.claude/hooks/longrun-prep-compounding-sequence-check.sh` — the mechanical layer
141
+ - `.claude/hooks/tests/longrun-prep-compounding-sequence-check.test.sh` — Tier 0 tests pinning the hook
142
+ - `.claude/skills/longrun/SKILL.md` Step 1.5 — the procedure surface the rule serves
143
+ - `@luminary jerome-saltzer-and-michael-schroeder` — complete mediation principle
144
+ - `@luminary tony-hoare` — pre/postcondition contracts (R2 fresh-analysis is precondition, mechanically unverifiable)
145
+ - `@luminary michael-feathers` — characterization tests pin REAL prep prose (R3 follow-on)
146
+ - `@luminary kent-beck` — Tier 0 strict TDD on the hook (R4 follow-on covers each umbrella ticket instance)
147
+
148
+ ## Refs
149
+
150
+ - sunj-labs/bassclef-upstream#540 — umbrella ticket; this rule closes 1 of 5 sub-cures
151
+ - `docs/iteration-bets/2026-06-30b-substrate-anchoring-cure.md` — goal doc; WU-E ships this rule
152
+ - `docs/risk-ledgers/2026-06-30b-substrate-anchoring-cure.md` — 8 lens pre-mortem + R8 meta-catch
153
+ - bassclef-upstream#1299 (Step 1.5 INTER-shape compounding-sequence) — sister filing ticket if it exists
154
+ - bassclef-upstream#1302 (Step 1.6 INTER-shape adopter-benefit) — sister rule shape
155
+ - bassclef-upstream#1304 (turn-prose-surface marker discipline) — operator-facing-prose Rule 3
156
+ - memory `feedback-compounding-sequence-mandatory-every-prep-surface` — fires at every prep surface, including single-shape continuation
157
+ - memory `feedback-architect-review-audit-is-authoritative` — audits override `next_longrun_queue` for next-pickup
158
+ - ADR-035 substrate-as-system — the tenet this rule operationalizes at Step 1.5
159
+ - ADR-040 Decision 4 (planning-skill body template) — plain-English axis names shipped in PR #743 (goal 17a). Per #745, the sister rule + hook accept both shapes during the grace window through 2026-10-31.
160
+
161
+ ## Deferred to follow-on
162
+
163
+ The bet 30b risk ledger named these add-to-scope dispositions for WU-E; they ship in a follow-on goal:
164
+
165
+ - **R3 (Feathers)** — extend Tier 0 tests with 3 characterization tests against REAL `/longrun` prep messages (tonight's + 2 from prior goal prep chronicles)
166
+ - **R4 (Beck)** — extend Tier 0 tests with cases for each instance under umbrella #540 (release recommendation skip, cleanup proposal skip, visual-compare skip, session-orientation skip)
167
+ - **R6 (Linus)** — cold-adopter harness check for session-reflection.d/05-active-bet.sh fragment presence (sister to WU-B)
168
+ - **R7 (Norman)** — extend `longrun-prep-compounding-sequence-check.sh` to ALSO scan for proof-of-read line from `/longrun` Step 0.4 (sister to WU-B cure 3)
169
+
170
+ The rule body is complete without these; the hook coverage extension is a separate ship vehicle.
171
+
172
+ ## Per-WU coverage (bassclef-upstream#597 extension)
173
+
174
+ Per-WU compounding-sequence rendering carries the same 5 axes at the step layer, alongside the produces/consumes table.
175
+
176
+ When a `/longrun` prep proposal contains 2+ WU rows in the produces/consumes table (per Step 1.7), the proposal MUST also carry per-step compounding-sequence rendering — either a `## Compounding value per step` section OR per-step 5-axis bullets under each step.
177
+
178
+ Anti-pattern that fails: shape-level 5 axes rendered per Step 1.5, WU produces/consumes rendered per Step 1.7, per-step compounding-sequence skipped. This shape passed as convention for weeks. It got displaced when PR #567 tightened Step 1.5 to per-shape distinct values, which shifted agent attention to shape-level. INSTEAD of trusting convention: mechanize the per-step coverage so sibling discipline tightening does not crowd it out.
179
+
180
+ Correct shape: same 5 axes rendered per step with distinct values — plain-English names preferred per ADR-040 D4 (Where the payoff shows up / How often it fires / What must be true first / Does this teach a shape later work reuses / What breaks if we ship this half-done). Compressed forms accepted during the grace window through 2026-10-31.
181
+
182
+ Mechanical layer: `.claude/hooks/longrun-prep-compounding-sequence-check.sh` extended with per-step check (V1 strict — BLOCK on missing per-step axes when 2+ WU rows present). Toggle `COMPOUNDING_AXIS_TOGGLE=advisory` retains backward-compat.
183
+
184
+ Sister to Step 1.5 per-shape check (bassclef-upstream#564). Same discipline shape at a different layer.
185
+
186
+ ## Retirement condition
187
+
188
+ This rule retires only if `/longrun` Step 1.5 stops requiring per-shape compounding analysis. Mechanical extensions (V2 BLOCK flip, additional column types, additional surfaces) may evolve; the discipline of fresh analysis per shape persists.
@@ -0,0 +1,68 @@
1
+ ---
2
+ tier: lite
3
+ description: Every bash hook + script in bassclef follows standards/bash-hook-safety.md.
4
+ ---
5
+
6
+ # Defensive Bash — Methodology Pointer
7
+
8
+ Every bash hook + script in bassclef follows `standards/bash-hook-safety.md`. This rule is the auto-loaded reminder; the standard is the full reference.
9
+
10
+ ## When this rule fires
11
+
12
+ Any edit / write to:
13
+
14
+ - `.claude/hooks/*.sh` (hook files)
15
+ - `scripts/*.sh` (scripts)
16
+ - `lib/*.sh` (shared bash libraries)
17
+ - New bash files anywhere in the repo (`.sh` extension OR `#!/bin/bash` shebang)
18
+
19
+ ## The seven disciplines (one-line each)
20
+
21
+ 1. **Strict mode at the top** — `set -euo pipefail` is mandatory
22
+ 2. **Quote every variable** — `"$var"` always inside string contexts; bare `$var` inside strings causes word-splitting + glob-expansion
23
+ 3. **`local` in functions** — every function-scope variable declared `local`
24
+ 4. **Trap EXIT for cleanup** — temp files / locks / background processes get `trap '...' EXIT`
25
+ 5. **Explicit return codes** — every termination point ends with `exit N`
26
+ 6. **Glob-tolerance** — `shopt -s nullglob` or array-with-length-check
27
+ 7. **Audit emission at every exit** — `trace_record` before exit
28
+
29
+ Full reference: `standards/bash-hook-safety.md` (each discipline has anti-pattern + INSTEAD pair + worked example).
30
+
31
+ ## Saltzer & Schroeder anchor
32
+
33
+ The seven disciplines instantiate `@luminary saltzer-schroeder`'s 8 protection-mechanism principles for the bash layer. The stack-translation table in `.claude/luminaries/saltzer-schroeder.md` maps each principle to its bash discipline.
34
+
35
+ INSTEAD of inventing bassclef-specific bash rules: this rule + standard chain to the 50-year-stable Saltzer & Schroeder authority. The chain is: principle (luminary) → discipline (standard) → reminder (this rule).
36
+
37
+ ## Mechanical enforcement
38
+
39
+ | Layer | Mechanism | When |
40
+ |---|---|---|
41
+ | Methodology | This rule (auto-loaded) | Every session |
42
+ | Tier 0 TDD | `testing-tier-enforce.sh` hook | Edit/Write on `.claude/hooks/*.sh` (test mtime ≤ source mtime) |
43
+ | Shellcheck baseline | `.github/workflows/shellcheck.yml` (Phase X-4) | PR open + push |
44
+ | Strict-mode self-check | Reviewer + `/security-review` skill | PR review |
45
+
46
+ INSTEAD of relying on agent self-discipline alone: mechanical layers fire at the moment of failure. This rule is the methodology layer that coexists with the mechanical layers.
47
+
48
+ ## Override
49
+
50
+ `SKIP_DEFENSIVE_BASH=1 <command>` — for one-shot scripts that will not ship into the substrate (e.g., ad-hoc data inspection). Logged via trace-helper.
51
+
52
+ INSTEAD of overriding when scope is tight: split the work — the throwaway script bypasses; the substrate-bound hook keeps the discipline. Mixing the two leaves substrate code with weakened safety.
53
+
54
+ ## Refs
55
+
56
+ - `standards/bash-hook-safety.md` — full reference
57
+ - `standards/code-safety-principles.md` — language-agnostic principles this rule instantiates
58
+ - `@luminary saltzer-schroeder` — anchor
59
+ - `@luminary john-ousterhout` — Deep modules framing for hook design
60
+ - `@luminary kent-beck` — TDD anchor; Tier 0 strict-TDD applies
61
+ - `.claude/rules/security.md` — sibling rule for web-layer source
62
+ - `.claude/rules/destructive-operations.md` — agent self-assessment companion
63
+ - `.claude/rules/testing-tier-config.md` — Tier 0 strict-TDD discipline
64
+ - docs/iteration-bets/2026-06-17a-secure-coding-foundations-longrun.md — goal authoring this rule
65
+
66
+ ## Retirement
67
+
68
+ This rule retires only if bassclef migrates off bash for hooks. See `standards/bash-hook-safety.md` § Retirement.
@@ -0,0 +1,233 @@
1
+ ---
2
+ tier: lite
3
+ globs: ["**/*"]
4
+ description: Deferred-actions manifest — capability-routed handoff across session modalities. Sessions write entries when capabilities don't satisfy an action; capable future sessions pick them up.
5
+ ---
6
+
7
+ # Deferred Actions — Session Handoff Protocol
8
+
9
+ `docs/deferred-actions/*.md` is the capability-routed handoff primitive.
10
+ When a session produces work it cannot deliver (missing credentials,
11
+ ephemeral sandbox, abrupt stop), it writes a deferred-action entry that
12
+ a capable future session picks up at session-start.
13
+
14
+ See `standards/deferred-actions-schema.md` for the full schema, field
15
+ reference, capability vocabulary, and lifecycle. This rule governs
16
+ *agent behavior* — when to write, when to resolve, how to prioritize.
17
+
18
+ ## When to write a deferred-action entry
19
+
20
+ Any time the session has produced artifacts or state the current
21
+ environment cannot deliver, and a future session with different
22
+ capabilities could.
23
+
24
+ Specifically:
25
+
26
+ 1. **External delivery gap** — skill produced output that pushes to an
27
+ external service (Google Doc, memory file, remote tag) but the
28
+ session lacks the capability. Examples:
29
+ - `/release-notes` in ephemeral-mobile — missing `gcloud-auth`
30
+ - `/journal` in cloud-web — missing `network` + `gcloud-auth`
31
+ - `/deploy-prod` retroactive `git tag` — ephemeral session without `git-tag`
32
+ 2. **Memory proposal** — mobile / cloud-web session identifies a memory
33
+ entry worth adding, but cannot write to `~/.claude/projects/.../memory/`.
34
+ Write a `*-memory.md` entry with the proposed content; next desktop
35
+ session reviews and applies.
36
+ 3. **Session rescue (abrupt stop)** — Stop hook fires in danger mode
37
+ (context exhausted, OS interruption). Write a `*-session-rescue.md`
38
+ entry enumerating unfinished MUST/SHOULD obligations (chronicle
39
+ backfill, whereami update, journal entry). Next session picks them
40
+ up as `BLOCKED:` items.
41
+ 4. **Skill explicitly defers** — any skill that encounters a missing
42
+ capability mid-run should self-detect and write the entry rather
43
+ than silently skipping. Silent skip is a rule violation (per
44
+ `session-artifacts.md` — silence is not deferral).
45
+
46
+ ## How to write
47
+
48
+ Copy `templates/deferred-action-template.md` to
49
+ `docs/deferred-actions/<ISO-ts>-<slug>.md`. Fill every required field
50
+ per the schema. Commit as part of the session's normal artifact flow.
51
+
52
+ ```bash
53
+ # example one-liner for skills
54
+ TS=$(date -u +"%Y-%m-%dT%H-%M-%SZ")
55
+ SLUG="release-notes-gdoc-push"
56
+ cp templates/deferred-action-template.md \
57
+ "docs/deferred-actions/${TS}-${SLUG}.md"
58
+ # ...then edit the frontmatter + body in-place
59
+ ```
60
+
61
+ The file must commit successfully — if `git add` / `git commit` fails
62
+ in the current session, the entry will not propagate. Surface the
63
+ failure visibly; do not silently drop.
64
+
65
+ ## When to resolve
66
+
67
+ At session-start, `60-deferred-actions.sh` scans entries and emits
68
+ `BLOCKED:` for capability-matched entries (this session can resolve)
69
+ or `INFORM:` for capability-missed entries (visible, not actionable).
70
+
71
+ Protocol for `BLOCKED:` entries mirrors `blocked-items.md`:
72
+
73
+ 1. Surface the `BLOCKED:` block verbatim to the operator (agent's
74
+ mandatory response format handles this automatically).
75
+ 2. Each blocked deferred-action entry MUST be either:
76
+ - **Resolved** in this session (run the entry's "Command to execute",
77
+ verify "On completion", apply Pattern A or Pattern B per below), OR
78
+ - **Explicitly deferred** by operator ("skip `<id>` this session")
79
+ 3. Silence is not deferral. Default is resolve.
80
+
81
+ ### Two resolution patterns — Pattern A and Pattern B
82
+
83
+ Resolution shape depends on whether the entry's work was actually done OR routed elsewhere. Picking the wrong pattern is a real substrate failure. The eager mv to `completed/` mistake compounds across consumer sessions if not caught.
84
+
85
+ **Pattern B (mv to completed/) — work was done:**
86
+
87
+ The entry's `Command to execute` ran successfully; the entry's `On
88
+ completion` checks pass; the work the entry described is finished.
89
+
90
+ ```bash
91
+ git mv "docs/deferred-actions/<id>.md" \
92
+ "docs/deferred-actions/completed/<id>.md"
93
+ git commit -m "chore: resolve <id>"
94
+ ```
95
+
96
+ The filename never changes; git tracks the move so audit trail is
97
+ preserved.
98
+
99
+ **Pattern A (keep alive in active dir, flip status, surface as INFORM)
100
+ — work was routed elsewhere:**
101
+
102
+ The entry can't run as written because the substrate needs the current session cannot deliver. Examples: operator decisions, infra not yet provisioned, schema not yet shipped. The work moves to a GitHub issue in the consumer repo with the prereq spec. Bassclef issues get cross-referenced in a comment. The deferred-action file stays **in the active dir** with status flipped to `blocked-on-issue:#NNN`.
103
+
104
+ Procedure:
105
+ 1. File a GitHub issue in the consumer repo with the prereq
106
+ specification.
107
+ 2. Cross-reference relevant bassclef issues in a comment on that
108
+ issue.
109
+ 3. **Leave** the deferred-action file in `docs/deferred-actions/`
110
+ (active dir).
111
+ 4. Edit the entry's frontmatter: set `status: blocked-on-issue:#NNN`.
112
+ 5. When bassclef#434 (`/defer-to-issue` skill) ships, the skill will
113
+ automate steps 1-4 and surface the entry as `INFORM` instead of
114
+ `BLOCKED` at session-start.
115
+
116
+ Why Pattern A: deferred actions stay a visible signal until the substrate work behind them ships. Moving to `completed/` makes them disappear from the BLOCKED/INFORM pipeline. That is correct only when the work itself was done (Pattern B). Not when it was routed elsewhere.
117
+
118
+ ### Picking between A and B
119
+
120
+ ```mermaid
121
+ stateDiagram-v2
122
+ [*] --> Active: entry written
123
+
124
+ Active --> RanCommand: agent runs Command to execute
125
+ RanCommand --> CheckOnCompletion: command succeeded
126
+ CheckOnCompletion --> CompletedB: On completion check passes (work done)
127
+ CheckOnCompletion --> RanCommand: check fails — retry
128
+
129
+ Active --> FoundFalsePositive: hook fired but work was already done
130
+ FoundFalsePositive --> CompletedB: mv to completed/ with body note
131
+
132
+ Active --> NeedsPrereqs: work needs prereqs current session cannot deliver
133
+ NeedsPrereqs --> FiledIssue: file GitHub issue with prereq spec
134
+ FiledIssue --> BlockedOnIssueA: leave in active dir, flip status to blocked-on-issue:#NNN
135
+
136
+ CompletedB --> [*]: archived in completed/ dir
137
+ BlockedOnIssueA --> Active: prereqs land, retry
138
+ BlockedOnIssueA --> CompletedB: re-routed work satisfied elsewhere
139
+ ```
140
+
141
+ The state machine. Pattern B archives via `git mv` to `completed/`. Pattern A keeps the entry in `active/` and flips its status. Picking wrong compounds across consumer sessions. The wrong pick is: eager mv to `completed/` when the work was routed elsewhere.
142
+
143
+ Ask: did the entry's `Command to execute` run successfully and does
144
+ its `On completion` check pass?
145
+
146
+ - **Yes** → Pattern B (mv to completed/)
147
+ - **No, because the work needs prereqs the current session can't
148
+ deliver** → Pattern A (file issue, flip status, leave in active dir)
149
+ - **No, because the entry was a hook false-positive (the work was
150
+ already done elsewhere)** → Pattern B (mv to completed/) with a
151
+ body note in the resolution commit explaining the false-positive
152
+ reason
153
+
154
+ Mid-session, if you are tempted to mv a deferred-action to `completed/` because "we decided not to do it tonight" — STOP. That is Pattern A territory. File the issue. Comment with cross-refs. Leave the file alone. If you have already mv'd, revert. Push the revert to the same branch the file lives on.
155
+
156
+ ### Source incidents
157
+
158
+ - TwoDo session 2026-05-02 (`docs/chronicle/2026-05-02-bind-subdomain-deferred-action-triage.md`): bind-subdomain deferred-action filed by cloud `/launch` dispatch (TwoDo PR #269) needed deploy-host provisioning the session couldn't do. First pass mv'd to `completed/` (commit `b4db506`); operator caught it and reverted (`b566d6c`) so bassclef#434 (when shipped) can route through Pattern A.
159
+ - bassclef session 2026-05-03 /longrun pre-flight: `2026-05-01T11-51-24Z-session-rescue` had its hook-flagged obligations satisfied across subsequent sessions (chronicles written daily, whereami fresh) — Pattern B mv to completed/ correct here (work satisfied via natural session flow, not structurally re-routed).
160
+
161
+ ### Reference
162
+
163
+ - bassclef#434 — `/defer-to-issue` skill (automates Pattern A)
164
+ - bassclef#437 — deferred-action schema extension (adds the
165
+ `blocked-on-issue:#NNN` status field referenced above)
166
+
167
+ ## When to surface INFORM
168
+
169
+ `INFORM:` entries are visible at session-start but not actionable in
170
+ the current modality. Agent behavior:
171
+
172
+ - Acknowledge the count in the session plan ("3 deferred entries require
173
+ capabilities this session doesn't have — next desktop session picks
174
+ them up")
175
+ - Do NOT attempt to resolve them. Doing so wastes turns and may corrupt
176
+ the entry (partial resolution with wrong capabilities).
177
+ - Do NOT delete or archive them. They wait for a capable session.
178
+
179
+ ## Priority handling
180
+
181
+ Entries have `priority: high | medium | low` in frontmatter. Resolution
182
+ order within a session:
183
+
184
+ 1. All `high` entries first (integrity-critical — missing chronicle,
185
+ orphan memory proposal)
186
+ 2. All `medium` entries (delivery gaps with downstream cost)
187
+ 3. `low` entries (nice-to-have) only if time budget allows
188
+
189
+ If a session has 5+ resolvable entries, batch by priority and surface a
190
+ resolution plan to the operator before running through them.
191
+
192
+ ## What NOT to write as a deferred action
193
+
194
+ - **Tasks the operator hasn't asked for** — deferred actions are for
195
+ already-produced work, not proactive task proposals. Use GitHub
196
+ issues for that.
197
+ - **Debug state or scratch notes** — chronicle footnotes, commit
198
+ messages, and scratch branches cover these.
199
+ - **Information the resolver can re-derive** — if the work can be
200
+ re-produced by running the skill again, just cite the skill in a
201
+ chronicle and let the next session re-run it.
202
+
203
+ ## Relationship to other rules
204
+
205
+ - `blocked-items.md` — deferred actions fire through the same
206
+ BLOCKED/resolve/explicit-defer protocol; this rule adds the
207
+ capability-routing layer
208
+ - `mobile-ephemeral-session.md` — modality detection + the rule that
209
+ markers go git-tracked (not `/tmp`); deferred actions are the
210
+ mechanism for modality-bridging
211
+ - `session-artifacts.md` — chronicle + journal-entry tier obligations;
212
+ session-rescue entries cover the abrupt-stop case
213
+ - `artifact-ingestion.md` — resolving a deferred action counts as
214
+ "reading prior artifact"; the entry itself is the source to cite
215
+
216
+ ## Override paths
217
+
218
+ - **Skip this session**: operator explicit "skip `<id>`" — entry stays
219
+ in place, next session surfaces it again
220
+ - **Reject as not-needed**: operator explicit "reject `<id>`" — the
221
+ resolving session `git mv`'s to `completed/` with a body note
222
+ explaining rejection rationale (audit trail preserved)
223
+ - **Re-scope mid-resolution**: if the entry's command no longer applies,
224
+ amend the entry body to describe the new path; do not delete
225
+
226
+ ## Enforcement
227
+
228
+ Methodology-level. The session-reflection hook surfaces entries; the
229
+ rule governs disposition. Mechanical enforcement (hook blocks session
230
+ on unresolved high-priority entries) could be added if methodology
231
+ alone proves insufficient.
232
+
233
+ Override per-session: `SKIP_DEFERRED_ACTIONS=1 <command>` (logged to trace).
@@ -0,0 +1,156 @@
1
+ ---
2
+ tier: lite
3
+ description: "Every GitHub issue body opens with Problem (≤500 chars): + --- + technical detail."
4
+ ---
5
+
6
+ # GitHub Issue Body — Problem-Section Discipline
7
+
8
+ Every GitHub issue body opens with `**Problem (≤500 chars):**` + `---` + technical detail. Operators on mobile read the title, then the Problem statement, then decide whether to scroll into the body. Detail comes AFTER the problem framing, not before.
9
+
10
+ This rule closes the missing-surface gap: bassclef already enforces a clean opener at three other surfaces (skill descriptions per bassclef#377, plan enumerations per bassclef#339, autonomous-run output per bassclef#357). bassclef#484 originally adopted Flash + Tweet at the issue surface; bassclef#1178 retires that pairing in favor of a single problem-grounded section drafted by `/state-a-problem brief` — same shape, better orientation, fewer chars for the operator to scan.
11
+
12
+ ## Why this rule exists
13
+
14
+ Operator feedback during /longrun 2026-05-04d closeout: "we were supposed to be ensuring that we were having value propositions and keep it simple (i.e., KISS-type skill and GitHub issue organizing). I'm not sure we're doing that consistently."
15
+
16
+ Tickets bassclef#479 + bassclef#480 (filed during the same session) both had multi-section technical bodies with no opener. Operator on mobile reads title + scrolls past. Agent reading the ticket later has to re-scan to extract the 1-line claim. Both tickets DEMONSTRATE the gap; this rule closes it.
17
+
18
+ V1 (bassclef#484) shipped Flash + Tweet. Operator observation 2026-06-18 surfaced that Flash + Tweet was solution-framed twice — neither stated user pain. bassclef#1178 retires Flash + Tweet at the issue surface in favor of a single problem-grounded opener. Same eat-our-own-dogfood: this rule, amended for bassclef#1178, opens its own related tickets with the new shape.
19
+
20
+ ## Format contract
21
+
22
+ Every issue body MUST open with:
23
+
24
+ ```markdown
25
+ **Problem (≤500 chars):** <Who + What + When + Why now + Outcome — framework implicit; drafted by /state-a-problem brief>
26
+
27
+ ---
28
+
29
+ ## <first detail section>
30
+ ```
31
+
32
+ Format rules:
33
+
34
+ - **Problem label is bold and enclosed in `**`** — visual scan handle, not body prose
35
+ - **Length limit enforced** — Problem ≤500 chars (matches `/state-a-problem brief` mode cap)
36
+ - **Plain language** — no bassclef jargon ("primitive", "load-bearing") 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 this rule is hard to violate
37
+ - **Horizontal rule** (`---`) separates Problem from technical detail
38
+ - **Implicit framework** — Who/What/When/Why-now/Outcome carried in 3-4 sentences; labels NOT in the output
39
+ - **No leading whitespace or code blocks before Problem** — must be the literal first content of the body
40
+
41
+ ## What NOT to do
42
+
43
+ - **Don't open with a section header** (`## Summary`, `## Context`, etc.) before Problem. INSTEAD: Problem is the headline; section headers come after the `---` rule.
44
+ - **Don't fall back to Flash + Tweet** because the `/state-a-problem` skill is not at hand. INSTEAD: hand-roll the Problem section using the implicit framework (Who/What/When/Why-now/Outcome in 3-4 sentences). The shape contract holds even when the mechanical layer is not running.
45
+ - **Don't bury the claim in a "## Why this is needed" section.** INSTEAD: the claim IS the Problem opener; the rest of "why" belongs in detail.
46
+ - **Don't use jargon walls in Problem.** INSTEAD: substitute plain English per `standards/bassclef-internal-jargon.md` and the `/kiss --grade10` table.
47
+ - **Don't skip Problem because "the title says it."** INSTEAD: titles are search-truncated to ~70 chars; the Problem section gives the operator full context without needing to load the body.
48
+
49
+ ## Trivial-fix exception
50
+
51
+ Bug-report or quick-fix tickets MAY skip the Problem section if the scope is one file AND no methodology change is implied (e.g., "typo in line 42 of X"). The shape contract still requires a clear first detail section in that case.
52
+
53
+ ## When this rule fires
54
+
55
+ Every NEW GitHub issue body filed via:
56
+
57
+ - `/promote` SKILL.md output — must include Problem section at top
58
+ - `gh issue create` direct dispatch — agent self-checks before writing; local pre-author scrub fires via bassclef#1177 (PR #1180)
59
+ - Manual operator filing via GitHub web UI — issue templates updated to show Problem shape
60
+
61
+ Existing tickets are NOT retroactively backfilled. Forward-only enforcement keeps the discipline visible at the ticket-creation surface where it lands.
62
+
63
+ ## Mechanical enforcement
64
+
65
+ V1 shipped methodology + `/promote` SKILL composition update (bassclef#484). V2 shipped local pre-author body scrub via bassclef#1177 (PR #1180 merged 2026-06-18). V3 (this bassclef#1178 amendment) ships:
66
+
67
+ - Shape contract enforces Problem opener at substantive issue bodies
68
+ - `/state-a-problem brief` skill drafts the section (runs `/kiss --grade10` inline by default)
69
+ - `/promote` SKILL output gains the Problem-section shape
70
+
71
+ ## Override path
72
+
73
+ `SKIP_ISSUE_PROBLEM_SHAPE=1 <command>` — for genuinely-not-issue-body cases (e.g., bug reports filed directly by external users where bassclef doesn't control the format). Logged.
74
+
75
+ INSTEAD of overriding for tight scope: write the Problem section. Three sentences carrying the framework cost less than reviewer re-derivation.
76
+
77
+ ## Worked examples
78
+
79
+ ### Anti-pattern (what NOT to do — bassclef#479 + #480 demonstrate this)
80
+
81
+ ```markdown
82
+ ## Summary
83
+
84
+ Add `/roadmap-reconcile` — a bassclef skill that updates roadmap surfaces...
85
+
86
+ ## Why this is needed
87
+
88
+ Observed pattern (2026-05-04 sessions, captured during /longrun prep 2026-05-04d):
89
+
90
+ 1. Operator ideation surfaces a load-bearing detour mid-session...
91
+ 2. The detour reshapes downstream LR-N sequencing, but the canvases that hold...
92
+ ```
93
+
94
+ Operator on mobile reads title, then "Summary" header, then has to read 3 paragraphs to get the claim. The claim is buried; user pain stays implicit.
95
+
96
+ ### Anti-pattern (V1 Flash + Tweet — superseded by bassclef#1178)
97
+
98
+ ```markdown
99
+ **Flash (≤180 chars):** /roadmap-reconcile automates LR4 WU-0's manual canvas reconciliation — diffs canvas LR-N tables against shipping reality, surfaces drift via dry-run, applies edits with --apply.
100
+
101
+ **Tweet (≤280 chars):** Stale-canvas trap closes: every future /longrun prep auto-reconciles before scope commit. Skill detects status mismatch, sequencing mismatch, and reference rot.
102
+ ```
103
+
104
+ Better than no shape, but solution-framed twice. Reader still does not know WHY this work exists — only WHAT it does.
105
+
106
+ ### Conformant pattern (bassclef#1178 — Problem opener)
107
+
108
+ ```markdown
109
+ **Problem (≤500 chars):** Today canvas LR-N tables and shipping reality drift apart across long sessions — operators returning to a canvas after a /longrun see stale status, wrong sequencing, and reference rot. The drift compounds across iterations until someone manually reconciles. The change we want is automated reconciliation at every /longrun prep so canvas tables and shipping reality stay aligned without manual cycles.
110
+
111
+ ---
112
+
113
+ ## Goal
114
+
115
+ Add `/roadmap-reconcile` — a bassclef skill that...
116
+ ```
117
+
118
+ Operator gets user pain → solution → diff in <60 seconds. Detail follows for those who want depth.
119
+
120
+ ## Composes with
121
+
122
+ - `/state-a-problem` skill (brief mode, ≤500 chars) — drafts the Problem section; runs `/kiss --grade10` inline by default
123
+ - `/promote` SKILL.md — composes Problem section at the top of every filed issue body
124
+ - `/kiss` skill (words mode) — applies plain-English substitution to body's technical detail
125
+ - `.claude/rules/pr-body-shape.md` (bassclef#906, amended by bassclef#1178) — sister discipline at PR-body surface
126
+ - `.claude/rules/skill-description-clarity.md` (bassclef#377) — sibling discipline at description surface
127
+ - `.claude/rules/plan-enumeration-needs-value-props.md` (bassclef#339) — sibling discipline at choice-presentation surface
128
+
129
+ ## Distinct from
130
+
131
+ - `commit-conventions.md` — commit messages have separate format; this rule applies to issue BODIES, not commits
132
+ - `iteration-bet-brief-completeness.md` — that's about delegation briefs (handoff content); this is about ticket-creation surface
133
+ - `pattern-annotation.md` — that's source-code annotation discipline; orthogonal
134
+
135
+ ## Sources read
136
+
137
+ - bassclef#484 (this rule's V1 parent ticket — filed at LR4 closeout) — operator framing
138
+ - bassclef#1178 — V3 amendment (Problem section + `/state-a-problem` skill) — replaces Flash + Tweet at this surface
139
+ - bassclef#377 (`.claude/rules/skill-description-clarity.md`) — sibling discipline at description surface
140
+ - bassclef#339 (`.claude/rules/plan-enumeration-needs-value-props.md`) — sibling discipline at enumeration surface
141
+ - bassclef#357 (autonomous-run flash + kiss) — sibling discipline at output surface
142
+ - bassclef#1176 + bassclef#1177 — local pre-author body scrub hooks
143
+ - `.claude/skills/value-prop/SKILL.md` — Flash + Tweet modes kept for chronicle / journal entry surfaces (just not PR + issue)
144
+ - `.claude/skills/state-a-problem/SKILL.md` — replaces Flash + Tweet at this surface
145
+ - `.claude/skills/promote/SKILL.md` — composition surface this rule integrates with
146
+ - NN/g, UX Design Institute, OpinionX problem-statement frameworks — the templates `/state-a-problem` synthesizes
147
+
148
+ ## Closes
149
+
150
+ - V1 of bassclef#484 — Flash + Tweet at issue body opener (WU-3 of LR5)
151
+ - V2 of bassclef#484 — local pre-author scrub (bassclef#1176 + bassclef#1177)
152
+ - V3 of bassclef#484 — Problem section opener replacing Flash + Tweet (bassclef#1178 — this amendment)
153
+
154
+ ## Retirement condition
155
+
156
+ If observed across 6 months with zero operator corrections of issue opener formatting + `/promote` SKILL output consistently Problem-first, this rule is calibrated. If operator stops asking "what does this ticket buy me?" entirely, the rule has done its job.