@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,222 @@
|
|
|
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 + verification lenses}
|
|
8
|
+
- {type: standard, id: standards/mechanism-fidelity.md, anchor: audit method for substrate sibling}
|
|
9
|
+
- {type: standard, id: standards/cold-adopter-harness.md, anchor: per-PR mechanism-fidelity check class}
|
|
10
|
+
- {type: skill, id: .claude/skills/architect-review/SKILL.md, anchor: the SKILL that composes this framework}
|
|
11
|
+
- {type: skill, id: .claude/skills/audit-rule-mechanism-fidelity/SKILL.md, anchor: substrate sibling's verification skill (tier upstream)}
|
|
12
|
+
- {type: rule, id: .claude/rules/architect-review-discipline.md, anchor: companion rule (lands in WU-9.5)}
|
|
13
|
+
- {type: external, id: Working Effectively with Legacy Code — Michael Feathers, anchor: characterization tests — universal principle}
|
|
14
|
+
- {type: external, id: A Philosophy of Software Design — John Ousterhout, anchor: red flag — comment-driven design + deep modules}
|
|
15
|
+
- {type: external, id: The Mythical Man-Month — Frederick Brooks, anchor: conceptual integrity}
|
|
16
|
+
luminaries:
|
|
17
|
+
primary: [michael-feathers, w-edwards-deming, kaoru-ishikawa]
|
|
18
|
+
supporting: [saltzer-schroeder, tony-hoare, kent-beck, hyrum-wright, linus-torvalds, frederick-brooks, john-ousterhout]
|
|
19
|
+
description: "- ADR-035 — names the substrate-as-system tenet + the lens-gap that bet 24c surfaced - architecture/audits/2026-06-24-closeout.md — the audit that missed the mechanism-fidelity class; informs the universal framework's mandatory verification step -…"
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
# Architect-review discipline — universal framework
|
|
23
|
+
|
|
24
|
+
> **Anthropic docs reference:** This standard is the UNIVERSAL framework that ships to adopters. It does not depend on Anthropic's hook surface. The framework names the lenses + the method; per-stack siblings (under `standards/architect-review-discipline/<stack>.md`) hold the stack-specific verification mechanisms. Adopters loading the framework get the universal principle; siblings load per declared `tech_stack.kind` in `.claude/bassclef-configs.jsonc`.
|
|
25
|
+
|
|
26
|
+
## Sources read
|
|
27
|
+
|
|
28
|
+
- ADR-035 — names the substrate-as-system tenet + the lens-gap that bet 24c surfaced
|
|
29
|
+
- `architecture/audits/2026-06-24-closeout.md` — the audit that missed the mechanism-fidelity class; informs the universal framework's mandatory verification step
|
|
30
|
+
- `.claude/skills/architect-review/SKILL.md` — the existing SKILL; WU-9.5 amends to call this framework
|
|
31
|
+
- `.claude/rules/api-conventions.md` + `standards/api-conventions/nextjs.md` — Path A sibling pattern exemplar (ARCH-T0 bassclef-upstream#1133)
|
|
32
|
+
- `.claude/rules/schema-management.md` + `standards/migration-discipline/<orm>.md` — sister Path A pattern
|
|
33
|
+
- `.claude/rules/new-dependency-check.md` + `standards/dependency-discipline/<pm>.md` — sister Path A pattern
|
|
34
|
+
- bassclef-upstream#1127 — `tech_stack.kind` vocabulary that drives sibling loading
|
|
35
|
+
|
|
36
|
+
## What this standard covers
|
|
37
|
+
|
|
38
|
+
The universal framework that every architect-review applies — regardless of project stack. The framework names:
|
|
39
|
+
|
|
40
|
+
- Universal lens set (comprehension + verification — both required)
|
|
41
|
+
- Universal procedure (static method + dynamic method — both required)
|
|
42
|
+
- The per-stack sibling pointer (loaded from `.claude/bassclef-configs.jsonc` `tech_stack.kind`)
|
|
43
|
+
|
|
44
|
+
Adopters running `/architect-review` on a Next.js app get the universal lenses + framework + a clean "your stack sibling isn't authored yet — file `/promote` to draft it" surface if no sibling exists. Adopters never see bassclef-internal vocabulary or paths.
|
|
45
|
+
|
|
46
|
+
The substrate sibling (`standards/architect-review-discipline/substrate.md` — for bassclef-upstream itself, tech_stack.kind = substrate) defines verification specific to substrate work — the mechanism-fidelity audit + the cold-adopter harness check classes.
|
|
47
|
+
|
|
48
|
+
## Universal principle
|
|
49
|
+
|
|
50
|
+
> Every project is a system. Every claim it makes (function signatures, API endpoints, schema fields, documented behaviors, configuration contracts) is a contract. Per @luminary michael-feathers, untested contracts are legacy code by definition. Per @luminary kent-beck, tests pin contracts. Architect-review verifies — for the stack at hand — that the project's claims hold end-to-end. The verification method is stack-specific; the principle is universal.
|
|
51
|
+
|
|
52
|
+
This sentence appears verbatim in `.claude/luminaries/michael-feathers.md` (anchor cite), in `.claude/rules/substrate-as-system.md` (auto-loaded reminder), in every per-stack sibling's opener, and in ADR-035 (the foundational tenet section). Future ADRs cite this principle by name (`per ADR-035 substrate-as-system tenet`).
|
|
53
|
+
|
|
54
|
+
## Universal lens set
|
|
55
|
+
|
|
56
|
+
Every architect-review applies BOTH halves: comprehension lenses to organize findings + verification lenses to verify claims hold.
|
|
57
|
+
|
|
58
|
+
### Comprehension lenses (organize findings)
|
|
59
|
+
|
|
60
|
+
- @luminary w-edwards-deming — Act phase; corrective action from findings
|
|
61
|
+
- @luminary kaoru-ishikawa — 6M fishbone (Man / Machine / Method / Material / Measurement / Mother Nature) to categorize causes
|
|
62
|
+
- @luminary linus-torvalds — adopter-compat: does the change break existing adopters or users
|
|
63
|
+
- @luminary frederick-brooks — conceptual integrity: does the system match its design
|
|
64
|
+
|
|
65
|
+
### Verification lenses (verify claims hold)
|
|
66
|
+
|
|
67
|
+
- @luminary michael-feathers — characterization tests: code without tests is legacy code by definition
|
|
68
|
+
- @luminary kent-beck — TDD: tests pin contracts
|
|
69
|
+
- @luminary tony-hoare — pre/postcondition: do the contracts hold against the implementation
|
|
70
|
+
- @luminary saltzer-schroeder — complete mediation: every claim verified empirically, not nominally
|
|
71
|
+
- @luminary hyrum-wright — observable behavior: every documented claim becomes a contract with users / adopters
|
|
72
|
+
- @luminary john-ousterhout — deep modules: does the API match its internal complexity, or does the API lie
|
|
73
|
+
|
|
74
|
+
Bet 2026-06-24c architect-review anchored on comprehension lenses only; the audit could not catch a class that only verification lenses surface (mechanism-fidelity). This universal framework requires both halves.
|
|
75
|
+
|
|
76
|
+
## Universal procedure (mandatory steps)
|
|
77
|
+
|
|
78
|
+
Every architect-review runs all six steps:
|
|
79
|
+
|
|
80
|
+
```
|
|
81
|
+
1. Read the previous architect-review at docs/architecture/reviews/<latest>.md
|
|
82
|
+
to compare against (delta-driven; surface only changes since last review)
|
|
83
|
+
2. Explore the codebase — C4 Context + Container + Component diagrams
|
|
84
|
+
3. Apply comprehension lenses to organize findings — Ishikawa 6M categorization
|
|
85
|
+
4. Apply verification lenses — for every documented claim, verify it holds end-to-end
|
|
86
|
+
per the per-stack sibling
|
|
87
|
+
5. Apply Deming's Act phase — each finding either filed as ticket OR
|
|
88
|
+
closed in this PR OR explicitly deferred with rationale
|
|
89
|
+
6. Produce the report at docs/architecture/reviews/<YYYY-MM-DD>.md
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Step 4 is the mandatory verification step that bet 24c skipped. Implementation per the per-stack sibling.
|
|
93
|
+
|
|
94
|
+
## Per-stack sibling lookup
|
|
95
|
+
|
|
96
|
+
Adopters declare their stack in `.claude/bassclef-configs.jsonc`:
|
|
97
|
+
|
|
98
|
+
```jsonc
|
|
99
|
+
"tech_stack": {
|
|
100
|
+
"kind": "<substrate | nextjs | python | rails | go | none>",
|
|
101
|
+
"orm": "<prisma | sqlalchemy | alembic | active-record | gorm | none>",
|
|
102
|
+
"pkg_manager": "<npm | pnpm | yarn | pip | poetry | cargo | gem | go-mod | none>"
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Architect-review SKILL reads `tech_stack.kind` and loads the matching sibling:
|
|
107
|
+
|
|
108
|
+
| tech_stack.kind | Sibling path | What verification = |
|
|
109
|
+
|---|---|---|
|
|
110
|
+
| `substrate` | `standards/architect-review-discipline/substrate.md` | Run `/audit-rule-mechanism-fidelity`; check rule-mechanism-claim-fidelity per `standards/mechanism-fidelity.md`; verify cold-adopter harness check classes pass per `standards/cold-adopter-harness.md` |
|
|
111
|
+
| `nextjs` | `standards/architect-review-discipline/nextjs.md` *(future — file `/promote` per bassclef-upstream#418)* | Playwright + smoke coverage for every API route; characterization tests for every Server Action; load test for every public endpoint |
|
|
112
|
+
| `python` | `standards/architect-review-discipline/python.md` *(future)* | pytest integration coverage per module; contract tests for every public API; characterization tests around legacy modules |
|
|
113
|
+
| `rails` | `standards/architect-review-discipline/rails.md` *(future)* | RSpec request specs; system specs for critical flows; characterization tests for legacy controllers |
|
|
114
|
+
| `go` | `standards/architect-review-discipline/go.md` *(future)* | Table-driven tests; integration tests via httptest; fuzz tests for inputs |
|
|
115
|
+
| `none` or unset | universal framework only | Operator picks verification method per finding; framework's universal lenses + procedure still apply |
|
|
116
|
+
|
|
117
|
+
When the matching sibling does not exist, the universal procedure applies; verification step surfaces "no sibling for this stack" + cites bassclef-upstream#418 as the place to file `/promote` for sibling authoring.
|
|
118
|
+
|
|
119
|
+
## Path A pattern
|
|
120
|
+
|
|
121
|
+
This standard follows the per-stack sibling pattern established by:
|
|
122
|
+
|
|
123
|
+
- `standards/api-conventions/<stack>.md` (sister; api-conventions universal + per-stack)
|
|
124
|
+
- `standards/migration-discipline/<orm>.md` (sister; schema-management universal + per-orm)
|
|
125
|
+
- `standards/dependency-discipline/<pkg-manager>.md` (sister; new-dependency-check universal + per-pm)
|
|
126
|
+
|
|
127
|
+
The pattern was established under ARCH-T0 bassclef-upstream#1133 (stack-leakage audit) — universal framework lives in the parent rule + standard; stack-specific specifics live in siblings; loader reads `tech_stack` from configs.
|
|
128
|
+
|
|
129
|
+
## When the framework is invoked
|
|
130
|
+
|
|
131
|
+
The architect-review SKILL invokes this framework whenever `/architect-review` is invoked. Per memory + ADR convention, that is at least:
|
|
132
|
+
|
|
133
|
+
- Every 10 commits OR before any launch (per current SKILL description)
|
|
134
|
+
- After any substrate-evolution bet closeout (operator preference)
|
|
135
|
+
- After any P0 substrate-defect surfaces (defensive)
|
|
136
|
+
- Operator-invoked ad-hoc
|
|
137
|
+
|
|
138
|
+
## Output (every architect-review report)
|
|
139
|
+
|
|
140
|
+
The report at `docs/architecture/reviews/<YYYY-MM-DD>.md` includes:
|
|
141
|
+
|
|
142
|
+
```
|
|
143
|
+
## Lenses applied
|
|
144
|
+
- Comprehension: <list>
|
|
145
|
+
- Verification: <list>
|
|
146
|
+
|
|
147
|
+
## Findings (Ishikawa 6M categorized)
|
|
148
|
+
| Bone | Findings |
|
|
149
|
+
|---|---|
|
|
150
|
+
| Man | ... |
|
|
151
|
+
| Machine | ... |
|
|
152
|
+
| Method | ... |
|
|
153
|
+
| Material | ... |
|
|
154
|
+
| Measurement | ... |
|
|
155
|
+
| Mother Nature | ... |
|
|
156
|
+
|
|
157
|
+
## Verification per stack
|
|
158
|
+
Stack: <kind>
|
|
159
|
+
Sibling loaded: <path or "none — file /promote">
|
|
160
|
+
Verification results: <pass/fail per claim category>
|
|
161
|
+
|
|
162
|
+
## Act phase (Deming)
|
|
163
|
+
- Filed: <ticket numbers>
|
|
164
|
+
- Closed in this PR: <list>
|
|
165
|
+
- Explicitly deferred: <list with rationale>
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
Reports without the verification section are non-conformant — the framework refuses to consider an architect-review "complete" without it.
|
|
169
|
+
|
|
170
|
+
## Anti-patterns
|
|
171
|
+
|
|
172
|
+
### Run architect-review with comprehension lenses only
|
|
173
|
+
|
|
174
|
+
The bet 2026-06-24c failure mode. INSTEAD: include verification-side lenses + run the per-stack sibling's verification step. Framework refuses non-conforming reports.
|
|
175
|
+
|
|
176
|
+
### Hardcode bassclef-internal verification into the universal SKILL
|
|
177
|
+
|
|
178
|
+
Breaks adopter-safety (adopters running `/architect-review` on their app would hit substrate-specific paths). INSTEAD: substrate verification lives in `standards/architect-review-discipline/substrate.md`; SKILL references the sibling by `tech_stack.kind` lookup.
|
|
179
|
+
|
|
180
|
+
### Skip the verification step because no sibling exists for the adopter's stack
|
|
181
|
+
|
|
182
|
+
A missing sibling is a `/promote` opportunity, not an excuse. INSTEAD: surface "no sibling for `<stack>` — file `/promote` per bassclef-upstream#418" + apply universal framework's lens + procedure to whatever can be verified manually.
|
|
183
|
+
|
|
184
|
+
### Architect-review without comparing against the previous review
|
|
185
|
+
|
|
186
|
+
Drift goes uncaught when each review starts fresh. INSTEAD: step 1 mandates reading the prior review + surfacing the delta.
|
|
187
|
+
|
|
188
|
+
## Composes with
|
|
189
|
+
|
|
190
|
+
- `standards/mechanism-fidelity.md` — the audit method that the substrate sibling invokes
|
|
191
|
+
- `standards/cold-adopter-harness.md` — the harness extension that runs verification per PR
|
|
192
|
+
- `standards/hook-injection-discipline.md` + `standards/hook-install-class.md` — substrate verification covers hooks per these standards
|
|
193
|
+
- `.claude/skills/architect-review/SKILL.md` — the SKILL that composes this framework (WU-9.5 amends to call it)
|
|
194
|
+
- `.claude/rules/architect-review-discipline.md` (lands in WU-9.5) — the rule that enforces this framework
|
|
195
|
+
- `.claude/rules/bootstrap-pair-discipline.md` — paired ship discipline that verification verifies post-merge
|
|
196
|
+
- `.claude/rules/blocked-items.md` — findings file `/promote substrate-defect` per the protocol
|
|
197
|
+
|
|
198
|
+
## Refs
|
|
199
|
+
|
|
200
|
+
- ADR-035 — substrate-as-system tenet + hooks-as-steering-surfaces
|
|
201
|
+
- bassclef-upstream#417 — umbrella tracking for bet 2026-06-27c
|
|
202
|
+
- bassclef-upstream#418 — follow-on: per-stack siblings (Next.js, Python, Rails, Go) + adopter configs UI
|
|
203
|
+
- bassclef-upstream#320 — substrate-architect-review umbrella (bet 24c)
|
|
204
|
+
- bassclef-upstream#1133 — ARCH-T0 stack-leakage audit (Path A pattern established)
|
|
205
|
+
- bassclef-upstream#1127 — `tech_stack` vocabulary
|
|
206
|
+
- `architecture/audits/2026-06-24-closeout.md` — bet 24c closeout (the audit this framework retroactively learns from)
|
|
207
|
+
- `architecture/audits/2026-06-27-mechanism-fidelity.md` (lands in WU-6) — first substrate-sibling audit run
|
|
208
|
+
- `architecture/audits/2026-06-27-audit-method-blind-spot.md` (lands in WU-7.5) — recursive Ishikawa + Deming on bet 24c method
|
|
209
|
+
- @luminary michael-feathers — *Working Effectively with Legacy Code*: universal characterization-tests principle
|
|
210
|
+
- @luminary kent-beck — *Test-Driven Development By Example*: tests pin contracts
|
|
211
|
+
- @luminary w-edwards-deming — Plan-Do-Check-Act: comprehension + corrective action
|
|
212
|
+
- @luminary kaoru-ishikawa — fishbone: comprehension categorization
|
|
213
|
+
- @luminary saltzer-schroeder — complete mediation: verification empirically
|
|
214
|
+
- @luminary tony-hoare — pre/postcondition: contract holds against implementation
|
|
215
|
+
- @luminary hyrum-wright — observable behavior becomes contract for users / adopters
|
|
216
|
+
- @luminary linus-torvalds — we-don't-break-userspace: adopter contract
|
|
217
|
+
- @luminary frederick-brooks — conceptual integrity: system matches design
|
|
218
|
+
- @luminary john-ousterhout — deep modules: API matches internal complexity
|
|
219
|
+
|
|
220
|
+
## Retirement condition
|
|
221
|
+
|
|
222
|
+
This standard retires only if architect-review itself ceases to be a bassclef SKILL. The universal framework may evolve (new lenses surface; new verification mechanisms appear) but the two-method requirement (comprehension + verification) persists.
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
description: The agent-native platform-engineering primitive.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# bassclef-platform.yml — Org-Baseline Platform Manifest
|
|
7
|
+
|
|
8
|
+
The agent-native platform-engineering primitive. One flat YAML, in a
|
|
9
|
+
sibling repo, that names every org-level infrastructure assumption
|
|
10
|
+
bassclef's provisioning skills need at dispatch-time.
|
|
11
|
+
|
|
12
|
+
## Sources read
|
|
13
|
+
|
|
14
|
+
- `strategy/canvases/2026-05-03-bassclef-platform-primitive.md` — Stage 2 PR/FAQ + Stage 3 Phase 1 acceptance criteria
|
|
15
|
+
- `docs/iteration-bets/2026-05-04-bassclef-platform-foundation.md` — bet that ships this primitive
|
|
16
|
+
- `standards/state-spine/schemas/bassclef-platform.schema.json` — the SHAPE contract this standard documents semantics for
|
|
17
|
+
- `standards/state-spine.md` — Shape D entity placement (added bassclef#462)
|
|
18
|
+
- `standards/substrate-config-schema.md` — sibling per-repo concern; this is the org-baseline concern
|
|
19
|
+
- `architecture/decisions/ADR-008-full-typescript-stack.md` — `stack.default_*` references this
|
|
20
|
+
- `architecture/decisions/ADR-009-deploy-and-operations.md` — `deploy_tiers.*` references this
|
|
21
|
+
- `standards/domain-and-dns.md` — `dns.*` field semantics
|
|
22
|
+
|
|
23
|
+
## What I'm NOT reading (with reason)
|
|
24
|
+
|
|
25
|
+
- Backstage source code or plugin docs — this standard references Backstage for positioning only, not for technical adaptation
|
|
26
|
+
- Pulumi / Terraform / OpenTofu docs — sibling IaC tools; bassclef-platform.yml is declarative-READ, not declarative-IaC; orthogonal concerns
|
|
27
|
+
|
|
28
|
+
## Why this exists — the agent-native equivalent of Backstage
|
|
29
|
+
|
|
30
|
+
Backstage gave developers a service-catalog portal: a Node app + database +
|
|
31
|
+
plugins, days-to-weeks to deploy, that lets engineers find services, run
|
|
32
|
+
templates, and read system metadata. It works because *developers read
|
|
33
|
+
the portal*.
|
|
34
|
+
|
|
35
|
+
Agentic SDLC has a different problem. **Agents don't read portals.** Agents
|
|
36
|
+
read files. When a bassclef provisioning skill (`/provision-deploy-host`,
|
|
37
|
+
`/secrets-bootstrap`, `/scaffold-stack`) needs to know "what's our AWS
|
|
38
|
+
account, what's our DNS zone, which platform do we deploy prototypes to" —
|
|
39
|
+
it needs that information in a flat file at dispatch-time, not behind a
|
|
40
|
+
REST endpoint behind an auth-handshake behind a portal-deployment.
|
|
41
|
+
|
|
42
|
+
`bassclef-platform.yml` is that file. One YAML. Sibling repo. Edit and go.
|
|
43
|
+
|
|
44
|
+
| Primitive | Format | Setup cost | Agent-native? | Market position |
|
|
45
|
+
|-----------|--------|-----------|---------------|-----------------|
|
|
46
|
+
| Backstage `catalog-info.yaml` + portal | YAML + Node + DB + plugins | days-to-weeks | needs adapter | dominant for IDP, but heavyweight |
|
|
47
|
+
| Pulumi stack config | TS/HCL + runtime | Pulumi installed everywhere | no — IaC-native | strong for IaC; orthogonal to "agent-discovery" |
|
|
48
|
+
| Terraform `workspace.yaml` | HCL + Terraform Cloud | Terraform install + state mgmt | no — IaC-native | dominant IaC; orthogonal |
|
|
49
|
+
| **bassclef-platform.yml** | **flat YAML** | **`touch` + edit** | **yes — agent-first** | **uncontested for agent-native IDP** |
|
|
50
|
+
|
|
51
|
+
Position bassclef's substrate when pitching to PE / boards / CIOs:
|
|
52
|
+
|
|
53
|
+
> bassclef is the agent-native equivalent of Backstage for organizations
|
|
54
|
+
> adopting agentic SDLC. Same primitives — service catalog, infrastructure
|
|
55
|
+
> declarations, policy-as-data — but consumed by AGENTS at dispatch-time
|
|
56
|
+
> rather than developers at portal-time. Result: provisioning that's
|
|
57
|
+
> normally days of clickops or hours of Terraform becomes one dispatch
|
|
58
|
+
> plus one PR merge.
|
|
59
|
+
|
|
60
|
+
## Where the file lives
|
|
61
|
+
|
|
62
|
+
**Sibling repo, not bassclef.** Default convention:
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
~/src/<github_org>/platform-config/bassclef-platform.yml
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
For sunj-labs, the resolved path is:
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
~/src/sunj-labs/platform-config/bassclef-platform.yml
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Why a sibling repo, not bassclef's repo:
|
|
75
|
+
|
|
76
|
+
1. **Adopters fork platform-config without forking bassclef.** A CIO
|
|
77
|
+
evaluating bassclef for their org doesn't fork the methodology repo;
|
|
78
|
+
they fork the platform-config repo, edit values, point their consumer
|
|
79
|
+
repos' `.bassclef-source.json` at upstream bassclef. Bassclef stays
|
|
80
|
+
one upstream; platform-config is per-tenant.
|
|
81
|
+
2. **Multi-tenant capable from V1.** A 4-BU enterprise checks out 4
|
|
82
|
+
platform-config repos, points each consumer repo's thin-pointer at
|
|
83
|
+
the right one. Single-tenant deployed in V1; multi-tenant is just
|
|
84
|
+
"more sibling repos" — no schema change.
|
|
85
|
+
3. **Org-level facts don't belong in methodology.** Bassclef is the
|
|
86
|
+
rulebook; platform-config is the runtime configuration. Different
|
|
87
|
+
change cadences, different review surfaces, different audit trails.
|
|
88
|
+
|
|
89
|
+
## Resolution order
|
|
90
|
+
|
|
91
|
+
`state_platform_get` resolves the file path in this order:
|
|
92
|
+
|
|
93
|
+
1. **`BASSCLEF_PLATFORM_CONFIG_PATH` env var** — explicit override. Used
|
|
94
|
+
by tests and unusual deployment topologies.
|
|
95
|
+
2. **`~/src/<github_org>/platform-config/bassclef-platform.yml`** — the
|
|
96
|
+
default convention. `<github_org>` resolves from substrate.config.md
|
|
97
|
+
or, in V1, hardcodes to `sunj-labs`. (V2 reads it from the consumer
|
|
98
|
+
repo's substrate.config.md `github_org` field.)
|
|
99
|
+
3. **Thin-pointer field `platform_config_source` in `.bassclef-source.json`** —
|
|
100
|
+
V2 extension. When bassclef-sync ships the field, consumer repos
|
|
101
|
+
declare which platform-config repo to consume; resolution chases the
|
|
102
|
+
declared path. Until V2: option 2 is the only fallback.
|
|
103
|
+
|
|
104
|
+
## What lives in this file vs. substrate.config.md
|
|
105
|
+
|
|
106
|
+
| Concern | Where |
|
|
107
|
+
|---------|-------|
|
|
108
|
+
| Org name, GitHub org, AWS account ID | bassclef-platform.yml (org-baseline) |
|
|
109
|
+
| Default DNS zone, DNS provider, token env-var name | bassclef-platform.yml |
|
|
110
|
+
| Default stack (frontend / backend / db) | bassclef-platform.yml |
|
|
111
|
+
| Per-tier deploy-host defaults (prototype / production) | bassclef-platform.yml |
|
|
112
|
+
| Provisioning behavior switches (CLI vs console-pivot) | bassclef-platform.yml |
|
|
113
|
+
| Secrets storage type default (env / 1password / vault) | bassclef-platform.yml |
|
|
114
|
+
| Audit-trail policy | bassclef-platform.yml |
|
|
115
|
+
| **THIS REPO**'s deploy URL, app ID, branch | substrate.config.md (per-repo) |
|
|
116
|
+
| **THIS REPO**'s subdomain | substrate.config.md |
|
|
117
|
+
| **THIS REPO**'s environment-specific overrides | substrate.config.md |
|
|
118
|
+
|
|
119
|
+
The line: **anything sunj-labs configures once across all repos** lives
|
|
120
|
+
in bassclef-platform.yml. **Anything that varies per repo** lives in that
|
|
121
|
+
repo's substrate.config.md.
|
|
122
|
+
|
|
123
|
+
If a field needs to vary per repo, it's a substrate.config.md field, not
|
|
124
|
+
a bassclef-platform.yml field. The schema enforces this division.
|
|
125
|
+
|
|
126
|
+
## Provider adapter pattern
|
|
127
|
+
|
|
128
|
+
`hosting_platform` is a discriminator enum. Provider-specific subfields
|
|
129
|
+
live under namespaced top-level keys (`amplify.*`, `vercel.*`,
|
|
130
|
+
`ec2_tailscale.*`).
|
|
131
|
+
|
|
132
|
+
Provisioning skills dispatch through an adapter:
|
|
133
|
+
|
|
134
|
+
```
|
|
135
|
+
/provision-deploy-host reads bassclef-platform.yml deploy_tiers.<tier>.hosting_platform
|
|
136
|
+
→ "amplify" → loads amplify adapter, reads top-level amplify.* fields
|
|
137
|
+
→ "vercel" → loads vercel adapter, reads top-level vercel.* fields
|
|
138
|
+
→ "ec2-tailscale" → loads ec2 adapter, reads top-level ec2_tailscale.* fields
|
|
139
|
+
→ "none" → no-op (docs-only repos)
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
Same shape as `/bind-subdomain`'s DNS-provider adapter pattern. The first
|
|
143
|
+
time a consumer needs Vercel, it's an adapter file added under
|
|
144
|
+
`scripts/adapters/`, not a schema rewrite.
|
|
145
|
+
|
|
146
|
+
## Per-tier deploy-host split
|
|
147
|
+
|
|
148
|
+
`deploy_tiers.prototype` and `deploy_tiers.production` are independent.
|
|
149
|
+
Different provider, different region, different config.
|
|
150
|
+
|
|
151
|
+
This resolves the POA gotcha (POA's existing `ec2-tailscale` production
|
|
152
|
+
deploy must coexist with `amplify` prototype hosting). Without the split,
|
|
153
|
+
bassclef-platform.yml could only carry one `hosting_platform` per org —
|
|
154
|
+
which would force POA to either give up production-on-ec2 or give up
|
|
155
|
+
prototypes-on-amplify. The split says "both, indexed by tier."
|
|
156
|
+
|
|
157
|
+
## Secrets storage type
|
|
158
|
+
|
|
159
|
+
`secrets.storage_default` is a discriminator. Per-secret entries in
|
|
160
|
+
`substrate.secrets.md` may override.
|
|
161
|
+
|
|
162
|
+
V1 ships the `env` adapter only — secrets live in
|
|
163
|
+
`~/.config/bassclef/secrets.env` (XDG-conformant), sourced by `.zshrc`.
|
|
164
|
+
|
|
165
|
+
V2 stubs:
|
|
166
|
+
- `1password` — `op read op://<vault>/<item>/<field>`
|
|
167
|
+
- `aws-sm` — `aws secretsmanager get-secret-value`
|
|
168
|
+
- `vault` — `vault kv get`
|
|
169
|
+
|
|
170
|
+
Each adapter is a script under `scripts/secrets-adapters/` — same shape
|
|
171
|
+
as the DNS-provider adapters. Schema is unchanged when V2 lands; only
|
|
172
|
+
adapter scripts ship.
|
|
173
|
+
|
|
174
|
+
## Audit-trail primitive
|
|
175
|
+
|
|
176
|
+
`audit.enabled = true` (default) makes every `/provision-*` skill write
|
|
177
|
+
a row to `state/audit/<utc>-<skill>-<short-hash>.json` per dispatch.
|
|
178
|
+
|
|
179
|
+
Each row captures:
|
|
180
|
+
- env vars consulted (names only, never values)
|
|
181
|
+
- API calls made (method + endpoint + status, never body if it contains secrets)
|
|
182
|
+
- ARNs / IDs created
|
|
183
|
+
- Operator dispatch context (session id, branch, intent string)
|
|
184
|
+
|
|
185
|
+
CIO evaluations ask "what did the agent do, on what authority, with what
|
|
186
|
+
credentials" in week 1. This primitive answers that without retrofit.
|
|
187
|
+
|
|
188
|
+
`audit.retention_days = 365` (default) — adopters tighten or loosen per
|
|
189
|
+
compliance regime.
|
|
190
|
+
|
|
191
|
+
## Validation
|
|
192
|
+
|
|
193
|
+
Schema: `standards/state-spine/schemas/bassclef-platform.schema.json` —
|
|
194
|
+
JSON Schema draft-2020-12.
|
|
195
|
+
|
|
196
|
+
`state-validate.sh` PreToolUse hook validates on Edit/Write. Pattern:
|
|
197
|
+
`*/bassclef-platform.yml` triggers entity detection.
|
|
198
|
+
|
|
199
|
+
Required fields (the minimum for a bassclef-platform.yml to be
|
|
200
|
+
considered onboard-able):
|
|
201
|
+
|
|
202
|
+
- `org.name`
|
|
203
|
+
- `org.github_org`
|
|
204
|
+
- `dns.primary_zone`
|
|
205
|
+
|
|
206
|
+
Everything else has documented defaults. The schema's `additionalProperties: true`
|
|
207
|
+
on the root means orgs can extend the schema without it rejecting their
|
|
208
|
+
edits — but the documented fields are what bassclef's skills consume.
|
|
209
|
+
|
|
210
|
+
## Schema versioning
|
|
211
|
+
|
|
212
|
+
`schema_version: v0` — documentary; required-field set is loose.
|
|
213
|
+
|
|
214
|
+
`v1` will tighten property typing once empirical adoption surfaces real
|
|
215
|
+
divergence between sunj-labs's shape and the next adopter's shape.
|
|
216
|
+
Migration path: same as bassclef's other schemas — paired PR amends
|
|
217
|
+
schema + bumps `schema_version` field; old files migrate via a one-shot
|
|
218
|
+
script.
|
|
219
|
+
|
|
220
|
+
## /scaffold-platform-yml mini-skill (Phase 2 follow-on)
|
|
221
|
+
|
|
222
|
+
When bassclef#462 closes, the operator runs `/scaffold-platform-yml`
|
|
223
|
+
once to backfill values from existing AWS + GitHub state via API
|
|
224
|
+
probes:
|
|
225
|
+
|
|
226
|
+
- `aws sts get-caller-identity` → `org.aws_account_id`
|
|
227
|
+
- `gh api /user/installations` → `provisioning.github_app_installation_id`
|
|
228
|
+
- `aws iam list-roles` (filter `amplify`) → `amplify.service_role_arn`
|
|
229
|
+
- `aws amplify list-apps` (per region) → `amplify.default_region`
|
|
230
|
+
|
|
231
|
+
Skill ships in bassclef#462 sub-goal 1.1 of the platform foundation bet
|
|
232
|
+
(deferred follow-on; not critical-path for V1). Operator-edit is the
|
|
233
|
+
fallback for fields the API can't probe.
|
|
234
|
+
|
|
235
|
+
## Relationship to other standards
|
|
236
|
+
|
|
237
|
+
- `standards/substrate-config-schema.md` — sibling per-repo concern
|
|
238
|
+
- `standards/secrets-lifecycle.md` — per-secret rotation tracking; storage_default discriminator added by bassclef#461
|
|
239
|
+
- `standards/state-spine.md` — Shape D placement
|
|
240
|
+
- `standards/state-spine-contract.md` — `state_platform_get` accessor surface
|
|
241
|
+
- `standards/domain-and-dns.md` — DNS conventions referenced by `dns.*`
|
|
242
|
+
- ADR-008 (TypeScript stack) — `stack.default_*` references this
|
|
243
|
+
- ADR-009 (deploy operations) — `deploy_tiers.*` references this
|
|
244
|
+
|
|
245
|
+
## Enforcement
|
|
246
|
+
|
|
247
|
+
- **Hook**: `state-validate.sh` validates on Edit/Write to `*/bassclef-platform.yml`
|
|
248
|
+
- **Methodology**: this standard loads via bassclef-sync; all consumer repos read it
|
|
249
|
+
- **Test coverage**: `.claude/hooks/tests/state-validate.test.sh` (bassclef-platform Shape D cases added in bassclef#462)
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
description: "Two dedicated repos exist as bassclef's validation surface — separate from operator product work (POA, TwoDo, Ops, Pruneguice, Quorum)."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Bassclef Test Repos
|
|
7
|
+
|
|
8
|
+
Two dedicated repos exist as bassclef's validation surface — separate from operator product work (POA, TwoDo, Ops, Pruneguice, Quorum).
|
|
9
|
+
|
|
10
|
+
This is the pattern bassclef uses to validate substrate changes without polluting the repos where real product work happens. Surfaced 2026-05-11 during the TwoDo cross-repo execution boundary discussion (bassclef#639); test ground established 2026-05-12 (bassclef#642).
|
|
11
|
+
|
|
12
|
+
## The two test repos
|
|
13
|
+
|
|
14
|
+
### `sunj-labs/dokuwiki-bassclef-test` — brownfield validation target
|
|
15
|
+
|
|
16
|
+
**Source**: fork of `dokuwiki/dokuwiki` (open-source PHP wiki, flat-file storage, no DB)
|
|
17
|
+
|
|
18
|
+
**Why DokuWiki**:
|
|
19
|
+
- Already on GitHub (direct `gh repo fork` works)
|
|
20
|
+
- PHP/flat-file stack ≠ bassclef's TypeScript default — exercises vendor-bindings coverage on a different stack
|
|
21
|
+
- Mature codebase representative of real brownfield-adoption shapes
|
|
22
|
+
- GPL-2.0 license; fork is welcome with attribution preserved
|
|
23
|
+
- Smaller than alternatives (BookStack/MediaWiki) — faster validation cycles
|
|
24
|
+
|
|
25
|
+
**Visibility**: PUBLIC (inherited from upstream)
|
|
26
|
+
|
|
27
|
+
**What bassclef tests against it**:
|
|
28
|
+
- Retroactive adoption — adding bassclef-sync + rules + hooks to an EXISTING codebase that didn't start with bassclef conventions
|
|
29
|
+
- Vendor-bindings (PHP/no-DB stack vs bassclef's TypeScript default)
|
|
30
|
+
- Brownfield file-structure migration questions (where do bassclef artifacts land in a non-bassclef layout?)
|
|
31
|
+
|
|
32
|
+
### `sunj-labs/foobar` — minimal greenfield consumer
|
|
33
|
+
|
|
34
|
+
**Source**: created empty via `gh repo create`
|
|
35
|
+
|
|
36
|
+
**Why "foobar"**:
|
|
37
|
+
- Placeholder by design. Not a product. Not a demo target. Just a thing that adopts bassclef via bassclef-sync.
|
|
38
|
+
|
|
39
|
+
**Visibility**: PRIVATE
|
|
40
|
+
|
|
41
|
+
**What bassclef tests against it**:
|
|
42
|
+
- Greenfield adoption — bassclef conventions from day zero
|
|
43
|
+
- Minimal-app smoke validation — bassclef-sync runs cleanly on a fresh Next.js skeleton
|
|
44
|
+
- Future substrate changes — first integration test target
|
|
45
|
+
|
|
46
|
+
**What foobar is NOT**:
|
|
47
|
+
- NOT a product. No domain model, no auth, no features beyond "Next.js skeleton + bassclef adoption."
|
|
48
|
+
- NOT the Hey-Alexa demo target (Phase V). The demo creates whatever Alex speaks into existence at runtime; it's a separate concern.
|
|
49
|
+
- NOT a long-term bassclef product. If bassclef eventually wants its own product surface, that's separate scope.
|
|
50
|
+
|
|
51
|
+
## How they fit bassclef's interaction model (ADR-018)
|
|
52
|
+
|
|
53
|
+
Both repos are **Consumer** objects per the runtime-interaction model. They consume bassclef's substrate via bassclef-sync, same as POA/TwoDo/Ops/Pruneguice/Quorum.
|
|
54
|
+
|
|
55
|
+
The distinction:
|
|
56
|
+
- **Operator product consumers** — POA, TwoDo, Ops, Pruneguice, Quorum. Real product work. Bassclef-session writes to these repos = bassclef#639 boundary violation.
|
|
57
|
+
- **Bassclef test consumers** — dokuwiki-bassclef-test, foobar. Designed-as-test-ground. Bassclef-session-driven git operations (clone + edit + push) are the EXPECTED use case.
|
|
58
|
+
|
|
59
|
+
Per bassclef#639's stated principle: "bassclef session must NOT execute hooks or scripts on consumer-repo filesystems." Standard git operations on cloned test repos don't trigger this — no consumer-side hook execution involved.
|
|
60
|
+
|
|
61
|
+
If future ambiguity surfaces, file substrate-defect to clarify the boundary.
|
|
62
|
+
|
|
63
|
+
## Validation cadence
|
|
64
|
+
|
|
65
|
+
Test repos receive bassclef-sync runs at any time. Recommended:
|
|
66
|
+
- After substantive bassclef-sync template changes
|
|
67
|
+
- Before opening bassclef to new adopters (bassclef#637 readiness audit)
|
|
68
|
+
- When vendor-bindings catalog (bassclef#629) ships new abstractions
|
|
69
|
+
|
|
70
|
+
Test results land in `docs/sibling-validations/YYYY-MM-DD-<test-repo>-<concern>.md`.
|
|
71
|
+
|
|
72
|
+
## Distinct from
|
|
73
|
+
|
|
74
|
+
- `standards/vendor-plugins/` — third-party skills bassclef adopts (e.g., Anthropic community skills). Not test repos.
|
|
75
|
+
- `standards/bassclef-platform.md` — org-level infra surface. Not test repos.
|
|
76
|
+
- `standards/vendor-bindings.md` — external-service binding catalog. Test repos exercise the catalog; they don't define it.
|
|
77
|
+
|
|
78
|
+
## When to retire / replace
|
|
79
|
+
|
|
80
|
+
This standard retires if:
|
|
81
|
+
- DokuWiki upstream becomes inactive + we need a new brownfield target
|
|
82
|
+
- foobar gets product features (at which point it's no longer a test consumer)
|
|
83
|
+
- bassclef evolves a different test-ground pattern (e.g., ephemeral test consumers, sandboxed runs)
|
|
84
|
+
|
|
85
|
+
Until then, both repos stay live + receive periodic bassclef-sync runs as validation surface.
|
|
86
|
+
|
|
87
|
+
## Sources read
|
|
88
|
+
|
|
89
|
+
- bassclef#642 (test-repos parent ticket)
|
|
90
|
+
- bassclef#639 (cross-repo execution boundary; this standard names the legitimate exception)
|
|
91
|
+
- `architecture/decisions/ADR-018-bassclef-interaction-model.md` (Consumer object definition)
|
|
92
|
+
- `docs/iteration-bets/2026-05-12-test-repos-dokuwiki-foobar.md` (active bet)
|
|
93
|
+
- `docs/stacks/2026-05-12-test-repos-dokuwiki-foobar.md` (active manifest)
|
|
94
|
+
|
|
95
|
+
## Closes
|
|
96
|
+
|
|
97
|
+
bassclef#642 WU-1. WU-3 + WU-5 follow with bassclef-adoption on each repo.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"tier": "standard",
|
|
3
3
|
"$id": "https://bassclef.sunj-labs/bassclef-wiring-manifest/v1",
|
|
4
4
|
"$schema": "https://bassclef.sunj-labs/state-spine/v0/schemas/bassclef-wiring-manifest.schema.json",
|
|
5
|
-
"version": "2.
|
|
5
|
+
"version": "2.1.0",
|
|
6
6
|
"hooks": {
|
|
7
7
|
"SessionStart": [
|
|
8
8
|
{
|
|
@@ -159,6 +159,12 @@
|
|
|
159
159
|
"command": "$CLAUDE_PROJECT_DIR/.claude/hooks/pre-gh-release-body-scrub.sh",
|
|
160
160
|
"timeout": 5,
|
|
161
161
|
"tier": "standard"
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
"type": "command",
|
|
165
|
+
"command": "$CLAUDE_PROJECT_DIR/.claude/hooks/pre-commit-identifier-leak-scrub.sh",
|
|
166
|
+
"timeout": 10,
|
|
167
|
+
"tier": "lite"
|
|
162
168
|
}
|
|
163
169
|
]
|
|
164
170
|
},
|
|
@@ -290,6 +296,12 @@
|
|
|
290
296
|
"command": "$CLAUDE_PROJECT_DIR/.claude/hooks/vocabulary-migration-check.sh",
|
|
291
297
|
"timeout": 10,
|
|
292
298
|
"tier": "lite"
|
|
299
|
+
},
|
|
300
|
+
{
|
|
301
|
+
"type": "command",
|
|
302
|
+
"command": "$CLAUDE_PROJECT_DIR/.claude/hooks/persona-name-scrub-check.sh",
|
|
303
|
+
"timeout": 10,
|
|
304
|
+
"tier": "lite"
|
|
293
305
|
}
|
|
294
306
|
]
|
|
295
307
|
}
|
|
@@ -397,6 +409,18 @@
|
|
|
397
409
|
"command": "$CLAUDE_PROJECT_DIR/.claude/hooks/stop-assertion-shape-scan.sh",
|
|
398
410
|
"timeout": 10,
|
|
399
411
|
"tier": "standard"
|
|
412
|
+
},
|
|
413
|
+
{
|
|
414
|
+
"type": "command",
|
|
415
|
+
"command": "$CLAUDE_PROJECT_DIR/.claude/hooks/longrun-prep-render-check.sh",
|
|
416
|
+
"timeout": 10,
|
|
417
|
+
"tier": "lite"
|
|
418
|
+
},
|
|
419
|
+
{
|
|
420
|
+
"type": "command",
|
|
421
|
+
"command": "$CLAUDE_PROJECT_DIR/.claude/hooks/skill-step-list-check.sh",
|
|
422
|
+
"timeout": 10,
|
|
423
|
+
"tier": "lite"
|
|
400
424
|
}
|
|
401
425
|
]
|
|
402
426
|
}
|