@thebassclef/lite 1.0.4 → 1.1.1
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 +298 -55
- package/dist/cli.js +298 -55
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/lite/.claude/agents/architect.md +70 -0
- package/dist/lite/.claude/agents/builder.md +114 -0
- package/dist/lite/.claude/agents/designer.md +156 -0
- package/dist/lite/.claude/agents/reviewer.md +88 -0
- package/dist/lite/.claude/hooks/bassclef-sync.sh +85 -27
- package/dist/lite/.claude/hooks/longrun-prep-compounding-axis-check.sh +492 -0
- package/dist/lite/.claude/hooks/longrun-prep-render-check.sh +236 -0
- package/dist/lite/.claude/hooks/persona-name-scrub-check.sh +105 -0
- package/dist/lite/.claude/hooks/skill-step-list-check.sh +171 -0
- package/dist/lite/.claude/luminaries/alan-cooper.md +170 -0
- package/dist/lite/.claude/luminaries/alistair-cockburn.md +140 -0
- package/dist/lite/.claude/luminaries/amazon-pr-faq.md +34 -0
- package/dist/lite/.claude/luminaries/andreas-zeller.md +74 -0
- package/dist/lite/.claude/luminaries/ash-maurya.md +121 -0
- package/dist/lite/.claude/luminaries/bill-buxton.md +210 -0
- package/dist/lite/.claude/luminaries/charles-sanders-peirce.md +150 -0
- package/dist/lite/.claude/luminaries/david-ogilvy.md +192 -0
- package/dist/lite/.claude/luminaries/don-norman.md +173 -0
- package/dist/lite/.claude/luminaries/edward-tufte.md +179 -0
- package/dist/lite/.claude/luminaries/eric-evans.md +160 -0
- package/dist/lite/.claude/luminaries/frederick-brooks.md +50 -0
- package/dist/lite/.claude/luminaries/gang-of-four.md +157 -0
- package/dist/lite/.claude/luminaries/glenford-myers.md +230 -0
- package/dist/lite/.claude/luminaries/hunt-thomas.md +115 -0
- package/dist/lite/.claude/luminaries/hyrum-wright.md +94 -0
- package/dist/lite/.claude/luminaries/jason-fried-dhh.md +46 -0
- package/dist/lite/.claude/luminaries/jesse-james-garrett.md +154 -0
- package/dist/lite/.claude/luminaries/john-ousterhout.md +94 -0
- package/dist/lite/.claude/luminaries/karl-popper.md +132 -0
- package/dist/lite/.claude/luminaries/kent-beck.md +168 -0
- package/dist/lite/.claude/luminaries/linus-torvalds.md +218 -0
- package/dist/lite/.claude/luminaries/martin-fowler.md +164 -0
- package/dist/lite/.claude/luminaries/michael-feathers.md +125 -0
- package/dist/lite/.claude/luminaries/michael-nygard.md +118 -0
- package/dist/lite/.claude/luminaries/robert-c-martin.md +164 -0
- package/dist/lite/.claude/luminaries/saltzer-schroeder.md +194 -0
- package/dist/lite/.claude/luminaries/sophia-prater.md +193 -0
- package/dist/lite/.claude/luminaries/stephen-toulmin.md +131 -0
- package/dist/lite/.claude/luminaries/tony-hoare.md +170 -0
- package/dist/lite/.claude/luminaries/vaughn-vernon.md +50 -0
- package/dist/lite/.claude/luminaries/w-edwards-deming.md +158 -0
- package/dist/lite/.claude/rules/accessor-library-discipline.md +110 -0
- package/dist/lite/.claude/rules/adr-discipline.md +96 -0
- package/dist/lite/.claude/rules/api-conventions.md +115 -0
- package/dist/lite/.claude/rules/artifact-ingestion.md +137 -0
- package/dist/lite/.claude/rules/assert-only-after-verify.md +111 -0
- package/dist/lite/.claude/rules/blocked-items.md +139 -0
- package/dist/lite/.claude/rules/bootstrap-pair-discipline.md +106 -0
- package/dist/lite/.claude/rules/branching.md +28 -0
- package/dist/lite/.claude/rules/cold-adopter-harness-discipline.md +93 -0
- package/dist/lite/.claude/rules/commit-conventions.md +22 -0
- package/dist/lite/.claude/rules/compounding-axis-fresh-analysis.md +173 -0
- package/dist/lite/.claude/rules/compounding-sequence-fresh-analysis.md +173 -0
- package/dist/lite/.claude/rules/context-engineering.md +155 -0
- package/dist/lite/.claude/rules/context-management.md +85 -0
- package/dist/lite/.claude/rules/defensive-bash.md +52 -0
- package/dist/lite/.claude/rules/deferred-actions.md +233 -0
- package/dist/lite/.claude/rules/destructive-operations.md +69 -0
- package/dist/lite/.claude/rules/diagnosis.md +38 -0
- package/dist/lite/.claude/rules/github-issue-flash-tweet.md +114 -0
- package/dist/lite/.claude/rules/guardrails.md +73 -0
- package/dist/lite/.claude/rules/hook-wire-on-author.md +77 -0
- package/dist/lite/.claude/rules/identifier-leak-prevention.md +73 -0
- package/dist/lite/.claude/rules/iteration-bet-brief-completeness.md +43 -0
- package/dist/lite/.claude/rules/lite-manifest-schema-change-discipline.md +79 -0
- package/dist/lite/.claude/rules/longrun-prep-plan-doc-compression.md +77 -0
- package/dist/lite/.claude/rules/loop-discipline.md +71 -0
- package/dist/lite/.claude/rules/manual-prod-approval.md +100 -0
- package/dist/lite/.claude/rules/marker-enrichment-discipline.md +72 -0
- package/dist/lite/.claude/rules/mobile-ephemeral-session.md +109 -0
- package/dist/lite/.claude/rules/new-dependency-check.md +44 -0
- package/dist/lite/.claude/rules/oo-ad-entry-point.md +95 -0
- package/dist/lite/.claude/rules/operator-facing-prose.md +177 -0
- package/dist/lite/.claude/rules/option-label-discipline.md +82 -0
- package/dist/lite/.claude/rules/pattern-annotation.md +83 -0
- package/dist/lite/.claude/rules/persona-name-leak-scrub.md +90 -0
- package/dist/lite/.claude/rules/plain-english-discipline.md +132 -0
- package/dist/lite/.claude/rules/plan-enumeration-needs-value-props.md +177 -0
- package/dist/lite/.claude/rules/pr-body-shape.md +195 -0
- package/dist/lite/.claude/rules/pr-strategy.md +142 -0
- package/dist/lite/.claude/rules/pr-title-shape.md +90 -0
- package/dist/lite/.claude/rules/prototype-workflow.md +53 -0
- package/dist/lite/.claude/rules/reserved-skill-names.md +103 -0
- package/dist/lite/.claude/rules/schema-management.md +42 -0
- package/dist/lite/.claude/rules/sdlc-gates.md +149 -0
- package/dist/lite/.claude/rules/security.md +37 -0
- package/dist/lite/.claude/rules/session-artifacts.md +236 -0
- package/dist/lite/.claude/rules/skill-composition-declarations.md +105 -0
- package/dist/lite/.claude/rules/skill-description-clarity.md +196 -0
- package/dist/lite/.claude/rules/skill-procedure-step-list.md +119 -0
- package/dist/lite/.claude/rules/sprint-prep-preset-picker.md +76 -0
- package/dist/lite/.claude/rules/state-schema-validation.md +156 -0
- package/dist/lite/.claude/rules/stuck-signal-diagnostic.md +111 -0
- package/dist/lite/.claude/rules/substrate-config-schema.md +85 -0
- package/dist/lite/.claude/rules/test-list-discipline.md +129 -0
- package/dist/lite/.claude/rules/test-sufficiency.md +186 -0
- package/dist/lite/.claude/rules/testing-tier-config.md +125 -0
- package/dist/lite/.claude/rules/testing.md +38 -0
- package/dist/lite/.claude/rules/turn-estimate-grounding.md +82 -0
- package/dist/lite/.claude/rules/visual-hierarchy.md +427 -0
- package/dist/lite/.claude/rules/we-dont-break-adopters.md +103 -0
- package/dist/lite/.claude/rules/whereami-load-bearing.md +184 -0
- package/dist/lite/.claude/rules/writing-craft-discipline.md +72 -0
- package/dist/lite/.claude/rules/wu-sequencing-compounds.md +119 -0
- package/dist/lite/.claude/skills/build/SKILL.md +640 -0
- package/dist/lite/.claude/skills/chronicle/SKILL.md +55 -0
- package/dist/lite/.claude/skills/clean-artifacts/SKILL.md +249 -0
- package/dist/lite/.claude/skills/decompose/SKILL.md +280 -0
- package/dist/lite/.claude/skills/diagnose/SKILL.md +297 -0
- package/dist/lite/.claude/skills/feynman/SKILL.md +90 -0
- package/dist/lite/.claude/skills/howdoi/SKILL.md +105 -0
- package/dist/lite/.claude/skills/ia-model/SKILL.md +108 -0
- package/dist/lite/.claude/skills/interaction-design/SKILL.md +112 -0
- package/dist/lite/.claude/skills/interpret-input/SKILL.md +180 -0
- package/dist/lite/.claude/skills/journal/SKILL.md +209 -0
- package/dist/lite/.claude/skills/kiss/SKILL.md +449 -0
- package/dist/lite/.claude/skills/launch/SKILL.md +915 -0
- package/dist/lite/.claude/skills/lean-canvas/SKILL.md +332 -0
- package/dist/lite/.claude/skills/longrun/SKILL.md +512 -0
- package/dist/lite/.claude/skills/luminary/SKILL.md +481 -0
- package/dist/lite/.claude/skills/ogilvy-writing-audit/SKILL.md +177 -0
- package/dist/lite/.claude/skills/onboard-repo/SKILL.md +1640 -0
- package/dist/lite/.claude/skills/pattern-review/SKILL.md +99 -0
- package/dist/lite/.claude/skills/personas/SKILL.md +207 -0
- package/dist/lite/.claude/skills/promote/SKILL.md +283 -0
- package/dist/lite/.claude/skills/requirement/SKILL.md +98 -0
- package/dist/lite/.claude/skills/retro/SKILL.md +117 -0
- package/dist/lite/.claude/skills/riff/SKILL.md +114 -0
- package/dist/lite/.claude/skills/roadmap-reconcile/SKILL.md +163 -0
- package/dist/lite/.claude/skills/session-end/SKILL.md +309 -0
- package/dist/lite/.claude/skills/session-log/SKILL.md +299 -0
- package/dist/lite/.claude/skills/skills/SKILL.md +228 -0
- package/dist/lite/.claude/skills/spec/SKILL.md +105 -0
- package/dist/lite/.claude/skills/sprint/SKILL.md +418 -0
- package/dist/lite/.claude/skills/stage/SKILL.md +384 -0
- package/dist/lite/.claude/skills/state-a-problem/SKILL.md +185 -0
- package/dist/lite/.claude/skills/temperance/SKILL.md +108 -0
- package/dist/lite/.claude/skills/use-case/SKILL.md +417 -0
- package/dist/lite/.claude/skills/user-stories/SKILL.md +268 -0
- package/dist/lite/.claude/skills/value-prop/SKILL.md +251 -0
- package/dist/lite/.claude/skills/verify/SKILL.md +160 -0
- package/dist/lite/.claude/skills/visual-review/SKILL.md +503 -0
- package/dist/lite/.claude/skills/whats-the-plan/SKILL.md +202 -0
- package/dist/lite/.claude/skills/whereami/SKILL.md +307 -0
- package/dist/lite/AGENTS.md +79 -0
- package/dist/lite/CLAUDE-lite.md +85 -0
- package/dist/lite/CODE_OF_CONDUCT.md +28 -0
- package/dist/lite/CONTRIBUTING.md +177 -0
- package/dist/lite/README.md +173 -0
- package/dist/lite/SECURITY.md +19 -0
- package/dist/lite/architecture/decisions/ADR-029-release-pipeline.md +79 -0
- package/dist/lite/architecture/decisions/ADR-031-non-breaking-changes-adopter-discipline.md +139 -0
- package/dist/lite/architecture/decisions/ADR-032-adopter-sync-dispatcher-architecture.md +192 -0
- package/dist/lite/architecture/decisions/ADR-039-release-tagging-scheme.md +145 -0
- package/dist/lite/architecture/decisions/ADR-040-planning-skill-vocabulary-and-lite-profile.md +155 -0
- package/dist/lite/architecture/decisions/ADR-044-unified-skill-body-template.md +162 -0
- package/dist/lite/lib/clean-artifacts-sweep.sh +112 -0
- package/dist/lite/lib/code-comment-discipline.sh +144 -0
- package/dist/lite/lib/composer-preflight.sh +459 -0
- package/dist/lite/lib/deferred-actions.sh +146 -0
- package/dist/lite/lib/hook-header-parser.sh +61 -0
- package/dist/lite/lib/hook-heartbeat.sh +152 -0
- package/dist/lite/lib/hook-inject.sh +255 -0
- package/dist/lite/lib/hook-installer.sh +195 -0
- package/dist/lite/lib/luminary-pick.sh +96 -0
- package/dist/lite/lib/output-discipline.sh +143 -0
- package/dist/lite/lib/prose-scan-boundary.sh +171 -0
- package/dist/lite/lib/rewrite-check.sh +214 -0
- package/dist/lite/lib/session-rescue.sh +151 -0
- package/dist/lite/lib/source-graph-walker.sh +277 -0
- package/dist/lite/lib/state.sh +1372 -0
- package/dist/lite/lib/telemetry.sh +205 -0
- package/dist/lite/lib/tier-check.sh +187 -0
- package/dist/lite/lib/tier-dependency-audit.sh +1088 -0
- package/dist/lite/presence/install/bassclef-hook-connect.sh +178 -0
- package/dist/lite/presence/install/bassclef-sync.dispatcher.template.sh +841 -0
- package/dist/lite/presence/install/bassclef-sync.template.sh +2278 -0
- package/dist/lite/presence/install/schedule-auto-save.cron.sh +88 -0
- package/dist/lite/presence/install/schedule-auto-save.taskscheduler.md +122 -0
- package/dist/lite/scripts/aggregate-telemetry.sh +217 -0
- package/dist/lite/scripts/analyze-tier-dependencies.sh +239 -0
- package/dist/lite/scripts/generate-lite-manifest.sh +505 -0
- package/dist/lite/scripts/generate-tier-manifest.sh +28 -0
- package/dist/lite/scripts/intent-drift-check.sh +456 -0
- package/dist/lite/scripts/lite-manifest-drift-check.sh +146 -0
- package/dist/lite/scripts/render-lite-manifest-doc.sh +150 -0
- package/dist/lite/standards/adr-template.md +86 -0
- package/dist/lite/standards/api-conventions/nextjs.md +84 -0
- package/dist/lite/standards/artifact-composition.md +209 -0
- package/dist/lite/standards/bash-hook-safety.md +246 -0
- package/dist/lite/standards/bassclef-configs-schema.md +232 -0
- package/dist/lite/standards/bassclef-evolution.md +143 -0
- package/dist/lite/standards/bassclef-internal-jargon.md +244 -0
- package/dist/lite/standards/bassclef-managed-sentinel.md +96 -0
- package/dist/lite/standards/bassclef-source-config.md +228 -0
- package/dist/lite/standards/branch-stacking.md +408 -0
- package/dist/lite/standards/code-safety-principles.md +176 -0
- package/dist/lite/standards/composer-prerequisites.md +155 -0
- package/dist/lite/standards/deferred-actions-schema.md +204 -0
- package/dist/lite/standards/dependency-discipline/cargo.md +39 -0
- package/dist/lite/standards/dependency-discipline/gem.md +43 -0
- package/dist/lite/standards/dependency-discipline/go-mod.md +41 -0
- package/dist/lite/standards/dependency-discipline/npm.md +42 -0
- package/dist/lite/standards/dependency-discipline/pip.md +42 -0
- package/dist/lite/standards/deployment-topology/ec2-tailscale.md +225 -0
- package/dist/lite/standards/deployment-topology.md +69 -0
- package/dist/lite/standards/docs-sync-allowlist.md +76 -0
- package/dist/lite/standards/domain-and-dns.md +145 -0
- package/dist/lite/standards/frontend-stack.md +67 -0
- package/dist/lite/standards/frontmatter-schema.md +154 -0
- package/dist/lite/standards/graceful-exit.md +227 -0
- package/dist/lite/standards/hook-idempotency.md +102 -0
- package/dist/lite/standards/hook-injection-discipline.md +202 -0
- package/dist/lite/standards/hook-install-class.md +215 -0
- package/dist/lite/standards/input-handler-interface.md +152 -0
- package/dist/lite/standards/lite-manifest-schema-changes.md +180 -0
- package/dist/lite/standards/lite-manifest.json +2797 -0
- package/dist/lite/standards/luminary-matching.md +105 -0
- package/dist/lite/standards/luminary-problem-patterns.md +481 -0
- package/dist/lite/standards/migration-discipline/active-record.md +50 -0
- package/dist/lite/standards/migration-discipline/alembic.md +43 -0
- package/dist/lite/standards/migration-discipline/gorm.md +50 -0
- package/dist/lite/standards/migration-discipline/prisma.md +53 -0
- package/dist/lite/standards/migration-discipline/sqlalchemy.md +51 -0
- package/dist/lite/standards/mobile-ephemeral-session.md +167 -0
- package/dist/lite/standards/model-routing-discipline.md +160 -0
- package/dist/lite/standards/ogilvy-writing-rules.md +225 -0
- package/dist/lite/standards/opener-discipline.md +96 -0
- package/dist/lite/standards/operator-facing-prose-discipline.md +201 -0
- package/dist/lite/standards/persona-schema.md +229 -0
- package/dist/lite/standards/pluggable-luminaries.md +323 -0
- package/dist/lite/standards/pr-body-discipline.md +115 -0
- package/dist/lite/standards/preview-state-schema.md +189 -0
- package/dist/lite/standards/project-directory-layout.md +276 -0
- package/dist/lite/standards/release-tagging.md +137 -0
- package/dist/lite/standards/reserved-skill-names.md +120 -0
- package/dist/lite/standards/scannable-multi-option-output.md +265 -0
- package/dist/lite/standards/sdlc-compliance.md +286 -0
- package/dist/lite/standards/sdlc-gates/typescript.md +57 -0
- package/dist/lite/standards/secrets-lifecycle.md +210 -0
- package/dist/lite/standards/security-scanner-adapter.md +145 -0
- package/dist/lite/standards/session-board.md +256 -0
- package/dist/lite/standards/skill-output-discipline.md +121 -0
- package/dist/lite/standards/state-spine-contract.md +255 -0
- package/dist/lite/standards/state-spine.md +511 -0
- package/dist/lite/standards/steering-hints/kiss-words.md +11 -0
- package/dist/lite/standards/substrate-config-schema.md +267 -0
- package/dist/lite/standards/tech-stack-config.md +109 -0
- package/dist/lite/standards/tier-dependency-analysis.md +167 -0
- package/dist/lite/standards/tier-runtime-deps/lite.md +57 -0
- package/dist/lite/standards/tier-tag-schema.md +155 -0
- package/dist/lite/standards/two-layer-config.md +99 -0
- package/dist/lite/standards/use-case-format.md +292 -0
- package/dist/lite/standards/user-story-invest.md +268 -0
- package/dist/lite/standards/velocity-and-appetite.md +229 -0
- package/dist/lite/standards/voice-input-pattern.md +119 -0
- package/dist/lite/standards/whereami-schema.md +301 -0
- package/dist/lite/standards/worktree-management.md +211 -0
- package/dist/lite/standards/writing-guide.md +213 -0
- package/dist/lite/templates/chronicle-template.md +75 -0
- package/dist/lite/templates/deferred-action-template.md +45 -0
- package/dist/lite/templates/memory-proposal-template.md +77 -0
- package/dist/lite/templates/persona-template.md +200 -0
- package/dist/lite/templates/pr-faq.md +45 -0
- package/dist/lite/templates/secret-rotation-template.md +162 -0
- package/dist/lite/templates/spec-template.md +131 -0
- package/dist/lite/templates/use-case-template.md +194 -0
- package/dist/lite/templates/user-story-template.md +107 -0
- package/dist/lite/templates/whereami-template.md +101 -0
- package/package.json +12 -5
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
description: Substrate changes that touch any adopter-observable surface MUST pass the cold-adopter harness before merge.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Cold-Adopter Harness Discipline
|
|
7
|
+
|
|
8
|
+
Substrate changes that touch any adopter-observable surface MUST pass the cold-adopter harness before merge. The harness lives at `scripts/cold-adopter-harness-sync.sh` and runs as a PR-blocking job in `.github/workflows/bassclef-pr-ci.yml`. This rule is the methodology layer; the CI job is the mechanical layer; both load-bearing together close the audit gap that surfaced 2026-06-25 (harness existed but no rule required substrate evolution to drive a check).
|
|
9
|
+
|
|
10
|
+
## When this rule fires
|
|
11
|
+
|
|
12
|
+
Any PR that touches a path in the adopter-observable surface set:
|
|
13
|
+
|
|
14
|
+
- `.claude/hooks/*.sh` — hook scripts adopters symlink into their `.claude/` dirs
|
|
15
|
+
- `.claude/skills/*/SKILL.md` — skill definitions adopters discover by name
|
|
16
|
+
- `.claude/rules/*.md` — rules adopters inherit via `additionalDirectories`
|
|
17
|
+
- `.claude/agents/*.md` — agent definitions adopters dispatch by role
|
|
18
|
+
- `.claude/luminaries/*.md` — luminaries adopters reference in goal docs
|
|
19
|
+
- `lib/*.sh` — shared accessor libraries adopters source from
|
|
20
|
+
- `standards/*.md` — standards adopters cite as reference
|
|
21
|
+
- `standards/state-spine/schemas/*.json` — schemas adopters validate against
|
|
22
|
+
- `presence/install/bassclef-sync.*.sh` — sync templates adopters vendor
|
|
23
|
+
- `architecture/decisions/ADR-*.md` — ADRs adopters read for architecture context
|
|
24
|
+
- `.github/workflows/bassclef-*.yml` — workflows adopters extend (when the change affects shared workflow shape)
|
|
25
|
+
- `scripts/*.sh` — scripts adopters invoke (when classified as adopter-facing per `.claude/rules/testing-tier-config.md`)
|
|
26
|
+
- Any other path under `~/src/sunj-labs/` that adopter sync hooks resolve through
|
|
27
|
+
|
|
28
|
+
The rule passes through (does not fire) on:
|
|
29
|
+
|
|
30
|
+
- Operator content (chronicles, journals, deferred-actions, `docs/operator-private/**`)
|
|
31
|
+
- Documentation edits that stay clear of adopter-observable surface (typo in a chronicle)
|
|
32
|
+
- Test edits where the source under test is not adopter-observable
|
|
33
|
+
- Bug fixes where the harness already covers the change class (the harness IS the regression test in that case)
|
|
34
|
+
|
|
35
|
+
## What the rule requires
|
|
36
|
+
|
|
37
|
+
When a PR touches an adopter-observable path, the agent OR operator MUST:
|
|
38
|
+
|
|
39
|
+
1. **Local pre-push run** — execute `bash scripts/cold-adopter-harness-sync.sh --mode sync --target .` from the bassclef-upstream root. Confirm exit 0 (all checks pass) OR explicitly document why a check failure is acceptable.
|
|
40
|
+
2. **CI confirmation** — the `cold-adopter-harness` PR-blocking job in `.github/workflows/bassclef-pr-ci.yml` runs the same command on the PR head. Job must pass before merge.
|
|
41
|
+
3. **PR body acknowledgement** — when the PR body's `Test plan` section is authored, include a line confirming the harness was run locally OR cite the CI job that runs it.
|
|
42
|
+
|
|
43
|
+
The mechanical layer (CI job) is the load-bearing enforcement. The methodology layer (this rule + the local pre-push step) closes the gap between commit time and CI-fire time.
|
|
44
|
+
|
|
45
|
+
## What this rule does NOT require
|
|
46
|
+
|
|
47
|
+
- Running the harness on every commit (only on substrate-affecting paths; the path matcher above is the trigger)
|
|
48
|
+
- Running the harness on operator content (chronicles, journals — pass-through)
|
|
49
|
+
- Re-running the harness when CI already ran it cleanly and no substrate-affecting paths changed in a follow-up commit
|
|
50
|
+
- A separate harness for adopter-facing scripts (the same `scripts/cold-adopter-harness-sync.sh` covers all surfaces)
|
|
51
|
+
- Pre-commit-time enforcement (deferred to follow-on; bet 25g closes the CI + methodology layers; pre-commit hook is Gap 4 follow-on)
|
|
52
|
+
|
|
53
|
+
## Anti-patterns
|
|
54
|
+
|
|
55
|
+
These shapes fail this rule.
|
|
56
|
+
|
|
57
|
+
**Substrate change shipped without running the harness locally.** Author edited `.claude/hooks/<name>.sh`, ran the test suite, pushed. CI catches it but the round-trip cost is one PR cycle wasted.
|
|
58
|
+
|
|
59
|
+
INSTEAD: run `bash scripts/cold-adopter-harness-sync.sh --mode sync --target .` before pushing. Catches the same class of failure locally; saves the CI round-trip.
|
|
60
|
+
|
|
61
|
+
**Substrate change shipped + CI green + harness still fails.** The CI job ran but produced a stale result because the harness was not extended to cover the new check class. The author's PR ships; an adopter cloning fresh hits the failure.
|
|
62
|
+
|
|
63
|
+
INSTEAD: extend the harness check classes in the same PR that introduces the new surface. Per `.claude/rules/bootstrap-pair-discipline.md` — when a new substrate primitive ships, its bootstrap pair includes the harness check class that validates it.
|
|
64
|
+
|
|
65
|
+
**Author overrides the harness CI job to merge faster.** Operator-merge mode with `SKIP_COLD_ADOPTER_HARNESS=1` set in the workflow environment.
|
|
66
|
+
|
|
67
|
+
INSTEAD: fix the harness failure OR document the explicit deferral in the PR body's `Out of scope` section with a follow-on ticket reference. Silence is not deferral.
|
|
68
|
+
|
|
69
|
+
**Adopter-observable change disguised as operator-internal change.** Author edits `presence/install/bassclef-sync.template.sh` (adopter-observable) but commits it as a `chore:` claiming it is internal-only.
|
|
70
|
+
|
|
71
|
+
INSTEAD: the path-matcher determines adopter-observable status, not the commit message. `presence/install/*` IS adopter-observable; the harness fires.
|
|
72
|
+
|
|
73
|
+
## Override path
|
|
74
|
+
|
|
75
|
+
`SKIP_COLD_ADOPTER_HARNESS=1` env var — logged via trace-helper per existing bassclef hook idiom. Use only for:
|
|
76
|
+
|
|
77
|
+
- One-shot migration scripts that bootstrap state and intentionally produce a harness failure during the migration window (the migration itself fixes the failure)
|
|
78
|
+
- Emergency rescue when the harness itself is broken (substrate-defect recovery; harness must be fixed before next PR)
|
|
79
|
+
- Explicitly-deferred work where the PR body documents the override + cites a follow-on ticket that closes the deferred check
|
|
80
|
+
|
|
81
|
+
For routine work, run the harness. The cost is ~30 seconds on `--target .` (no live network fetch). The discipline holds across every PR.
|
|
82
|
+
|
|
83
|
+
## Composes with
|
|
84
|
+
|
|
85
|
+
- `@luminary saltzer-schroeder` — complete-mediation principle (every adopter-observable surface validated by the harness; the rule names which surfaces are observable)
|
|
86
|
+
- `@luminary hyrum-wright` — observable behavior becomes load-bearing (the harness pins the observable contract; this rule formalizes that pinning)
|
|
87
|
+
- `@luminary linus-torvalds` — adopter-trust ceiling (CI gate IS the operational form of the adopter-compatibility stance; rule names the discipline)
|
|
88
|
+
- `@luminary michael-feathers` — characterization tests at the adopter boundary (the harness IS the characterization test; this rule mandates the test fires)
|
|
89
|
+
- `.claude/rules/we-dont-break-adopters.md` — sister discipline; this rule is the test-side of the discipline that rule defines
|
|
90
|
+
- `.claude/rules/bootstrap-pair-discipline.md` — sister rule; this rule's "harness check class" IS one of bootstrap-pair's required pairs for adopter-observable primitives
|
|
91
|
+
- `.claude/rules/testing-tier-config.md` — Tier 0 paths the harness validates; sister rule for per-path test enforcement
|
|
92
|
+
- `.claude/rules/loop-discipline.md` — the per-PR cycle this rule fires within (loop's final-validation step composes the harness check)
|
|
93
|
+
- `.claude/rules/blocked-items.md` — BLOCK protocol the CI job fires when the harness fails
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
globs: ["*"]
|
|
4
|
+
description: Commit message format — Conventional Commits
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Format: `<type>: <description>`
|
|
8
|
+
|
|
9
|
+
Types: feat, fix, docs, refactor, test, ci, chore, security
|
|
10
|
+
|
|
11
|
+
Rules:
|
|
12
|
+
- Imperative mood, lowercase, no period, max 72 chars
|
|
13
|
+
- Body: explain WHY not what — the diff shows what
|
|
14
|
+
- Footer: `Closes #NNN` or `Ref #NNN`
|
|
15
|
+
- PR titles become squash commit messages — make them clean
|
|
16
|
+
- One commit per PR on main (squash merge)
|
|
17
|
+
|
|
18
|
+
## Forbidden prefixes
|
|
19
|
+
|
|
20
|
+
Don't use `substrate-defect:` as a prefix. INSTEAD: use `fix:` per the type list above. Substrate bugs are bugs — the bassclef-internal `substrate-defect:` prefix duplicates the conventional `fix:` category without adding signal. See bassclef#1241 § "Wordlist amendment from 2026-06-19 dispatch session" for the decision.
|
|
21
|
+
|
|
22
|
+
Don't invent one-off prefixes outside the 8 types listed above. INSTEAD: request additions via `/promote bassclef-evolution` so the type list grows by amendment rather than drift.
|
|
@@ -0,0 +1,173 @@
|
|
|
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
|
+
## When this rule fires
|
|
17
|
+
|
|
18
|
+
Every `/longrun` prep that proposes scope shapes:
|
|
19
|
+
|
|
20
|
+
- `/longrun prep` (operator types) — Step 1.5 compounding-sequence analysis per shape candidate
|
|
21
|
+
- `/sprint` next-work proposals when scope-shape options are surfaced (sister surface; same shape contract)
|
|
22
|
+
- Bet doc authoring — when the goal doc's `## Steps` section enumerates a per-shape table, the same axis applies
|
|
23
|
+
|
|
24
|
+
The rule does NOT fire on:
|
|
25
|
+
|
|
26
|
+
- 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`)
|
|
27
|
+
- WU-sequencing inside a chosen shape (covered by sister rule `.claude/rules/wu-sequencing-compounds.md` for Step 1.7 INTRA-shape)
|
|
28
|
+
|
|
29
|
+
## What the rule requires
|
|
30
|
+
|
|
31
|
+
Before the operator picks a scope shape:
|
|
32
|
+
|
|
33
|
+
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.
|
|
34
|
+
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 — recommended only` section (old anchor `### Compounding value per option` still accepted through 2026-10-31 grace window per ADR-031). 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.
|
|
35
|
+
|
|
36
|
+
The 6-axis default (new; per bassclef#1555 PR-2):
|
|
37
|
+
|
|
38
|
+
| Axis | Source | Standard values |
|
|
39
|
+
|---|---|---|
|
|
40
|
+
| Deliverable | Plain sentence | What ships when this option lands |
|
|
41
|
+
| Problem | `/state-a-problem brief` | ≤500 chars; framework implicit |
|
|
42
|
+
| Value prop | `/value-prop tweet` | ≤280 chars; claim + sharpener |
|
|
43
|
+
| Turns | Grounded range | Cite past goal actuals per `.claude/rules/turn-estimate-grounding.md` |
|
|
44
|
+
| Risk | `🟢/🟡/🔴 <severity> — <failure mode>` | Bands (Klein blast radius): 🟢 fix-forward CI, no adopter impact, rework < 15 min · 🟡 rebuild cycle, local rollback, rework < 2h · 🔴 adopter-visible drift or compat shim, rework > 2h |
|
|
45
|
+
| Shipping priority | P1 / P2 / P3 / P4 or blank | Blank prompts `Run /eisenhower to prioritize?`. Distinct from Eisenhower Q1-Q4 (importance × urgency); P-prefix matches bassclef `p1` GitHub label |
|
|
46
|
+
|
|
47
|
+
The 5-axis legacy (grace window through 2026-10-31 per ADR-031; hook accepts both shapes):
|
|
48
|
+
|
|
49
|
+
| Plain-English (preferred per ADR-040 D4) | Compressed (grace only) | Standard values |
|
|
50
|
+
|---|---|---|
|
|
51
|
+
| Where the payoff shows up | Compounding surface | per-PR / per-release / per-session / per-adopter / per-quarter |
|
|
52
|
+
| How often it fires | Compounding rate | continuous / frequent / per-session / per-adopter / per-quarter |
|
|
53
|
+
| What must be true first | Foundation prerequisites | none / specific goal / ticket / config flag |
|
|
54
|
+
| Does this teach a shape later work reuses | Inverse-dependency | yes (names the later work) / no |
|
|
55
|
+
| What breaks if we ship this half-done | Risk class | One line: severity glyph + failure mode + detection. Bands per 6-axis Risk row above. |
|
|
56
|
+
|
|
57
|
+
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.
|
|
58
|
+
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.
|
|
59
|
+
4. **Recommended shape rationale** cites the compounding sequence + adopter-benefit mechanism (per sister rule for Step 1.6 bassclef-upstream#1302) explicitly.
|
|
60
|
+
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.
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
rm -f state/markers/turn-prose-surface/longrun_prep_proposal.marker
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
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.
|
|
67
|
+
|
|
68
|
+
## Postcondition contract (per Hoare)
|
|
69
|
+
|
|
70
|
+
Per bassclef-upstream#564 + luminary consultation (Ousterhout / Hoare / Feathers / Saltzer-Schroeder / Beck):
|
|
71
|
+
|
|
72
|
+
**Precondition:** the /longrun prep proposes 2+ candidate shapes, each with a distinct scope.
|
|
73
|
+
|
|
74
|
+
**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):
|
|
75
|
+
|
|
76
|
+
- **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.
|
|
77
|
+
- **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.
|
|
78
|
+
|
|
79
|
+
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.
|
|
80
|
+
|
|
81
|
+
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.
|
|
82
|
+
|
|
83
|
+
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.
|
|
84
|
+
|
|
85
|
+
**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.
|
|
86
|
+
|
|
87
|
+
### Per-preset axis sets (added bassclef-upstream#1598)
|
|
88
|
+
|
|
89
|
+
The 6-axis default applies when prep runs in the FULL ceremony path — no plan doc, no preset picker fired, agent authoring option candidates from scratch.
|
|
90
|
+
|
|
91
|
+
When the preset picker fires (mechanism ships under bassclef-upstream#1598 goal Step 2 — not present yet at PR 1 land), the axis set adjusts to fit the picked preset. The Stop hook reads a preset marker under `state/markers/longrun-preset/` to know which axis set to apply. This rule extension is methodology-only until the picker hook lands in the sister PR of the same goal:
|
|
92
|
+
|
|
93
|
+
| Preset | Axis set the hook checks for | Rationale |
|
|
94
|
+
|---|---|---|
|
|
95
|
+
| **converged** | Deliverable, Problem, Value prop, Turns, Risk in the top block. Per-row: Scope, Turns, Risk. | Plan doc carries the depth. Prep shows the pick at the top, table stays lean. |
|
|
96
|
+
| **exploratory** | Per-row: Scope, One-line description, Turns, Risk. Recommend row marked. | Operator hasn't converged; light shape helps scanning. |
|
|
97
|
+
| **reversible-small** | One line per option carrying scope + risk. Recommend line + action line. | Small scope needs no ceremony. |
|
|
98
|
+
| **no marker present** | Fall back to 6-axis default (legacy behavior). Grace window preserves. | Existing prep discipline holds when picker did not run. |
|
|
99
|
+
|
|
100
|
+
The postcondition applies per axis set. The hook fires ADVISORY when a preset marker exists but the checked axes are missing from the message. The hook fires BLOCK when the 6-axis default is expected but missing (unchanged existing behavior).
|
|
101
|
+
|
|
102
|
+
## Anti-patterns
|
|
103
|
+
|
|
104
|
+
These shapes fail this rule.
|
|
105
|
+
|
|
106
|
+
**Agent ships scope shapes WITHOUT compounding-sequence columns.** Tonight's failure (caught by operator). Cure: include the columns; touch the marker BEFORE the proposal.
|
|
107
|
+
|
|
108
|
+
**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.
|
|
109
|
+
|
|
110
|
+
**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.
|
|
111
|
+
|
|
112
|
+
**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.
|
|
113
|
+
|
|
114
|
+
**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.
|
|
115
|
+
|
|
116
|
+
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.
|
|
117
|
+
|
|
118
|
+
## Hand-off documents that do NOT satisfy
|
|
119
|
+
|
|
120
|
+
These all carry useful context but do not substitute for fresh analysis:
|
|
121
|
+
|
|
122
|
+
- `docs/whereami.md` `next_longrun_queue` — operator + prior session's pickup suggestion; not compounding-derived
|
|
123
|
+
- audit doc `next_pending` field — sequenced by audit author; may not match current compounding priorities
|
|
124
|
+
- prior chronicle's "next pickup" suggestion — operator-facing handoff narrative; not analysis
|
|
125
|
+
- prior goal doc's `next_bet` field — sequencing intent; not analysis
|
|
126
|
+
- memory entry `feedback_*` — prior discipline; relevant context but not a substitute for the per-shape row
|
|
127
|
+
|
|
128
|
+
Agent reads all of these for context. Agent then writes fresh compounding analysis per shape. The two activities are distinct.
|
|
129
|
+
|
|
130
|
+
## Override
|
|
131
|
+
|
|
132
|
+
`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.
|
|
133
|
+
|
|
134
|
+
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.
|
|
135
|
+
|
|
136
|
+
## Composes with
|
|
137
|
+
|
|
138
|
+
- `.claude/rules/wu-sequencing-compounds.md` — sister at Step 1.7 INTRA-shape (per-step produces/consumes)
|
|
139
|
+
- `.claude/rules/operator-facing-prose.md` Rule 3 — marker touch BEFORE the named surface (this rule's mechanism precondition)
|
|
140
|
+
- `.claude/rules/blocked-items.md` — BLOCKED protocol the hook fires under V2 strict
|
|
141
|
+
- `.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
|
|
142
|
+
- `.claude/hooks/longrun-prep-compounding-sequence-check.sh` — the mechanical layer
|
|
143
|
+
- `.claude/hooks/tests/longrun-prep-compounding-sequence-check.test.sh` — Tier 0 tests pinning the hook
|
|
144
|
+
- `.claude/skills/longrun/SKILL.md` Step 1.5 — the procedure surface the rule serves
|
|
145
|
+
- `@luminary jerome-saltzer-and-michael-schroeder` — complete mediation principle
|
|
146
|
+
- `@luminary tony-hoare` — pre/postcondition contracts (R2 fresh-analysis is precondition, mechanically unverifiable)
|
|
147
|
+
- `@luminary michael-feathers` — characterization tests pin REAL prep prose (R3 follow-on)
|
|
148
|
+
- `@luminary kent-beck` — Tier 0 strict TDD on the hook (R4 follow-on covers each umbrella ticket instance)
|
|
149
|
+
|
|
150
|
+
## Deferred to follow-on
|
|
151
|
+
|
|
152
|
+
The bet 30b risk ledger named these add-to-scope dispositions for WU-E; they ship in a follow-on goal:
|
|
153
|
+
|
|
154
|
+
- **R3 (Feathers)** — extend Tier 0 tests with 3 characterization tests against REAL `/longrun` prep messages (tonight's + 2 from prior goal prep chronicles)
|
|
155
|
+
- **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)
|
|
156
|
+
- **R6 (Linus)** — cold-adopter harness check for session-reflection.d/05-active-bet.sh fragment presence (sister to WU-B)
|
|
157
|
+
- **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)
|
|
158
|
+
|
|
159
|
+
The rule body is complete without these; the hook coverage extension is a separate ship vehicle.
|
|
160
|
+
|
|
161
|
+
## Per-WU coverage (bassclef-upstream#597 extension)
|
|
162
|
+
|
|
163
|
+
Per-WU compounding-sequence rendering carries the same 5 axes at the step layer, alongside the produces/consumes table.
|
|
164
|
+
|
|
165
|
+
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.
|
|
166
|
+
|
|
167
|
+
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.
|
|
168
|
+
|
|
169
|
+
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.
|
|
170
|
+
|
|
171
|
+
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.
|
|
172
|
+
|
|
173
|
+
Sister to Step 1.5 per-shape check (bassclef-upstream#564). Same discipline shape at a different layer.
|
|
@@ -0,0 +1,173 @@
|
|
|
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
|
+
## When this rule fires
|
|
17
|
+
|
|
18
|
+
Every `/longrun` prep that proposes scope shapes:
|
|
19
|
+
|
|
20
|
+
- `/longrun prep` (operator types) — Step 1.5 compounding-sequence analysis per shape candidate
|
|
21
|
+
- `/sprint` next-work proposals when scope-shape options are surfaced (sister surface; same shape contract)
|
|
22
|
+
- Bet doc authoring — when the goal doc's `## Steps` section enumerates a per-shape table, the same axis applies
|
|
23
|
+
|
|
24
|
+
The rule does NOT fire on:
|
|
25
|
+
|
|
26
|
+
- 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`)
|
|
27
|
+
- WU-sequencing inside a chosen shape (covered by sister rule `.claude/rules/wu-sequencing-compounds.md` for Step 1.7 INTRA-shape)
|
|
28
|
+
|
|
29
|
+
## What the rule requires
|
|
30
|
+
|
|
31
|
+
Before the operator picks a scope shape:
|
|
32
|
+
|
|
33
|
+
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.
|
|
34
|
+
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 — recommended only` section (old anchor `### Compounding value per option` still accepted through 2026-10-31 grace window per ADR-031). 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.
|
|
35
|
+
|
|
36
|
+
The 6-axis default (new; per bassclef#1555 PR-2):
|
|
37
|
+
|
|
38
|
+
| Axis | Source | Standard values |
|
|
39
|
+
|---|---|---|
|
|
40
|
+
| Deliverable | Plain sentence | What ships when this option lands |
|
|
41
|
+
| Problem | `/state-a-problem brief` | ≤500 chars; framework implicit |
|
|
42
|
+
| Value prop | `/value-prop tweet` | ≤280 chars; claim + sharpener |
|
|
43
|
+
| Turns | Grounded range | Cite past goal actuals per `.claude/rules/turn-estimate-grounding.md` |
|
|
44
|
+
| Risk | `🟢/🟡/🔴 <severity> — <failure mode>` | Bands (Klein blast radius): 🟢 fix-forward CI, no adopter impact, rework < 15 min · 🟡 rebuild cycle, local rollback, rework < 2h · 🔴 adopter-visible drift or compat shim, rework > 2h |
|
|
45
|
+
| Shipping priority | P1 / P2 / P3 / P4 or blank | Blank prompts `Run /eisenhower to prioritize?`. Distinct from Eisenhower Q1-Q4 (importance × urgency); P-prefix matches bassclef `p1` GitHub label |
|
|
46
|
+
|
|
47
|
+
The 5-axis legacy (grace window through 2026-10-31 per ADR-031; hook accepts both shapes):
|
|
48
|
+
|
|
49
|
+
| Plain-English (preferred per ADR-040 D4) | Compressed (grace only) | Standard values |
|
|
50
|
+
|---|---|---|
|
|
51
|
+
| Where the payoff shows up | Compounding surface | per-PR / per-release / per-session / per-adopter / per-quarter |
|
|
52
|
+
| How often it fires | Compounding rate | continuous / frequent / per-session / per-adopter / per-quarter |
|
|
53
|
+
| What must be true first | Foundation prerequisites | none / specific goal / ticket / config flag |
|
|
54
|
+
| Does this teach a shape later work reuses | Inverse-dependency | yes (names the later work) / no |
|
|
55
|
+
| What breaks if we ship this half-done | Risk class | One line: severity glyph + failure mode + detection. Bands per 6-axis Risk row above. |
|
|
56
|
+
|
|
57
|
+
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.
|
|
58
|
+
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.
|
|
59
|
+
4. **Recommended shape rationale** cites the compounding sequence + adopter-benefit mechanism (per sister rule for Step 1.6 bassclef-upstream#1302) explicitly.
|
|
60
|
+
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.
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
rm -f state/markers/turn-prose-surface/longrun_prep_proposal.marker
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
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.
|
|
67
|
+
|
|
68
|
+
## Postcondition contract (per Hoare)
|
|
69
|
+
|
|
70
|
+
Per bassclef-upstream#564 + luminary consultation (Ousterhout / Hoare / Feathers / Saltzer-Schroeder / Beck):
|
|
71
|
+
|
|
72
|
+
**Precondition:** the /longrun prep proposes 2+ candidate shapes, each with a distinct scope.
|
|
73
|
+
|
|
74
|
+
**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):
|
|
75
|
+
|
|
76
|
+
- **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.
|
|
77
|
+
- **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.
|
|
78
|
+
|
|
79
|
+
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.
|
|
80
|
+
|
|
81
|
+
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.
|
|
82
|
+
|
|
83
|
+
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.
|
|
84
|
+
|
|
85
|
+
**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.
|
|
86
|
+
|
|
87
|
+
### Per-preset axis sets (added bassclef-upstream#1598)
|
|
88
|
+
|
|
89
|
+
The 6-axis default applies when prep runs in the FULL ceremony path — no plan doc, no preset picker fired, agent authoring option candidates from scratch.
|
|
90
|
+
|
|
91
|
+
When the preset picker fires (mechanism ships under bassclef-upstream#1598 goal Step 2 — not present yet at PR 1 land), the axis set adjusts to fit the picked preset. The Stop hook reads a preset marker under `state/markers/longrun-preset/` to know which axis set to apply. This rule extension is methodology-only until the picker hook lands in the sister PR of the same goal:
|
|
92
|
+
|
|
93
|
+
| Preset | Axis set the hook checks for | Rationale |
|
|
94
|
+
|---|---|---|
|
|
95
|
+
| **converged** | Deliverable, Problem, Value prop, Turns, Risk in the top block. Per-row: Scope, Turns, Risk. | Plan doc carries the depth. Prep shows the pick at the top, table stays lean. |
|
|
96
|
+
| **exploratory** | Per-row: Scope, One-line description, Turns, Risk. Recommend row marked. | Operator hasn't converged; light shape helps scanning. |
|
|
97
|
+
| **reversible-small** | One line per option carrying scope + risk. Recommend line + action line. | Small scope needs no ceremony. |
|
|
98
|
+
| **no marker present** | Fall back to 6-axis default (legacy behavior). Grace window preserves. | Existing prep discipline holds when picker did not run. |
|
|
99
|
+
|
|
100
|
+
The postcondition applies per axis set. The hook fires ADVISORY when a preset marker exists but the checked axes are missing from the message. The hook fires BLOCK when the 6-axis default is expected but missing (unchanged existing behavior).
|
|
101
|
+
|
|
102
|
+
## Anti-patterns
|
|
103
|
+
|
|
104
|
+
These shapes fail this rule.
|
|
105
|
+
|
|
106
|
+
**Agent ships scope shapes WITHOUT compounding-sequence columns.** Tonight's failure (caught by operator). Cure: include the columns; touch the marker BEFORE the proposal.
|
|
107
|
+
|
|
108
|
+
**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.
|
|
109
|
+
|
|
110
|
+
**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.
|
|
111
|
+
|
|
112
|
+
**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.
|
|
113
|
+
|
|
114
|
+
**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.
|
|
115
|
+
|
|
116
|
+
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.
|
|
117
|
+
|
|
118
|
+
## Hand-off documents that do NOT satisfy
|
|
119
|
+
|
|
120
|
+
These all carry useful context but do not substitute for fresh analysis:
|
|
121
|
+
|
|
122
|
+
- `docs/whereami.md` `next_longrun_queue` — operator + prior session's pickup suggestion; not compounding-derived
|
|
123
|
+
- audit doc `next_pending` field — sequenced by audit author; may not match current compounding priorities
|
|
124
|
+
- prior chronicle's "next pickup" suggestion — operator-facing handoff narrative; not analysis
|
|
125
|
+
- prior goal doc's `next_bet` field — sequencing intent; not analysis
|
|
126
|
+
- memory entry `feedback_*` — prior discipline; relevant context but not a substitute for the per-shape row
|
|
127
|
+
|
|
128
|
+
Agent reads all of these for context. Agent then writes fresh compounding analysis per shape. The two activities are distinct.
|
|
129
|
+
|
|
130
|
+
## Override
|
|
131
|
+
|
|
132
|
+
`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.
|
|
133
|
+
|
|
134
|
+
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.
|
|
135
|
+
|
|
136
|
+
## Composes with
|
|
137
|
+
|
|
138
|
+
- `.claude/rules/wu-sequencing-compounds.md` — sister at Step 1.7 INTRA-shape (per-step produces/consumes)
|
|
139
|
+
- `.claude/rules/operator-facing-prose.md` Rule 3 — marker touch BEFORE the named surface (this rule's mechanism precondition)
|
|
140
|
+
- `.claude/rules/blocked-items.md` — BLOCKED protocol the hook fires under V2 strict
|
|
141
|
+
- `.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
|
|
142
|
+
- `.claude/hooks/longrun-prep-compounding-sequence-check.sh` — the mechanical layer
|
|
143
|
+
- `.claude/hooks/tests/longrun-prep-compounding-sequence-check.test.sh` — Tier 0 tests pinning the hook
|
|
144
|
+
- `.claude/skills/longrun/SKILL.md` Step 1.5 — the procedure surface the rule serves
|
|
145
|
+
- `@luminary jerome-saltzer-and-michael-schroeder` — complete mediation principle
|
|
146
|
+
- `@luminary tony-hoare` — pre/postcondition contracts (R2 fresh-analysis is precondition, mechanically unverifiable)
|
|
147
|
+
- `@luminary michael-feathers` — characterization tests pin REAL prep prose (R3 follow-on)
|
|
148
|
+
- `@luminary kent-beck` — Tier 0 strict TDD on the hook (R4 follow-on covers each umbrella ticket instance)
|
|
149
|
+
|
|
150
|
+
## Deferred to follow-on
|
|
151
|
+
|
|
152
|
+
The bet 30b risk ledger named these add-to-scope dispositions for WU-E; they ship in a follow-on goal:
|
|
153
|
+
|
|
154
|
+
- **R3 (Feathers)** — extend Tier 0 tests with 3 characterization tests against REAL `/longrun` prep messages (tonight's + 2 from prior goal prep chronicles)
|
|
155
|
+
- **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)
|
|
156
|
+
- **R6 (Linus)** — cold-adopter harness check for session-reflection.d/05-active-bet.sh fragment presence (sister to WU-B)
|
|
157
|
+
- **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)
|
|
158
|
+
|
|
159
|
+
The rule body is complete without these; the hook coverage extension is a separate ship vehicle.
|
|
160
|
+
|
|
161
|
+
## Per-WU coverage (bassclef-upstream#597 extension)
|
|
162
|
+
|
|
163
|
+
Per-WU compounding-sequence rendering carries the same 5 axes at the step layer, alongside the produces/consumes table.
|
|
164
|
+
|
|
165
|
+
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.
|
|
166
|
+
|
|
167
|
+
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.
|
|
168
|
+
|
|
169
|
+
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.
|
|
170
|
+
|
|
171
|
+
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.
|
|
172
|
+
|
|
173
|
+
Sister to Step 1.5 per-shape check (bassclef-upstream#564). Same discipline shape at a different layer.
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
description: The single most leverage-y discipline in bassclef.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Context Engineering
|
|
7
|
+
|
|
8
|
+
The single most leverage-y discipline in bassclef.
|
|
9
|
+
|
|
10
|
+
When you write a skill, rule, hook, luminary, or agent definition, you
|
|
11
|
+
are writing instructions for a model that has specific epistemic
|
|
12
|
+
constraints. The model can only act on information physically present
|
|
13
|
+
in its current context window. Cross-session memory, knowledge of
|
|
14
|
+
past generations, imagined norms, and unstated operator intent are
|
|
15
|
+
NOT accessible.
|
|
16
|
+
|
|
17
|
+
Every instruction must be actionable from information the agent has
|
|
18
|
+
in this conversation. If the instruction depends on information the
|
|
19
|
+
model can't see, it is a no-op at best, a footgun at worst.
|
|
20
|
+
|
|
21
|
+
## What the model has access to
|
|
22
|
+
|
|
23
|
+
- Current conversation history (this session only)
|
|
24
|
+
- Files in working directory (only when explicitly Read)
|
|
25
|
+
- Tool results (when tools fire and return)
|
|
26
|
+
- System prompt + loaded rules (whatever the harness injects, including the contents of `.claude/rules/` via `additionalDirectories`)
|
|
27
|
+
- Memory directory (only if memory file is read this conversation)
|
|
28
|
+
|
|
29
|
+
## What the model does NOT have access to
|
|
30
|
+
|
|
31
|
+
- Previous conversations (unless that conversation's chronicle is loaded)
|
|
32
|
+
- Prior generations of the same prompt (unless surfaced as text in current context)
|
|
33
|
+
- What other agents are doing in parallel sessions (without state-spine reads)
|
|
34
|
+
- Imagined "norms" or "averages" — the model can't compare against itself
|
|
35
|
+
- Operator intent beyond what's been typed in this conversation
|
|
36
|
+
- Prior commits / git log (without an explicit `git log` tool call)
|
|
37
|
+
- Time / date awareness (the harness must surface today's date)
|
|
38
|
+
|
|
39
|
+
## The INSTEAD-block pattern
|
|
40
|
+
|
|
41
|
+
The rule's mechanical output, derived from Anthropic's context-engineering
|
|
42
|
+
treatment. Every "NEVER" / "DON'T" / "AVOID" instruction is paired with an
|
|
43
|
+
actionable substitute the model can verify in its current context.
|
|
44
|
+
|
|
45
|
+
**Anti-pattern (unactionable):**
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
NEVER converge on common choices across generations.
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
→ Claude can't see other generations. Instruction has no in-context
|
|
52
|
+
referent. No-op.
|
|
53
|
+
|
|
54
|
+
**INSTEAD-block (actionable):**
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
INSTEAD: For each generation, deliberately commit to one bold
|
|
58
|
+
direction from this list: [bold/saturated, moody/restrained,
|
|
59
|
+
high-contrast/minimal, lo-fi/zine, handcrafted]. Pick a different
|
|
60
|
+
direction than the obvious default for the input.
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
→ Model has the list in current context. Can pick. Actionable.
|
|
64
|
+
|
|
65
|
+
**Format for bassclef instructions:**
|
|
66
|
+
|
|
67
|
+
When writing a skill/rule/luminary, every "NEVER" / "DON'T" / "AVOID"
|
|
68
|
+
gets paired:
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
NEVER do X.
|
|
72
|
+
INSTEAD: <specific in-context action that produces the desired outcome>.
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
If you can't write the INSTEAD substitute, the original NEVER was
|
|
76
|
+
unactionable — rewrite the whole instruction.
|
|
77
|
+
|
|
78
|
+
## How to apply this rule
|
|
79
|
+
|
|
80
|
+
### When writing a skill
|
|
81
|
+
|
|
82
|
+
Ask, for every instruction:
|
|
83
|
+
1. Does this reference information the model has in current context?
|
|
84
|
+
2. If it references state that needs to be loaded — am I telling the model HOW to load it (Read X, run Y)?
|
|
85
|
+
3. If it has a "DON'T" — is there an INSTEAD-block?
|
|
86
|
+
4. Does it assume the model remembers something? If yes, am I providing the memory file path or instructing a Read?
|
|
87
|
+
|
|
88
|
+
### When writing a rule
|
|
89
|
+
|
|
90
|
+
Same checks plus:
|
|
91
|
+
- Will this rule be loaded automatically (`additionalDirectories`)? If yes, the model has the rule body in context every conversation.
|
|
92
|
+
- Or is it referenced by file path? If yes, I must explicitly tell the agent to Read it.
|
|
93
|
+
|
|
94
|
+
### When writing a luminary
|
|
95
|
+
|
|
96
|
+
The luminary file becomes context if invoked via `/luminary <slug>` or referenced in a skill that Reads it. Every "channel this luminary's discipline" instruction must produce concrete in-context actions, not aspirational adjectives.
|
|
97
|
+
|
|
98
|
+
### When writing a hook
|
|
99
|
+
|
|
100
|
+
Hooks fire at specific events and inject text into the agent's
|
|
101
|
+
session output. The injected text IS context the model now has.
|
|
102
|
+
Don't tell the model "remember this for next time."
|
|
103
|
+
INSTEAD: write to a state file the next session reads.
|
|
104
|
+
|
|
105
|
+
## What this rule does NOT cover
|
|
106
|
+
|
|
107
|
+
- Cognitive-science research on "Theory of Mind in LLMs" (Kosinski, Bos et al.). That research tests whether LLMs *model human minds* — opposite direction from this rule. Cite this rule as "context engineering" (industry standard term) when discussing externally.
|
|
108
|
+
- Tool design for agents (Anthropic's doc covers this in depth)
|
|
109
|
+
- Memory systems beyond what bassclef implements
|
|
110
|
+
|
|
111
|
+
## Common violations to grep for
|
|
112
|
+
|
|
113
|
+
- `"don't repeat"` / `"don't drift"` / `"avoid converging"` — without INSTEAD substitutes
|
|
114
|
+
- `"remember to"` / `"keep in mind"` — model has no persistence; you mean "Read X first" or "check Y"
|
|
115
|
+
- `"based on prior sessions"` — the model can't see them; you must instruct chronicle Reads
|
|
116
|
+
- `"the way you usually do"` — there is no usually; pin the specific pattern
|
|
117
|
+
- `"use your judgment"` — what context does the model judge against? Specify or remove
|
|
118
|
+
|
|
119
|
+
If `git grep -niE 'don.?t|never|avoid|remember to|keep in mind' .claude/skills .claude/rules .claude/luminaries` surfaces matches, audit each for INSTEAD-block discipline.
|
|
120
|
+
|
|
121
|
+
## Relationship to other rules
|
|
122
|
+
|
|
123
|
+
- `artifact-ingestion.md` — concrete instance of context engineering (Read before producing)
|
|
124
|
+
- `iteration-bet-brief-completeness.md` — concrete instance (every artifact in brief, because receiver has no other state)
|
|
125
|
+
- `mobile-ephemeral-session.md` — context engineering under the most extreme stateless conditions
|
|
126
|
+
- `context-management.md` — operational guidance for context-window budgeting (companion at the runtime layer)
|
|
127
|
+
- `bassclef#357` (autonomous-run flash + kiss) — output-side discipline; this rule is the input-side discipline
|
|
128
|
+
- `bassclef#367` (section-heading standardization) — concrete instance of "if the parser greps for X, X must be in the producer's output")
|
|
129
|
+
- `bassclef#382` (substrate-clarity-gate hook) — mechanical enforcement of skill-description clarity + rule/luminary INSTEAD-block discipline; closes the methodology+mechanism gap (rules prescribe; hook fires at PreToolUse Edit|Write)
|
|
130
|
+
|
|
131
|
+
## Why this rule is the highest-leverage rule we have
|
|
132
|
+
|
|
133
|
+
Most rules govern WHAT the agent should do (gates, checks, ceremonies). This rule governs HOW WE WRITE every other artifact. Meta-rule.
|
|
134
|
+
|
|
135
|
+
Every future skill, rule, luminary, hook, and agent definition we add
|
|
136
|
+
or modify is improved by this lens. Every existing artifact we audit
|
|
137
|
+
against this lens is a candidate for cleanup.
|
|
138
|
+
|
|
139
|
+
That's the leverage: one rule, applied retroactively + prospectively
|
|
140
|
+
to the entire substrate.
|
|
141
|
+
|
|
142
|
+
## What this rule will NOT fix
|
|
143
|
+
|
|
144
|
+
- Genuinely smart-but-vague creative direction ("make it beautiful") — context engineering catches *unactionable* instructions; whether the actionable substitute is *good* is a separate quality question handled by luminary-driven design + visual-review
|
|
145
|
+
- Hook bugs (mechanical) — context engineering is methodology; hooks are mechanical enforcement
|
|
146
|
+
- Operator-side ambiguity — if the operator's request is unclear, no amount of model-context discipline fixes it; that's a clarification gate
|
|
147
|
+
|
|
148
|
+
## Override
|
|
149
|
+
|
|
150
|
+
There is no override. Context engineering is the model's actual
|
|
151
|
+
constraint, not a discipline we choose to follow. Violating it
|
|
152
|
+
produces drift (silent or noisy), not "exceptional cases."
|
|
153
|
+
|
|
154
|
+
If a rule or skill seems to require a context-engineering violation,
|
|
155
|
+
the rule or skill is wrong. Rewrite.
|