@thebassclef/lite 1.1.1 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.cjs +23 -6
- package/dist/cli.js +23 -6
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/lite/.claude/bassclef-configs.jsonc +56 -0
- package/dist/lite/.claude/bassclef-orientation.md +120 -0
- package/dist/lite/.claude/hooks/adr-discipline-check.sh +132 -0
- package/dist/lite/.claude/hooks/atomic-pr-check.sh +169 -0
- package/dist/lite/.claude/hooks/auto-save-idle.sh +51 -0
- package/dist/lite/.claude/hooks/bassclef-sync.sh +51 -13
- package/dist/lite/.claude/hooks/bet-doc-gate.sh +283 -0
- package/dist/lite/.claude/hooks/bug-diagnosis.sh +64 -0
- package/dist/lite/.claude/hooks/destructive-command-guard.sh +136 -0
- package/dist/lite/.claude/hooks/file-rename-discipline-check.sh +147 -0
- package/dist/lite/.claude/hooks/hook-classifier-canary.sh +158 -0
- package/dist/lite/.claude/hooks/kiss-default-check.sh +129 -0
- package/dist/lite/.claude/hooks/multi-tenancy-check.sh +83 -0
- package/dist/lite/.claude/hooks/oo-ad-entry-point-check.sh +216 -0
- package/dist/lite/.claude/hooks/operator-private-path-check.sh +203 -0
- package/dist/lite/.claude/hooks/pattern-annotation-validate.sh +142 -0
- package/dist/lite/.claude/hooks/plain-english-steering.sh +15 -1
- package/dist/lite/.claude/hooks/post-write-trace.sh +66 -0
- package/dist/lite/.claude/hooks/pr-body-scrub-check.sh +446 -0
- package/dist/lite/.claude/hooks/pre-commit-identifier-leak-scrub.sh +137 -0
- package/dist/lite/.claude/hooks/pre-gh-pr-body-scrub.sh +192 -0
- package/dist/lite/.claude/hooks/pre-gh-pr-title-scrub.sh +172 -0
- package/dist/lite/.claude/hooks/role-entry-gate.sh +115 -0
- package/dist/lite/.claude/hooks/save-state.sh +268 -0
- package/dist/lite/.claude/hooks/session-reflection.d/08-settings-drift.sh +8 -1
- package/dist/lite/.claude/hooks/session-reflection.d/10-abrupt-stop-recovery.sh +52 -0
- package/dist/lite/.claude/hooks/session-reflection.d/55-orientation-gate.sh +40 -4
- package/dist/lite/.claude/hooks/session-reflection.d/80-hook-heartbeat-check.sh +12 -5
- package/dist/lite/.claude/hooks/session-reflection.d/81-hook-manifest-staleness.sh +18 -2
- package/dist/lite/.claude/hooks/session-reflection.d/91-npm-version-drift.sh +54 -0
- package/dist/lite/.claude/hooks/session-reflection.d/tests/10-abrupt-stop-recovery.test.sh +95 -0
- package/dist/lite/.claude/hooks/session-reflection.sh +62 -15
- package/dist/lite/.claude/hooks/tool-failure-diagnosis.sh +50 -0
- package/dist/lite/.claude/luminaries/andrej-karpathy.md +165 -0
- package/dist/lite/.claude/luminaries/dave-gray.md +155 -0
- package/dist/lite/.claude/luminaries/gary-klein.md +166 -0
- package/dist/lite/.claude/luminaries/kaoru-ishikawa.md +162 -0
- package/dist/lite/.claude/luminaries/lean-product-canvas.md +33 -0
- package/dist/lite/.claude/luminaries/luke-wroblewski.md +224 -0
- package/dist/lite/.claude/luminaries/ryan-singer.md +113 -0
- package/dist/lite/.claude/luminaries/steve-krug.md +168 -0
- package/dist/lite/.claude/luminaries/tony-ulwick.md +134 -0
- package/dist/lite/.claude/rules/arc-level-orientation-before-leaf.md +60 -0
- package/dist/lite/.claude/rules/architect-review-discipline.md +71 -0
- package/dist/lite/.claude/rules/auto-fix-criteria.md +126 -0
- package/dist/lite/.claude/rules/bassclef-hook-drift-blocker.md +144 -0
- package/dist/lite/.claude/rules/bassclef-models-discovery.md +107 -0
- package/dist/lite/.claude/rules/bassclef-workflow-parity.md +104 -0
- package/dist/lite/.claude/rules/cost-governance.md +154 -0
- package/dist/lite/.claude/rules/file-rename-discipline.md +95 -0
- package/dist/lite/.claude/rules/mechanism-fidelity.md +88 -0
- package/dist/lite/.claude/rules/prototype-production-coupling.md +125 -0
- package/dist/lite/.claude/rules/quick-fix-criteria.md +90 -0
- package/dist/lite/.claude/rules/session-artifacts.md +30 -0
- package/dist/lite/.claude/rules/sibling-smoke-after-substrate-change.md +107 -0
- package/dist/lite/.claude/rules/substrate-as-system.md +67 -0
- package/dist/lite/.claude/rules/usability.md +22 -0
- package/dist/lite/.claude/settings.json +20 -0
- package/dist/lite/.claude/skills/agent-research-spawn/SKILL.md +100 -0
- package/dist/lite/.claude/skills/architect-review/SKILL.md +201 -0
- package/dist/lite/.claude/skills/auto-fix/SKILL.md +297 -0
- package/dist/lite/.claude/skills/autonomous/SKILL.md +300 -0
- package/dist/lite/.claude/skills/bind-subdomain/SKILL.md +232 -0
- package/dist/lite/.claude/skills/canvas/SKILL.md +41 -0
- package/dist/lite/.claude/skills/deploy-prod/SKILL.md +106 -0
- package/dist/lite/.claude/skills/docs-sync/SKILL.md +188 -0
- package/dist/lite/.claude/skills/eisenhower/SKILL.md +273 -0
- package/dist/lite/.claude/skills/empathy-map/SKILL.md +168 -0
- package/dist/lite/.claude/skills/frontend-design/SKILL.md +53 -0
- package/dist/lite/.claude/skills/interview-me/SKILL.md +171 -0
- package/dist/lite/.claude/skills/journal-export/SKILL.md +293 -0
- package/dist/lite/.claude/skills/jtbd-tasks/SKILL.md +203 -0
- package/dist/lite/.claude/skills/objectory-decompose/SKILL.md +256 -0
- package/dist/lite/.claude/skills/pick-luminaries/SKILL.md +100 -0
- package/dist/lite/.claude/skills/pre-mortem/SKILL.md +180 -0
- package/dist/lite/.claude/skills/prototype-gallery/SKILL.md +264 -0
- package/dist/lite/.claude/skills/provision-deploy-host/SKILL.md +257 -0
- package/dist/lite/.claude/skills/quick-fix/SKILL.md +273 -0
- package/dist/lite/.claude/skills/release/SKILL.md +311 -0
- package/dist/lite/.claude/skills/release-notes/SKILL.md +202 -0
- package/dist/lite/.claude/skills/rfc/SKILL.md +222 -0
- package/dist/lite/.claude/skills/riff-prototypes/SKILL.md +637 -0
- package/dist/lite/.claude/skills/secrets-bootstrap/SKILL.md +209 -0
- package/dist/lite/.claude/skills/skill/SKILL.md +304 -0
- package/dist/lite/.claude/skills/smoke-test/SKILL.md +100 -0
- package/dist/lite/.claude/skills/state/SKILL.md +204 -0
- package/dist/lite/.claude/skills/substrate-check/SKILL.md +218 -0
- package/dist/lite/.claude/skills/synthetic-user/SKILL.md +381 -0
- package/dist/lite/.claude/skills/task-scenarios/SKILL.md +105 -0
- package/dist/lite/.claude/skills/tier-dependency-audit/SKILL.md +139 -0
- package/dist/lite/.claude/skills/ux-migration/SKILL.md +424 -0
- package/dist/lite/.claude/skills/value-prop-canvas/SKILL.md +297 -0
- package/dist/lite/README.md +5 -1
- package/dist/lite/gitignore +6 -0
- package/dist/lite/lib/bassclef-dir-resolver.sh +85 -0
- package/dist/lite/lib/clone-failure-classifier.sh +59 -0
- package/dist/lite/lib/fixture-builder.sh +190 -0
- package/dist/lite/lib/fresh-install-check.sh +49 -0
- package/dist/lite/lib/hook-heartbeat.sh +0 -1
- package/dist/lite/lib/mechanism-fidelity.sh +569 -0
- package/dist/lite/lib/npm-version-check.sh +112 -0
- package/dist/lite/lib/preview-state.sh +229 -0
- package/dist/lite/lib/session-rescue.sh +0 -1
- package/dist/lite/scripts/generate-lite-manifest.sh +145 -4
- package/dist/lite/scripts/lite-manifest-drift-check.sh +5 -1
- package/dist/lite/standards/architect-review-discipline.md +222 -0
- package/dist/lite/standards/bassclef-platform.md +249 -0
- package/dist/lite/standards/bassclef-test-repos.md +97 -0
- package/dist/lite/standards/bassclef-wiring-manifest.json +25 -1
- package/dist/lite/standards/cold-adopter-harness.md +205 -0
- package/dist/lite/standards/data-management.md +135 -0
- package/dist/lite/standards/frontend-stack/nextjs-prisma.md +124 -0
- package/dist/lite/standards/lite-manifest-schema-changes.md +27 -0
- package/dist/lite/standards/lite-manifest.json +1456 -14
- package/dist/lite/standards/mechanism-fidelity.md +205 -0
- package/dist/lite/standards/operator-private-discipline.md +200 -0
- package/dist/lite/standards/operator-to-public-flow.md +195 -0
- package/dist/lite/standards/prototype-gallery.md +251 -0
- package/dist/lite/standards/pseudonym-key-schema.md +109 -0
- package/dist/lite/standards/sibling-validation-checklist.md +181 -0
- package/dist/lite/standards/slack-notifications.md +161 -0
- package/dist/lite/standards/synthetic-user-testing.md +173 -0
- package/dist/lite/standards/vendor-bindings.md +165 -0
- package/dist/lite/standards/vendor-plugins/frontend-design.md +66 -0
- package/dist/lite/standards/vpc-fit-validation.md +167 -0
- package/dist/lite/templates/gallery-yml.md +113 -0
- package/dist/lite/templates/product-canvas.md +169 -0
- package/dist/lite/templates/value-prop-canvas.md +180 -0
- package/package.json +3 -3
- /package/dist/lite/{whereami.md → docs/whereami.md} +0 -0
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
status: live
|
|
4
|
+
date: 2026-06-27
|
|
5
|
+
authority: ADR-035
|
|
6
|
+
references:
|
|
7
|
+
- {type: adr, id: ADR-035, anchor: substrate-as-system tenet}
|
|
8
|
+
- {type: standard, id: standards/hook-injection-discipline.md, anchor: injection hook contract}
|
|
9
|
+
- {type: standard, id: standards/hook-install-class.md, anchor: install-class declaration}
|
|
10
|
+
- {type: standard, id: standards/architect-review-discipline.md, anchor: universal architect-review framework that composes this audit}
|
|
11
|
+
- {type: standard, id: standards/cold-adopter-harness.md, anchor: harness check class that runs this audit per PR}
|
|
12
|
+
- {type: rule, id: .claude/rules/bootstrap-pair-discipline.md, anchor: hook + test + wiring shipping together}
|
|
13
|
+
- {type: rule, id: .claude/rules/testing-tier-config.md, anchor: Tier 0 strict-TDD path table}
|
|
14
|
+
- {type: external, id: Working Effectively with Legacy Code — Michael Feathers, anchor: legacy code = code without tests}
|
|
15
|
+
- {type: external, id: Test-Driven Development By Example — Kent Beck, anchor: tests pin the contract}
|
|
16
|
+
luminaries:
|
|
17
|
+
primary: [michael-feathers, kent-beck]
|
|
18
|
+
supporting: [saltzer-schroeder, tony-hoare, hyrum-wright]
|
|
19
|
+
description: "- ADR-035 — names the substrate-as-system foundational tenet that this standard's audit method verifies - architecture/audits/2026-06-24-closeout.md — bet 24c architect-review that missed this class; this standard's audit fills the lens-gap and…"
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
# Mechanism fidelity
|
|
23
|
+
|
|
24
|
+
> **Anthropic docs reference:** This standard does not depend on a specific Anthropic surface — it is a bassclef discipline for verifying the substrate's own catalog claims hold end-to-end. The audit method applies to any bassclef rule, hook, skill, or standard regardless of Anthropic's hook surface evolution.
|
|
25
|
+
|
|
26
|
+
## Sources read
|
|
27
|
+
|
|
28
|
+
- ADR-035 — names the substrate-as-system foundational tenet that this standard's audit method verifies
|
|
29
|
+
- `architecture/audits/2026-06-24-closeout.md` — bet 24c architect-review that missed this class; this standard's audit fills the lens-gap and method-gap
|
|
30
|
+
- `chronicle/2026-06-27c-mechanism-fidelity-foundation-longrun.md` (in-flight; lands at WU-12 closeout) — three known instances of the class surfaced during /diagnose
|
|
31
|
+
- `.claude/hooks/turn-prose-kiss-check.sh` (live SILENT-PASS example) — hook fires but reads from nonexistent path; falls back to 8 defaults
|
|
32
|
+
- `.claude/hooks/adr-discipline-check.sh` (live DEAD-LETTER example) — hook file exists but not wired in any settings.json
|
|
33
|
+
- `.claude/skills/build/SKILL.md` + `launch/SKILL.md` + `spec/SKILL.md` + `decompose/SKILL.md` (live METHODOLOGY-ONLY example) — procedure has no "read pinned ADRs" step despite rules saying ADR consultation is required
|
|
34
|
+
- Michael Feathers — *Working Effectively with Legacy Code* (Prentice Hall 2004) — anchor for the substrate-as-system tenet
|
|
35
|
+
- Kent Beck — *Test-Driven Development By Example* (Addison-Wesley 2002) — anchor for tests-pin-contracts
|
|
36
|
+
|
|
37
|
+
## What this standard covers
|
|
38
|
+
|
|
39
|
+
The audit method for verifying that every bassclef rule which names a mechanical enforcement mechanism actually has that mechanism wired, firing, and producing the stated effect end-to-end.
|
|
40
|
+
|
|
41
|
+
Per @luminary michael-feathers — code without characterization tests is legacy code by definition. A bassclef rule that says "mechanism X enforces this discipline" without an end-to-end test of X is legacy code at the catalog-claim layer.
|
|
42
|
+
|
|
43
|
+
This standard defines:
|
|
44
|
+
- The class — "rule claims mechanism X enforces discipline; mechanism is missing, unwired, or fails silently"
|
|
45
|
+
- The 7 classification labels
|
|
46
|
+
- The scan method (per-rule)
|
|
47
|
+
- The verification chain (5 steps)
|
|
48
|
+
- The output format (markdown findings table)
|
|
49
|
+
- The integration points (the `/audit-rule-mechanism-fidelity` skill that runs the audit; the cold-adopter harness check class that runs it per PR)
|
|
50
|
+
|
|
51
|
+
## The class
|
|
52
|
+
|
|
53
|
+
A rule asserts:
|
|
54
|
+
|
|
55
|
+
> Mechanical enforcement: `<hook-name>.sh` fires at `<event>` matching `<matcher>` and BLOCKs `<condition>`.
|
|
56
|
+
|
|
57
|
+
The class fires when one or more of these hold:
|
|
58
|
+
|
|
59
|
+
| Label | What is broken | Example |
|
|
60
|
+
|---|---|---|
|
|
61
|
+
| `DEAD-LETTER` | Hook file exists but no settings.json entry wires it | `adr-discipline-check.sh` (live 2026-06-27) |
|
|
62
|
+
| `UNWIRED` | Hook file missing entirely; rule references a nonexistent path | (none known today) |
|
|
63
|
+
| `PATH-BROKEN` | Hook is wired but its internal path resolution fails under its install layout | `turn-prose-kiss-check.sh` (live 2026-06-27 — Class A) |
|
|
64
|
+
| `SILENT-PASS` | Hook fires but produces no observable signal — fallback to defaults, advisory mode in chat, suppressed stderr | `turn-prose-kiss-check.sh` (same — Class B) |
|
|
65
|
+
| `TEST-MISSING` | Hook works but no Tier 0 test pins its contract; future drift not caught | (audit to surface) |
|
|
66
|
+
| `METHODOLOGY-ONLY` | Rule body claims mechanical enforcement; no hook exists; pure self-discipline | `/build` `/launch` `/spec` `/decompose` `/shape` SKILL procedures lack ADR-read step despite `iteration-bet-brief-completeness.md` requiring ADR cite |
|
|
67
|
+
| `NOT-WIRED-BY-DESIGN-CI` | Hook lives on disk and is referenced from `.github/workflows/*.yml`; settings.json is not the right home for it | `pr-body-scrub-check.sh`, `pr-body-loop-discipline-check.sh` |
|
|
68
|
+
| `NOT-WIRED-BY-DESIGN-LAUNCHD` | Hook is scheduled by macOS launchd (or cron); header comment names the scheduler; settings.json is not the right home | `auto-save-idle.sh` |
|
|
69
|
+
| `NOT-WIRED-BY-DESIGN-LIB` | File is sourced by other hooks (library role); header comment says "sourced by"; settings.json is not the right home | `trace-helper.sh` |
|
|
70
|
+
| `CLEAN` | All chain steps pass | most existing rules (audit will surface count) |
|
|
71
|
+
|
|
72
|
+
## The 5-step verification chain
|
|
73
|
+
|
|
74
|
+
For each rule that names a mechanism, run all five steps:
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
1. Hook file exists at the claimed path?
|
|
78
|
+
2. Hook is wired in project settings.json OR user settings.json per its install-class declaration?
|
|
79
|
+
3. Hook has a Tier 0 test that runs end-to-end (not just unit)?
|
|
80
|
+
4. Hook's path resolution succeeds under its install class (operator | project | dual)?
|
|
81
|
+
5. Smoke-test: install fresh under declared layout + run + assert the rule's claimed
|
|
82
|
+
block / scan / inject behavior is observable?
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Step 5 is the dynamic verification step — the one goal 24c's static-classification audit method skipped. It is what catches `PATH-BROKEN` + `SILENT-PASS` classes that static checks pass over.
|
|
86
|
+
|
|
87
|
+
## Scan method (per rule)
|
|
88
|
+
|
|
89
|
+
Per rule file, extract mechanism claims via grep patterns:
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
"Mechanical enforcement", "hook BLOCKs", "BLOCK at",
|
|
93
|
+
"fires at", "PreToolUse|PostToolUse|Stop|SessionStart|UserPromptSubmit",
|
|
94
|
+
"<hook-name>.sh", "wired in settings"
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Extract claimed mechanism (hook path, event, matcher) from the rule body. Apply the 5-step verification chain. Classify per the 10 labels.
|
|
98
|
+
|
|
99
|
+
The shared helper `lib/mechanism-fidelity.sh` (lands in WU-3 of bet 2026-06-27c) implements:
|
|
100
|
+
|
|
101
|
+
- `scan_rule_for_mechanism_claims <rule-path>` — extracts claims from rule body
|
|
102
|
+
- `verify_hook_exists <claimed-path>` — step 1
|
|
103
|
+
- `verify_hook_wired <hook-path>` — step 2
|
|
104
|
+
- `verify_path_resolution <hook-path>` — step 4
|
|
105
|
+
- `verify_hook_test_pins_contract <hook-path>` — step 3
|
|
106
|
+
- `smoke_test_hook <hook-path> <fixture>` — step 5
|
|
107
|
+
- `classify_hook_install_pattern <hook-name> [project-root]` — detects install pattern (ci|launchd|lib|standard); bet 29a WU-1
|
|
108
|
+
- `classify_finding <rule-path> <verification-results>` — returns one of 10 labels (accepts `--install-pattern=N` to map DEAD-LETTER → NOT-WIRED-BY-DESIGN-{CI|LAUNCHD|LIB} when the hook correctly lives outside settings.json; bet 29a WU-1)
|
|
109
|
+
|
|
110
|
+
The library is `tier: upstream` (bassclef-internal). The `/audit-rule-mechanism-fidelity` skill (WU-4) calls it; the cold-adopter harness `rule-mechanism-claim-fidelity` check class (WU-5) calls it on every PR.
|
|
111
|
+
|
|
112
|
+
## Output format (findings table)
|
|
113
|
+
|
|
114
|
+
A markdown table with one row per rule × mechanism claim:
|
|
115
|
+
|
|
116
|
+
```markdown
|
|
117
|
+
| Rule | Claimed mechanism | Classification | Resolution path |
|
|
118
|
+
|---|---|---|---|
|
|
119
|
+
| `.claude/rules/adr-discipline.md` | `adr-discipline-check.sh` fires on Edit/Write of architectural paths; requires ADR marker | DEAD-LETTER | Wire in `.claude/settings.json` PreToolUse |
|
|
120
|
+
| `.claude/rules/operator-facing-prose.md` | `turn-prose-kiss-check.sh` strict mode BLOCKs on Stop | PATH-BROKEN + SILENT-PASS | Refactor to use `lib/hook-inject.sh` resolve-helpers + declare install-class: dual |
|
|
121
|
+
| `.claude/rules/iteration-bet-brief-completeness.md` | brief MUST cite ADRs | METHODOLOGY-ONLY | Author hook OR amend /build /launch /spec /decompose /shape SKILLs to read ADRs |
|
|
122
|
+
| `.claude/rules/state-schema-validation.md` | `state-validate.sh` BLOCKs on Edit/Write of state-spine paths | CLEAN | (per first audit run) |
|
|
123
|
+
| ... |
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Per-classification summary at top:
|
|
127
|
+
|
|
128
|
+
```
|
|
129
|
+
=== Classification summary ===
|
|
130
|
+
CLEAN: N
|
|
131
|
+
DEAD-LETTER: N
|
|
132
|
+
UNWIRED: N
|
|
133
|
+
PATH-BROKEN: N
|
|
134
|
+
SILENT-PASS: N
|
|
135
|
+
NOT-WIRED-BY-DESIGN-CI: N
|
|
136
|
+
NOT-WIRED-BY-DESIGN-LAUNCHD: N
|
|
137
|
+
NOT-WIRED-BY-DESIGN-LIB: N
|
|
138
|
+
TEST-MISSING: N
|
|
139
|
+
METHODOLOGY-ONLY: N
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
First audit run lands at `architecture/audits/2026-06-27-mechanism-fidelity.md` in WU-6 of bet 2026-06-27c.
|
|
143
|
+
|
|
144
|
+
## When the audit runs
|
|
145
|
+
|
|
146
|
+
Three triggers:
|
|
147
|
+
|
|
148
|
+
1. **Operator-invoked** — `/audit-rule-mechanism-fidelity` skill (user_invocable: true) — operator runs ad-hoc when reviewing substrate state
|
|
149
|
+
2. **Auto-fires at `/architect-review`** — the architect-review SKILL amendment (WU-9.5) makes this audit a mandatory procedure step; no architect-review ships without running it
|
|
150
|
+
3. **Per-PR via cold-adopter harness** — the `rule-mechanism-claim-fidelity` check class (WU-5) fires on every PR touching `.claude/rules/*.md`, `.claude/hooks/*.sh`, `.claude/skills/*/SKILL.md`, `standards/*.md`; blocks PRs that introduce a new instance of the class without paired verification
|
|
151
|
+
|
|
152
|
+
The three triggers together close the lens-gap (architect-review now includes verification) + the method-gap (audit runs end-to-end) + the per-PR drift gap (harness catches new instances at merge time).
|
|
153
|
+
|
|
154
|
+
## Override
|
|
155
|
+
|
|
156
|
+
Per-rule legitimate exception: rule explicitly marked METHODOLOGY-ONLY in its body (with stated reason — operator discretion required; mechanical layer not feasible; etc.) — audit reports METHODOLOGY-ONLY without flagging as defect.
|
|
157
|
+
|
|
158
|
+
Per-PR override: `SKIP_MECHANISM_FIDELITY_HARNESS=1 <command>` (logged via trace-helper). Used only when a rule ships ahead of its mechanism by design (e.g., methodology layer in this PR; mechanical layer in next bet, with cross-reference cited in the rule body).
|
|
159
|
+
|
|
160
|
+
## Anti-patterns
|
|
161
|
+
|
|
162
|
+
### Static-only audit
|
|
163
|
+
|
|
164
|
+
Counting hooks + classifying as wired-vs-unwired without running the hook end-to-end. INSTEAD: include the 5-step verification chain; step 5 is the dynamic test that catches PATH-BROKEN + SILENT-PASS.
|
|
165
|
+
|
|
166
|
+
### Audit a single rule in isolation
|
|
167
|
+
|
|
168
|
+
Hook silent-fail under install-class layout can only be detected by installing fresh under the declared layout. Auditing in the current install layout misses the failure. INSTEAD: cold-adopter harness check class installs each hook fresh per its declared install-class.
|
|
169
|
+
|
|
170
|
+
### Treat findings as informational
|
|
171
|
+
|
|
172
|
+
Findings without ticket filings allow the class to persist. INSTEAD: every DEAD-LETTER / PATH-BROKEN / SILENT-PASS / TEST-MISSING finding gets a `/promote substrate-defect` ticket per `.claude/rules/blocked-items.md`.
|
|
173
|
+
|
|
174
|
+
### Ship a new rule with a mechanism claim that no hook exists for
|
|
175
|
+
|
|
176
|
+
This creates the METHODOLOGY-ONLY class instance. INSTEAD: either ship the hook in the same PR (bootstrap-pair-discipline per `.claude/rules/bootstrap-pair-discipline.md`) OR mark the rule body explicitly METHODOLOGY-ONLY with rationale.
|
|
177
|
+
|
|
178
|
+
## Composes with
|
|
179
|
+
|
|
180
|
+
- `standards/architect-review-discipline.md` — universal architect-review framework calls this audit as a mandatory procedure step
|
|
181
|
+
- `standards/cold-adopter-harness.md` — `rule-mechanism-claim-fidelity` check class fires per PR
|
|
182
|
+
- `standards/hook-injection-discipline.md` + `standards/hook-install-class.md` — both inform the verification chain
|
|
183
|
+
- `standards/bash-hook-safety.md` — defensive bash disciplines that hooks under audit must hold
|
|
184
|
+
- `.claude/rules/bootstrap-pair-discipline.md` — paired ship discipline that this audit verifies post-merge
|
|
185
|
+
- `.claude/rules/testing-tier-config.md` — Tier 0 strict-TDD for new hooks; step 3 of the verification chain checks for test presence
|
|
186
|
+
- `.claude/rules/blocked-items.md` — findings file `/promote substrate-defect` per the protocol
|
|
187
|
+
- `.claude/skills/audit-rule-mechanism-fidelity/SKILL.md` (lands in WU-4 of bet 2026-06-27c) — operator-facing dispatch surface for this audit
|
|
188
|
+
|
|
189
|
+
## Refs
|
|
190
|
+
|
|
191
|
+
- ADR-035 — substrate-as-system tenet + hooks-as-steering-surfaces
|
|
192
|
+
- bassclef-upstream#417 — umbrella tracking for bet 2026-06-27c
|
|
193
|
+
- bassclef-upstream#320 — substrate-architect-review umbrella (bet 24c — the audit that missed this class)
|
|
194
|
+
- `architecture/audits/2026-06-24-closeout.md` — bet 24c closeout doc
|
|
195
|
+
- `architecture/audits/2026-06-27-mechanism-fidelity.md` (lands in WU-6) — first audit run
|
|
196
|
+
- `architecture/audits/2026-06-27-audit-method-blind-spot.md` (lands in WU-7.5) — recursive Ishikawa + Deming on bet 24c method
|
|
197
|
+
- @luminary michael-feathers — *Working Effectively with Legacy Code*
|
|
198
|
+
- @luminary kent-beck — *Test-Driven Development By Example*
|
|
199
|
+
- @luminary saltzer-schroeder — complete mediation (empirically verified)
|
|
200
|
+
- @luminary tony-hoare — pre/postcondition (audit checks contract holds against implementation)
|
|
201
|
+
- @luminary hyrum-wright — observable behavior becomes contract for adopters
|
|
202
|
+
|
|
203
|
+
## Retirement condition
|
|
204
|
+
|
|
205
|
+
This standard retires only if bassclef stops shipping rules that name mechanical enforcement. The classification labels may evolve (new classes surface as new failure shapes appear); the discipline of empirical verification at the catalog-claim layer persists.
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
description: Operator-private substrate (canvases, audits, persona reviews, proposals, strategy, ephemeral content) lives in a separate private repo, not in the public bassclef/bassclef repo.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Operator-private discipline
|
|
7
|
+
|
|
8
|
+
Operator-private substrate (canvases, audits, persona reviews, proposals, strategy, ephemeral content) lives in a separate private repo, not in the public bassclef/bassclef repo. The public repo's `docs/operator-private/` directory is a placeholder with a tracked README; everything else is gitignored. Operator workflow symlinks the private repo's content into the public working directory.
|
|
9
|
+
|
|
10
|
+
This standard documents the two-repo separation, the symlink workflow, the gitignore pattern, the commit-time repo selection, and the reference-leak discipline that keeps operator-private content out of public substrate.
|
|
11
|
+
|
|
12
|
+
## Why two repos
|
|
13
|
+
|
|
14
|
+
`.gitignore` alone is a single point of failure. If operator-private content lives only in gitignored paths on a local disk, disk crash + machine theft + accidental `rm -rf` all destroy operator-strategic substrate without recovery. The operator needs:
|
|
15
|
+
|
|
16
|
+
- Content **gitignored from public bassclef/bassclef** so it never leaks to adopters
|
|
17
|
+
- **Version-controlled + backed up** so changes are recoverable
|
|
18
|
+
- **History-preserved** so deliberation evolution is auditable
|
|
19
|
+
|
|
20
|
+
A separate private GitHub repo (`sunj-labs/bassclef-upstream`) provides all three. Standard git workflow on a private repo gives version control + GitHub backup + history.
|
|
21
|
+
|
|
22
|
+
Per `bassclef#811`.
|
|
23
|
+
|
|
24
|
+
## Two-repo layout
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
~/src/sunj-labs/
|
|
28
|
+
├── bassclef/ # public repo (operator's primary working directory)
|
|
29
|
+
│ ├── docs/
|
|
30
|
+
│ │ ├── operator-private/ # real directory; tracked README placeholder
|
|
31
|
+
│ │ │ ├── README.md # tracked (adopter-facing)
|
|
32
|
+
│ │ │ ├── audits/ # symlink → ../../../bassclef-upstream/docs/operator-private/audits
|
|
33
|
+
│ │ │ ├── canvases/ # symlink → ...
|
|
34
|
+
│ │ │ ├── persona-reviews/ # symlink → ...
|
|
35
|
+
│ │ │ ├── proposals/ # symlink → ...
|
|
36
|
+
│ │ │ ├── strategy/ # symlink → ...
|
|
37
|
+
│ │ │ └── ephemeral/ # symlink → ...
|
|
38
|
+
│ │ ├── proposals/ # public proposals only (operator-strategic ones live in private repo)
|
|
39
|
+
│ │ └── ...
|
|
40
|
+
│ └── ...
|
|
41
|
+
└── bassclef-upstream/ # private repo (operator cd's here when authoring private substrate)
|
|
42
|
+
└── docs/
|
|
43
|
+
└── operator-private/
|
|
44
|
+
├── canvases/
|
|
45
|
+
├── audits/
|
|
46
|
+
├── persona-reviews/
|
|
47
|
+
├── proposals/
|
|
48
|
+
├── strategy/
|
|
49
|
+
└── ephemeral/
|
|
50
|
+
└── journals/
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
The symlink discipline is **per-subdirectory** (audits/, canvases/, etc.) rather than the parent directory. The parent `docs/operator-private/` stays as a real directory so the tracked README placeholder can live inside it without symlink resolution issues.
|
|
54
|
+
|
|
55
|
+
## Repository naming
|
|
56
|
+
|
|
57
|
+
`bassclef-upstream` matches the public `bassclef` name (which the public bassclef repo renames to per ADR-022). Forward-compatible: when bassclef → bassclef rename completes, both repo names stay aligned (`bassclef` + `bassclef-upstream`).
|
|
58
|
+
|
|
59
|
+
## Gitignore pattern (public repo)
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
docs/operator-private/*
|
|
63
|
+
!docs/operator-private/README.md
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Ignores everything inside `docs/operator-private/` (including all subdirectory symlinks) except the README placeholder.
|
|
67
|
+
|
|
68
|
+
## Symlink setup
|
|
69
|
+
|
|
70
|
+
`scripts/operator-setup.sh` creates the per-subdirectory symlinks. The script is:
|
|
71
|
+
|
|
72
|
+
- **Idempotent**: re-runs are safe; skips symlinks already pointing at correct targets
|
|
73
|
+
- **Conditional**: no-op if `bassclef-upstream` isn't checked out at the expected sibling location (adopters can ignore the script entirely)
|
|
74
|
+
- **Operator-only**: documented in `CONTRIBUTING.md` as an operator-specific setup step; adopters don't need to run it
|
|
75
|
+
|
|
76
|
+
To set up symlinks (operator workflow):
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
cd ~/src/sunj-labs/bassclef
|
|
80
|
+
bash scripts/operator-setup.sh
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
To verify symlinks point at the private repo:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
ls -la docs/operator-private/
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Each subdirectory should show as a symbolic link with a path under `bassclef-upstream/docs/operator-private/`.
|
|
90
|
+
|
|
91
|
+
## Commit-time repo selection
|
|
92
|
+
|
|
93
|
+
Operator's working directory determines which repo a commit lands in:
|
|
94
|
+
|
|
95
|
+
| Authoring | Working directory | Commits land in |
|
|
96
|
+
|---|---|---|
|
|
97
|
+
| Public substrate (skills, hooks, rules, standards, ADRs, public proposals) | `~/src/sunj-labs/bassclef` | Public `bassclef` repo |
|
|
98
|
+
| Operator-private substrate (canvases, audits, persona reviews, internal proposals, strategy, ephemeral) | `~/src/sunj-labs/bassclef-upstream` | Private `bassclef-upstream` repo |
|
|
99
|
+
|
|
100
|
+
The symlink resolves transparently for reads from the public working directory, but commits should be authored in the repo that owns the content. If an operator edits an operator-private file from inside `bassclef/docs/operator-private/canvases/X.md`, the file system follows the symlink and the edit is actually written to `bassclef-upstream/docs/operator-private/canvases/X.md` — but `git status` in `bassclef/` will show no change (the file is gitignored there). To commit, `cd ~/src/sunj-labs/bassclef-upstream` first.
|
|
101
|
+
|
|
102
|
+
## Reference-leak discipline
|
|
103
|
+
|
|
104
|
+
Public substrate (skills, hooks, rules, standards, ADRs, public docs, README, CONTRIBUTING, public proposals) MUST NOT reference operator-private paths.
|
|
105
|
+
|
|
106
|
+
Examples of leaks to avoid:
|
|
107
|
+
|
|
108
|
+
- A skill body that cites `docs/operator-private/canvases/X.md` as required reading
|
|
109
|
+
- An ADR that references a persona review file by path
|
|
110
|
+
- A README that mentions specific operator-private artifacts by name
|
|
111
|
+
- A CONTRIBUTING.md that links to `docs/operator-private/strategy/Y.md`
|
|
112
|
+
|
|
113
|
+
Why this matters: adopters don't have `bassclef-upstream` checked out, so cited paths resolve to nothing (or to the empty `docs/operator-private/` directory). The citation creates a 404 from the adopter's perspective and erodes trust.
|
|
114
|
+
|
|
115
|
+
The substrate-coherence CI Rule 4 (per `bassclef#739` and `bassclef#787`) lints PR bodies for operator-private path citations. A companion extension (filed separately) should extend Rule 4's surface to public substrate content (skills, hooks, rules, standards, ADRs, README, CONTRIBUTING).
|
|
116
|
+
|
|
117
|
+
## Adopter experience
|
|
118
|
+
|
|
119
|
+
Adopters cloning the public bassclef repo see:
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
bassclef/docs/operator-private/
|
|
123
|
+
└── README.md
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
That's it. The README explains the directory exists for operator-private substrate (not adopter substrate) and points at `standards/operator-private-discipline.md` for the workflow detail.
|
|
127
|
+
|
|
128
|
+
Adopters do not run `scripts/operator-setup.sh`. The script's conditional check (does `bassclef-upstream` exist at the sibling location?) makes it a no-op for adopters.
|
|
129
|
+
|
|
130
|
+
## Substrate-coherence CI compatibility
|
|
131
|
+
|
|
132
|
+
Rule 3 of bassclef#739 (operator-private path enforcement) lints filenames against operator-private subdirectory location. With the symlink workflow:
|
|
133
|
+
|
|
134
|
+
- Operator's working tree: persona-review-shaped + canvas-shaped files exist at `docs/operator-private/<subdir>/*` (via symlink). Rule 3 sees them at the operator-private path → PASS.
|
|
135
|
+
- Adopter's working tree: the same files don't exist locally (only README does). Rule 3 has nothing to lint → PASS.
|
|
136
|
+
- PR adding a violating file at a public path (e.g., `docs/persona-reviews/new-review.md`): Rule 3 blocks → expected behavior.
|
|
137
|
+
|
|
138
|
+
## /promote workflow gap (known limitation)
|
|
139
|
+
|
|
140
|
+
The `/promote` skill currently files improvement tickets against bassclef/bassclef. Post-this-standard, operator-private improvement tickets may need to land in `bassclef-upstream` instead. The `/promote` skill needs target-repo discipline (`--repo private | public | both`) to distinguish.
|
|
141
|
+
|
|
142
|
+
Tracked at bassclef#817 (separately filed). Until that ships, operator manually chooses target repo when invoking `/promote`.
|
|
143
|
+
|
|
144
|
+
## Rationale for Pattern A (per-subdirectory symlinks, real parent directory)
|
|
145
|
+
|
|
146
|
+
Considered Pattern B (parent `docs/operator-private/` is itself a symlink). Rejected because:
|
|
147
|
+
|
|
148
|
+
- README placeholder can't live inside a symlink target if we want adopters to see only README (the symlink would resolve to the private repo's content for any reader who has bassclef-upstream cloned at the sibling location)
|
|
149
|
+
- Adopter experience cleaner if `docs/operator-private/` is a real (mostly empty) directory with one tracked file
|
|
150
|
+
|
|
151
|
+
Pattern A trade-off: operator-setup.sh has to manage N subdirectory symlinks instead of one. Acceptable cost for cleaner adopter experience + simpler tracked-file semantics.
|
|
152
|
+
|
|
153
|
+
## Backup + recovery
|
|
154
|
+
|
|
155
|
+
`bassclef-upstream` is a private GitHub repo. Standard git workflow gives:
|
|
156
|
+
|
|
157
|
+
- **Off-machine backup**: every push to GitHub backs up content
|
|
158
|
+
- **Recovery from disk loss**: `git clone` retrieves full history
|
|
159
|
+
- **Version-controlled history**: every commit is recoverable; deleted content stays in git history
|
|
160
|
+
- **Authentication**: standard GitHub access controls (private repo + operator-only collaborator list)
|
|
161
|
+
|
|
162
|
+
Operator workflow:
|
|
163
|
+
|
|
164
|
+
1. Author operator-private substrate in `~/src/sunj-labs/bassclef-upstream`
|
|
165
|
+
2. Commit + push to private remote regularly (same cadence as public bassclef work)
|
|
166
|
+
3. Disk loss recovery: `cd ~/src/sunj-labs && git clone https://github.com/sunj-labs/bassclef-upstream.git && cd bassclef && bash scripts/operator-setup.sh`
|
|
167
|
+
|
|
168
|
+
Ephemeral content (journal entries, scratch notes, throwaway prompts, persona-brand substrate) lives at `bassclef-upstream/docs/operator-private/ephemeral/` — same repo, same backup, same recovery path. Per `bassclef#823`.
|
|
169
|
+
|
|
170
|
+
## Relationship to other standards
|
|
171
|
+
|
|
172
|
+
- `standards/operator-to-public-flow.md` — the deliberation → public-artifact sequence (Pattern 2)
|
|
173
|
+
- `standards/pr-body-discipline.md` — Rule 4 scrub criteria (bassclef#787) compose with reference-leak discipline
|
|
174
|
+
- `standards/operator-facing-prose-discipline.md` — operator-facing prose discipline (bassclef#790) applies to private substrate too
|
|
175
|
+
- `.claude/rules/operator-facing-prose.md` — conversational rule that loads via additionalDirectories
|
|
176
|
+
- `.claude/hooks/operator-private-path-check.sh` — Rule 3 mechanical enforcement (bassclef#739)
|
|
177
|
+
- `.claude/hooks/pr-body-scrub-check.sh` — Rule 1 + Rule 4 mechanical enforcement (bassclef#739)
|
|
178
|
+
|
|
179
|
+
## Override paths
|
|
180
|
+
|
|
181
|
+
There is no override path for the two-repo separation itself. The operator can choose to keep some operator-private content in gitignored paths within the public repo (legacy pattern), but that loses backup + recovery + history.
|
|
182
|
+
|
|
183
|
+
For specific exceptions (e.g., a single operator-private file the operator wants in the public repo for reasons), use commit footer `SKIP_OPERATOR_PRIVATE_PATH=1` (per Rule 3 documented override).
|
|
184
|
+
|
|
185
|
+
## Surfaced in
|
|
186
|
+
|
|
187
|
+
- /longrun 2026-06-01 Bet 1 closeout — operator surfaced concern that gitignore-only is a single point of failure for operator-private substrate. Filed bassclef#811.
|
|
188
|
+
- /longrun 2026-06-01 bassclef#811 + bassclef#809 execution — this standard authored end-to-end.
|
|
189
|
+
|
|
190
|
+
## Refs
|
|
191
|
+
|
|
192
|
+
- bassclef#811 — parent ticket (this standard documents the implementation)
|
|
193
|
+
- bassclef#823 — ephemeral content relocation tracking
|
|
194
|
+
- bassclef#816 — operator-strategic proposals under operator-private (extends content scope)
|
|
195
|
+
- bassclef#817 — /promote target-repo discipline (known limitation)
|
|
196
|
+
- bassclef#739 — substrate-coherence CI (Rule 3 + Rule 4 enforcement surfaces)
|
|
197
|
+
- bassclef#787 — PR-body scrub discipline (compose with reference-leak)
|
|
198
|
+
- bassclef#790 — operator-facing-prose discipline (gloss + /kiss pass)
|
|
199
|
+
- bassclef#769 — canvas-path discipline (grandparent)
|
|
200
|
+
- bassclef#803 — persona-private path enforcement (sibling closed by Rule 3)
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
description: This standard documents the sequence by which operator-private deliberation (canvases, audits, persona reviews, internal proposals, strategy docs) produces public-facing artifacts (README, CONTRIBUTING, ADRs, public docs, skills, hooks, rules…
|
|
4
|
+
---
|
|
5
|
+
<!-- andon-allow: docs/operator-private/[a-z-]+/20[0-9][0-9]-[0-9]{2} -->
|
|
6
|
+
|
|
7
|
+
# Operator-to-public flow
|
|
8
|
+
|
|
9
|
+
This standard documents the sequence by which operator-private deliberation (canvases, audits, persona reviews, internal proposals, strategy docs) produces public-facing artifacts (README, CONTRIBUTING, ADRs, public docs, skills, hooks, rules, standards) without leaking operator-private content into the public surface.
|
|
10
|
+
|
|
11
|
+
This is Pattern 2 from `bassclef#811`. Companion to `standards/operator-private-discipline.md`.
|
|
12
|
+
|
|
13
|
+
## Why this flow exists
|
|
14
|
+
|
|
15
|
+
Operator-private substrate captures deliberation: persona-altitude reviews, scoring matrices, leap-of-faith assumptions, alternative scenarios, strategic-pivot reasoning. Public substrate captures decisions: ADRs, standards, skills, hooks, rules, README, CONTRIBUTING.
|
|
16
|
+
|
|
17
|
+
Naively writing public substrate "based on" operator-private substrate produces two failure modes:
|
|
18
|
+
|
|
19
|
+
1. **Path citations leak**: public artifact cites `docs/operator-private/canvases/X.md` as evidence — adopter follows the citation + gets nothing (gitignored, no symlink).
|
|
20
|
+
2. **Deliberation framing leaks**: public artifact reproduces leap-of-faith framing + persona-divergence analysis + strategic-pivot reasoning — adopter reads operator-strategic context instead of decision substance.
|
|
21
|
+
|
|
22
|
+
Both fail the public surface: adopters see broken evidence trails + over-detailed strategic context that erodes trust.
|
|
23
|
+
|
|
24
|
+
The flow below keeps deliberation in operator-private and decision substance in public.
|
|
25
|
+
|
|
26
|
+
## The four-step sequence
|
|
27
|
+
|
|
28
|
+
### Step 1 — Author private substrate in `bassclef-upstream`
|
|
29
|
+
|
|
30
|
+
Operator works in `~/src/sunj-labs/bassclef-upstream` for all operator-strategic deliberation:
|
|
31
|
+
|
|
32
|
+
- Canvases (lean-canvas, value-prop-canvas, chain-of-beliefs)
|
|
33
|
+
- Audits (substrate audits, bootstrap audits)
|
|
34
|
+
- Persona reviews (Sam, Jamie, Morgan — bounce risk, lock-in cost, leadership pitch tests)
|
|
35
|
+
- Internal proposals (scoring matrices, tier rankings, draft pitches)
|
|
36
|
+
- Strategy docs (locked decisions, growth-loop pivot reasoning)
|
|
37
|
+
- Ephemeral content (LinkedIn drafts, scratch notes, throwaway prompts)
|
|
38
|
+
|
|
39
|
+
Symlinks make these readable from the public `bassclef/docs/operator-private/` working directory, but commits land in `bassclef-upstream`.
|
|
40
|
+
|
|
41
|
+
### Step 2 — Deliberation produces a decision
|
|
42
|
+
|
|
43
|
+
Operator-strategic deliberation reaches a conclusion. The decision is concrete and stable: "Apache 2.0 license", "community-open lean", "Tier 0 = 5 luminaries (Garrett, Norman, Krug, Tufte, Fowler)", "growth-loop strategy not IP-protection".
|
|
44
|
+
|
|
45
|
+
The decision is the load-bearing output. The deliberation is the scaffolding that produced it.
|
|
46
|
+
|
|
47
|
+
### Step 3 — Author public artifact citing decision substance, not deliberation path
|
|
48
|
+
|
|
49
|
+
Operator authors the public artifact (ADR, standard, skill, hook, rule, README, CONTRIBUTING, public proposal) in `~/src/sunj-labs/bassclef`. The public artifact:
|
|
50
|
+
|
|
51
|
+
- States the decision (what we chose + the rationale that matters for adopters)
|
|
52
|
+
- Cites public-tree evidence (other ADRs, standards, public commits, public PRs, public issues)
|
|
53
|
+
- Does NOT cite operator-private paths (`docs/operator-private/canvases/X.md`)
|
|
54
|
+
- Does NOT reproduce operator-strategic framing (leap-of-faith, canvas walk surfaced, persona divergence, riskiest assumption)
|
|
55
|
+
|
|
56
|
+
Mechanical framing per `standards/pr-body-discipline.md` criteria 1 + 2:
|
|
57
|
+
|
|
58
|
+
| Avoid | Use |
|
|
59
|
+
|---|---|
|
|
60
|
+
| "Per docs/operator-private/canvases/bassclef-public-launch-lean-canvas.md, growth-loop strategy preferred" | "Per locked strategic decision (2026-05-25): bassclef ships under growth-loop strategy" |
|
|
61
|
+
| "Canvas walk surfaced LF1 (Morgan-as-gatekeeper riskiest assumption); Tier 1 quickstart shape addresses it" | "Tier 1 quickstart shape closes the 15-minute-to-first-PR adopter onboarding path" |
|
|
62
|
+
| "Per persona divergence analysis between Jamie + Morgan, scope-pivot decision is..." | "Scope decision: ... (rationale: aligns with portfolio-operator audience commitment)" |
|
|
63
|
+
|
|
64
|
+
### Step 4 — Cross-reference works via symlink for operator authoring
|
|
65
|
+
|
|
66
|
+
When operator authors a public artifact and wants to reference an operator-private artifact for personal context (e.g., to look up exact framing from a canvas walk), the symlink in `bassclef/docs/operator-private/` resolves transparently. Operator reads the private artifact from their `bassclef` working directory without leaving it.
|
|
67
|
+
|
|
68
|
+
Critical: reading is fine; citing the path in the public artifact is not. The symlink enables operator workflow; the reference-leak discipline keeps the public artifact clean.
|
|
69
|
+
|
|
70
|
+
## When public substrate IS allowed to reference operator-private
|
|
71
|
+
|
|
72
|
+
There are exactly two cases:
|
|
73
|
+
|
|
74
|
+
### Case 1 — Companion standards in `standards/operator-*.md`
|
|
75
|
+
|
|
76
|
+
This document and `standards/operator-private-discipline.md` reference operator-private substrate by NAME (not by file path) when documenting the workflow. Example: this standard mentions canvases + audits + persona reviews as content types that live in operator-private.
|
|
77
|
+
|
|
78
|
+
That's allowed because:
|
|
79
|
+
- The reference is to a content category, not a specific file
|
|
80
|
+
- Adopters reading this standard learn what content type the operator keeps private (not what specific file's content)
|
|
81
|
+
- The standard is itself operator-facing infrastructure documentation
|
|
82
|
+
|
|
83
|
+
### Case 2 — Substrate-defect citations referencing prior private content
|
|
84
|
+
|
|
85
|
+
When a substrate-defect ticket cites an operator-private artifact as the failure surface (e.g., bassclef#816 cites the WU-6 final-proposal review files), the citation reference is allowed if the citation:
|
|
86
|
+
- Doesn't reproduce the operator-private content body
|
|
87
|
+
- Cites the file as evidence-of-existence (not evidence-of-content)
|
|
88
|
+
- Includes the substrate-coherence framing (the file lives at operator-private path; the ticket extends discipline to that surface)
|
|
89
|
+
|
|
90
|
+
Pattern: "Per bassclef#816, persona-review files at `docs/operator-private/persona-reviews/*.md` need Rule 3 enforcement."
|
|
91
|
+
|
|
92
|
+
Counter-pattern (not allowed): "Per Sam's review at `docs/operator-private/persona-reviews/2026-05-24c-final-proposal-sam.md`, the Tier 1 layering proposal needs X" — this cites operator-private content body via path.
|
|
93
|
+
|
|
94
|
+
## Worked example — Tier 1 layering decision
|
|
95
|
+
|
|
96
|
+
The Tier 1 layering decision (PR #804 + #812 + #813 + #814) followed this flow:
|
|
97
|
+
|
|
98
|
+
### Step 1 — Private substrate
|
|
99
|
+
|
|
100
|
+
Operator authored in `bassclef-upstream`:
|
|
101
|
+
- `canvases/bassclef-public-launch-lean-canvas.md` (operator-strategic positioning)
|
|
102
|
+
- `canvases/bassclef-public-launch-chain-of-beliefs.md` (leap-of-faith analysis)
|
|
103
|
+
- `audits/2026-05-25-bassclef-audit-bootstrap.md` (pre-launch audit findings)
|
|
104
|
+
- `audits/2026-05-25-bassclef-strategic-audit.md` (strategic audit)
|
|
105
|
+
- `strategy/2026-05-25-locked-decisions.md` (Apache 2.0, community-open, Tier 0 luminaries)
|
|
106
|
+
- `proposals/2026-05-24-tier-1-scoring-matrix.md` (73-skill + 32-hook + 45-rule scoring)
|
|
107
|
+
- `proposals/2026-05-24-tier-1-ranking.md` (9 skills + 4 hooks + 3 rules + 2 architectural layers)
|
|
108
|
+
- `proposals/2026-05-24-tier-0-draft.md` (Tier 0 pitch with ADR-flagged decisions)
|
|
109
|
+
- `proposals/2026-05-24-tier-1-quickstart-shape.md` (Sam-altitude 15-min path)
|
|
110
|
+
- `proposals/2026-05-24-tier-1-layering-proposal.md` (consolidated 9-section synthesis)
|
|
111
|
+
- `persona-reviews/2026-05-24c-*-{sam,jamie,morgan}.md` (multi-altitude reviews)
|
|
112
|
+
|
|
113
|
+
### Step 2 — Decisions reached
|
|
114
|
+
|
|
115
|
+
- Tier 0 = 5 luminaries (Garrett + Norman + Krug + Tufte + Fowler)
|
|
116
|
+
- Tier 1 = 9 skills + 4 hooks + 3 rules + 2 architectural-commitment layers (state spine + luminary catalog)
|
|
117
|
+
- License = Apache 2.0
|
|
118
|
+
- Business model lean = community-open
|
|
119
|
+
- Audience anchor = portfolio operator
|
|
120
|
+
|
|
121
|
+
### Step 3 — Public artifacts authored citing decision substance
|
|
122
|
+
|
|
123
|
+
- `docs/proposals/2026-05-24-tier-1-quickstart-shape.md` (PR #812 — public, lists Tier 1 building blocks + 15-min path)
|
|
124
|
+
- `docs/proposals/2026-05-24-tier-1-layering-proposal.md` (PR #814 — public, consolidates Tier 1 layering for adopters)
|
|
125
|
+
- `docs/proposals/2026-05-24-tier-0-draft.md` (PR #813 — public, Tier 0 pitch + ADR-flagged decisions)
|
|
126
|
+
- ADR-021 (anchor catalog selection)
|
|
127
|
+
- ADR-022 (fresh-repo vs rename-in-place, pending operator decision)
|
|
128
|
+
|
|
129
|
+
Public artifacts reference decisions + cite other public substrate (ADRs, PRs, standards). They do NOT cite the operator-private canvas walks, audit findings, or persona reviews by path.
|
|
130
|
+
|
|
131
|
+
Per bassclef#816, the operator-strategic proposals at `docs/operator-private/proposals/` (scoring matrix, ranking, internal pitch drafts) stay private. The public Tier 1 layering proposal is a separately-authored adopter-facing artifact, not a publication of the private deliberation.
|
|
132
|
+
|
|
133
|
+
### Step 4 — Cross-reference during authoring
|
|
134
|
+
|
|
135
|
+
When authoring the public Tier 1 layering proposal, the operator can read the private scoring matrix + ranking from their `bassclef/docs/operator-private/proposals/` working directory (via symlink). The public artifact references the decision (9 + 4 + 3 + 2 Tier 1 surfaces), not the private deliberation path.
|
|
136
|
+
|
|
137
|
+
## Anti-patterns
|
|
138
|
+
|
|
139
|
+
### Anti-pattern 1 — Authoring public artifacts in private repo
|
|
140
|
+
|
|
141
|
+
If the operator authors a public-facing artifact (e.g., README rewrite) inside `bassclef-upstream`, the artifact lands in the private repo + isn't visible to adopters. Confusing failure mode.
|
|
142
|
+
|
|
143
|
+
Discipline: public artifacts always land in the public bassclef repo. Private repo holds only operator-private content.
|
|
144
|
+
|
|
145
|
+
### Anti-pattern 2 — Authoring private artifacts in public repo
|
|
146
|
+
|
|
147
|
+
If the operator authors a private artifact (e.g., a draft pitch) directly in `bassclef/docs/operator-private/<subdir>/`, the gitignore catches it (file is gitignored, not tracked). But subtle: the file lives on disk at the public repo's working directory + isn't backed up anywhere.
|
|
148
|
+
|
|
149
|
+
Discipline: private artifacts always land in the private repo. The symlink lets you cd into a subdirectory that resolves through the symlink — and edits go to the private repo automatically. Verify via `git status` in `bassclef/` (no change visible) + `git status` in `bassclef-upstream/` (change visible at the subdir).
|
|
150
|
+
|
|
151
|
+
### Anti-pattern 3 — Path citations in public substrate
|
|
152
|
+
|
|
153
|
+
Already covered in `standards/pr-body-discipline.md` criterion 1. Public substrate (skills, hooks, rules, standards, ADRs, public docs, README, CONTRIBUTING, PR bodies) doesn't cite `docs/operator-private/<...>` paths. The path resolves to nothing for adopters.
|
|
154
|
+
|
|
155
|
+
### Anti-pattern 4 — Reproducing private framing in public substrate
|
|
156
|
+
|
|
157
|
+
Already covered in `standards/pr-body-discipline.md` criterion 2. Public substrate doesn't reproduce operator-strategic deliberation framing (leap-of-faith, persona divergence, canvas walk surfaced, riskiest assumption, strategic pivot reasoning). Public substrate states decisions + their adopter-facing rationale.
|
|
158
|
+
|
|
159
|
+
## Mechanical enforcement
|
|
160
|
+
|
|
161
|
+
Per `bassclef#739` substrate-coherence CI:
|
|
162
|
+
|
|
163
|
+
- **Rule 3** (operator-private path enforcement) — blocks PRs adding persona-review-shaped, canvas-shaped, or proposal-shaped files outside `docs/operator-private/`
|
|
164
|
+
- **Rule 4** (PR-body scrub) — blocks PR bodies containing operator-private path citations OR operator-strategic deliberation framing
|
|
165
|
+
|
|
166
|
+
A companion extension (filed separately) extends Rule 4's surface from PR bodies to public substrate content (skills, hooks, rules, standards, ADRs, README, CONTRIBUTING). When that ships, mechanical enforcement covers the full public surface.
|
|
167
|
+
|
|
168
|
+
## Relationship to other standards
|
|
169
|
+
|
|
170
|
+
- `standards/operator-private-discipline.md` — companion (two-repo + symlink workflow detail)
|
|
171
|
+
- `standards/pr-body-discipline.md` — Rule 4 scrub criteria
|
|
172
|
+
- `standards/operator-facing-prose-discipline.md` — operator-facing prose discipline applies to both private and public
|
|
173
|
+
- `.claude/rules/operator-facing-prose.md` — conversational rule
|
|
174
|
+
|
|
175
|
+
## Override paths
|
|
176
|
+
|
|
177
|
+
There is no override for the deliberation-to-public-artifact sequence. The flow is the discipline.
|
|
178
|
+
|
|
179
|
+
For specific path-citation needs (e.g., a substrate-defect ticket that needs to name the violating private file by path as evidence), use the Case 2 framing above — cite as evidence-of-existence, not evidence-of-content.
|
|
180
|
+
|
|
181
|
+
## Surfaced in
|
|
182
|
+
|
|
183
|
+
- bassclef#811 implementation — this standard authored end-to-end as part of Part A.
|
|
184
|
+
- bassclef#816 — the proposal relocation that motivated the file-classification gap.
|
|
185
|
+
- Bet 1 closeout — the Tier 1 layering decision worked example.
|
|
186
|
+
|
|
187
|
+
## Refs
|
|
188
|
+
|
|
189
|
+
- bassclef#811 — parent ticket (this standard documents the Pattern 2 flow)
|
|
190
|
+
- bassclef#816 — operator-strategic proposals under operator-private (the gap this flow closes)
|
|
191
|
+
- bassclef#739 — substrate-coherence CI (mechanical enforcement)
|
|
192
|
+
- bassclef#787 — PR-body scrub discipline (criteria source)
|
|
193
|
+
- bassclef#790 — operator-facing-prose discipline (companion)
|
|
194
|
+
- bassclef#769 — canvas-path discipline (grandparent)
|
|
195
|
+
- bassclef#823 — ephemeral content relocation (companion)
|