@thebassclef/lite 0.0.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +85 -4
- package/dist/cli.cjs +1612 -0
- package/dist/cli.js +1589 -0
- package/dist/index.cjs +4 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +4 -0
- package/package.json +51 -3
- package/substrate/.bassclef/lite-manifest.json +2701 -0
- package/substrate/.claude/agents/architect.md +70 -0
- package/substrate/.claude/agents/builder.md +114 -0
- package/substrate/.claude/agents/designer.md +156 -0
- package/substrate/.claude/agents/reviewer.md +88 -0
- package/substrate/.claude/hooks/artifact-ingestion-gate.sh +357 -0
- package/substrate/.claude/hooks/assert-verify-steering.sh +77 -0
- package/substrate/.claude/hooks/bassclef-source-config-validate.sh +215 -0
- package/substrate/.claude/hooks/bassclef-sync.sh +634 -0
- package/substrate/.claude/hooks/compound-noun-scrub.sh +292 -0
- package/substrate/.claude/hooks/kiss-expansion-inject.sh +69 -0
- package/substrate/.claude/hooks/longrun-prep-compounding-axis-check.sh +492 -0
- package/substrate/.claude/hooks/longrun-prep-compounding-sequence-check.sh +492 -0
- package/substrate/.claude/hooks/plain-english-steering.sh +156 -0
- package/substrate/.claude/hooks/post-skill-friction-check.sh +177 -0
- package/substrate/.claude/hooks/post-skill-telemetry.sh +62 -0
- package/substrate/.claude/hooks/pre-build-gate.sh +511 -0
- package/substrate/.claude/hooks/pre-commit-gate.sh +451 -0
- package/substrate/.claude/hooks/session-end.sh +433 -0
- package/substrate/.claude/hooks/session-reflection.sh +303 -0
- package/substrate/.claude/hooks/skill-body-grade-gate.sh +219 -0
- package/substrate/.claude/hooks/skill-body-intent-drift.sh +107 -0
- package/substrate/.claude/hooks/skill-step-list-check.sh +171 -0
- package/substrate/.claude/hooks/state-validate.sh +271 -0
- package/substrate/.claude/hooks/substrate-clarity-gate.sh +1110 -0
- package/substrate/.claude/hooks/temperance-gate.sh +147 -0
- package/substrate/.claude/hooks/testing-tier-enforce.sh +233 -0
- package/substrate/.claude/hooks/turn-prose-grade-measure.sh +219 -0
- package/substrate/.claude/hooks/turn-prose-kiss-check.sh +463 -0
- package/substrate/.claude/hooks/vocabulary-migration-check.sh +171 -0
- package/substrate/.claude/hooks/whereami-utc-gate.sh +142 -0
- package/substrate/.claude/luminaries/alan-cooper.md +170 -0
- package/substrate/.claude/luminaries/alistair-cockburn.md +140 -0
- package/substrate/.claude/luminaries/amazon-pr-faq.md +34 -0
- package/substrate/.claude/luminaries/ash-maurya.md +121 -0
- package/substrate/.claude/luminaries/bill-buxton.md +210 -0
- package/substrate/.claude/luminaries/charles-sanders-peirce.md +150 -0
- package/substrate/.claude/luminaries/david-ogilvy.md +192 -0
- package/substrate/.claude/luminaries/don-norman.md +173 -0
- package/substrate/.claude/luminaries/edward-tufte.md +179 -0
- package/substrate/.claude/luminaries/eric-evans.md +160 -0
- package/substrate/.claude/luminaries/frederick-brooks.md +50 -0
- package/substrate/.claude/luminaries/gang-of-four.md +157 -0
- package/substrate/.claude/luminaries/glenford-myers.md +230 -0
- package/substrate/.claude/luminaries/hunt-thomas.md +115 -0
- package/substrate/.claude/luminaries/hyrum-wright.md +94 -0
- package/substrate/.claude/luminaries/jason-fried-dhh.md +46 -0
- package/substrate/.claude/luminaries/jesse-james-garrett.md +154 -0
- package/substrate/.claude/luminaries/john-ousterhout.md +94 -0
- package/substrate/.claude/luminaries/karl-popper.md +132 -0
- package/substrate/.claude/luminaries/kent-beck.md +168 -0
- package/substrate/.claude/luminaries/linus-torvalds.md +218 -0
- package/substrate/.claude/luminaries/martin-fowler.md +164 -0
- package/substrate/.claude/luminaries/michael-feathers.md +125 -0
- package/substrate/.claude/luminaries/michael-nygard.md +118 -0
- package/substrate/.claude/luminaries/robert-c-martin.md +164 -0
- package/substrate/.claude/luminaries/saltzer-schroeder.md +194 -0
- package/substrate/.claude/luminaries/sophia-prater.md +193 -0
- package/substrate/.claude/luminaries/stephen-toulmin.md +131 -0
- package/substrate/.claude/luminaries/tony-hoare.md +170 -0
- package/substrate/.claude/luminaries/vaughn-vernon.md +50 -0
- package/substrate/.claude/luminaries/w-edwards-deming.md +158 -0
- package/substrate/.claude/rules/accessor-library-discipline.md +138 -0
- package/substrate/.claude/rules/adr-discipline.md +120 -0
- package/substrate/.claude/rules/api-conventions.md +125 -0
- package/substrate/.claude/rules/artifact-ingestion.md +179 -0
- package/substrate/.claude/rules/assert-only-after-verify.md +137 -0
- package/substrate/.claude/rules/blocked-items.md +146 -0
- package/substrate/.claude/rules/bootstrap-pair-discipline.md +141 -0
- package/substrate/.claude/rules/branching.md +28 -0
- package/substrate/.claude/rules/cold-adopter-harness-discipline.md +129 -0
- package/substrate/.claude/rules/commit-conventions.md +22 -0
- package/substrate/.claude/rules/compounding-axis-fresh-analysis.md +188 -0
- package/substrate/.claude/rules/compounding-sequence-fresh-analysis.md +188 -0
- package/substrate/.claude/rules/context-engineering.md +202 -0
- package/substrate/.claude/rules/context-management.md +85 -0
- package/substrate/.claude/rules/defensive-bash.md +68 -0
- package/substrate/.claude/rules/deferred-actions.md +233 -0
- package/substrate/.claude/rules/destructive-operations.md +69 -0
- package/substrate/.claude/rules/diagnosis.md +38 -0
- package/substrate/.claude/rules/github-issue-flash-tweet.md +156 -0
- package/substrate/.claude/rules/guardrails.md +73 -0
- package/substrate/.claude/rules/hook-wire-on-author.md +103 -0
- package/substrate/.claude/rules/identifier-leak-prevention.md +104 -0
- package/substrate/.claude/rules/iteration-bet-brief-completeness.md +54 -0
- package/substrate/.claude/rules/lite-manifest-schema-change-discipline.md +98 -0
- package/substrate/.claude/rules/longrun-prep-plan-doc-compression.md +89 -0
- package/substrate/.claude/rules/loop-discipline.md +81 -0
- package/substrate/.claude/rules/manual-prod-approval.md +100 -0
- package/substrate/.claude/rules/marker-enrichment-discipline.md +99 -0
- package/substrate/.claude/rules/mobile-ephemeral-session.md +109 -0
- package/substrate/.claude/rules/new-dependency-check.md +51 -0
- package/substrate/.claude/rules/oo-ad-entry-point.md +117 -0
- package/substrate/.claude/rules/operator-facing-prose.md +196 -0
- package/substrate/.claude/rules/option-label-discipline.md +108 -0
- package/substrate/.claude/rules/pattern-annotation.md +100 -0
- package/substrate/.claude/rules/plain-english-discipline.md +156 -0
- package/substrate/.claude/rules/plan-enumeration-needs-value-props.md +211 -0
- package/substrate/.claude/rules/pr-body-shape.md +317 -0
- package/substrate/.claude/rules/pr-strategy.md +167 -0
- package/substrate/.claude/rules/pr-title-shape.md +161 -0
- package/substrate/.claude/rules/prototype-workflow.md +65 -0
- package/substrate/.claude/rules/reserved-skill-names.md +123 -0
- package/substrate/.claude/rules/schema-management.md +49 -0
- package/substrate/.claude/rules/sdlc-gates.md +149 -0
- package/substrate/.claude/rules/security.md +37 -0
- package/substrate/.claude/rules/session-artifacts.md +236 -0
- package/substrate/.claude/rules/skill-composition-declarations.md +124 -0
- package/substrate/.claude/rules/skill-description-clarity.md +247 -0
- package/substrate/.claude/rules/skill-procedure-step-list.md +137 -0
- package/substrate/.claude/rules/state-schema-validation.md +162 -0
- package/substrate/.claude/rules/stuck-signal-diagnostic.md +140 -0
- package/substrate/.claude/rules/substrate-config-schema.md +98 -0
- package/substrate/.claude/rules/test-list-discipline.md +175 -0
- package/substrate/.claude/rules/test-sufficiency.md +210 -0
- package/substrate/.claude/rules/testing-tier-config.md +145 -0
- package/substrate/.claude/rules/testing.md +38 -0
- package/substrate/.claude/rules/turn-estimate-grounding.md +134 -0
- package/substrate/.claude/rules/visual-hierarchy.md +437 -0
- package/substrate/.claude/rules/we-dont-break-adopters.md +126 -0
- package/substrate/.claude/rules/whereami-load-bearing.md +202 -0
- package/substrate/.claude/rules/writing-craft-discipline.md +92 -0
- package/substrate/.claude/rules/wu-sequencing-compounds.md +145 -0
- package/substrate/.claude/skills/build/SKILL.md +640 -0
- package/substrate/.claude/skills/chronicle/SKILL.md +55 -0
- package/substrate/.claude/skills/clean-artifacts/SKILL.md +249 -0
- package/substrate/.claude/skills/decompose/SKILL.md +280 -0
- package/substrate/.claude/skills/diagnose/SKILL.md +297 -0
- package/substrate/.claude/skills/feynman/SKILL.md +90 -0
- package/substrate/.claude/skills/howdoi/SKILL.md +105 -0
- package/substrate/.claude/skills/ia-model/SKILL.md +108 -0
- package/substrate/.claude/skills/interaction-design/SKILL.md +112 -0
- package/substrate/.claude/skills/interpret-input/SKILL.md +180 -0
- package/substrate/.claude/skills/journal/SKILL.md +209 -0
- package/substrate/.claude/skills/kiss/SKILL.md +449 -0
- package/substrate/.claude/skills/launch/SKILL.md +915 -0
- package/substrate/.claude/skills/lean-canvas/SKILL.md +332 -0
- package/substrate/.claude/skills/longrun/SKILL.md +463 -0
- package/substrate/.claude/skills/luminary/SKILL.md +481 -0
- package/substrate/.claude/skills/ogilvy-writing-audit/SKILL.md +177 -0
- package/substrate/.claude/skills/onboard-repo/SKILL.md +1624 -0
- package/substrate/.claude/skills/pattern-review/SKILL.md +99 -0
- package/substrate/.claude/skills/personas/SKILL.md +207 -0
- package/substrate/.claude/skills/promote/SKILL.md +283 -0
- package/substrate/.claude/skills/requirement/SKILL.md +98 -0
- package/substrate/.claude/skills/retro/SKILL.md +117 -0
- package/substrate/.claude/skills/riff/SKILL.md +114 -0
- package/substrate/.claude/skills/roadmap-reconcile/SKILL.md +163 -0
- package/substrate/.claude/skills/session-end/SKILL.md +309 -0
- package/substrate/.claude/skills/session-log/SKILL.md +299 -0
- package/substrate/.claude/skills/skills/SKILL.md +228 -0
- package/substrate/.claude/skills/spec/SKILL.md +105 -0
- package/substrate/.claude/skills/sprint/SKILL.md +392 -0
- package/substrate/.claude/skills/stage/SKILL.md +384 -0
- package/substrate/.claude/skills/state-a-problem/SKILL.md +185 -0
- package/substrate/.claude/skills/temperance/SKILL.md +108 -0
- package/substrate/.claude/skills/use-case/SKILL.md +417 -0
- package/substrate/.claude/skills/user-stories/SKILL.md +268 -0
- package/substrate/.claude/skills/value-prop/SKILL.md +251 -0
- package/substrate/.claude/skills/verify/SKILL.md +160 -0
- package/substrate/.claude/skills/visual-review/SKILL.md +503 -0
- package/substrate/.claude/skills/whats-the-plan/SKILL.md +202 -0
- package/substrate/.claude/skills/whereami/SKILL.md +307 -0
- package/substrate/AGENTS.md +79 -0
- package/substrate/CLAUDE-lite.md +85 -0
- package/substrate/CODE_OF_CONDUCT.md +28 -0
- package/substrate/CONTRIBUTING.md +177 -0
- package/substrate/README.md +173 -0
- package/substrate/SECURITY.md +19 -0
- package/substrate/architecture/decisions/ADR-029-release-pipeline.md +79 -0
- package/substrate/architecture/decisions/ADR-031-non-breaking-changes-adopter-discipline.md +139 -0
- package/substrate/architecture/decisions/ADR-032-adopter-sync-dispatcher-architecture.md +192 -0
- package/substrate/architecture/decisions/ADR-039-release-tagging-scheme.md +145 -0
- package/substrate/architecture/decisions/ADR-040-planning-skill-vocabulary-and-lite-profile.md +155 -0
- package/substrate/architecture/decisions/ADR-044-unified-skill-body-template.md +162 -0
- package/substrate/lib/clean-artifacts-sweep.sh +112 -0
- package/substrate/lib/code-comment-discipline.sh +144 -0
- package/substrate/lib/composer-preflight.sh +459 -0
- package/substrate/lib/hook-inject.sh +255 -0
- package/substrate/lib/luminary-pick.sh +96 -0
- package/substrate/lib/output-discipline.sh +143 -0
- package/substrate/lib/prose-scan-boundary.sh +171 -0
- package/substrate/lib/rewrite-check.sh +214 -0
- package/substrate/lib/state.sh +1372 -0
- package/substrate/lib/telemetry.sh +205 -0
- package/substrate/lib/tier-check.sh +187 -0
- package/substrate/lib/tier-dependency-audit.sh +1088 -0
- package/substrate/presence/install/bassclef-hook-connect.sh +178 -0
- package/substrate/presence/install/bassclef-sync.dispatcher.template.sh +841 -0
- package/substrate/presence/install/bassclef-sync.template.sh +2076 -0
- package/substrate/presence/install/schedule-auto-save.cron.sh +88 -0
- package/substrate/presence/install/schedule-auto-save.taskscheduler.md +122 -0
- package/substrate/scripts/aggregate-telemetry.sh +217 -0
- package/substrate/scripts/analyze-tier-dependencies.sh +239 -0
- package/substrate/scripts/generate-lite-manifest.sh +505 -0
- package/substrate/scripts/generate-tier-manifest.sh +28 -0
- package/substrate/scripts/intent-drift-check.sh +456 -0
- package/substrate/scripts/lite-manifest-drift-check.sh +146 -0
- package/substrate/scripts/render-lite-manifest-doc.sh +150 -0
- package/substrate/standards/adr-template.md +86 -0
- package/substrate/standards/api-conventions/nextjs.md +84 -0
- package/substrate/standards/artifact-composition.md +209 -0
- package/substrate/standards/bash-hook-safety.md +246 -0
- package/substrate/standards/bassclef-configs-schema.md +232 -0
- package/substrate/standards/bassclef-evolution.md +143 -0
- package/substrate/standards/bassclef-internal-jargon.md +244 -0
- package/substrate/standards/bassclef-managed-sentinel.md +96 -0
- package/substrate/standards/bassclef-source-config.md +228 -0
- package/substrate/standards/branch-stacking.md +408 -0
- package/substrate/standards/code-safety-principles.md +176 -0
- package/substrate/standards/composer-prerequisites.md +155 -0
- package/substrate/standards/deferred-actions-schema.md +204 -0
- package/substrate/standards/dependency-discipline/cargo.md +39 -0
- package/substrate/standards/dependency-discipline/gem.md +43 -0
- package/substrate/standards/dependency-discipline/go-mod.md +41 -0
- package/substrate/standards/dependency-discipline/npm.md +42 -0
- package/substrate/standards/dependency-discipline/pip.md +42 -0
- package/substrate/standards/deployment-topology/ec2-tailscale.md +225 -0
- package/substrate/standards/deployment-topology.md +69 -0
- package/substrate/standards/docs-sync-allowlist.md +76 -0
- package/substrate/standards/domain-and-dns.md +145 -0
- package/substrate/standards/frontend-stack.md +67 -0
- package/substrate/standards/frontmatter-schema.md +154 -0
- package/substrate/standards/graceful-exit.md +227 -0
- package/substrate/standards/hook-idempotency.md +102 -0
- package/substrate/standards/hook-injection-discipline.md +202 -0
- package/substrate/standards/hook-install-class.md +215 -0
- package/substrate/standards/input-handler-interface.md +152 -0
- package/substrate/standards/lite-manifest-schema-changes.md +135 -0
- package/substrate/standards/luminary-matching.md +105 -0
- package/substrate/standards/luminary-problem-patterns.md +481 -0
- package/substrate/standards/migration-discipline/active-record.md +50 -0
- package/substrate/standards/migration-discipline/alembic.md +43 -0
- package/substrate/standards/migration-discipline/gorm.md +50 -0
- package/substrate/standards/migration-discipline/prisma.md +53 -0
- package/substrate/standards/migration-discipline/sqlalchemy.md +51 -0
- package/substrate/standards/mobile-ephemeral-session.md +167 -0
- package/substrate/standards/model-routing-discipline.md +160 -0
- package/substrate/standards/ogilvy-writing-rules.md +225 -0
- package/substrate/standards/opener-discipline.md +96 -0
- package/substrate/standards/operator-facing-prose-discipline.md +201 -0
- package/substrate/standards/persona-schema.md +229 -0
- package/substrate/standards/pluggable-luminaries.md +323 -0
- package/substrate/standards/pr-body-discipline.md +115 -0
- package/substrate/standards/preview-state-schema.md +189 -0
- package/substrate/standards/project-directory-layout.md +276 -0
- package/substrate/standards/release-tagging.md +137 -0
- package/substrate/standards/reserved-skill-names.md +120 -0
- package/substrate/standards/scannable-multi-option-output.md +261 -0
- package/substrate/standards/sdlc-compliance.md +286 -0
- package/substrate/standards/sdlc-gates/typescript.md +57 -0
- package/substrate/standards/secrets-lifecycle.md +210 -0
- package/substrate/standards/security-scanner-adapter.md +145 -0
- package/substrate/standards/session-board.md +256 -0
- package/substrate/standards/skill-output-discipline.md +90 -0
- package/substrate/standards/state-spine-contract.md +255 -0
- package/substrate/standards/state-spine.md +511 -0
- package/substrate/standards/steering-hints/kiss-words.md +11 -0
- package/substrate/standards/substrate-config-schema.md +267 -0
- package/substrate/standards/tech-stack-config.md +109 -0
- package/substrate/standards/tier-dependency-analysis.md +167 -0
- package/substrate/standards/tier-runtime-deps/lite.md +57 -0
- package/substrate/standards/tier-tag-schema.md +155 -0
- package/substrate/standards/two-layer-config.md +99 -0
- package/substrate/standards/use-case-format.md +292 -0
- package/substrate/standards/user-story-invest.md +268 -0
- package/substrate/standards/velocity-and-appetite.md +229 -0
- package/substrate/standards/voice-input-pattern.md +119 -0
- package/substrate/standards/whereami-schema.md +301 -0
- package/substrate/standards/worktree-management.md +211 -0
- package/substrate/standards/writing-guide.md +213 -0
- package/substrate/templates/chronicle-template.md +75 -0
- package/substrate/templates/deferred-action-template.md +45 -0
- package/substrate/templates/memory-proposal-template.md +77 -0
- package/substrate/templates/persona-template.md +200 -0
- package/substrate/templates/pr-faq.md +45 -0
- package/substrate/templates/secret-rotation-template.md +162 -0
- package/substrate/templates/spec-template.md +131 -0
- package/substrate/templates/use-case-template.md +194 -0
- package/substrate/templates/user-story-template.md +107 -0
- package/substrate/templates/whereami-template.md +101 -0
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
description: This is the one list of bassclef-internal jargon terms with plain-English alternatives.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Bassclef-internal jargon — single source of truth
|
|
7
|
+
|
|
8
|
+
This is the one list of bassclef-internal jargon terms with plain-English alternatives. The `/kiss` skill reads from it. The PR-body-scrub hook reads from it. The pre-push `/kiss` hook reads from it. Drift between surfaces becomes structurally impossible.
|
|
9
|
+
|
|
10
|
+
## Why this exists
|
|
11
|
+
|
|
12
|
+
Before this list, two surfaces stripped bassclef-internal jargon with different lists:
|
|
13
|
+
|
|
14
|
+
- `/kiss` substitution table at `.claude/skills/kiss/SKILL.md` — 47 entries; mostly advisory substitution
|
|
15
|
+
- PR-body-scrub hook `JARGON_TERMS` at `.claude/hooks/pr-body-scrub-check.sh` — 8 entries; mechanical block at CI
|
|
16
|
+
|
|
17
|
+
The lists did not match. PR #903 leaked "load-bearing" through `/kiss --grade11` (which does not substitute it) and got caught at CI (which does block it).
|
|
18
|
+
|
|
19
|
+
Single source of truth closes the gap.
|
|
20
|
+
|
|
21
|
+
## The list
|
|
22
|
+
|
|
23
|
+
Each term has a plain-English alternative + a tier:
|
|
24
|
+
|
|
25
|
+
- **BLOCK** — adopter-facing surfaces; hook BLOCKs at pre-push and CI on all surfaces
|
|
26
|
+
- **BLOCK-title** — title + commit-message surfaces only; hook BLOCKs when `SCRUB_SURFACE=title` or `SCRUB_SURFACE=commit`. Body-surface scrub passes through. Use when a term is wrong at the title surface but acceptable in body prose (e.g., `substrate-defect:` as title prefix vs `substrate-defect` mentioned in body discussion)
|
|
27
|
+
- **ADVISE** — adopter-facing surfaces; `/kiss` substitutes; hook does not block
|
|
28
|
+
- **ALLOW** — bassclef-internal allowlist per bassclef#763; both surfaces preserve
|
|
29
|
+
|
|
30
|
+
| Term | Plain English | Tier |
|
|
31
|
+
|---|---|---|
|
|
32
|
+
| composer | runs / chains / combines | BLOCK |
|
|
33
|
+
| primitive | building block | BLOCK |
|
|
34
|
+
| tier-preset | preset / size | BLOCK |
|
|
35
|
+
| load-bearing | actually used / counted on | BLOCK |
|
|
36
|
+
| blast radius | how much breaks if this goes wrong | BLOCK |
|
|
37
|
+
| compose-with | uses / builds on | BLOCK |
|
|
38
|
+
| scope-bounded | bounded by what we said we'd ship | BLOCK |
|
|
39
|
+
| operationalize | do / ship | BLOCK |
|
|
40
|
+
| wirings | hooks that fire / connections | BLOCK |
|
|
41
|
+
| operator-eyes | needs your review / review by you | BLOCK |
|
|
42
|
+
| seed (verb) | fill in / populate / set up | BLOCK |
|
|
43
|
+
| seed (noun, defaults) | starter defaults / default config | BLOCK |
|
|
44
|
+
| seed catalog | defaults catalog / stack defaults | BLOCK |
|
|
45
|
+
| Greek letters as option labels (α, β, γ, δ in "Shape α", "Option β", "pick γ", "tier δ" patterns — per bassclef#1286) | a, b, c, d or 1, 2, 3, 4 — keyboard-typeable; never escalate to Greek to "differentiate" labels | BLOCK |
|
|
46
|
+
| shape (as label for operator choices — "shape a", "shape b", "pick shape") | option (as label — "option a", "option b", "pick option"). Rename applies ONLY to option-label context; generic uses ("the shape of the problem", "wrong shape") stay as-is. Per ADR-040 D1 amendment 2026-07-18 | ADVISE |
|
|
47
|
+
| discipline-debt | unfinished discipline work / what we still owe | BLOCK |
|
|
48
|
+
| carved out | took out / removed / set aside | BLOCK |
|
|
49
|
+
| discipline-shipping rhythm | how often we ship discipline / shipping cadence | BLOCK |
|
|
50
|
+
| meta-pattern | the bigger pattern / the pattern across patterns | BLOCK |
|
|
51
|
+
| meta-loop | the loop happening to the loop / the recursive case | BLOCK |
|
|
52
|
+
| complete mediation triangle | three-layer coverage / three-layer defence | BLOCK |
|
|
53
|
+
| 12-pattern matcher | the path list / the substrate-affecting path check | BLOCK |
|
|
54
|
+
| compounding axis | compounding sequence (per bet 2026-07-03b WU-2 rename #611) | BLOCK |
|
|
55
|
+
| OR hand-roll (soft-INSTEAD escape per bassclef-upstream#375) | dispatch the skill; no fallback | BLOCK |
|
|
56
|
+
| OR write inline (soft-INSTEAD escape) | dispatch the skill; no fallback | BLOCK |
|
|
57
|
+
| OR compose by hand (soft-INSTEAD escape) | dispatch the skill; no fallback | BLOCK |
|
|
58
|
+
| if available (in MUST-tier procedure) | name the prereq; BLOCK with INSTEAD when missing | BLOCK |
|
|
59
|
+
| if at hand (in MUST-tier procedure) | name the prereq; BLOCK with INSTEAD when missing | BLOCK |
|
|
60
|
+
| when at hand (in MUST-tier procedure) | name the prereq; BLOCK with INSTEAD when missing | BLOCK |
|
|
61
|
+
| when available (in MUST-tier procedure) | name the prereq; BLOCK with INSTEAD when missing | BLOCK |
|
|
62
|
+
| if the skill is not (soft-INSTEAD escape) | dispatch the skill; no fallback | BLOCK |
|
|
63
|
+
| when the skill is not (soft-INSTEAD escape) | dispatch the skill; no fallback | BLOCK |
|
|
64
|
+
| leverage (as verb — Ogilvy §Rule 3) | use / take advantage of / build on | BLOCK |
|
|
65
|
+
| synergies (Ogilvy §Rule 3) | what they do well together / how the teams help each other | BLOCK |
|
|
66
|
+
| verticals (Ogilvy §Rule 3) | product lines / markets / categories | BLOCK |
|
|
67
|
+
| circle back (Ogilvy §Rule 3) | follow up / come back to this | BLOCK |
|
|
68
|
+
| deep dive (Ogilvy §Rule 3) | look closely / study | BLOCK |
|
|
69
|
+
| low-hanging fruit (Ogilvy §Rule 3) | the easy wins / what we can ship first | BLOCK |
|
|
70
|
+
| ideate (Ogilvy §Rule 3) | come up with ideas / brainstorm | BLOCK |
|
|
71
|
+
| value-add (Ogilvy §Rule 3) | what makes it worth it / the benefit | BLOCK |
|
|
72
|
+
| move the needle (Ogilvy §Rule 3) | make a real difference / change the outcome | BLOCK |
|
|
73
|
+
| boil the ocean (Ogilvy §Rule 3) | try to do everything / scope too broadly | BLOCK |
|
|
74
|
+
| holistic (Ogilvy §Rule 3 — outside biology) | complete / covers everything / end-to-end | BLOCK |
|
|
75
|
+
| robust (Ogilvy §Rule 3 — vague usage) | reliable / handles the edge cases | BLOCK |
|
|
76
|
+
| scalable (Ogilvy §Rule 3 — vague usage) | works when volume grows / handles more load | BLOCK |
|
|
77
|
+
| ecosystem (Ogilvy §Rule 3 — outside biology) | the set of related tools / the community | BLOCK |
|
|
78
|
+
| stakeholder (Ogilvy §Rule 3 — no referent) | the specific person or team; name them | BLOCK |
|
|
79
|
+
| incentivize (Ogilvy §Rule 3) | give a reason / reward | BLOCK |
|
|
80
|
+
| strategize (Ogilvy §Rule 3) | plan / decide the approach | BLOCK |
|
|
81
|
+
| socialize (Ogilvy §Rule 3 — metaphorical) | share with the team / discuss | BLOCK |
|
|
82
|
+
| pursuant to (Ogilvy §Rule 1) | following / as we discussed | BLOCK |
|
|
83
|
+
| please be advised (Ogilvy §Rule 1) | drop entirely — just state the point | BLOCK |
|
|
84
|
+
| it has come to my attention (Ogilvy §Rule 1) | I noticed / I saw | BLOCK |
|
|
85
|
+
| right-sizing (Ogilvy §Rule 9 — euphemism for layoffs) | layoffs / we're cutting jobs | BLOCK |
|
|
86
|
+
| reached out (Ogilvy §Rule 9 — vague euphemism) | called / emailed / messaged (pick one) | BLOCK |
|
|
87
|
+
| going in a different direction (Ogilvy §Rule 9 — euphemism for rejection) | we're rejecting / we're not doing this | BLOCK |
|
|
88
|
+
| opportunity for improvement (Ogilvy §Rule 9 — euphemism for problem) | problem / what's wrong | BLOCK |
|
|
89
|
+
| challenging (Ogilvy §Rule 9 — euphemism for bad/failing) | bad / failing / broken (be specific) | BLOCK |
|
|
90
|
+
| atomic | all-or-nothing | ADVISE |
|
|
91
|
+
| determinism | same answer every time | ADVISE |
|
|
92
|
+
| replay-deterministic | gives the same answer when re-run | ADVISE |
|
|
93
|
+
| machine-readable | the system can read it directly | ADVISE |
|
|
94
|
+
| compose / composes | combine / works with | ADVISE |
|
|
95
|
+
| ingest / ingestion | read in / reading | ADVISE |
|
|
96
|
+
| enforcement | the rule that catches it | ADVISE |
|
|
97
|
+
| enforce | catch it / make it stick | ADVISE |
|
|
98
|
+
| instrumentation | what we measure | ADVISE |
|
|
99
|
+
| idempotent | safe to run twice | ADVISE |
|
|
100
|
+
| canonical (as adjective; legacy reference to prior brand pre-2026-06-20 rename) | bassclef (as brand) / shared / official (as English) | ADVISE |
|
|
101
|
+
| orthogonal | unrelated / separate concern | ADVISE |
|
|
102
|
+
| obviate | make unnecessary | ADVISE |
|
|
103
|
+
| supersede / supersedes | replaces | ADVISE |
|
|
104
|
+
| coherent | consistent / it fits together | ADVISE |
|
|
105
|
+
| heterogeneous | mixed / not the same kind | ADVISE |
|
|
106
|
+
| homogeneous | same kind / consistent | ADVISE |
|
|
107
|
+
| nominal | the expected case | ADVISE |
|
|
108
|
+
| pathological | the bad case | ADVISE |
|
|
109
|
+
| degenerate | broken / not the normal shape | ADVISE |
|
|
110
|
+
| MECE | clean buckets, nothing overlaps, nothing missed | ADVISE |
|
|
111
|
+
| appetite | time budget (per ADR-040 D1 rename 2026-07-17). First-mention gloss: '(steps you'll spend at your current pace before cutting scope)' | BLOCK |
|
|
112
|
+
| iteration / iteration bet | goal (per ADR-040 D1 rename 2026-07-17) — a chunk of work we commit to | BLOCK |
|
|
113
|
+
| stack / stacked | a chain of small PRs | ADVISE |
|
|
114
|
+
| retro | look-back / what we learned | ADVISE |
|
|
115
|
+
| stopping criteria | when we know we're done | ADVISE |
|
|
116
|
+
| surface | the thing the user sees | ADVISE |
|
|
117
|
+
| projection | computed view | ADVISE |
|
|
118
|
+
| invariant | thing that's always true | ADVISE |
|
|
119
|
+
| anti-pattern | the wrong way that looks right | ADVISE |
|
|
120
|
+
| harness | the system Claude Code runs in | ADVISE |
|
|
121
|
+
| hook | code that fires automatically | ADVISE |
|
|
122
|
+
| cardinality | how many of them | ADVISE |
|
|
123
|
+
| latency | wait time | ADVISE |
|
|
124
|
+
| throughput | how many per second | ADVISE |
|
|
125
|
+
| backpressure | when to slow down | ADVISE |
|
|
126
|
+
| stuck-signal | repeated warning | ADVISE |
|
|
127
|
+
| substrate-defect | bug in the rules / rule bug | ADVISE |
|
|
128
|
+
| substrate-defect: | fix: (per commit-conventions.md — use the 8 standard types) | BLOCK-title |
|
|
129
|
+
| INSTEAD-block discipline | the pairing rule | ADVISE |
|
|
130
|
+
| arc (as multi-goal continuation — 'arc walk', 'arc-level', 'the arc', 'arc-orientation') | thread (as in 'thread walk', 'thread-level'). Per ADR-040 D1 rename 2026-07-17. Prose only; not filenames or historical git | BLOCK |
|
|
131
|
+
| workunit | step. Per ADR-040 D1 rename 2026-07-17. Prose only; commit tags stay | BLOCK |
|
|
132
|
+
| WU (short form of workunit) | step. Same rename as workunit per ADR-040 D1. Commit tags stay | BLOCK |
|
|
133
|
+
| parent bet | parent goal. Per ADR-040 D1 rename 2026-07-17 | BLOCK |
|
|
134
|
+
| circuit breaker (Shape Up term) | hard stop and re-decide. Per ADR-040 D1 rename 2026-07-17 | ADVISE |
|
|
135
|
+
| substrate | shared toolkit | ALLOW |
|
|
136
|
+
| bassclef | bassclef | ALLOW |
|
|
137
|
+
| cameo | cameo | ALLOW |
|
|
138
|
+
| Studio | Studio | ALLOW |
|
|
139
|
+
| Band | Band | ALLOW |
|
|
140
|
+
| bandleader | bandleader | ALLOW |
|
|
141
|
+
| chronicle | chronicle | ALLOW (added 2026-08-16 per goal 2026-08-16a Louis-lens consult; retracts ADR-040 D1 chronicle → session log word rename; directory `chronicle/` stays; `/chronicle` and `/session-log` SKILL names both work) |
|
|
142
|
+
|
|
143
|
+
## Phrase compounds (ADVISE-PHRASE tier — V1 advisory)
|
|
144
|
+
|
|
145
|
+
Per bassclef#915. The word-shaped table above catches individual words. Substrate-internal compounds use plain individual words combined into substrate-internal phrases that pass every gate. Adopters reading post-launch encounter dense phrasing even when no single word violates Rule 1.
|
|
146
|
+
|
|
147
|
+
Format: `Phrase | Plain alternative | Tier`. Tier ADVISE-PHRASE fires the PR-body-scrub hook Rule 5 (advisory) — emits a CI comment, does not block.
|
|
148
|
+
|
|
149
|
+
| Phrase | Plain alternative | Tier |
|
|
150
|
+
|---|---|---|
|
|
151
|
+
| pipeline altitude | pipeline | ADVISE-PHRASE |
|
|
152
|
+
| atomic discipline | one-PR-per-concern (or one concern per PR) | ADVISE-PHRASE |
|
|
153
|
+
| operator-attention | operator review | ADVISE-PHRASE |
|
|
154
|
+
| operator-attended | operator-reviewed | ADVISE-PHRASE |
|
|
155
|
+
| honest case | valid case (or omit) | ADVISE-PHRASE |
|
|
156
|
+
| forcing function | what forces the answer | ADVISE-PHRASE |
|
|
157
|
+
| surface scrub | surface cleanup | ADVISE-PHRASE |
|
|
158
|
+
| serial work | sequenced work (or in series) | ADVISE-PHRASE |
|
|
159
|
+
| pipeline shape | pipeline (when used as noun in prose) | ADVISE-PHRASE |
|
|
160
|
+
| hook wirings | hooks that fire / hook connections | ADVISE-PHRASE |
|
|
161
|
+
| discipline propagation | rolling the rule out / making the rule stick | ADVISE-PHRASE |
|
|
162
|
+
| phase N vocabulary | the word-list piece of phase N | ADVISE-PHRASE |
|
|
163
|
+
| next pickup | what to do next | ADVISE-PHRASE |
|
|
164
|
+
| promotable patterns | patterns worth promoting | ADVISE-PHRASE |
|
|
165
|
+
| discoveries extraction | things worth keeping | ADVISE-PHRASE |
|
|
166
|
+
| sister shape | same shape | ADVISE-PHRASE |
|
|
167
|
+
| ungated | the gate cleared / no longer blocked | ADVISE-PHRASE |
|
|
168
|
+
| atomic PR | one issue per PR | ADVISE-PHRASE |
|
|
169
|
+
| forward-compat | safe for later versions | ADVISE-PHRASE |
|
|
170
|
+
| discovery surface | discovery / where you find it | ADVISE-PHRASE |
|
|
171
|
+
| compounding axis | compounding sequence (per bet 2026-07-03b WU-2 rename #611) | ADVISE-PHRASE |
|
|
172
|
+
| luminary design ceremony | proper design with a named author / design review with named perspectives | ADVISE-PHRASE |
|
|
173
|
+
| validator-registry | the list of checks / set of validators | ADVISE-PHRASE |
|
|
174
|
+
| per-substrate-evolution-shipping-window | each time we ship a new rule / each substrate shipping window | ADVISE-PHRASE |
|
|
175
|
+
| compounds tightly | each builds on the prior / one supports the next | ADVISE-PHRASE |
|
|
176
|
+
|
|
177
|
+
Additions to this section follow the same lifecycle as the word-shaped table: file an issue → propose addition → both surfaces (/kiss + PR-body-scrub Rule 5) pick up at next session-start sync.
|
|
178
|
+
|
|
179
|
+
## How surfaces read the list
|
|
180
|
+
|
|
181
|
+
### `/kiss` skill
|
|
182
|
+
|
|
183
|
+
`/kiss --grade10` substitutes BLOCK + ADVISE terms; preserves ALLOW.
|
|
184
|
+
`/kiss --grade11` substitutes BLOCK terms; preserves ADVISE + ALLOW.
|
|
185
|
+
`/kiss --grade8` substitutes BLOCK + ADVISE + a stricter prose pass; preserves ALLOW.
|
|
186
|
+
|
|
187
|
+
### PR-body-scrub hook
|
|
188
|
+
|
|
189
|
+
The CI hook reads BLOCK terms only and fires on match. ADVISE and ALLOW terms pass through.
|
|
190
|
+
|
|
191
|
+
### Pre-push `/kiss` hook (bassclef#907 Part 4)
|
|
192
|
+
|
|
193
|
+
Reads BLOCK terms; fires at `gh pr create` and `gh issue create` time. ADVISE and ALLOW terms pass through.
|
|
194
|
+
|
|
195
|
+
## Term lifecycle
|
|
196
|
+
|
|
197
|
+
Three states for a term:
|
|
198
|
+
|
|
199
|
+
1. **New jargon caught at /diagnose or operator review** → file an issue, propose adding to the table at a tier
|
|
200
|
+
2. **Added to the table at a tier** → both surfaces pick it up at next session-start sync
|
|
201
|
+
3. **Promoted from ADVISE to BLOCK** → when a term shows up in 3+ leaked PR bodies despite advisory pass
|
|
202
|
+
|
|
203
|
+
ALLOW promotions require a separate bassclef-evolution issue per bassclef#763 reserved-name discipline.
|
|
204
|
+
|
|
205
|
+
## Standard technical vocabulary — preserved across all tiers
|
|
206
|
+
|
|
207
|
+
These terms stay as-is at every tier. They are not jargon; they are standard tech vocabulary every digital team understands:
|
|
208
|
+
|
|
209
|
+
```
|
|
210
|
+
API, SDK, CLI, GUI, HTTP, REST, JSON, YAML, schema, regex, hook,
|
|
211
|
+
repo, branch, commit, PR, MR, CI, CD, workflow, action, artifact,
|
|
212
|
+
function, class, method, property, field, constant, variable, enum,
|
|
213
|
+
database, query, index, migration, transaction, cache, queue, lock,
|
|
214
|
+
container, image, pod, cluster, node, runner, build, deploy, rollback,
|
|
215
|
+
test, assert, mock, stub, fixture, snapshot, regression,
|
|
216
|
+
auth, token, secret, credential, scope, permission, role,
|
|
217
|
+
file, directory, path, glob, pattern, prefix, suffix
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
Do not substitute these. Do not expand them into multi-sentence explanations.
|
|
221
|
+
|
|
222
|
+
## Operator opt-out
|
|
223
|
+
|
|
224
|
+
Two paths to skip substitution for operator-internal work (canvases, audits, internal strategy docs):
|
|
225
|
+
|
|
226
|
+
- PR label `bassclef-internal-prose-ok` — downgrades hook firings to advisory at both pre-push and CI
|
|
227
|
+
- Environment variable `SKIP_KISS=1` — bypasses the pre-push `/kiss` hook for one invocation; logged via trace-helper
|
|
228
|
+
|
|
229
|
+
Operator-private files under `docs/operator-private/*` are out of scope for this list — they are private substrate; the discipline applies to adopter-facing output.
|
|
230
|
+
|
|
231
|
+
## Composes with
|
|
232
|
+
|
|
233
|
+
- `.claude/skills/kiss/SKILL.md` — reads BLOCK + ADVISE from this list per mode
|
|
234
|
+
- `.claude/hooks/pr-body-scrub-check.sh` — reads BLOCK from this list
|
|
235
|
+
- `.claude/hooks/kiss-default-check.sh` — reads BLOCK from this list (bassclef#907 Part 4)
|
|
236
|
+
- `.claude/rules/plain-english-discipline.md` — methodology layer; references this list as authoritative
|
|
237
|
+
- bassclef#763 — `/kiss` reserved-name allowlist (the ALLOW tier traces to this discipline)
|
|
238
|
+
- bassclef#906 — PR-body shape contract (sister discipline; shape + vocabulary together close the drift)
|
|
239
|
+
|
|
240
|
+
## Refs
|
|
241
|
+
|
|
242
|
+
- bassclef#907 — `/kiss` overhaul (this standard's parent ticket)
|
|
243
|
+
- bassclef#908 — asymmetric-gate pattern (this standard is one positive fix)
|
|
244
|
+
- PR #903 — surfaced the drift (leaked "load-bearing")
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
title: bassclef-managed sentinel — file semantic
|
|
4
|
+
status: adopted
|
|
5
|
+
date: 2026-08-30
|
|
6
|
+
introduced_by: PR #1428 (Option F cp swap)
|
|
7
|
+
frozen_by: RFC-0001 H2
|
|
8
|
+
description: The .bassclef-managed sentinel marks a directory as bassclef-managed content.
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Standard — `.bassclef-managed` sentinel
|
|
12
|
+
|
|
13
|
+
## Purpose
|
|
14
|
+
|
|
15
|
+
The `.bassclef-managed` sentinel marks a directory as bassclef-managed content. Adopter tooling reads it to distinguish bassclef-shipped skill directories from adopter-authored skill directories that happen to share a name.
|
|
16
|
+
|
|
17
|
+
Introduced in PR #1428 for `.claude/skills/*/` (both project-level and user-level). Extends to `.claude/luminaries/`, `.claude/agents/`, and `lib/` when #1429 ships.
|
|
18
|
+
|
|
19
|
+
## Sources read
|
|
20
|
+
|
|
21
|
+
- PR #1428 body — first introduction of the sentinel at `presence/install/bassclef-sync.template.sh` Sections 2 and 3b-skills
|
|
22
|
+
- `docs/rfcs/RFC-0001-option-f-cp-swap-review.md` H2 finding — Hyrum lens flagged the sentinel as an observable contract
|
|
23
|
+
- `.claude/rules/we-dont-break-adopters.md` — ADR-031 discipline that governs any change to this semantic
|
|
24
|
+
|
|
25
|
+
## Sentinel semantic — frozen
|
|
26
|
+
|
|
27
|
+
The sentinel is an **empty file** at the root of a bassclef-managed directory. Nothing more. Adopters MAY bind to its presence or absence. Adopters MUST NOT bind to its content, its size, or its modification time.
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
.claude/skills/longrun/
|
|
31
|
+
├── SKILL.md
|
|
32
|
+
├── scripts/
|
|
33
|
+
└── .bassclef-managed ← empty file; adopter reads presence only
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
**What the sentinel means:**
|
|
37
|
+
|
|
38
|
+
- **Present** — directory is managed by bassclef sync. Contents get refreshed on next sync. Adopter edits inside the directory get overwritten. Adopter override should live in a differently-named directory OR (for future migration) a `.bassclef-override` flag.
|
|
39
|
+
- **Absent** — directory is adopter-authored. Sync leaves it alone even if a bassclef skill of the same name exists upstream.
|
|
40
|
+
|
|
41
|
+
**What the sentinel does NOT mean:**
|
|
42
|
+
|
|
43
|
+
- The sentinel does NOT carry a version, checksum, or bassclef commit reference.
|
|
44
|
+
- The sentinel does NOT change size across bassclef versions.
|
|
45
|
+
- The sentinel does NOT get mtime-refreshed on every sync (empty file writes are idempotent).
|
|
46
|
+
|
|
47
|
+
## Why the semantic is frozen
|
|
48
|
+
|
|
49
|
+
Hyrum's law — with enough adopters, every observable becomes a load-bearing contract. First release binds the sentinel semantic forever. Adding a field, changing size, or renaming the file breaks adopter tools that already bind to the shape.
|
|
50
|
+
|
|
51
|
+
Freezing early prevents the drift class. Any future extension owes a new sentinel filename (e.g., `.bassclef-metadata-v2`) plus a compat shim per ADR-031.
|
|
52
|
+
|
|
53
|
+
## Adopter usage patterns
|
|
54
|
+
|
|
55
|
+
**Check whether a skill directory is bassclef-managed:**
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
if [ -f "$CWD/.claude/skills/$SKILL_NAME/.bassclef-managed" ]; then
|
|
59
|
+
echo "bassclef manages $SKILL_NAME"
|
|
60
|
+
else
|
|
61
|
+
echo "adopter authors $SKILL_NAME"
|
|
62
|
+
fi
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
**Skip bassclef-managed directories in adopter scripts:**
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
find "$CWD/.claude/skills" -mindepth 1 -maxdepth 1 -type d ! -exec test -f {}/.bassclef-managed \; -print
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Migration path from prior symlink shape
|
|
72
|
+
|
|
73
|
+
Before PR #1428, `.claude/skills/*/` were symlinks to the bassclef sibling. Adopter tools that used `test -L` or `readlink` to detect bassclef-shipped skills need to switch to the sentinel check.
|
|
74
|
+
|
|
75
|
+
See `docs/adopters/option-f-migration-note.md` for the full migration guide.
|
|
76
|
+
|
|
77
|
+
## Change control
|
|
78
|
+
|
|
79
|
+
Amendments to this semantic require:
|
|
80
|
+
|
|
81
|
+
1. An ADR proposing the change (references ADR-031 grace window discipline)
|
|
82
|
+
2. A `/rfc` outside-lens council review (per `.claude/skills/rfc/SKILL.md`)
|
|
83
|
+
3. A compat shim keeping the prior semantic working for one release cycle
|
|
84
|
+
4. A migration manifest in `docs/operator-private/forward-port-registry/migrations/`
|
|
85
|
+
5. An adopter changelog entry at `/release` time
|
|
86
|
+
|
|
87
|
+
## Refs
|
|
88
|
+
|
|
89
|
+
- PR #1428 (introduced sentinel)
|
|
90
|
+
- Ticket #1429 (extends sentinel to remaining 4 sections)
|
|
91
|
+
- RFC-0001 H2 (freeze motivated by Hyrum lens finding)
|
|
92
|
+
- ADR-031 (we-dont-break-adopters)
|
|
93
|
+
- `docs/adopters/option-f-migration-note.md` (adopter-facing migration guide)
|
|
94
|
+
- `presence/install/bassclef-sync.template.sh` (writes the sentinel at cp time)
|
|
95
|
+
- `@luminary hyrum-wright` (H2 finding source)
|
|
96
|
+
- `@luminary linus-torvalds` (adopter-compat anchor for the freeze)
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
description: "The thin-pointer bassclef-sync hook (presence/install/bassclef-sync.template.sh and consumer-vendored bassclef-sync.sh) has two paths to load bassclef's substrate:"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `.bassclef-source.json` — schema for thin-pointer curl-fallback
|
|
7
|
+
|
|
8
|
+
The thin-pointer bassclef-sync hook (`presence/install/bassclef-sync.template.sh`
|
|
9
|
+
and consumer-vendored `bassclef-sync.sh`) has two paths to load
|
|
10
|
+
bassclef's substrate:
|
|
11
|
+
|
|
12
|
+
1. **Sibling fast-path**: if `$CWD/../bassclef/` exists on the local
|
|
13
|
+
filesystem, the hook execs the bassclef-sync template directly.
|
|
14
|
+
2. **Curl fallback**: if no sibling, the hook reads
|
|
15
|
+
`.bassclef-source.json` from the consumer repo root, fetches the
|
|
16
|
+
tarball at `source_url`, extracts it, and execs the bassclef-sync
|
|
17
|
+
template from the extracted tree.
|
|
18
|
+
|
|
19
|
+
This standard defines the schema of `.bassclef-source.json` so all
|
|
20
|
+
five provider patterns (GitHub public, GitHub private repo, GitHub
|
|
21
|
+
private release, Azure DevOps Repos, GitLab) can be authored against
|
|
22
|
+
a single contract. Onboarding tooling (`/onboard-repo`), validation
|
|
23
|
+
hooks, and consumer adapters compose against this contract.
|
|
24
|
+
|
|
25
|
+
Closes bassclef#419.
|
|
26
|
+
|
|
27
|
+
## Sources read
|
|
28
|
+
|
|
29
|
+
- bassclef#419 — schema + provider examples specification
|
|
30
|
+
- TwoDo PR #258 — thin-pointer hook implementation that defines the contract
|
|
31
|
+
- TwoDo `.bassclef-source.json` (live config that proved the schema in PR #268)
|
|
32
|
+
- `presence/install/bassclef-sync.template.sh` — sibling fast-path target
|
|
33
|
+
- `architecture/decisions/ADR-015-state-schema-format.md` — JSON Schema draft-2020-12 standard
|
|
34
|
+
- `standards/state-spine/schemas/*.schema.json` — schema-format precedent
|
|
35
|
+
|
|
36
|
+
## Why this schema is small (and stays small)
|
|
37
|
+
|
|
38
|
+
Five fields, three required, one optional. The thin-pointer hook is
|
|
39
|
+
the only consumer; provider differences resolve at the URL level
|
|
40
|
+
(provider-specific tarball endpoints) and at the auth-header level
|
|
41
|
+
(Bearer vs Basic vs none). Adding fields would couple the schema to
|
|
42
|
+
provider-specific concerns the hook doesn't need.
|
|
43
|
+
|
|
44
|
+
If a provider requires a header the schema doesn't model (e.g., an
|
|
45
|
+
extra X-API-Version), wrap it in the URL or add a pre-fetch shim in
|
|
46
|
+
the hook — don't grow the schema.
|
|
47
|
+
|
|
48
|
+
## Schema
|
|
49
|
+
|
|
50
|
+
```json
|
|
51
|
+
{
|
|
52
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
53
|
+
"type": "object",
|
|
54
|
+
"required": ["source_url", "auth_method", "token_env"],
|
|
55
|
+
"additionalProperties": false,
|
|
56
|
+
"properties": {
|
|
57
|
+
"source_url": { "type": "string", "format": "uri" },
|
|
58
|
+
"auth_method": { "type": "string", "enum": ["Bearer", "Basic", "none"] },
|
|
59
|
+
"token_env": { "type": "string", "pattern": "^[A-Z_][A-Z0-9_]*$" },
|
|
60
|
+
"comment": { "type": "string" },
|
|
61
|
+
"auto_sync": { "type": "boolean" }
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Authoritative copy lives at `standards/bassclef-source/schemas/bassclef-source.schema.json`
|
|
67
|
+
and is enforced by the validation hook (see § Validation below).
|
|
68
|
+
|
|
69
|
+
### Field reference
|
|
70
|
+
|
|
71
|
+
| Field | Type | Required | Description |
|
|
72
|
+
|-------|------|----------|-------------|
|
|
73
|
+
| `source_url` | string (URI) | yes | Tarball-download URL on the upstream provider. The hook curls this and pipes through `tar -xzf -`. Must return a gzipped tarball when fetched with the appropriate auth header. |
|
|
74
|
+
| `auth_method` | enum | yes | `"Bearer"` (Authorization: Bearer `$TOKEN`), `"Basic"` (Authorization: Basic `$TOKEN`), or `"none"` (no auth header — public URL). |
|
|
75
|
+
| `token_env` | string | yes | Name of the environment variable holding the auth token. Must be a valid env-var identifier (uppercase letters, digits, underscores; cannot start with a digit). For `auth_method: none`, set to empty string `""` (the field is required but unused). |
|
|
76
|
+
| `comment` | string | no | Human-readable description. Recommended: name the provider, name the token, link to the bassclef issue or bet that motivated the config. |
|
|
77
|
+
| `auto_sync` | boolean | no | When `true`, the bassclef-sync dispatcher fetches bassclef's latest substrate at every SessionStart. When `false` or absent, the dispatcher short-circuits with a one-line note + opt-in path. **Default behavior on absence is `false`** — a cold-adopter safe default per bassclef#939. Existing bassclef operator-side consumers (poa / twodo / quorum / ops / pruneguice) set this to `true` explicitly to preserve auto-sync behavior. |
|
|
78
|
+
|
|
79
|
+
### Why all three are required
|
|
80
|
+
|
|
81
|
+
The hook reads all three fields at fire-time. Making `token_env`
|
|
82
|
+
optional with a default would hide the no-auth case behind a default
|
|
83
|
+
and produce silent failure modes when an operator forgets to set the
|
|
84
|
+
env var. Explicit-or-empty is clearer than implicit-default.
|
|
85
|
+
|
|
86
|
+
## Provider examples
|
|
87
|
+
|
|
88
|
+
### Public GitHub release (no auth)
|
|
89
|
+
|
|
90
|
+
```json
|
|
91
|
+
{
|
|
92
|
+
"source_url": "https://github.com/sunj-labs/bassclef/releases/latest/download/substrate.tar.gz",
|
|
93
|
+
"auth_method": "none",
|
|
94
|
+
"token_env": "",
|
|
95
|
+
"comment": "Public bassclef substrate release; no auth needed. Suitable for public consumer repos and demos."
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Private GitHub repo (via fine-grained PAT)
|
|
100
|
+
|
|
101
|
+
```json
|
|
102
|
+
{
|
|
103
|
+
"source_url": "https://api.github.com/repos/sunj-labs/bassclef/tarball/main",
|
|
104
|
+
"auth_method": "Bearer",
|
|
105
|
+
"token_env": "BASSCLEF_TOKEN",
|
|
106
|
+
"comment": "GitHub repo tarball API. Auth: fine-grained PAT 'bassclef-substrate-read' (Contents:read on sunj-labs/bassclef), stored as BASSCLEF_TOKEN in the consumer's Cloud Code environment."
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
This is the pattern used by all five sunj-labs consumer repos
|
|
111
|
+
(TwoDo, POA, quorum, ops, pruneguice) when running against
|
|
112
|
+
bassclef's private repo from Cloud Code.
|
|
113
|
+
|
|
114
|
+
### Private GitHub release (via fine-grained PAT)
|
|
115
|
+
|
|
116
|
+
```json
|
|
117
|
+
{
|
|
118
|
+
"source_url": "https://api.github.com/repos/sunj-labs/bassclef/releases/latest",
|
|
119
|
+
"auth_method": "Bearer",
|
|
120
|
+
"token_env": "BASSCLEF_GH_TOKEN",
|
|
121
|
+
"comment": "GitHub release API. Returns release JSON; the hook follows assets[].browser_download_url for the tarball asset. Auth: fine-grained PAT with Contents:read."
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
Use for environments where releases are gated more strictly than the
|
|
126
|
+
repo (e.g., preview vs. stable channels).
|
|
127
|
+
|
|
128
|
+
### Azure DevOps Repos (via ADO PAT)
|
|
129
|
+
|
|
130
|
+
```json
|
|
131
|
+
{
|
|
132
|
+
"source_url": "https://dev.azure.com/<ORG>/<PROJECT>/_apis/git/repositories/bassclef/items?path=/&versionDescriptor.version=main&$format=zip&download=true&api-version=7.0",
|
|
133
|
+
"auth_method": "Basic",
|
|
134
|
+
"token_env": "BASSCLEF_ADO_PAT",
|
|
135
|
+
"comment": "Azure DevOps Repos zip-archive API. Auth: ADO PAT base64-encoded as ':<PAT>' (empty username + colon + PAT) when set in BASSCLEF_ADO_PAT — the hook sends it as Authorization: Basic <env>."
|
|
136
|
+
}
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
ADO returns a zip, not a tarball. The hook handles the conversion
|
|
140
|
+
(unzip → tar) when the URL ends in `.zip` or contains `$format=zip`.
|
|
141
|
+
|
|
142
|
+
### GitLab (via GitLab PAT)
|
|
143
|
+
|
|
144
|
+
```json
|
|
145
|
+
{
|
|
146
|
+
"source_url": "https://gitlab.com/api/v4/projects/<PROJECT_ID>/repository/archive.tar.gz?sha=main",
|
|
147
|
+
"auth_method": "Bearer",
|
|
148
|
+
"token_env": "BASSCLEF_GITLAB_TOKEN",
|
|
149
|
+
"comment": "GitLab repo archive API. Auth: GitLab PAT with read_repository scope. PROJECT_ID is the numeric project ID from GitLab settings."
|
|
150
|
+
}
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
## Validation
|
|
154
|
+
|
|
155
|
+
### At write time (hook-enforced)
|
|
156
|
+
|
|
157
|
+
`.claude/hooks/bassclef-source-config-validate.sh` (PreToolUse on
|
|
158
|
+
Edit/Write to `.bassclef-source.json`) validates the file against
|
|
159
|
+
the schema using `ajv-cli` draft-2020-12. Same pattern as
|
|
160
|
+
`state-validate.sh` per `.claude/rules/state-schema-validation.md`.
|
|
161
|
+
|
|
162
|
+
On validation failure, the hook BLOCKs the write with structured
|
|
163
|
+
stderr message naming the field + ajv error.
|
|
164
|
+
|
|
165
|
+
### At hook fire time (runtime)
|
|
166
|
+
|
|
167
|
+
The thin-pointer hook itself reads `source_url` / `auth_method` /
|
|
168
|
+
`token_env` and surfaces a clear error if any are missing or malformed
|
|
169
|
+
when the curl-fallback path fires. Schema validation at write time
|
|
170
|
+
catches most issues before runtime.
|
|
171
|
+
|
|
172
|
+
### At session start (drift check)
|
|
173
|
+
|
|
174
|
+
Future hardening: `bassclef-sync.sh` could validate
|
|
175
|
+
`.bassclef-source.json` exists + parses cleanly at session start,
|
|
176
|
+
emitting a BLOCKED if the file is corrupt. Deferred — write-time
|
|
177
|
+
validation covers the common case.
|
|
178
|
+
|
|
179
|
+
## Test fixtures
|
|
180
|
+
|
|
181
|
+
Five fixtures, one per provider pattern:
|
|
182
|
+
|
|
183
|
+
- `scripts/tests/fixtures/bassclef-source/github-public-release.json`
|
|
184
|
+
- `scripts/tests/fixtures/bassclef-source/github-private-repo.json`
|
|
185
|
+
- `scripts/tests/fixtures/bassclef-source/github-private-release.json`
|
|
186
|
+
- `scripts/tests/fixtures/bassclef-source/azure-devops-repos.json`
|
|
187
|
+
- `scripts/tests/fixtures/bassclef-source/gitlab.json`
|
|
188
|
+
|
|
189
|
+
Test runner: `scripts/tests/bassclef-source.test.sh` validates every
|
|
190
|
+
fixture against the schema; CI fails if any fixture diverges.
|
|
191
|
+
|
|
192
|
+
Plus negative-case fixtures (each in its own file under
|
|
193
|
+
`scripts/tests/fixtures/bassclef-source/invalid/`) to verify the
|
|
194
|
+
schema rejects malformed configs.
|
|
195
|
+
|
|
196
|
+
## Operator workflow per consumer repo
|
|
197
|
+
|
|
198
|
+
1. Operator creates fine-grained PAT for bassclef (read-only,
|
|
199
|
+
90-day expiry). Track in `substrate.secrets.md` per
|
|
200
|
+
`standards/secrets-lifecycle.md`.
|
|
201
|
+
2. Operator pastes PAT into consumer's Cloud Code environment as
|
|
202
|
+
`BASSCLEF_TOKEN` (or per-consumer name if scoped tokens are used).
|
|
203
|
+
3. `/onboard-repo` writes `.bassclef-source.json` to consumer repo
|
|
204
|
+
root using the GitHub-private-repo template.
|
|
205
|
+
4. Operator commits + pushes; next session-start fires the
|
|
206
|
+
thin-pointer hook → curl fallback → bassclef substrate loaded.
|
|
207
|
+
|
|
208
|
+
## Relationship to other standards + rules
|
|
209
|
+
|
|
210
|
+
- `standards/secrets-lifecycle.md` — `token_env` references a secret
|
|
211
|
+
whose lifecycle is governed by this standard
|
|
212
|
+
- `.claude/rules/state-schema-validation.md` — write-time validation
|
|
213
|
+
pattern this standard composes
|
|
214
|
+
- `architecture/decisions/ADR-015-state-schema-format.md` — JSON
|
|
215
|
+
Schema draft-2020-12 with format support; this schema follows
|
|
216
|
+
- `.claude/skills/onboard-repo/SKILL.md` — installer that creates
|
|
217
|
+
`.bassclef-source.json` per the schema
|
|
218
|
+
- bassclef#418 — drift-check thin-pointer-aware (related; ships
|
|
219
|
+
alongside)
|
|
220
|
+
- bassclef#420 — secrets-primitive gap on Cloud Env (related; the
|
|
221
|
+
PAT lifecycle question this schema reveals)
|
|
222
|
+
|
|
223
|
+
## Retirement condition
|
|
224
|
+
|
|
225
|
+
This standard retires only if the thin-pointer hook architecture
|
|
226
|
+
retires. Provider examples may grow (BitBucket, codecommit, etc.) as
|
|
227
|
+
new providers are exercised; the schema itself is intentionally
|
|
228
|
+
minimal and should resist field additions.
|