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