@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,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
description: "We're committed to a welcoming, respectful community for everyone contributing to or using bassclef."
|
|
4
|
+
---
|
|
5
|
+
# Code of Conduct
|
|
6
|
+
|
|
7
|
+
We're committed to a welcoming, respectful community for everyone contributing to or using bassclef.
|
|
8
|
+
|
|
9
|
+
## Expected behavior
|
|
10
|
+
|
|
11
|
+
- Treat others with respect and good faith.
|
|
12
|
+
- Engage constructively with feedback and disagreement.
|
|
13
|
+
- Credit sources for content you contribute.
|
|
14
|
+
|
|
15
|
+
## Unacceptable behavior
|
|
16
|
+
|
|
17
|
+
- Harassment, personal attacks, or discriminatory language.
|
|
18
|
+
- Sharing others' private information without consent.
|
|
19
|
+
- Threats or encouragement of violence.
|
|
20
|
+
- Impersonating others or evading enforcement actions.
|
|
21
|
+
|
|
22
|
+
## Reporting
|
|
23
|
+
|
|
24
|
+
To report a violation, email conduct@bassclef.dev. Reports are handled privately.
|
|
25
|
+
|
|
26
|
+
## Scope
|
|
27
|
+
|
|
28
|
+
This applies to all project spaces — issues, pull requests, discussions, and any official project communication.
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
description: Bassclef is a framework for guiding AI agents through software development — skills, rules, hooks, and standards that compose into an opinionated SDLC substrate.
|
|
4
|
+
---
|
|
5
|
+
# Contributing to Bassclef
|
|
6
|
+
|
|
7
|
+
Bassclef is a framework for guiding AI agents through software development — skills, rules, hooks, and standards that compose into an opinionated SDLC substrate. This guide is for contributors extending it.
|
|
8
|
+
|
|
9
|
+
If you're adopting bassclef (not extending it), start with [`docs/bassclef-mental-model.md`](docs/bassclef-mental-model.md) — the 5-minute primer.
|
|
10
|
+
|
|
11
|
+
## Before you start
|
|
12
|
+
|
|
13
|
+
Read these three, in order:
|
|
14
|
+
|
|
15
|
+
1. **[`docs/bassclef-mental-model.md`](docs/bassclef-mental-model.md)** — the shape of the framework in 5 minutes
|
|
16
|
+
2. **[`docs/philosophy.md`](docs/philosophy.md)** — the nine threads of influence bassclef embeds and why
|
|
17
|
+
3. **[`.claude/rules/context-engineering.md`](.claude/rules/context-engineering.md)** — the foundational rule. Every skill, rule, and hook is improved by this lens.
|
|
18
|
+
|
|
19
|
+
Then browse the catalogs for the surface you're touching:
|
|
20
|
+
|
|
21
|
+
- [`docs/skills-catalog.md`](docs/skills-catalog.md) — all skills
|
|
22
|
+
- [`docs/hooks-catalog.md`](docs/hooks-catalog.md) — all hooks
|
|
23
|
+
- [`docs/rules-catalog.md`](docs/rules-catalog.md) — all rules
|
|
24
|
+
- [`docs/glossary.md`](docs/glossary.md) — the vocabulary
|
|
25
|
+
|
|
26
|
+
## The contribution model
|
|
27
|
+
|
|
28
|
+
Bassclef's substrate is **markdown + bash + git**. No proprietary runtime. Contributing means editing markdown files and bash scripts, then opening a PR.
|
|
29
|
+
|
|
30
|
+
Four surfaces you can contribute to:
|
|
31
|
+
|
|
32
|
+
| Surface | Where | What it is |
|
|
33
|
+
|---|---|---|
|
|
34
|
+
| **Skill** | `.claude/skills/<name>/SKILL.md` | A named workflow the agent invokes |
|
|
35
|
+
| **Rule** | `.claude/rules/<name>.md` | A methodology constraint auto-loaded every session |
|
|
36
|
+
| **Hook** | `.claude/hooks/<name>.sh` | Mechanical enforcement firing on tool-use events |
|
|
37
|
+
| **Standard** | `standards/<name>.md` | A reference document |
|
|
38
|
+
|
|
39
|
+
Not sure which surface fits? The `/skill` skill runs a taxonomy gate (skill / rule / hook?) before scaffolding. Use it.
|
|
40
|
+
|
|
41
|
+
### Operator-private vs adopter-facing
|
|
42
|
+
|
|
43
|
+
The `docs/operator-private/` directory in your clone contains only a README placeholder. That's intentional — operator-private substrate (internal deliberation, strategy notes) lives in a separate private repo. Contributors don't need to populate or interact with it. The discipline: strategy artifacts stay private; only reference substrate (rules, hooks, standards) ships to the public bassclef repo.
|
|
44
|
+
|
|
45
|
+
If you're the bassclef maintainer (operator), `scripts/operator-setup.sh` sets up the symlink workflow when the private repo is cloned at the expected sibling location. The script is idempotent + a no-op for adopter clones; adopters can ignore it.
|
|
46
|
+
|
|
47
|
+
## How to contribute a change
|
|
48
|
+
|
|
49
|
+
### 1. Open an issue first
|
|
50
|
+
|
|
51
|
+
Every branch ties to an issue. The issue body opens with a flash (≤180 chars) + tweet (≤280 chars) + `---` + detail, per [`.claude/rules/github-issue-flash-tweet.md`](.claude/rules/github-issue-flash-tweet.md). Operators scan flash → tweet → decide.
|
|
52
|
+
|
|
53
|
+
### 2. Branch from main
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
feature/ISSUE-NNN-short-description
|
|
57
|
+
fix/ISSUE-NNN-short-description
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Trunk-based. Main is always deployable. No branches older than 5 days — break large work into a stack.
|
|
61
|
+
|
|
62
|
+
### 3. Follow the rules that fire on your surface
|
|
63
|
+
|
|
64
|
+
Rules auto-load every session. The ones you'll feel most when contributing:
|
|
65
|
+
|
|
66
|
+
- **`context-engineering.md`** — every "DON'T do X" instruction needs a paired "INSTEAD do Y." The stateless model can't act on negation alone.
|
|
67
|
+
- **`skill-description-clarity.md`** — skill descriptions ≤280 chars, verb-first, no jargon. The `substrate-clarity-gate` hook BLOCKs violations.
|
|
68
|
+
- **`plain-english-discipline.md`** — grade-10 vocabulary. Keep standard tech terms; drop framework-internal jargon.
|
|
69
|
+
- **`artifact-ingestion.md`** — read every referenced artifact before producing output. State "Sources read" upfront.
|
|
70
|
+
- **`pr-strategy.md`** — stacked atomic branches by default; one work-unit per PR.
|
|
71
|
+
|
|
72
|
+
The full set: [`docs/rules-catalog.md`](docs/rules-catalog.md).
|
|
73
|
+
|
|
74
|
+
### 4. Hooks will check your work
|
|
75
|
+
|
|
76
|
+
When you edit a skill or rule, the `substrate-clarity-gate` hook validates description length + verb-first opener + paired-discipline INSTEAD-blocks. When you write a state-spine file, `state-validate` checks it against the JSON schema. These BLOCK the write if you've drifted — read the stderr, adjust, retry.
|
|
77
|
+
|
|
78
|
+
The full set: [`docs/hooks-catalog.md`](docs/hooks-catalog.md).
|
|
79
|
+
|
|
80
|
+
### 5. Commit conventions
|
|
81
|
+
|
|
82
|
+
```
|
|
83
|
+
<type>: <description>
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Types: `feat`, `fix`, `docs`, `refactor`, `test`, `ci`, `chore`, `security`. Imperative mood, lowercase, no period, ≤72 chars. The body explains *why* — the diff shows *what*.
|
|
87
|
+
|
|
88
|
+
### 6. Open the PR
|
|
89
|
+
|
|
90
|
+
PR title becomes the squash-merge commit. PR body opens with flash + tweet, same as issues. Include a test plan.
|
|
91
|
+
|
|
92
|
+
### 7. CI runs
|
|
93
|
+
|
|
94
|
+
The PR triggers three blocking substrate-coherence checks (bassclef#739):
|
|
95
|
+
|
|
96
|
+
- **Rule 1 — Jargon enforcement** — blocks PR body containing bassclef-internal jargon (composer, primitive, tier-preset, load-bearing, blast radius, compose-with, scope-bounded, operationalize). Override via `bassclef-internal-prose-ok` label for intentional exceptions.
|
|
97
|
+
- **Rule 3 — Operator-private path enforcement** — blocks persona-review-shaped, canvas-shaped, or proposal-shaped artifacts outside `docs/operator-private/`. Same label override.
|
|
98
|
+
- **Rule 4 — PR-body scrub** — blocks operator-private path citations + operator-strategic deliberation framing in PR body. Same label override.
|
|
99
|
+
|
|
100
|
+
Plus an advisory body-clarity check (does not block; flags long sentences + jargon for review). Address failures before requesting review.
|
|
101
|
+
|
|
102
|
+
## Branch-stacking discipline
|
|
103
|
+
|
|
104
|
+
When work splits into multiple dependent PRs, follow the mandatory protocol per [`standards/branch-stacking.md`](standards/branch-stacking.md):
|
|
105
|
+
|
|
106
|
+
- Each PR ships one work unit; revertable independently
|
|
107
|
+
- **Retarget-before-merge is mandatory when dependents exist** — retarget dependent PRs to `main` via `gh pr edit <PR> --base main` BEFORE merging the parent with `--delete-branch`. Skipping retarget causes GitHub to auto-close dependents (rebase-after-merge fallback is recovery, not first-class choice).
|
|
108
|
+
- Pre-merge audit: `scripts/check-stack-dependents.sh <PR>` lists open dependents before you trigger the merge
|
|
109
|
+
|
|
110
|
+
## Plain-language discipline
|
|
111
|
+
|
|
112
|
+
All operator-facing prose (PR bodies, chronicle entries, ticket bodies, summary tables) passes through `/kiss words` by default. See [`standards/operator-facing-prose-discipline.md`](standards/operator-facing-prose-discipline.md) for the three Tweet rules:
|
|
113
|
+
|
|
114
|
+
1. **Fit in 280 chars** (bassclef#785)
|
|
115
|
+
2. **Keep scoping qualifiers** — "deferred within Tier 1" not just "deferred" (bassclef#805)
|
|
116
|
+
3. **Lead with the goal**, then say what was done (bassclef#831)
|
|
117
|
+
|
|
118
|
+
Shorthand references (WU-N, F-X.Y, ADR-NNN, #NNN) carry a plain-language gloss at first mention per response.
|
|
119
|
+
|
|
120
|
+
## Writing a new skill
|
|
121
|
+
|
|
122
|
+
`/skill` composes a new skill from idea to conforming `SKILL.md`. It runs the taxonomy gate first, generates a verb-first plain-language description, scaffolds the frame, and pre-validates against the live clarity gate before writing.
|
|
123
|
+
|
|
124
|
+
Skill frontmatter requirements:
|
|
125
|
+
|
|
126
|
+
- `name` — matches the directory name; not a reserved Claude Code built-in (see [`standards/reserved-skill-names.md`](standards/reserved-skill-names.md))
|
|
127
|
+
- `description` — ≤280 chars, verb-first, names any `modes:` declared
|
|
128
|
+
- `user_invocable` + `disable_model_invocation` — the invocation contract
|
|
129
|
+
|
|
130
|
+
A skill is **composite** (hands-off-execution — returns a clickable artifact) or **atomic** (hands-off-planning — drives a thinking-and-decision loop). Know which you're building. See [`docs/skills-catalog.md`](docs/skills-catalog.md).
|
|
131
|
+
|
|
132
|
+
## Writing a new rule
|
|
133
|
+
|
|
134
|
+
Rules are methodology constraints. They auto-load every session via `additionalDirectories` — the agent doesn't invoke them.
|
|
135
|
+
|
|
136
|
+
A good rule:
|
|
137
|
+
|
|
138
|
+
- States the constraint, then **Why** (the reason, often a past incident), then **How to apply** (when/where it fires)
|
|
139
|
+
- Pairs every "DON'T" with an "INSTEAD" (the foundational `context-engineering.md` discipline)
|
|
140
|
+
- Names its enforcement — methodology-level, or which hook BLOCKs it
|
|
141
|
+
- Names its override path (most rules have a `SKIP_*` env var; methodology-level rules don't)
|
|
142
|
+
|
|
143
|
+
## Writing a new hook
|
|
144
|
+
|
|
145
|
+
Hooks are mechanical enforcement. They fire on tool-use events (PreToolUse, PostToolUse, SessionStart, Stop, UserPromptSubmit).
|
|
146
|
+
|
|
147
|
+
A good hook:
|
|
148
|
+
|
|
149
|
+
- Has a header comment — what it fires on, what it checks, why it exists
|
|
150
|
+
- Is **idempotent** — running it twice with the same input produces the same result (see [`standards/hook-idempotency.md`](standards/hook-idempotency.md))
|
|
151
|
+
- Provides a `SKIP_*` override env var, logged via `trace-helper`
|
|
152
|
+
- Has test coverage in `.claude/hooks/tests/`
|
|
153
|
+
|
|
154
|
+
## Promoting a pattern back to bassclef
|
|
155
|
+
|
|
156
|
+
If you're using bassclef in your own repo and discover a pattern worth sharing, the `/promote` skill files a `bassclef-evolution` issue. Patterns discovered in projects compound into the substrate.
|
|
157
|
+
|
|
158
|
+
## What bassclef is NOT
|
|
159
|
+
|
|
160
|
+
- **Not a code generator.** It guides the agent through the SDLC; the agent writes the code.
|
|
161
|
+
- **Not a CI tool.** It runs locally + via hooks. CI surfaces show its outputs but it doesn't replace your CI.
|
|
162
|
+
- **Not opinionated about your stack.** Works with any language / framework / cloud.
|
|
163
|
+
- **Not greenfield-only.** Bassclef drops onto an existing repo. The substrate goes in `.claude/`; your code stays in `src/`.
|
|
164
|
+
|
|
165
|
+
## Code of conduct
|
|
166
|
+
|
|
167
|
+
Be direct, be kind, assume good faith. Bassclef is opinionated by design — disagreement about the opinions is welcome, expressed as a reasoned issue, not a drive-by. The substrate evolves through `/promote` and reasoned PRs, not through unilateral rewrites of essential rules.
|
|
168
|
+
|
|
169
|
+
A formal `CODE_OF_CONDUCT.md` (Contributor Covenant 2.1) is planned for the open-source launch. Until it lands, the above guidance applies.
|
|
170
|
+
|
|
171
|
+
## Questions
|
|
172
|
+
|
|
173
|
+
Open an issue with the `question` label. For "how do I use bassclef" questions, the mental-model primer + glossary answer most of them first.
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
*Bassclef is markdown + bash + git. If you can read a file and run a script, you can contribute.*
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
description: A shared substrate for working with AI coding agents.
|
|
4
|
+
---
|
|
5
|
+
# Bassclef
|
|
6
|
+
|
|
7
|
+
> **If you are new — start here.** Three short reads in this order:
|
|
8
|
+
> 1. The [Mental Model](https://github.com/sunj-labs/bassclef/wiki/Mental-Model) — one page; what bassclef is and what it isn't.
|
|
9
|
+
> 2. The [Skill lifecycle diagram](https://github.com/sunj-labs/bassclef/wiki/Diagrams) — one image; the full skill catalog at a glance.
|
|
10
|
+
> 3. The [Getting Started](https://github.com/sunj-labs/bassclef/wiki/Getting-Started) page — three commands; substrate live in your repo.
|
|
11
|
+
>
|
|
12
|
+
> Then read the rest of this README as background. About 10 minutes total.
|
|
13
|
+
|
|
14
|
+
**A shared substrate for working with AI coding agents.** Install it once into your repo, and every Claude Code session starts loaded: 76 skills, 53 rules, 16 agents, 32 practitioner profiles, 27 hooks, 67 standards, and 27 ADRs that wire them together. The agent reads your rules, knows the catalog, handles failure cleanly, and ships with discipline. You stop re-explaining your conventions every session — the difference between an assistant you brief and a band that already knows the set.
|
|
15
|
+
|
|
16
|
+
It is not a product. It is not a SaaS. It's a public framework, Apache 2.0: clone the repo, run the install script, own your stack.
|
|
17
|
+
|
|
18
|
+
**Two install paths.** [Curl install](docs/getting-started.md) — one command per project, works once bassclef is public and your network allows `raw.githubusercontent.com`. [Clone install](docs/install-from-clone.md) — one clone of bassclef, wire many projects against it as siblings, one place to `git pull` for updates. Pre-launch adopters and multi-project operators pick the clone path.
|
|
19
|
+
|
|
20
|
+
## Who this is for
|
|
21
|
+
|
|
22
|
+
**Solo system / app / portfolio operators.** The person running multiple software projects in parallel — apps, internal systems, side bets, family operations — around a day job, around family, around the other things that don't pause. Real deadlines, real stakes, no headcount. Other audiences may benefit; this is the one SENTINEL_bassclef_commits to.
|
|
23
|
+
|
|
24
|
+
## Why this exists
|
|
25
|
+
|
|
26
|
+
A kid of immigrant entrepreneurs becomes one in his 20s with a hundred ideas and two hands. Every idea needed a team; teams needed money; money needed the ideas to work. Most entrepreneurship dies in that loop. Twenty-five years later — after launching the Alexa Skills Kit and building enterprise collaboration tools before their time — I hit the loop again. I hold power of attorney for my parents and run their affairs alongside acquiring small businesses on their behalf. Real deadlines, real stakes, no headcount. So I built the band I couldn't hire.
|
|
27
|
+
|
|
28
|
+
That origin is why bassclef is shaped the way it is:
|
|
29
|
+
|
|
30
|
+
- **Apache 2.0, no SaaS** — a capital bypass has to be free. Anthropic's 81k-person global study found entrepreneurship-with-AI resonates most where funding is scarcest; this is for the operator with ideas and no budget line.
|
|
31
|
+
- **Cheap by design** — small models route mechanical work; hard cost ceilings cap every run. Built by one person paying his own bills.
|
|
32
|
+
- **Local-first** — it works without expensive infrastructure, because mine had to.
|
|
33
|
+
- **Discipline as substrate** — rules, skills, and practitioner profiles load at session start because a solo operator can't afford to re-explain conventions, and an agent without a chart is a session musician with no memory of the band.
|
|
34
|
+
|
|
35
|
+
The acceptance test for v1 wasn't a demo — it was a live ticket from my parents' actual work. When it closed, the repo opened.
|
|
36
|
+
|
|
37
|
+
## What's actually shipped
|
|
38
|
+
|
|
39
|
+
Not theoretical. Bassclef runs today across eight repos in active use:
|
|
40
|
+
|
|
41
|
+
- **A private sibling repo for strategy notes** — canvases, audits, and locked decisions. Adopters replicate the pattern with a separate private repo cloned alongside their bassclef checkout.
|
|
42
|
+
- **Seven application repos in daily use** — from a power-of-attorney tracker for my family to a collaborative travel planner to a recipe database. Each one is code I use myself, not a demo.
|
|
43
|
+
|
|
44
|
+
The pattern: build the apps on the go, each repo's friction feeds back into bassclef as evolution tickets, the substrate hardens with every shipped feature.
|
|
45
|
+
|
|
46
|
+
**4,650 commits and 3,409 merged PRs to date** across the portfolio. The substrate you'd adopt is the one already smoke-tested across seven repos in production.
|
|
47
|
+
|
|
48
|
+
## Full documentation
|
|
49
|
+
|
|
50
|
+
The complete adopter docs live in the bassclef wiki: **[github.com/sunj-labs/bassclef/wiki](https://github.com/sunj-labs/bassclef/wiki)**.
|
|
51
|
+
|
|
52
|
+
Start there for [Getting Started](https://github.com/sunj-labs/bassclef/wiki/Getting-Started) (3-step fast path), [First-use sequence](https://github.com/sunj-labs/bassclef/wiki/First-Use-Sequence) (what bassclef actually does end-to-end), [Install paths](https://github.com/sunj-labs/bassclef/wiki/Install), [FAQ](https://github.com/sunj-labs/bassclef/wiki/FAQ), [Architecture Overview](https://github.com/sunj-labs/bassclef/wiki/Architecture-Overview), [Glossary](https://github.com/sunj-labs/bassclef/wiki/Glossary), and the [Luminary catalog](https://github.com/sunj-labs/bassclef/wiki/Luminary-Catalog).
|
|
53
|
+
|
|
54
|
+
## Before you start
|
|
55
|
+
|
|
56
|
+
Bassclef assumes a few things already work on your machine. Five minutes of setup before the build path:
|
|
57
|
+
|
|
58
|
+
| You need | How to check | If missing |
|
|
59
|
+
|---|---|---|
|
|
60
|
+
| A GitHub account | sign in to github.com | create one — free |
|
|
61
|
+
| `gh` CLI installed + authenticated | `gh auth status` | `brew install gh && gh auth login` |
|
|
62
|
+
| Claude Code installed | `command -v claude` | follow [code.claude.com](https://code.claude.com) install steps |
|
|
63
|
+
| `ANTHROPIC_API_KEY` set | `echo $ANTHROPIC_API_KEY` (non-empty) | get a key at [console.anthropic.com](https://console.anthropic.com) and `export` it |
|
|
64
|
+
| `git` installed | `git --version` | install from [git-scm.com](https://git-scm.com) |
|
|
65
|
+
| `python3` installed | `python3 --version` | macOS: pre-installed. Linux: `apt install python3`. Required by bassclef hooks (per [ADR-028](https://github.com/sunj-labs/bassclef/blob/main/architecture/decisions/ADR-028-python3-as-substrate-runtime.md)) |
|
|
66
|
+
|
|
67
|
+
Once those check out, pick a path.
|
|
68
|
+
|
|
69
|
+
## Two paths in
|
|
70
|
+
|
|
71
|
+
### Path A — Cold adopter (paragraph in, working preview out)
|
|
72
|
+
|
|
73
|
+
You have an idea. You don't have an issue tracker yet. You just want to see something real on your screen.
|
|
74
|
+
|
|
75
|
+
| Step | What | Time |
|
|
76
|
+
|---|---|---|
|
|
77
|
+
| 1 | `/onboard-repo` — installs substrate + asks "what is this repo for?"; auto-chains `/launch --local` with your paragraph | 60s |
|
|
78
|
+
| 2 | Wait — bassclef extracts intent, picks practitioner profiles, generates 4 variant directions | 4 min |
|
|
79
|
+
| 3 | Walk the variant gallery on your phone or laptop; say "I like variant 2" (or "none of these — try X instead") | 3 min |
|
|
80
|
+
| 4 | Wait — bassclef writes the formal artifacts (use case, user stories, IA, interaction design, spec, migration plan) for the chosen direction only | 5 min |
|
|
81
|
+
| 5 | `/build <bet-slug>` — dispatches per-work-unit feature branches with tests + PRs | continues asynchronously |
|
|
82
|
+
|
|
83
|
+
**Total to first variant pick: ~7 min.** Per-WU PRs land as `/build` works through the stack. You merge as they pass review.
|
|
84
|
+
|
|
85
|
+
This is the "I just want to build something" path. No tickets to file. No roadmap to maintain. The substrate handles the chain.
|
|
86
|
+
|
|
87
|
+
### Path B — Existing repo with open work
|
|
88
|
+
|
|
89
|
+
You have a repo with open issues, an iteration bet in flight, a roadmap. You want bassclef to help you execute against existing work, not invent new scope.
|
|
90
|
+
|
|
91
|
+
| Step | What | Time |
|
|
92
|
+
|---|---|---|
|
|
93
|
+
| 1 | `/onboard-repo` — installs substrate; closing handoff defers (no auto-chain in operator mode) | 60s |
|
|
94
|
+
| 2 | `/sprint` + `/whereami` — orient to project state + open issues + active iteration bet | 90s |
|
|
95
|
+
| 3 | Pick work from open issues / iteration bet; create a feature branch | 30s |
|
|
96
|
+
| 4 | `/stage quick "<scope>"` (variants) **OR** `/launch medium "<scope>"` (full plan) **OR** direct edits | 3-5 min |
|
|
97
|
+
| 5 | `/verify` — runs the test path matched to your change type | 60s |
|
|
98
|
+
| 6 | `git commit` + `git push` — pre-commit gate + scrub hooks fire automatically | 90s |
|
|
99
|
+
| 7 | `/session-end` — chronicle entry + whereami update + clean close | 90s |
|
|
100
|
+
|
|
101
|
+
**Total: ~12 min.** Operator opens a PR via GitHub UI or `gh pr create`.
|
|
102
|
+
|
|
103
|
+
Requires existing open issues, an iteration bet, or a roadmap. Without those, `/sprint` will surface "nothing in flight" and recommend Path A. Operator-mode is the sustained-work path; Path A is the first-contact path.
|
|
104
|
+
|
|
105
|
+
## What you can do with it
|
|
106
|
+
|
|
107
|
+
- **Dispatch a paragraph from your phone** → returns as a working preview on localhost
|
|
108
|
+
- **Run a long autonomous session** that paces itself, checkpoints at phase boundaries, and closes with a chronicle + retrospective
|
|
109
|
+
- **Combine skills** across the full SDLC (shape → spec → design → build → verify → deploy)
|
|
110
|
+
- **Audit the substrate against itself** via hooks + rules + the context-engineering rule that catches drift
|
|
111
|
+
|
|
112
|
+
## Substrate at a glance
|
|
113
|
+
|
|
114
|
+
| Component | Count | Where | Catalog |
|
|
115
|
+
|-----------|------:|-------|---------|
|
|
116
|
+
| Skills | 75 | `.claude/skills/*/SKILL.md` | [skills catalog](https://github.com/sunj-labs/bassclef/blob/main/docs/skills-catalog.md) |
|
|
117
|
+
| Hooks | 25 | `.claude/hooks/*.sh` | [hooks catalog](https://github.com/sunj-labs/bassclef/blob/main/docs/hooks-catalog.md) |
|
|
118
|
+
| Rules | 48 | `.claude/rules/*.md` | [rules catalog](https://github.com/sunj-labs/bassclef/blob/main/docs/rules-catalog.md) |
|
|
119
|
+
| Agents | 13 | `.claude/agents/*.md` | — |
|
|
120
|
+
| Practitioner profiles | 31 | `.claude/luminaries/*.md` (plus 1 TEMPLATE.md scaffold for new entries) | [wiki Luminary catalog](https://github.com/sunj-labs/bassclef/wiki/Luminary-Catalog) |
|
|
121
|
+
| Standards | 65 | `standards/` | — |
|
|
122
|
+
| ADRs | 26 | `architecture/decisions/` | — |
|
|
123
|
+
|
|
124
|
+
Browse interactively: `/skills`, `/hooks`. Past the build path, adopters pick up additional skills from the catalogs as needs surface.
|
|
125
|
+
|
|
126
|
+
## Team adopters
|
|
127
|
+
|
|
128
|
+
The substrate is shaped for solo operators, not teams. Teams will still find value: the state spine, the test + verify chain, and the auto-loading rules translate to team contexts (engineer A pairs Monday → `/sprint` surfaces context for engineer B Wednesday). Methodology evolution will favor solo-operator concerns; team adopters who borrow the substrate accepting that constraint do well.
|
|
129
|
+
|
|
130
|
+
Total team cost to adopt: about 3 engineer-days for a 5-person team in week 1.
|
|
131
|
+
|
|
132
|
+
## Foundations
|
|
133
|
+
|
|
134
|
+
Bassclef is context engineering applied to the full software development lifecycle. The discipline has a name and a literature:
|
|
135
|
+
|
|
136
|
+
- **[Karpathy — context engineering](https://x.com/karpathy/status/1937902205765607626)**: "LLM is the CPU, context window is RAM." Prompts as filling a finite working-memory buffer.
|
|
137
|
+
- **[Willison — stateless tool framing](https://fedi.simonwillison.net/@simon/114757992443676572)**: every conversation starts cold; the model knows what it knows only via what's in the prompt.
|
|
138
|
+
- **[Anthropic — Effective context engineering for AI agents](https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents)**: vendor-validated principles for context budgeting, persistence, and tool design.
|
|
139
|
+
|
|
140
|
+
Bassclef builds on eight more threads — distributed state management, multi-agent coordination, methodology (Shape Up, DDD), strategy canvases (Strategyzer, Lean Canvas, PR/FAQ), Jobs-to-be-Done, use-case design (Cockburn), red/green/refactor testing (Beck), and rapid prototyping (IDEO, design thinking). Each thread, who it comes from, and where it lives in the substrate: [philosophy](https://github.com/sunj-labs/bassclef/wiki/Philosophy).
|
|
141
|
+
|
|
142
|
+
## Start here
|
|
143
|
+
|
|
144
|
+
| Doc | What it is |
|
|
145
|
+
|---|---|
|
|
146
|
+
| [Mental Model](https://github.com/sunj-labs/bassclef/wiki/Mental-Model) | 5-minute primer — where things live, which skills to invoke, brownfield retrofit |
|
|
147
|
+
| [Glossary](https://github.com/sunj-labs/bassclef/wiki/Glossary) | The vocabulary — iteration bet, work unit, stack, marker, BLOCKED, and more |
|
|
148
|
+
| [Philosophy](https://github.com/sunj-labs/bassclef/wiki/Philosophy) | Nine threads of influence bassclef embeds and where each lives |
|
|
149
|
+
| [Overview](https://github.com/sunj-labs/bassclef/wiki/Overview) | Long-form — what bassclef is, how it works, where it's going |
|
|
150
|
+
| [Contributing](https://github.com/sunj-labs/bassclef/blob/main/CONTRIBUTING.md) | How to extend bassclef — four surfaces, contribution flow, per-surface guides |
|
|
151
|
+
|
|
152
|
+
## License + sustainability
|
|
153
|
+
|
|
154
|
+
Apache 2.0. Single-operator project today; the substrate is markdown + bash + git, so adopters retain everything that ships even if maintainer velocity changes. Business model is community-open — no commercial-pivot pressure on your adoption.
|
|
155
|
+
|
|
156
|
+
## Contributing
|
|
157
|
+
|
|
158
|
+
Bassclef is markdown + bash + git. If you can read a file and run a script, you can contribute. See [CONTRIBUTING](https://github.com/sunj-labs/bassclef/blob/main/CONTRIBUTING.md) — four surfaces (skill, rule, hook, standard), a 7-step contribution flow, per-surface authoring guides.
|
|
159
|
+
|
|
160
|
+
## Key files
|
|
161
|
+
|
|
162
|
+
- [Mental Model](https://github.com/sunj-labs/bassclef/wiki/Mental-Model) — 5-minute adopter primer
|
|
163
|
+
- [Glossary](https://github.com/sunj-labs/bassclef/wiki/Glossary) — the vocabulary
|
|
164
|
+
- [Philosophy](https://github.com/sunj-labs/bassclef/wiki/Philosophy) — eight threads of influence
|
|
165
|
+
- [Skills catalog](https://github.com/sunj-labs/bassclef/blob/main/docs/skills-catalog.md) · [Hooks catalog](https://github.com/sunj-labs/bassclef/blob/main/docs/hooks-catalog.md) · [Rules catalog](https://github.com/sunj-labs/bassclef/blob/main/docs/rules-catalog.md) — substrate catalogs
|
|
166
|
+
- [Context engineering framing](https://github.com/sunj-labs/bassclef/blob/main/design/bassclef-as-context-engineering.md) — substrate-truth framing
|
|
167
|
+
- [Context engineering rule](https://github.com/sunj-labs/bassclef/blob/main/.claude/rules/context-engineering.md) — the foundational rule
|
|
168
|
+
- Agent choreography — multi-agent operational guide (operator substrate)
|
|
169
|
+
- whereami — current project state (operator substrate)
|
|
170
|
+
|
|
171
|
+
## Operator-private substrate
|
|
172
|
+
|
|
173
|
+
The `docs/operator-private/` directory contains only a README placeholder in adopter clones. Operator-private substrate (internal deliberation, strategy notes) lives in a separate private repo cloned alongside bassclef.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
description: "Please report security vulnerabilities privately via GitHub's security advisory system:"
|
|
4
|
+
---
|
|
5
|
+
# Security Policy
|
|
6
|
+
|
|
7
|
+
## Reporting a vulnerability
|
|
8
|
+
|
|
9
|
+
Please report security vulnerabilities privately via GitHub's security advisory system:
|
|
10
|
+
|
|
11
|
+
**https://github.com/sunj-labs/bassclef/security/advisories/new**
|
|
12
|
+
|
|
13
|
+
Do not report security issues via public GitHub issues, discussions, or pull requests.
|
|
14
|
+
|
|
15
|
+
We aim to acknowledge reports within 72 hours and provide an initial response within 7 days.
|
|
16
|
+
|
|
17
|
+
## Supported versions
|
|
18
|
+
|
|
19
|
+
Bassclef is pre-1.0. Security fixes apply to the current main branch. Once tagged releases ship, this policy will be updated with version support details.
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
adr: ADR-029
|
|
4
|
+
title: Release pipeline — tier-filtered export from bassclef-upstream to public bassclef
|
|
5
|
+
status: accepted
|
|
6
|
+
date: 2026-06-21
|
|
7
|
+
description: bassclef-upstream is the upstream experimental source-of-truth (WU-0).
|
|
8
|
+
---
|
|
9
|
+
<!-- andon-allow: operator-private -->
|
|
10
|
+
<!-- andon-allow: bassclef-upstream -->
|
|
11
|
+
<!-- andon-allow: locked-decisions -->
|
|
12
|
+
|
|
13
|
+
# ADR-029 — Release pipeline (bassclef-upstream → public bassclef)
|
|
14
|
+
|
|
15
|
+
## Context
|
|
16
|
+
|
|
17
|
+
bassclef-upstream is the upstream experimental source-of-truth (WU-0). Public bassclef is the downstream release mirror. One operator, two repos, one direction of flow per the simplified Linux-kernel model (ADR-022 established the rename-in-place rationale that made this split sustainable).
|
|
18
|
+
|
|
19
|
+
Without a defined release pipeline, every release is either manual cherry-pick (slow, error-prone) or an unfiltered rsync (catastrophic — operator-private content ships). Neither is acceptable.
|
|
20
|
+
|
|
21
|
+
## Decision
|
|
22
|
+
|
|
23
|
+
Implement `scripts/release-to-bassclef.sh` with the following discipline:
|
|
24
|
+
|
|
25
|
+
1. **Tier-tagged frontmatter filter.** Each substrate file carries a `tier:` field with value `private | basic | premium | public` (per ADR + `standards/tier-tag-schema.md`). The script ships `basic` + `public`, excludes `private` + `premium`. Untagged legacy files default to `public`.
|
|
26
|
+
|
|
27
|
+
2. **Andon scan (jidoka stop-the-line).** Before any cross-repo write, grep the filtered file set for operator-private patterns (`operator-private`, `bassclef-upstream`, `locked-decisions`, plus any BLOCK-tier term in `standards/bassclef-internal-jargon.md`). Any match → STOP, surface file+line, refuse to push. Per-file override via `# andon-allow: <term>` header. Process-wide override via `SKIP_ANDON=1` (logged; never in prod).
|
|
28
|
+
|
|
29
|
+
3. **PR-based, never direct push.** Script rsyncs into the target repo working tree, commits on a `release-YYYY-MM-DD-<sha>` branch, pushes, and opens a PR against public bassclef main. Operator merges after review. No direct main-branch writes.
|
|
30
|
+
|
|
31
|
+
4. **Source tag for rollback.** Every release tags bassclef-upstream with `release-YYYY-MM-DD-<sha>` before any external action. Rollback = revert the PR + delete the tag; the source state is recoverable.
|
|
32
|
+
|
|
33
|
+
5. **Operator-fired cadence.** No cron. Operator runs `/release` when they want to ship. Conway lens — one operator IS the cadence signal; automated cadence would manufacture artificial release rhythm.
|
|
34
|
+
|
|
35
|
+
## Alternatives considered
|
|
36
|
+
|
|
37
|
+
| Alternative | Why rejected |
|
|
38
|
+
|---|---|
|
|
39
|
+
| Manual cherry-pick per file | Slow + error-prone + invites operator to skip the andon scan |
|
|
40
|
+
| Cron-scheduled auto-release | One-operator org doesn't need automated cadence (Conway); manufactures rhythm |
|
|
41
|
+
| Path-allowlist filter without tier | Too coarse for the iterative basic→premium graduation operator wanted (per session's plan-mode decision) |
|
|
42
|
+
| Direct push to public main | Branch protection on public main makes this impossible; PR-based works in both modes |
|
|
43
|
+
| Bidirectional sync (git subtree / submodule) | Adopter-PR merge to public would diverge; next `--delete` rsync would obliterate silently. PR cherry-pick into private preserves credit (per ADR-030) |
|
|
44
|
+
|
|
45
|
+
## Luminary rationale
|
|
46
|
+
|
|
47
|
+
- **Taiichi Ohno (jidoka)** — andon scan is the stop-the-line mechanism. Any operator-private term in shipped content trips the cord; release halts; operator diagnoses before resuming. No silent ship.
|
|
48
|
+
- **Vaughn Vernon (bounded contexts)** — the release script IS the explicit context map between the private-experimental and public-hardened bounded contexts. Every cross-context translation runs through one channel.
|
|
49
|
+
- **Melvin Conway (one source-of-truth)** — single release valve, single direction of flow, single operator firing it. Reject Linus's distributed subsystem-maintainer ceremony as overkill for one operator.
|
|
50
|
+
|
|
51
|
+
## Consequences
|
|
52
|
+
|
|
53
|
+
**Positive:**
|
|
54
|
+
- Operator gets one-command release with confidence (tier counts + andon clean before any cross-repo write)
|
|
55
|
+
- Iterative releases possible per feature (basic → premium graduation)
|
|
56
|
+
- Operator-private content cannot ship through this channel by accident
|
|
57
|
+
- PR-based release preserves review surface + rollback posture
|
|
58
|
+
|
|
59
|
+
**Negative / accepted trade-offs:**
|
|
60
|
+
- Operator must remember to fire `/release` (no automated cadence)
|
|
61
|
+
- Untagged legacy files default to public — if operator wanted them private, they must explicitly tier-tag (defense in depth via `docs/operator-private/**` path exclusion covers most cases)
|
|
62
|
+
- First-run risk: if the andon scan has a bug, operator-private content could ship. Mitigated by WU-4 verification gates including an intentional-leak andon trip test before Doors Open
|
|
63
|
+
- Tag clutter: each release creates a tag. After N releases, `git tag | grep release` is noisy. Acceptable for the cadence we expect (~weekly)
|
|
64
|
+
|
|
65
|
+
## Status
|
|
66
|
+
|
|
67
|
+
Accepted 2026-06-21. Implementation in commits shipping under WU-2 (#7). Verified by WU-4 (#10) before Doors Open.
|
|
68
|
+
|
|
69
|
+
## See also
|
|
70
|
+
|
|
71
|
+
- ADR-022 — rename-in-place (the move that made one-source-of-truth feasible)
|
|
72
|
+
- ADR-030 — adopter inbox flow (the complementary ingestion direction)
|
|
73
|
+
- ADR-032 — adopter-sync dispatcher architecture (what the release ships into adopter repos via `install.sh` — see `#1330`)
|
|
74
|
+
- `standards/tier-tag-schema.md` — the field definition this script consumes
|
|
75
|
+
- `scripts/release-to-bassclef.sh` — the implementation
|
|
76
|
+
- `.claude/skills/release/SKILL.md` — operator-invocable wrapper
|
|
77
|
+
- `architecture/tier-system-and-release-flow.md` § "Subsystem 4 — Release pipeline" + § "Subsystem 5 — Cold-adopter install bootstrap" — end-to-end view of tier + registry + manifest + release + install
|
|
78
|
+
- WU-2 (#7), WU-4 (#10) — work units shipping + verifying this pipeline
|
|
79
|
+
- bassclef-upstream `#1330` — cold-adopter install.sh missing (release ships install.sh once it lands; see architecture doc Subsystem 5)
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
adr: ADR-031
|
|
4
|
+
title: Non-breaking changes to adopters — substrate stability discipline
|
|
5
|
+
status: accepted
|
|
6
|
+
date: 2026-06-21
|
|
7
|
+
description: bassclef positions itself as an open substrate for Claude Code.
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# ADR-031 — Non-breaking changes to adopters
|
|
11
|
+
|
|
12
|
+
## Context
|
|
13
|
+
|
|
14
|
+
bassclef positions itself as an open substrate for Claude Code. Once public adopters exist (and they will, per the morning's Doors Open arc), every breaking change costs adopter trust. The discipline that protects that trust must be Tier 1, on par with ADR-029 (release pipeline) and ADR-030 (adopter inbox).
|
|
15
|
+
|
|
16
|
+
Tonight (2026-06-21 evening) demonstrated the failure mode concretely. A single filesystem rename — `mv ~/src/sunj-labs/canonical ~/src/sunj-labs/bassclef` — silently broke every adopter repo on the operator's machine. poa, twoDo, family-recipe-2, eugene-supplements, and quorum each had 30+ symlinks pointing through `../canonical/.claude/hooks/`. Every Bash tool call across every adopter emitted 6+ PreToolUse errors. Non-blocking but noisy, and masks any real failure signal.
|
|
17
|
+
|
|
18
|
+
The rename was reasonable: the GitHub repo had been renamed weeks earlier; the local folder was finally catching up. The architectural defect was the lack of any compatibility-shim discipline. The rename should have shipped with the shim in the same atomic action.
|
|
19
|
+
|
|
20
|
+
Two prior ADRs touched the edges of this concern but neither named it:
|
|
21
|
+
|
|
22
|
+
- **ADR-024 (Forward-port registry)** — handles internal content rewrites (chronicles, ADRs, iteration-bets) via Strategy A-clean (replace, no grace period). It does not handle adopter-observable surfaces.
|
|
23
|
+
- **ADR-019 (Reference vs vendor distribution)** — names the two adopter binding shapes (reference fetches latest; vendor freezes at pull-time) but does not name the stability guarantee bassclef makes to either.
|
|
24
|
+
|
|
25
|
+
The architecture document `architecture/dual-repo-flow.md` covers steady-state operation (release pipeline + adopter inbox) but is silent on substrate evolution. The gap surfaced clearly on 2026-06-21 evening and demands explicit decision.
|
|
26
|
+
|
|
27
|
+
## Decision
|
|
28
|
+
|
|
29
|
+
bassclef adopts **"we don't break adopters"** as a Tier 1 architectural discipline, with the same essential weight that Linus Torvalds's "we don't break userspace" carries for the Linux kernel. Hyrum's Law is the theoretical foundation: with enough adopters, every observable behavior is a contract whether bassclef declared it or not.
|
|
30
|
+
|
|
31
|
+
The discipline is operationalized through:
|
|
32
|
+
|
|
33
|
+
1. **A rule** at `.claude/rules/we-dont-break-adopters.md` that fires on any change to an adopter-observable surface. Methodology layer.
|
|
34
|
+
|
|
35
|
+
2. **Two luminaries** — Linus Torvalds (`linus-torvalds.md`) as the anchor; Hyrum Wright (`hyrum-wright.md`) as the theoretical foundation. Cited by the rule and by the architecture doc.
|
|
36
|
+
|
|
37
|
+
3. **A new section in `architecture/dual-repo-flow.md`** — "Non-breaking changes to adopters" — between the up-flow (ADR-030) and the "what ships, what doesn't" sections. Enumerates adopter-observable surfaces and the rename-with-compat-shim procedure.
|
|
38
|
+
|
|
39
|
+
4. **Migration manifest discipline** — `docs/operator-private/forward-port-registry/migrations/<date>-<change>.md` is required for every change touching an adopter-observable surface. Documents the change, the shim, the deprecation window, and the retirement condition for the shim.
|
|
40
|
+
|
|
41
|
+
5. **Phase 2 mechanical layer** (tracked at bassclef#1360, separate work) — pre-rename CI test that clones a representative adopter and validates their sync hook against the proposed bassclef HEAD; versioned sync protocol; redirect registry.
|
|
42
|
+
|
|
43
|
+
The rule supersedes ADR-024's Strategy A-clean default **for adopter-observable surfaces**. Operator-internal rewrites (chronicles, ADRs, iteration-bets) keep Strategy A-clean per ADR-024. The line between the two is the adopter-observable boundary.
|
|
44
|
+
|
|
45
|
+
## What counts as adopter-observable
|
|
46
|
+
|
|
47
|
+
Enumerated in the rule (`.claude/rules/we-dont-break-adopters.md`). Summary:
|
|
48
|
+
|
|
49
|
+
- Filesystem paths under `~/src/sunj-labs/` that adopter symlinks resolve through
|
|
50
|
+
- Symlink targets inside `<adopter>/.claude/hooks/` and `<adopter>/.claude/skills/`
|
|
51
|
+
- Filenames referenced by adopter `.claude/settings.json`
|
|
52
|
+
- Schema shape of state-spine files
|
|
53
|
+
- `settings.json` field conventions
|
|
54
|
+
- Repo names + `.bassclef-source.json` schema
|
|
55
|
+
- Hook filenames, agent names, skill directory names referenced by adopter automation
|
|
56
|
+
|
|
57
|
+
## What this requires of every substrate change
|
|
58
|
+
|
|
59
|
+
1. **Identify adopter-observable surfaces touched.** Required analysis before the change ships.
|
|
60
|
+
2. **Build compatibility shim FIRST.** Symlink, alias, forwarding stub, schema accommodation. Old surface keeps working.
|
|
61
|
+
3. **Write migration manifest.** Documents the shim + retirement condition.
|
|
62
|
+
4. **Adopter changelog entry.** /release PR body Summary names the rename, the shim, when the shim retires.
|
|
63
|
+
5. **Deprecation period.** Minimum one /release cycle between deprecation announcement and shim removal. Three cycles for high-blast-radius surfaces.
|
|
64
|
+
6. **Test against real adopter.** Clone a representative adopter; run their sync hook; confirm no observable change. This becomes Phase 2 CI-mechanical.
|
|
65
|
+
|
|
66
|
+
## Alternatives considered
|
|
67
|
+
|
|
68
|
+
| Alternative | Why rejected |
|
|
69
|
+
|---|---|
|
|
70
|
+
| Status quo (rely on operator's judgment per rename) | Tonight proved the operator's judgment is insufficient — we don't enumerate adopter dependencies before substrate changes. Need explicit discipline. |
|
|
71
|
+
| SemVer-only (no shim discipline; just bump major version on breaks) | Adopters don't auto-update; SemVer signals don't stop the cascade. Shim is the essential piece. |
|
|
72
|
+
| Strategy A-clean everywhere (per ADR-024 default) | Worked for chronicles. Doesn't work for filesystem paths and symlink targets adopters depend on. |
|
|
73
|
+
| Pre-announcement only (announce 2 weeks before rename) | Linus's response: "Announcements aren't shims. Did the old name keep working? No? You broke userspace." Announcements are necessary but insufficient. |
|
|
74
|
+
| Reference-only distribution (force every adopter to fetch via HTTP API) | Adopters with vendor bindings (the most stable adopter shape) would all need to migrate first. Worse trade than the discipline itself. |
|
|
75
|
+
|
|
76
|
+
The selected approach is the strictest discipline that's still operationally feasible for a one-operator substrate. Compat shims cost minutes per substrate change; the alternative is an angry adopter trail.
|
|
77
|
+
|
|
78
|
+
## Consequences
|
|
79
|
+
|
|
80
|
+
**Positive:**
|
|
81
|
+
|
|
82
|
+
- Adopters can pin a bassclef version and never have their existing setup break across upstream changes
|
|
83
|
+
- The discipline scales as adopter count grows (more adopters = more value from the shim)
|
|
84
|
+
- The substrate gets to refactor internal naming with adopter-cost-of-zero (the shim absorbs it)
|
|
85
|
+
- The "we don't break adopters" framing aligns bassclef philosophically with the most respected substrate evolutions in software history (Linux, POSIX, the Web)
|
|
86
|
+
|
|
87
|
+
**Negative:**
|
|
88
|
+
|
|
89
|
+
- Every substrate-rename costs more (one extra symlink + one manifest + one changelog entry)
|
|
90
|
+
- The substrate accumulates permanent compatibility code (shims that outlive their original purpose)
|
|
91
|
+
- Some clean-rename opportunities become uneconomic (Brooks's conceptual-integrity tax)
|
|
92
|
+
- Operator discipline required at every substrate change — easy to skip when tired
|
|
93
|
+
|
|
94
|
+
**Neutral:**
|
|
95
|
+
|
|
96
|
+
- Phase 2 mechanical layer is substantial work (pre-rename CI test, versioned protocol, redirect registry). Tracked as deferred. Discipline holds at methodology layer until Phase 2 ships.
|
|
97
|
+
|
|
98
|
+
## Implementation
|
|
99
|
+
|
|
100
|
+
Phase 1 (this session, 2026-06-21 evening):
|
|
101
|
+
|
|
102
|
+
- `.claude/rules/we-dont-break-adopters.md` — methodology rule
|
|
103
|
+
- `.claude/luminaries/linus-torvalds.md` + `.claude/luminaries/hyrum-wright.md` — discipline anchors
|
|
104
|
+
- This ADR (ADR-031)
|
|
105
|
+
- `architecture/dual-repo-flow.md` — new section "Non-breaking changes to adopters"
|
|
106
|
+
- `docs/operator-private/forward-port-registry/migrations/2026-06-21-local-canonical-to-bassclef-folder.md` — manifest for tonight's rename
|
|
107
|
+
- `~/src/sunj-labs/canonical → ~/src/sunj-labs/bassclef` — the rescue shim (already in place at time of authoring)
|
|
108
|
+
|
|
109
|
+
Phase 2 (separate session, bassclef#1360):
|
|
110
|
+
|
|
111
|
+
- Pre-rename CI test workflow
|
|
112
|
+
- bassclef-sync.sh extension that detects + auto-migrates stale references
|
|
113
|
+
- `.bassclef-source-redirect.json` registry
|
|
114
|
+
- Versioned sync protocol with breaking-change markers
|
|
115
|
+
|
|
116
|
+
## Eat-our-own-dogfood
|
|
117
|
+
|
|
118
|
+
This ADR was authored within minutes of the rule's first violation (the canonical→bassclef rename cascade). The shim was applied. The migration manifest names the substrate-rename retroactively. Future renames cite ADR-031 explicitly in their commit messages and /release PR bodies.
|
|
119
|
+
|
|
120
|
+
## References
|
|
121
|
+
|
|
122
|
+
- @luminary linus-torvalds
|
|
123
|
+
- @luminary hyrum-wright
|
|
124
|
+
- @luminary michael-nygard — circuit-breaker pattern (sister discipline)
|
|
125
|
+
- @luminary vaughn-vernon — anticorruption layer (the architectural pattern)
|
|
126
|
+
- @luminary frederick-brooks — conceptual integrity vs migration cost
|
|
127
|
+
- ADR-024 — forward-port registry (this ADR extends/scopes ADR-024 for adopter-observable surfaces)
|
|
128
|
+
- ADR-019 — reference vs vendor distribution (sets the two binding shapes this ADR protects)
|
|
129
|
+
- ADR-029 — release pipeline (every /release that breaks an adopter-observable surface MUST include migration-manifest reference)
|
|
130
|
+
- ADR-030 — adopter inbox (adopter-filed silent-break issues are now defect signals, not acceptable channel)
|
|
131
|
+
- `.claude/rules/we-dont-break-adopters.md` — operational methodology
|
|
132
|
+
- `architecture/dual-repo-flow.md` — architecture doc with the new section
|
|
133
|
+
- bassclef#1360 — Phase 2 mechanical layer
|
|
134
|
+
- poa#1251 — sister adopter-side migration ticket
|
|
135
|
+
- 2026-06-21 chronicle — the canonical→bassclef cascade + rescue + ADR authoring
|
|
136
|
+
|
|
137
|
+
## Retirement condition
|
|
138
|
+
|
|
139
|
+
This ADR retires only if bassclef stops having adopters. Phase 2 mechanical layer may reduce the methodology cost; it does not retire the decision. Adopter stability is a forever commitment.
|