@thebassclef/lite 0.0.1 → 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/LICENSE +202 -0
- package/README.md +85 -4
- package/dist/cli.cjs +1612 -0
- package/dist/cli.js +1589 -0
- package/dist/index.cjs +4 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +4 -0
- package/package.json +51 -3
- package/substrate/.bassclef/lite-manifest.json +2701 -0
- package/substrate/.claude/agents/architect.md +70 -0
- package/substrate/.claude/agents/builder.md +114 -0
- package/substrate/.claude/agents/designer.md +156 -0
- package/substrate/.claude/agents/reviewer.md +88 -0
- package/substrate/.claude/hooks/artifact-ingestion-gate.sh +357 -0
- package/substrate/.claude/hooks/assert-verify-steering.sh +77 -0
- package/substrate/.claude/hooks/bassclef-source-config-validate.sh +215 -0
- package/substrate/.claude/hooks/bassclef-sync.sh +634 -0
- package/substrate/.claude/hooks/compound-noun-scrub.sh +292 -0
- package/substrate/.claude/hooks/kiss-expansion-inject.sh +69 -0
- 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/plain-english-steering.sh +156 -0
- package/substrate/.claude/hooks/post-skill-friction-check.sh +177 -0
- package/substrate/.claude/hooks/post-skill-telemetry.sh +62 -0
- package/substrate/.claude/hooks/pre-build-gate.sh +511 -0
- package/substrate/.claude/hooks/pre-commit-gate.sh +451 -0
- package/substrate/.claude/hooks/session-end.sh +433 -0
- package/substrate/.claude/hooks/session-reflection.sh +303 -0
- package/substrate/.claude/hooks/skill-body-grade-gate.sh +219 -0
- package/substrate/.claude/hooks/skill-body-intent-drift.sh +107 -0
- package/substrate/.claude/hooks/skill-step-list-check.sh +171 -0
- package/substrate/.claude/hooks/state-validate.sh +271 -0
- package/substrate/.claude/hooks/substrate-clarity-gate.sh +1110 -0
- package/substrate/.claude/hooks/temperance-gate.sh +147 -0
- package/substrate/.claude/hooks/testing-tier-enforce.sh +233 -0
- package/substrate/.claude/hooks/turn-prose-grade-measure.sh +219 -0
- package/substrate/.claude/hooks/turn-prose-kiss-check.sh +463 -0
- package/substrate/.claude/hooks/vocabulary-migration-check.sh +171 -0
- package/substrate/.claude/hooks/whereami-utc-gate.sh +142 -0
- package/substrate/.claude/luminaries/alan-cooper.md +170 -0
- package/substrate/.claude/luminaries/alistair-cockburn.md +140 -0
- package/substrate/.claude/luminaries/amazon-pr-faq.md +34 -0
- package/substrate/.claude/luminaries/ash-maurya.md +121 -0
- package/substrate/.claude/luminaries/bill-buxton.md +210 -0
- package/substrate/.claude/luminaries/charles-sanders-peirce.md +150 -0
- package/substrate/.claude/luminaries/david-ogilvy.md +192 -0
- package/substrate/.claude/luminaries/don-norman.md +173 -0
- package/substrate/.claude/luminaries/edward-tufte.md +179 -0
- package/substrate/.claude/luminaries/eric-evans.md +160 -0
- package/substrate/.claude/luminaries/frederick-brooks.md +50 -0
- package/substrate/.claude/luminaries/gang-of-four.md +157 -0
- 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/jason-fried-dhh.md +46 -0
- package/substrate/.claude/luminaries/jesse-james-garrett.md +154 -0
- package/substrate/.claude/luminaries/john-ousterhout.md +94 -0
- package/substrate/.claude/luminaries/karl-popper.md +132 -0
- package/substrate/.claude/luminaries/kent-beck.md +168 -0
- package/substrate/.claude/luminaries/linus-torvalds.md +218 -0
- package/substrate/.claude/luminaries/martin-fowler.md +164 -0
- package/substrate/.claude/luminaries/michael-feathers.md +125 -0
- package/substrate/.claude/luminaries/michael-nygard.md +118 -0
- package/substrate/.claude/luminaries/robert-c-martin.md +164 -0
- package/substrate/.claude/luminaries/saltzer-schroeder.md +194 -0
- package/substrate/.claude/luminaries/sophia-prater.md +193 -0
- package/substrate/.claude/luminaries/stephen-toulmin.md +131 -0
- 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/artifact-ingestion.md +179 -0
- package/substrate/.claude/rules/assert-only-after-verify.md +137 -0
- package/substrate/.claude/rules/blocked-items.md +146 -0
- package/substrate/.claude/rules/bootstrap-pair-discipline.md +141 -0
- package/substrate/.claude/rules/branching.md +28 -0
- package/substrate/.claude/rules/cold-adopter-harness-discipline.md +129 -0
- package/substrate/.claude/rules/commit-conventions.md +22 -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/context-engineering.md +202 -0
- package/substrate/.claude/rules/context-management.md +85 -0
- package/substrate/.claude/rules/defensive-bash.md +68 -0
- package/substrate/.claude/rules/deferred-actions.md +233 -0
- package/substrate/.claude/rules/destructive-operations.md +69 -0
- package/substrate/.claude/rules/diagnosis.md +38 -0
- package/substrate/.claude/rules/github-issue-flash-tweet.md +156 -0
- package/substrate/.claude/rules/guardrails.md +73 -0
- package/substrate/.claude/rules/hook-wire-on-author.md +103 -0
- package/substrate/.claude/rules/identifier-leak-prevention.md +104 -0
- package/substrate/.claude/rules/iteration-bet-brief-completeness.md +54 -0
- package/substrate/.claude/rules/lite-manifest-schema-change-discipline.md +98 -0
- 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/oo-ad-entry-point.md +117 -0
- package/substrate/.claude/rules/operator-facing-prose.md +196 -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 +156 -0
- package/substrate/.claude/rules/plan-enumeration-needs-value-props.md +211 -0
- package/substrate/.claude/rules/pr-body-shape.md +317 -0
- package/substrate/.claude/rules/pr-strategy.md +167 -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/sdlc-gates.md +149 -0
- package/substrate/.claude/rules/security.md +37 -0
- package/substrate/.claude/rules/session-artifacts.md +236 -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/state-schema-validation.md +162 -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/whereami-load-bearing.md +202 -0
- package/substrate/.claude/rules/writing-craft-discipline.md +92 -0
- package/substrate/.claude/rules/wu-sequencing-compounds.md +145 -0
- package/substrate/.claude/skills/build/SKILL.md +640 -0
- 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 +280 -0
- package/substrate/.claude/skills/diagnose/SKILL.md +297 -0
- package/substrate/.claude/skills/feynman/SKILL.md +90 -0
- package/substrate/.claude/skills/howdoi/SKILL.md +105 -0
- package/substrate/.claude/skills/ia-model/SKILL.md +108 -0
- package/substrate/.claude/skills/interaction-design/SKILL.md +112 -0
- package/substrate/.claude/skills/interpret-input/SKILL.md +180 -0
- package/substrate/.claude/skills/journal/SKILL.md +209 -0
- package/substrate/.claude/skills/kiss/SKILL.md +449 -0
- package/substrate/.claude/skills/launch/SKILL.md +915 -0
- package/substrate/.claude/skills/lean-canvas/SKILL.md +332 -0
- package/substrate/.claude/skills/longrun/SKILL.md +463 -0
- package/substrate/.claude/skills/luminary/SKILL.md +481 -0
- package/substrate/.claude/skills/ogilvy-writing-audit/SKILL.md +177 -0
- package/substrate/.claude/skills/onboard-repo/SKILL.md +1624 -0
- package/substrate/.claude/skills/pattern-review/SKILL.md +99 -0
- package/substrate/.claude/skills/personas/SKILL.md +207 -0
- package/substrate/.claude/skills/promote/SKILL.md +283 -0
- package/substrate/.claude/skills/requirement/SKILL.md +98 -0
- package/substrate/.claude/skills/retro/SKILL.md +117 -0
- package/substrate/.claude/skills/riff/SKILL.md +114 -0
- package/substrate/.claude/skills/roadmap-reconcile/SKILL.md +163 -0
- package/substrate/.claude/skills/session-end/SKILL.md +309 -0
- package/substrate/.claude/skills/session-log/SKILL.md +299 -0
- package/substrate/.claude/skills/skills/SKILL.md +228 -0
- package/substrate/.claude/skills/spec/SKILL.md +105 -0
- package/substrate/.claude/skills/sprint/SKILL.md +392 -0
- package/substrate/.claude/skills/stage/SKILL.md +384 -0
- package/substrate/.claude/skills/state-a-problem/SKILL.md +185 -0
- package/substrate/.claude/skills/temperance/SKILL.md +108 -0
- package/substrate/.claude/skills/use-case/SKILL.md +417 -0
- package/substrate/.claude/skills/user-stories/SKILL.md +268 -0
- package/substrate/.claude/skills/value-prop/SKILL.md +251 -0
- package/substrate/.claude/skills/verify/SKILL.md +160 -0
- 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 +307 -0
- package/substrate/AGENTS.md +79 -0
- package/substrate/CLAUDE-lite.md +85 -0
- package/substrate/CODE_OF_CONDUCT.md +28 -0
- package/substrate/CONTRIBUTING.md +177 -0
- package/substrate/README.md +173 -0
- package/substrate/SECURITY.md +19 -0
- package/substrate/architecture/decisions/ADR-029-release-pipeline.md +79 -0
- package/substrate/architecture/decisions/ADR-031-non-breaking-changes-adopter-discipline.md +139 -0
- package/substrate/architecture/decisions/ADR-032-adopter-sync-dispatcher-architecture.md +192 -0
- package/substrate/architecture/decisions/ADR-039-release-tagging-scheme.md +145 -0
- package/substrate/architecture/decisions/ADR-040-planning-skill-vocabulary-and-lite-profile.md +155 -0
- package/substrate/architecture/decisions/ADR-044-unified-skill-body-template.md +162 -0
- package/substrate/lib/clean-artifacts-sweep.sh +112 -0
- package/substrate/lib/code-comment-discipline.sh +144 -0
- package/substrate/lib/composer-preflight.sh +459 -0
- package/substrate/lib/hook-inject.sh +255 -0
- package/substrate/lib/luminary-pick.sh +96 -0
- package/substrate/lib/output-discipline.sh +143 -0
- package/substrate/lib/prose-scan-boundary.sh +171 -0
- package/substrate/lib/rewrite-check.sh +214 -0
- package/substrate/lib/state.sh +1372 -0
- package/substrate/lib/telemetry.sh +205 -0
- package/substrate/lib/tier-check.sh +187 -0
- package/substrate/lib/tier-dependency-audit.sh +1088 -0
- package/substrate/presence/install/bassclef-hook-connect.sh +178 -0
- package/substrate/presence/install/bassclef-sync.dispatcher.template.sh +841 -0
- package/substrate/presence/install/bassclef-sync.template.sh +2076 -0
- package/substrate/presence/install/schedule-auto-save.cron.sh +88 -0
- package/substrate/presence/install/schedule-auto-save.taskscheduler.md +122 -0
- package/substrate/scripts/aggregate-telemetry.sh +217 -0
- package/substrate/scripts/analyze-tier-dependencies.sh +239 -0
- package/substrate/scripts/generate-lite-manifest.sh +505 -0
- package/substrate/scripts/generate-tier-manifest.sh +28 -0
- package/substrate/scripts/intent-drift-check.sh +456 -0
- package/substrate/scripts/lite-manifest-drift-check.sh +146 -0
- package/substrate/scripts/render-lite-manifest-doc.sh +150 -0
- 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/bassclef-configs-schema.md +232 -0
- package/substrate/standards/bassclef-evolution.md +143 -0
- package/substrate/standards/bassclef-internal-jargon.md +244 -0
- package/substrate/standards/bassclef-managed-sentinel.md +96 -0
- package/substrate/standards/bassclef-source-config.md +228 -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/deferred-actions-schema.md +204 -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 +76 -0
- 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/graceful-exit.md +227 -0
- package/substrate/standards/hook-idempotency.md +102 -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 +135 -0
- package/substrate/standards/luminary-matching.md +105 -0
- package/substrate/standards/luminary-problem-patterns.md +481 -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/ogilvy-writing-rules.md +225 -0
- package/substrate/standards/opener-discipline.md +96 -0
- package/substrate/standards/operator-facing-prose-discipline.md +201 -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/project-directory-layout.md +276 -0
- package/substrate/standards/release-tagging.md +137 -0
- package/substrate/standards/reserved-skill-names.md +120 -0
- package/substrate/standards/scannable-multi-option-output.md +261 -0
- package/substrate/standards/sdlc-compliance.md +286 -0
- package/substrate/standards/sdlc-gates/typescript.md +57 -0
- package/substrate/standards/secrets-lifecycle.md +210 -0
- package/substrate/standards/security-scanner-adapter.md +145 -0
- package/substrate/standards/session-board.md +256 -0
- package/substrate/standards/skill-output-discipline.md +90 -0
- package/substrate/standards/state-spine-contract.md +255 -0
- package/substrate/standards/state-spine.md +511 -0
- package/substrate/standards/steering-hints/kiss-words.md +11 -0
- package/substrate/standards/substrate-config-schema.md +267 -0
- package/substrate/standards/tech-stack-config.md +109 -0
- package/substrate/standards/tier-dependency-analysis.md +167 -0
- package/substrate/standards/tier-runtime-deps/lite.md +57 -0
- package/substrate/standards/tier-tag-schema.md +155 -0
- 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/whereami-schema.md +301 -0
- package/substrate/standards/worktree-management.md +211 -0
- package/substrate/standards/writing-guide.md +213 -0
- package/substrate/templates/chronicle-template.md +75 -0
- package/substrate/templates/deferred-action-template.md +45 -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
- package/substrate/templates/whereami-template.md +101 -0
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
description: "Session-start hook output may contain lines prefixed with BLOCKED:."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Blocked Items — Mandatory Resolution
|
|
7
|
+
|
|
8
|
+
Session-start hook output may contain lines prefixed with `BLOCKED:`.
|
|
9
|
+
These are not suggestions. They are mandatory scope.
|
|
10
|
+
|
|
11
|
+
## Protocol
|
|
12
|
+
|
|
13
|
+
1. **Before proposing any new work**, scan session-start output for
|
|
14
|
+
`BLOCKED:` lines.
|
|
15
|
+
2. Each blocked item MUST be either:
|
|
16
|
+
- **Resolved** in this session (run the command, write the artifact), OR
|
|
17
|
+
- **Explicitly deferred** by the operator ("skip metrics this session")
|
|
18
|
+
3. If the operator says nothing about blocked items, the default is
|
|
19
|
+
**resolve them**. Silence is not deferral.
|
|
20
|
+
4. Propose blocked items as the FIRST items in your session plan.
|
|
21
|
+
New iteration work comes AFTER blocked items, not instead of them.
|
|
22
|
+
|
|
23
|
+
## What counts as resolution
|
|
24
|
+
|
|
25
|
+
- `BLOCKED: release-notes` → run /release-notes, commit the output
|
|
26
|
+
- `BLOCKED: metrics` → run the metrics script, commit the output
|
|
27
|
+
- `BLOCKED: chronicle` → write the missing chronicle, commit
|
|
28
|
+
- `BLOCKED: architect-review` → run /architect-review
|
|
29
|
+
|
|
30
|
+
## What counts as explicit deferral
|
|
31
|
+
|
|
32
|
+
The operator must say one of:
|
|
33
|
+
- "skip [item]" / "defer [item]" / "not this session"
|
|
34
|
+
- Acknowledging the item exists is NOT deferral
|
|
35
|
+
- "okay" or "got it" is NOT deferral — it means resolve it
|
|
36
|
+
|
|
37
|
+
## Friction during chained dispatches (bassclef#400)
|
|
38
|
+
|
|
39
|
+
The `post-skill-friction-check.sh` hook fires on PostToolUse Skill for
|
|
40
|
+
major composer skills (/stage (formerly /preview), /launch (formerly /preview-build), /build, /shape full,
|
|
41
|
+
/longrun, /decompose, /spec, /architect-review, /interpret-input, etc.).
|
|
42
|
+
It classifies output:
|
|
43
|
+
|
|
44
|
+
- **Unambiguous friction** (`deferred to Phase X`, `stub return`,
|
|
45
|
+
`Error:`, `not yet implemented`) → log + recommend `/promote
|
|
46
|
+
substrate-defect` inline. Don't defer to closeout; file at the
|
|
47
|
+
boundary.
|
|
48
|
+
- **Borderline friction** (`Lorem ipsum`, `XXX`, `FIXME`, partial
|
|
49
|
+
output) → log only; operator triages on return.
|
|
50
|
+
- **No friction** → silent.
|
|
51
|
+
|
|
52
|
+
The friction log lives at `docs/session-friction-log.md`. Operators
|
|
53
|
+
returning from unattended runs read the log first; promote what's
|
|
54
|
+
worth promoting.
|
|
55
|
+
|
|
56
|
+
Per-skill opt-out: add `disable_friction_check: true` to skill
|
|
57
|
+
frontmatter (rare; for skills whose stub returns are intended).
|
|
58
|
+
Per-call override: `SKIP_FRICTION_CHECK=1 <command>` (logged).
|
|
59
|
+
|
|
60
|
+
## When resolution reveals a substrate defect
|
|
61
|
+
|
|
62
|
+
Sometimes resolving a BLOCKED item surfaces the real cause: the hook's
|
|
63
|
+
detection path is wrong, a state file rotted, a marker format changed,
|
|
64
|
+
or the compliance calculation reads a location the writer stopped
|
|
65
|
+
using. The nominal work was done; the signal kept firing because the
|
|
66
|
+
mechanism is broken.
|
|
67
|
+
|
|
68
|
+
When this happens, resolution MUST include firing `/promote` with the
|
|
69
|
+
`substrate-defect` classifier. Fix the local instance AND promote the
|
|
70
|
+
mechanism fix — otherwise every consumer repo keeps hitting the same
|
|
71
|
+
broken hook.
|
|
72
|
+
|
|
73
|
+
### Trigger (any of)
|
|
74
|
+
|
|
75
|
+
1. **Stuck signal resolved** — the signal was stuck per
|
|
76
|
+
`stuck-signal-diagnostic.md`, mechanism-read found a defect, defect
|
|
77
|
+
is now fixed. `/promote` fires automatically on this path.
|
|
78
|
+
2. **Hook false-positive** — the banner fired even though the
|
|
79
|
+
underlying work was already done, and the fix was editing the hook,
|
|
80
|
+
not doing the work.
|
|
81
|
+
3. **Counter miscount** — the number in the banner was wrong
|
|
82
|
+
(off-by-one, wrong window, stale cache), and the fix was editing
|
|
83
|
+
the counting mechanism.
|
|
84
|
+
4. **Marker location rot** — a gate marker was written to a path the
|
|
85
|
+
reader no longer checks (e.g., `/tmp` sandbox teardown), and the
|
|
86
|
+
fix was dual-writing or relocating the marker.
|
|
87
|
+
|
|
88
|
+
### Protocol
|
|
89
|
+
|
|
90
|
+
1. **Resolve the local instance.** Land the substrate edit (hook fix,
|
|
91
|
+
rule update, path correction) in the current branch.
|
|
92
|
+
2. **Fire `/promote`** — use the substrate-defect template in
|
|
93
|
+
`promote/SKILL.md`. The /promote issue cites:
|
|
94
|
+
- Signal observed (banner text + chronicle dates showing the loop)
|
|
95
|
+
- Mechanism file read (path + what was wrong)
|
|
96
|
+
- Fix applied (PR or commit ref)
|
|
97
|
+
- Propagation requirement (which consumer repos inherit; what
|
|
98
|
+
breaks if they don't pick up the fix)
|
|
99
|
+
3. **Classify** as `agent-self-proposed` + `substrate-defect` (see
|
|
100
|
+
`promote/SKILL.md` label table). These don't need operator prompt —
|
|
101
|
+
agent-discovered defects file automatically because the trigger
|
|
102
|
+
condition (stuck signal + mechanism fix) is unambiguous.
|
|
103
|
+
4. **Cite in the session's chronicle** with explicit "substrate defect
|
|
104
|
+
promoted: #NNN" line so retrospectives can audit the promotion
|
|
105
|
+
path worked.
|
|
106
|
+
|
|
107
|
+
### Why mandatory (not MUST-try)
|
|
108
|
+
|
|
109
|
+
`bassclef-evolution.md` already describes /promote as the promotion
|
|
110
|
+
path. The gap being closed: when an agent finds a substrate defect
|
|
111
|
+
mid-session and fixes only the local instance, the decision to
|
|
112
|
+
promote becomes "nice to have" and rots. Three sessions in April 2026
|
|
113
|
+
fixed local substrate drift without firing /promote; the same drift
|
|
114
|
+
resurfaced in consumer repos two weeks later (POA inherited broken
|
|
115
|
+
hook paths).
|
|
116
|
+
|
|
117
|
+
Making /promote mandatory on the `resolution-revealed-defect` branch
|
|
118
|
+
removes the decision. The agent doesn't choose whether to promote;
|
|
119
|
+
the trigger fires it.
|
|
120
|
+
|
|
121
|
+
### What doesn't trigger /promote
|
|
122
|
+
|
|
123
|
+
- BLOCKED items resolved by doing the nominal work (running
|
|
124
|
+
`/release-notes`, writing the chronicle) — the mechanism was fine,
|
|
125
|
+
the work just wasn't done. No defect to promote.
|
|
126
|
+
- Operator-overridden deferrals — the operator chose to skip; no
|
|
127
|
+
mechanism analysis happened.
|
|
128
|
+
- One-off bugs in the agent's session (typo in commit message,
|
|
129
|
+
missed file) — those aren't substrate.
|
|
130
|
+
|
|
131
|
+
The trigger is specifically "mechanism was broken, mechanism got
|
|
132
|
+
fixed" — not "work was slow, work got faster."
|
|
133
|
+
|
|
134
|
+
## Why this rule exists
|
|
135
|
+
|
|
136
|
+
Agents consistently acknowledge hook warnings and then skip them.
|
|
137
|
+
Three instances in 6 weeks: DORA metrics, metrics dashboard, release
|
|
138
|
+
notes. The hook detects the problem correctly — the agent chooses to
|
|
139
|
+
ignore it. This rule removes that choice.
|
|
140
|
+
|
|
141
|
+
## Infrastructure note
|
|
142
|
+
|
|
143
|
+
This is a methodology rule, not a hook. It works regardless of whether
|
|
144
|
+
enforcement comes from bash hooks, Managed Agents outcome preconditions,
|
|
145
|
+
or any other infrastructure. The hook produces the signal; this rule
|
|
146
|
+
defines the response.
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
description: Every substrate primitive ships with its paired bootstrap discipline.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Bootstrap-Pair Discipline
|
|
7
|
+
|
|
8
|
+
Every substrate primitive ships with its paired bootstrap discipline. A primitive without its pair is half-shipped — the substrate appears to ship the feature, but adopters hit the missing half as silent breakage at runtime.
|
|
9
|
+
|
|
10
|
+
This rule names the failure class, enumerates 5 known instances, and gives the discipline a name so future PRs catch the failure at authoring time instead of at adopter-runtime time.
|
|
11
|
+
|
|
12
|
+
## When this rule fires
|
|
13
|
+
|
|
14
|
+
Any PR that adds a substrate primitive to bassclef. "Substrate primitive" means any of these surfaces:
|
|
15
|
+
|
|
16
|
+
- **Hook** — a new file under `.claude/hooks/*.sh`
|
|
17
|
+
- **Rule** — a new file under `.claude/rules/*.md`
|
|
18
|
+
- **Skill** — a new directory under `.claude/skills/<name>/SKILL.md`
|
|
19
|
+
- **Validator / accessor / library** — a new shell library under `lib/*.sh` or a new validator under `scripts/`
|
|
20
|
+
- **Schema** — a new JSON Schema under `standards/state-spine/schemas/*.schema.json`
|
|
21
|
+
- **Standard** — a new standard under `standards/*.md`
|
|
22
|
+
- **ADR** — a new file under `architecture/decisions/ADR-*.md`
|
|
23
|
+
|
|
24
|
+
The rule passes through (does not fire) on:
|
|
25
|
+
|
|
26
|
+
- Operator content (chronicles, journals, deferred-actions)
|
|
27
|
+
- Documentation edits without behavior change
|
|
28
|
+
- Bug fixes that touch existing primitives without adding new ones
|
|
29
|
+
- Test edits (covered by sister rules — `.claude/rules/testing-tier-config.md`, `test-list-discipline.md`)
|
|
30
|
+
|
|
31
|
+
## The 7 known instances
|
|
32
|
+
|
|
33
|
+
Each row names the primitive being added, the pair it owes, and the failure mode when the pair is missing.
|
|
34
|
+
|
|
35
|
+
| Building block added | Bootstrap pair owed | Failure mode when missing |
|
|
36
|
+
|---|---|---|
|
|
37
|
+
| **Hook** under `.claude/hooks/*.sh` | The hook is wired in `.claude/settings.json` OR `presence/install/bassclef-sync.template.sh` for adopters | Hook exists on disk but stays silent (dead-letter) — surfaced 5 times during the 2026-04 substrate audit |
|
|
38
|
+
| **Rule** citing a mechanical hook in `## Mechanical Enforcement` | The cited hook exists on disk AND is wired | Rule promises mechanical layer that stays silent; methodology only — surfaced 11 times in WU-5 of bet 2026-06-24c |
|
|
39
|
+
| **Skill** declaring `modes:` / `tiers:` / `sizes:` in frontmatter | The `description:` field names each declared mode inline (per `.claude/rules/skill-description-clarity.md` description-mirrors-modes) | Type-ahead operator menu shows nothing distinguishing — surfaced 3 times in WU-6 of bet 2026-06-24c |
|
|
40
|
+
| **Accessor library** named in a rule (`lib/state.sh`) | The file exists at the named path | Rule's `accessor-library-discipline.md` references a path that 404s — surfaced via #324 (closed via bet 2026-06-25a) |
|
|
41
|
+
| **Schema** under `standards/state-spine/schemas/*.schema.json` | The write-time validation hook is wired (`state-validate.sh` PreToolUse) AND the entity has a storage-shape entry in `standards/state-spine.md` | Schema ships but the spine permits writes that violate it — surfaced via #319 (partial-close via bet 2026-06-25a WU-3) |
|
|
42
|
+
| **Adopter-observable surface change** — new hook / skill / rule / agent / luminary / standard / ADR / schema / sync-template OR edit to an existing one matching `.claude/rules/cold-adopter-harness-discipline.md` § "When this rule fires" | The cold-adopter harness check class covering the new surface exists in `scripts/cold-adopter-harness-sync.sh` AND the CI job `cold-adopter-harness` in `.github/workflows/bassclef-pr-ci.yml` fires on the PR | Substrate ships a change that breaks adopter-observable surface; harness passes with stale coverage OR harness fails with no CI gate to catch it before merge — surfaced via 2026-06-25 /longrun prep audit (Gap 1 + Gap 2 + Gap 3 of 5; closed via bet 25g) |
|
|
43
|
+
| **Release pipeline path change** (added bet 2026-06-29c WU-5) — any PR that adds a new top-level directory (e.g., new `lib/`, `templates/`, `presence/`) OR moves files between substrate directories (`scripts/`, `presence/`, `lib/`, `standards/`) OR adds a new operator-template at `presence/install/` | The release script's `ALLOWED_PATHS` in `scripts/release-to-bassclef.sh` covers the new top-level directory AND any new template at `presence/install/<name>.template.sh` is handled by the release step that ships templates (e.g., `public-bassclef-settings.template.json` copy step) | Release ships everything except the new directory; adopters get partial substrate; hooks reference files that aren't on the public tree — surfaced 4 release iterations in a row on 2026-06-29 (PRs #1372/#1373/#1374/#1375): PR #318 missed `scripts/`; later PRs missed `lib/` + `templates/`; settings template needed its own release-script step. Three sister cures: (a) extending the cold-adopter harness rule-mechanism-claim scanner to recognize `<name>.template.sh` as evidence the hook ships via install template; (b) refining the operator-private-path check filename pattern so it doesn't false-positive on bassclef's own `-review` rule names (out of scope tonight; tracked as follow-on); (c) auto-applying the `bassclef-internal-prose-ok` label on release PRs so the operator-private-path check passes first time (out of scope tonight; tracked as follow-on). |
|
|
44
|
+
|
|
45
|
+
## What this rule requires
|
|
46
|
+
|
|
47
|
+
When a PR adds a substrate primitive, the PR body MUST include a `Bootstrap pair shipped` block in the Summary section naming the pair:
|
|
48
|
+
|
|
49
|
+
```markdown
|
|
50
|
+
## Bootstrap pair shipped
|
|
51
|
+
|
|
52
|
+
- Building block: `<path>` (e.g., `.claude/hooks/foo.sh`)
|
|
53
|
+
- Pair: `<wiring location>` (e.g., `.claude/settings.json` PreToolUse Edit|Write|MultiEdit) OR `<rationale for no pair>`
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
If the primitive type is not in the 5-instance table, the author names the pair in plain English ("the pair this primitive owes is X because Y"). The reviewer's job is to verify the pair actually exists in the PR — not just that the author named it.
|
|
57
|
+
|
|
58
|
+
## Anti-patterns
|
|
59
|
+
|
|
60
|
+
These shapes fail this rule.
|
|
61
|
+
|
|
62
|
+
**Ship hook without wiring** — the hook lives on disk but no settings.json registers it. The hook is dead-letter; the failure surfaces silently in adopter sessions.
|
|
63
|
+
|
|
64
|
+
INSTEAD: ship the wiring in the same PR.
|
|
65
|
+
|
|
66
|
+
**Cite an unwired hook in a rule's Mechanical Enforcement section** — the rule promises mechanical enforcement but the hook is not wired. The rule operates as methodology-only with no agent-side awareness of the gap.
|
|
67
|
+
|
|
68
|
+
INSTEAD: either wire the hook in the same PR or rephrase the rule to claim methodology-only enforcement.
|
|
69
|
+
|
|
70
|
+
**Declare skill modes in frontmatter without naming them inline in the description** — the harness type-ahead shows the skill name but no mode disambiguation; operator has to invoke and discover.
|
|
71
|
+
|
|
72
|
+
INSTEAD: include each declared mode in the description's 280-character budget.
|
|
73
|
+
|
|
74
|
+
**Name a file path in a rule that does not exist on the substrate** — adopters reading the rule follow the path and 404.
|
|
75
|
+
|
|
76
|
+
INSTEAD: verify the path resolves on bassclef-upstream before the PR opens.
|
|
77
|
+
|
|
78
|
+
**Ship a schema without wiring the write-time validator** — writes that violate the schema land in the spine and corrupt state silently.
|
|
79
|
+
|
|
80
|
+
INSTEAD: wire `state-validate.sh` in `.claude/settings.json` in the same PR as the schema.
|
|
81
|
+
|
|
82
|
+
## Override path
|
|
83
|
+
|
|
84
|
+
`SKIP_BOOTSTRAP_PAIR=1 <command>` — for genuine cases where the pair lands in a separate PR by design AND the separate PR is filed AND the current PR's body cites the follow-on. Logged via trace-helper.
|
|
85
|
+
|
|
86
|
+
INSTEAD of overriding for routine work: ship the pair in the same PR. The cost is small (one hook line, one settings.json entry, one rule citation) and the discipline compounds across every future primitive.
|
|
87
|
+
|
|
88
|
+
## Why this rule exists
|
|
89
|
+
|
|
90
|
+
Five instances of "ship A without paired B" surfaced during the 2026-04 to 2026-06 substrate audit period (WU-10 of bet 2026-06-24c). Each instance was diagnosed individually before the class was named. Diagnosing the class lets future PRs catch the failure at authoring time instead of accumulating as silent debt the next architect-review sweeps surface.
|
|
91
|
+
|
|
92
|
+
Per `@luminary john-ousterhout` (deep modules): a substrate module is "deep" when its API matches its internal complexity. A bootstrap-paired ship matches the API surface (rule says X exists, hook does Y) with the internal commitment (X is on disk, Y is wired). Half-shipped primitives have shallow APIs that lie about internal state.
|
|
93
|
+
|
|
94
|
+
Per `@luminary michael-nygard` (stability patterns): bootstrap-pair is the circuit-breaker against incomplete substrate ships. The rule fires at the PR-author boundary; the optional V2 mechanical layer would fire at the pre-commit boundary; both prevent the half-shipped class from reaching adopter machines.
|
|
95
|
+
|
|
96
|
+
Per `@luminary kent-beck` (test-first): the test for a substrate primitive often IS its bootstrap pair. The hook test ships when the hook ships; the test running confirms the hook fires; the wiring is the bootstrap pair that makes the test reachable from adopter sessions.
|
|
97
|
+
|
|
98
|
+
Per `@luminary linus-torvalds` (adopter compatibility stance): when bassclef ships an incomplete substrate primitive, the failure is invisible to bassclef-internal tests (which assume bassclef's own environment is intact) but catastrophic at first adopter run (which catches the missing pair). The bootstrap-pair discipline is the bassclef-internal analog of the kernel-compatibility-stance Linus articulated — applied to substrate-internal completeness.
|
|
99
|
+
|
|
100
|
+
## Mechanical layer (V2 deferred)
|
|
101
|
+
|
|
102
|
+
V1 of this rule is methodology only. V2 deferred extension: a pre-commit hook that:
|
|
103
|
+
|
|
104
|
+
1. Detects PRs adding substrate primitives (path matchers per the "When this rule fires" section)
|
|
105
|
+
2. Greps the staged content for the pair (e.g., new hook → grep settings.json staged diff for the hook's path)
|
|
106
|
+
3. BLOCKs when the pair is absent AND the override is absent
|
|
107
|
+
|
|
108
|
+
Defer to a separate goal when the methodology layer has shipped through enough PRs that the failure modes are stable and the pre-commit logic can mechanize against them confidently.
|
|
109
|
+
|
|
110
|
+
## Composes with
|
|
111
|
+
|
|
112
|
+
- `.claude/rules/pr-body-shape.md` — the `Bootstrap pair shipped` block lives in the Summary section per this rule
|
|
113
|
+
- `.claude/rules/we-dont-break-adopters.md` — sister discipline at the adopter-observable surface; this rule extends the discipline to bassclef-internal substrate completeness
|
|
114
|
+
- `.claude/rules/blocked-items.md` — the BLOCK protocol the V2 mechanical layer would fire
|
|
115
|
+
- `.claude/rules/loop-discipline.md` — sister at the construction-cycle level; bootstrap-pair check fires in the per-PR loop discipline
|
|
116
|
+
- `.claude/rules/accessor-library-discipline.md` — the rule that surfaced one instance (#324)
|
|
117
|
+
- `.claude/rules/testing-tier-config.md` — the Tier 0 strict-TDD pattern; the bootstrap pair often IS the test that locks the primitive
|
|
118
|
+
- `architecture/audits/2026-06-24-validator-bootstrap.md` — WU-10 surfaced the 5-instance enumeration
|
|
119
|
+
|
|
120
|
+
## Distinct from
|
|
121
|
+
|
|
122
|
+
- `we-dont-break-adopters.md` — that rule covers adopter-observable surfaces. This rule covers substrate-internal completeness. The two compose; both required.
|
|
123
|
+
- `loop-discipline.md` — that rule covers the per-PR construction cycle. This rule covers the per-primitive completeness check WITHIN that cycle.
|
|
124
|
+
- `testing-tier-config.md` — that rule covers WHICH paths require which tier of test enforcement. This rule covers whether the primitive's PAIR ships at all.
|
|
125
|
+
|
|
126
|
+
## Refs
|
|
127
|
+
|
|
128
|
+
- bassclef-upstream#328 (this rule's filing ticket)
|
|
129
|
+
- bassclef-upstream#322 (single-instance case that seeded the generalization)
|
|
130
|
+
- bassclef-upstream#319 (hook wiring instance — partial-close via bet 25a WU-3)
|
|
131
|
+
- bassclef-upstream#324 (lib accessor library instance — closed via bet 25a)
|
|
132
|
+
- bassclef-upstream#325 (workflows instance — closed via bet 25b)
|
|
133
|
+
- bassclef-upstream#326 (design + patterns instance — closed via bet 25c)
|
|
134
|
+
- `architecture/audits/2026-06-24-validator-bootstrap.md` (WU-10 of bet 24c)
|
|
135
|
+
- bet 2026-06-25d — this rule's ship vehicle
|
|
136
|
+
|
|
137
|
+
## Retirement condition
|
|
138
|
+
|
|
139
|
+
This rule retires only if substrate primitives cease to require paired bootstrap (very unlikely — the half-shipped failure class is inherent to any modular substrate that crosses the bassclef → adopter boundary). The 5-instance enumeration may grow as new primitive types surface (e.g., agent definitions, luminary catalog entries) — extend the table per amendment.
|
|
140
|
+
|
|
141
|
+
Closes bassclef-upstream#328.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
globs: ["*"]
|
|
4
|
+
description: Trunk-based development — branch naming and flow
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Model: trunk-based development (solo variant). `main` is always deployable.
|
|
8
|
+
|
|
9
|
+
Branch naming:
|
|
10
|
+
- `feature/ISSUE-NNN-short-description`
|
|
11
|
+
- `fix/ISSUE-NNN-short-description`
|
|
12
|
+
- `spike/ISSUE-NNN-short-description`
|
|
13
|
+
|
|
14
|
+
Every branch ties to a GitHub Issue. No branch without an issue.
|
|
15
|
+
|
|
16
|
+
Flow: issue → branch from main → work → PR → CI passes → squash merge → delete branch
|
|
17
|
+
|
|
18
|
+
Rules:
|
|
19
|
+
- Broken main = drop everything
|
|
20
|
+
- No branches older than 5 days — break it up
|
|
21
|
+
- Force push on feature branches is fine, never on main
|
|
22
|
+
- Semantic versioning tags for releases: v0.1.0, v0.2.0
|
|
23
|
+
|
|
24
|
+
Multi-branch work (autonomous/multi-step sessions):
|
|
25
|
+
- See `standards/branch-stacking.md` for stacked atomic branches
|
|
26
|
+
- Stack manifest declares branches, dependencies, parallel-safety
|
|
27
|
+
- Naming: `feature/ISSUE-NNN-stack-N-short-description`
|
|
28
|
+
- Each branch is independently reviewable and revertable
|
|
@@ -0,0 +1,129 @@
|
|
|
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
|
+
## How bassclef channels this discipline
|
|
84
|
+
|
|
85
|
+
The discipline lives in three layers — pre-commit (operator-side fast-fail), PR-CI (PR-side enforcement), and /verify (operator-side audit) — all firing the same 12-pattern matcher per Saltzer-Schroeder complete mediation:
|
|
86
|
+
|
|
87
|
+
- `.claude/rules/cold-adopter-harness-discipline.md` — this rule (methodology layer)
|
|
88
|
+
- `.claude/hooks/pre-commit-gate.sh` § "Cold-adopter harness fast-path" — pre-commit layer (operator-side fast-fail; ships via bet 25h WU-2). Detects substrate-affecting staged paths, runs harness in `--mode structural` for fast feedback, BLOCKs the commit on harness failure. Override: `SKIP_COLD_ADOPTER_HARNESS=1 git commit`.
|
|
89
|
+
- `.github/workflows/bassclef-pr-ci.yml` — `cold-adopter-harness` PR-blocking job (PR-CI mechanical layer; ships via bet 25g WU-2)
|
|
90
|
+
- `.claude/skills/verify/SKILL.md` — operator-side audit composition (ships via bet 25h WU-3)
|
|
91
|
+
- `scripts/cold-adopter-harness-sync.sh` — the shape b harness all three layers invoke; extended with workflow-loop checks via bet 25g WU-3; FURTHER extended with Shape d mechanism-fidelity check classes via bet 27c WU-5 (4 new classes: `hook-wiring-presence`, `hook-path-resolution-under-install-class`, `hook-end-to-end-smoke`, `rule-mechanism-claim-fidelity`; V1 ADVISORY → V2 BLOCK after Bet C-pre-2 cures land)
|
|
92
|
+
- `standards/cold-adopter-harness.md` (standard tier — operator + standard adopter reachable) — operational reference for invocation + check semantics; documents Shape d V1 ADVISORY mode per bet 27c WU-5
|
|
93
|
+
- `.claude/rules/bootstrap-pair-discipline.md` — sister rule; amended in bet 25g WU-1 to list cold-adopter validation as a paired bootstrap class
|
|
94
|
+
|
|
95
|
+
## Composes with
|
|
96
|
+
|
|
97
|
+
- `@luminary saltzer-schroeder` — complete-mediation principle (every adopter-observable surface validated by the harness; the rule names which surfaces are observable)
|
|
98
|
+
- `@luminary hyrum-wright` — observable behavior becomes load-bearing (the harness pins the observable contract; this rule formalizes that pinning)
|
|
99
|
+
- `@luminary linus-torvalds` — adopter-trust ceiling (CI gate IS the operational form of the adopter-compatibility stance; rule names the discipline)
|
|
100
|
+
- `@luminary michael-feathers` — characterization tests at the adopter boundary (the harness IS the characterization test; this rule mandates the test fires)
|
|
101
|
+
- `.claude/rules/we-dont-break-adopters.md` — sister discipline; this rule is the test-side of the discipline that rule defines
|
|
102
|
+
- `.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
|
|
103
|
+
- `.claude/rules/testing-tier-config.md` — Tier 0 paths the harness validates; sister rule for per-path test enforcement
|
|
104
|
+
- `.claude/rules/loop-discipline.md` — the per-PR cycle this rule fires within (loop's final-validation step composes the harness check)
|
|
105
|
+
- `.claude/rules/blocked-items.md` — BLOCK protocol the CI job fires when the harness fails
|
|
106
|
+
|
|
107
|
+
## Distinct from
|
|
108
|
+
|
|
109
|
+
- `.claude/rules/we-dont-break-adopters.md` — that rule names the operator-side discipline (ship within the adopter contract); this rule names the mechanical enforcement (the harness fires on every PR)
|
|
110
|
+
- `.claude/rules/bootstrap-pair-discipline.md` — that rule lists 5 substrate-primitive classes that need paired bootstrap; this rule extends with the adopter-validation pair as a 6th class
|
|
111
|
+
- `.claude/rules/testing-tier-config.md` — that rule names per-path test enforcement tier; this rule names harness-level enforcement that composes with per-path tiers
|
|
112
|
+
- `scripts/release-to-bassclef.sh` — that script publishes substrate downstream; this rule's harness is a pre-publish gate (CI fires before release pipeline runs)
|
|
113
|
+
|
|
114
|
+
## Refs
|
|
115
|
+
|
|
116
|
+
- bassclef-upstream#341 — shape c (this rule + the CI job ship together via bet 25g)
|
|
117
|
+
- bassclef-upstream#333 — shape a (harness foundation; closed via 25e)
|
|
118
|
+
- bassclef-upstream#320 — substrate architect-review epic (closed; 24c umbrella still in_flight)
|
|
119
|
+
- bet `docs/iteration-bets/2026-06-25g-cold-adopter-ci-and-discipline.md` — ship vehicle
|
|
120
|
+
- bet `docs/iteration-bets/2026-06-25f-fixes-then-harness.md` — shape b parent
|
|
121
|
+
- ADR-029 release pipeline (CI harness fires before release)
|
|
122
|
+
- ADR-031 (`we-dont-break-adopters` decision) — this rule is the test-side enforcement
|
|
123
|
+
- 2026-06-25 /longrun prep audit — surfaced the 5 wiring gaps this rule + bet 25g close (3 of 5)
|
|
124
|
+
|
|
125
|
+
## Retirement condition
|
|
126
|
+
|
|
127
|
+
This rule retires only if bassclef stops having adopters OR the cold-adopter harness retires. The CI mechanical layer may evolve (separate workflow, runner profile change, harness extension) but the discipline of validating adopter-observable surface before merge persists.
|
|
128
|
+
|
|
129
|
+
Closes audit Gap 2 surfaced at /longrun prep 2026-06-25. Sister gaps 4 + 5 (pre-commit hook, /verify composition) filed as follow-ons during bet 25g closeout.
|
|
@@ -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.
|