@thebassclef/lite 1.0.4 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.cjs +65 -0
- package/dist/cli.js +65 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/lite/.claude/agents/architect.md +70 -0
- package/dist/lite/.claude/agents/builder.md +114 -0
- package/dist/lite/.claude/agents/designer.md +156 -0
- package/dist/lite/.claude/agents/reviewer.md +88 -0
- package/dist/lite/.claude/hooks/bassclef-sync.sh +85 -27
- package/dist/lite/.claude/hooks/longrun-prep-compounding-axis-check.sh +492 -0
- package/dist/lite/.claude/hooks/longrun-prep-render-check.sh +236 -0
- package/dist/lite/.claude/hooks/persona-name-scrub-check.sh +105 -0
- package/dist/lite/.claude/hooks/skill-step-list-check.sh +171 -0
- package/dist/lite/.claude/luminaries/alan-cooper.md +170 -0
- package/dist/lite/.claude/luminaries/alistair-cockburn.md +140 -0
- package/dist/lite/.claude/luminaries/amazon-pr-faq.md +34 -0
- package/dist/lite/.claude/luminaries/andreas-zeller.md +74 -0
- package/dist/lite/.claude/luminaries/ash-maurya.md +121 -0
- package/dist/lite/.claude/luminaries/bill-buxton.md +210 -0
- package/dist/lite/.claude/luminaries/charles-sanders-peirce.md +150 -0
- package/dist/lite/.claude/luminaries/david-ogilvy.md +192 -0
- package/dist/lite/.claude/luminaries/don-norman.md +173 -0
- package/dist/lite/.claude/luminaries/edward-tufte.md +179 -0
- package/dist/lite/.claude/luminaries/eric-evans.md +160 -0
- package/dist/lite/.claude/luminaries/frederick-brooks.md +50 -0
- package/dist/lite/.claude/luminaries/gang-of-four.md +157 -0
- package/dist/lite/.claude/luminaries/glenford-myers.md +230 -0
- package/dist/lite/.claude/luminaries/hunt-thomas.md +115 -0
- package/dist/lite/.claude/luminaries/hyrum-wright.md +94 -0
- package/dist/lite/.claude/luminaries/jason-fried-dhh.md +46 -0
- package/dist/lite/.claude/luminaries/jesse-james-garrett.md +154 -0
- package/dist/lite/.claude/luminaries/john-ousterhout.md +94 -0
- package/dist/lite/.claude/luminaries/karl-popper.md +132 -0
- package/dist/lite/.claude/luminaries/kent-beck.md +168 -0
- package/dist/lite/.claude/luminaries/linus-torvalds.md +218 -0
- package/dist/lite/.claude/luminaries/martin-fowler.md +164 -0
- package/dist/lite/.claude/luminaries/michael-feathers.md +125 -0
- package/dist/lite/.claude/luminaries/michael-nygard.md +118 -0
- package/dist/lite/.claude/luminaries/robert-c-martin.md +164 -0
- package/dist/lite/.claude/luminaries/saltzer-schroeder.md +194 -0
- package/dist/lite/.claude/luminaries/sophia-prater.md +193 -0
- package/dist/lite/.claude/luminaries/stephen-toulmin.md +131 -0
- package/dist/lite/.claude/luminaries/tony-hoare.md +170 -0
- package/dist/lite/.claude/luminaries/vaughn-vernon.md +50 -0
- package/dist/lite/.claude/luminaries/w-edwards-deming.md +158 -0
- package/dist/lite/.claude/rules/accessor-library-discipline.md +110 -0
- package/dist/lite/.claude/rules/adr-discipline.md +96 -0
- package/dist/lite/.claude/rules/api-conventions.md +115 -0
- package/dist/lite/.claude/rules/artifact-ingestion.md +137 -0
- package/dist/lite/.claude/rules/assert-only-after-verify.md +111 -0
- package/dist/lite/.claude/rules/blocked-items.md +139 -0
- package/dist/lite/.claude/rules/bootstrap-pair-discipline.md +106 -0
- package/dist/lite/.claude/rules/branching.md +28 -0
- package/dist/lite/.claude/rules/cold-adopter-harness-discipline.md +93 -0
- package/dist/lite/.claude/rules/commit-conventions.md +22 -0
- package/dist/lite/.claude/rules/compounding-axis-fresh-analysis.md +173 -0
- package/dist/lite/.claude/rules/compounding-sequence-fresh-analysis.md +173 -0
- package/dist/lite/.claude/rules/context-engineering.md +155 -0
- package/dist/lite/.claude/rules/context-management.md +85 -0
- package/dist/lite/.claude/rules/defensive-bash.md +52 -0
- package/dist/lite/.claude/rules/deferred-actions.md +233 -0
- package/dist/lite/.claude/rules/destructive-operations.md +69 -0
- package/dist/lite/.claude/rules/diagnosis.md +38 -0
- package/dist/lite/.claude/rules/github-issue-flash-tweet.md +114 -0
- package/dist/lite/.claude/rules/guardrails.md +73 -0
- package/dist/lite/.claude/rules/hook-wire-on-author.md +77 -0
- package/dist/lite/.claude/rules/identifier-leak-prevention.md +73 -0
- package/dist/lite/.claude/rules/iteration-bet-brief-completeness.md +43 -0
- package/dist/lite/.claude/rules/lite-manifest-schema-change-discipline.md +79 -0
- package/dist/lite/.claude/rules/longrun-prep-plan-doc-compression.md +77 -0
- package/dist/lite/.claude/rules/loop-discipline.md +71 -0
- package/dist/lite/.claude/rules/manual-prod-approval.md +100 -0
- package/dist/lite/.claude/rules/marker-enrichment-discipline.md +72 -0
- package/dist/lite/.claude/rules/mobile-ephemeral-session.md +109 -0
- package/dist/lite/.claude/rules/new-dependency-check.md +44 -0
- package/dist/lite/.claude/rules/oo-ad-entry-point.md +95 -0
- package/dist/lite/.claude/rules/operator-facing-prose.md +177 -0
- package/dist/lite/.claude/rules/option-label-discipline.md +82 -0
- package/dist/lite/.claude/rules/pattern-annotation.md +83 -0
- package/dist/lite/.claude/rules/persona-name-leak-scrub.md +90 -0
- package/dist/lite/.claude/rules/plain-english-discipline.md +132 -0
- package/dist/lite/.claude/rules/plan-enumeration-needs-value-props.md +177 -0
- package/dist/lite/.claude/rules/pr-body-shape.md +195 -0
- package/dist/lite/.claude/rules/pr-strategy.md +142 -0
- package/dist/lite/.claude/rules/pr-title-shape.md +90 -0
- package/dist/lite/.claude/rules/prototype-workflow.md +53 -0
- package/dist/lite/.claude/rules/reserved-skill-names.md +103 -0
- package/dist/lite/.claude/rules/schema-management.md +42 -0
- package/dist/lite/.claude/rules/sdlc-gates.md +149 -0
- package/dist/lite/.claude/rules/security.md +37 -0
- package/dist/lite/.claude/rules/session-artifacts.md +236 -0
- package/dist/lite/.claude/rules/skill-composition-declarations.md +105 -0
- package/dist/lite/.claude/rules/skill-description-clarity.md +196 -0
- package/dist/lite/.claude/rules/skill-procedure-step-list.md +119 -0
- package/dist/lite/.claude/rules/sprint-prep-preset-picker.md +76 -0
- package/dist/lite/.claude/rules/state-schema-validation.md +156 -0
- package/dist/lite/.claude/rules/stuck-signal-diagnostic.md +111 -0
- package/dist/lite/.claude/rules/substrate-config-schema.md +85 -0
- package/dist/lite/.claude/rules/test-list-discipline.md +129 -0
- package/dist/lite/.claude/rules/test-sufficiency.md +186 -0
- package/dist/lite/.claude/rules/testing-tier-config.md +125 -0
- package/dist/lite/.claude/rules/testing.md +38 -0
- package/dist/lite/.claude/rules/turn-estimate-grounding.md +82 -0
- package/dist/lite/.claude/rules/visual-hierarchy.md +427 -0
- package/dist/lite/.claude/rules/we-dont-break-adopters.md +103 -0
- package/dist/lite/.claude/rules/whereami-load-bearing.md +184 -0
- package/dist/lite/.claude/rules/writing-craft-discipline.md +72 -0
- package/dist/lite/.claude/rules/wu-sequencing-compounds.md +119 -0
- package/dist/lite/.claude/skills/build/SKILL.md +640 -0
- package/dist/lite/.claude/skills/chronicle/SKILL.md +55 -0
- package/dist/lite/.claude/skills/clean-artifacts/SKILL.md +249 -0
- package/dist/lite/.claude/skills/decompose/SKILL.md +280 -0
- package/dist/lite/.claude/skills/diagnose/SKILL.md +297 -0
- package/dist/lite/.claude/skills/feynman/SKILL.md +90 -0
- package/dist/lite/.claude/skills/howdoi/SKILL.md +105 -0
- package/dist/lite/.claude/skills/ia-model/SKILL.md +108 -0
- package/dist/lite/.claude/skills/interaction-design/SKILL.md +112 -0
- package/dist/lite/.claude/skills/interpret-input/SKILL.md +180 -0
- package/dist/lite/.claude/skills/journal/SKILL.md +209 -0
- package/dist/lite/.claude/skills/kiss/SKILL.md +449 -0
- package/dist/lite/.claude/skills/launch/SKILL.md +915 -0
- package/dist/lite/.claude/skills/lean-canvas/SKILL.md +332 -0
- package/dist/lite/.claude/skills/longrun/SKILL.md +512 -0
- package/dist/lite/.claude/skills/luminary/SKILL.md +481 -0
- package/dist/lite/.claude/skills/ogilvy-writing-audit/SKILL.md +177 -0
- package/dist/lite/.claude/skills/onboard-repo/SKILL.md +1640 -0
- package/dist/lite/.claude/skills/pattern-review/SKILL.md +99 -0
- package/dist/lite/.claude/skills/personas/SKILL.md +207 -0
- package/dist/lite/.claude/skills/promote/SKILL.md +283 -0
- package/dist/lite/.claude/skills/requirement/SKILL.md +98 -0
- package/dist/lite/.claude/skills/retro/SKILL.md +117 -0
- package/dist/lite/.claude/skills/riff/SKILL.md +114 -0
- package/dist/lite/.claude/skills/roadmap-reconcile/SKILL.md +163 -0
- package/dist/lite/.claude/skills/session-end/SKILL.md +309 -0
- package/dist/lite/.claude/skills/session-log/SKILL.md +299 -0
- package/dist/lite/.claude/skills/skills/SKILL.md +228 -0
- package/dist/lite/.claude/skills/spec/SKILL.md +105 -0
- package/dist/lite/.claude/skills/sprint/SKILL.md +418 -0
- package/dist/lite/.claude/skills/stage/SKILL.md +384 -0
- package/dist/lite/.claude/skills/state-a-problem/SKILL.md +185 -0
- package/dist/lite/.claude/skills/temperance/SKILL.md +108 -0
- package/dist/lite/.claude/skills/use-case/SKILL.md +417 -0
- package/dist/lite/.claude/skills/user-stories/SKILL.md +268 -0
- package/dist/lite/.claude/skills/value-prop/SKILL.md +251 -0
- package/dist/lite/.claude/skills/verify/SKILL.md +160 -0
- package/dist/lite/.claude/skills/visual-review/SKILL.md +503 -0
- package/dist/lite/.claude/skills/whats-the-plan/SKILL.md +202 -0
- package/dist/lite/.claude/skills/whereami/SKILL.md +307 -0
- package/dist/lite/AGENTS.md +79 -0
- package/dist/lite/CLAUDE-lite.md +85 -0
- package/dist/lite/CODE_OF_CONDUCT.md +28 -0
- package/dist/lite/CONTRIBUTING.md +177 -0
- package/dist/lite/README.md +173 -0
- package/dist/lite/SECURITY.md +19 -0
- package/dist/lite/architecture/decisions/ADR-029-release-pipeline.md +79 -0
- package/dist/lite/architecture/decisions/ADR-031-non-breaking-changes-adopter-discipline.md +139 -0
- package/dist/lite/architecture/decisions/ADR-032-adopter-sync-dispatcher-architecture.md +192 -0
- package/dist/lite/architecture/decisions/ADR-039-release-tagging-scheme.md +145 -0
- package/dist/lite/architecture/decisions/ADR-040-planning-skill-vocabulary-and-lite-profile.md +155 -0
- package/dist/lite/architecture/decisions/ADR-044-unified-skill-body-template.md +162 -0
- package/dist/lite/lib/clean-artifacts-sweep.sh +112 -0
- package/dist/lite/lib/code-comment-discipline.sh +144 -0
- package/dist/lite/lib/composer-preflight.sh +459 -0
- package/dist/lite/lib/deferred-actions.sh +146 -0
- package/dist/lite/lib/hook-header-parser.sh +61 -0
- package/dist/lite/lib/hook-heartbeat.sh +152 -0
- package/dist/lite/lib/hook-inject.sh +255 -0
- package/dist/lite/lib/hook-installer.sh +195 -0
- package/dist/lite/lib/luminary-pick.sh +96 -0
- package/dist/lite/lib/output-discipline.sh +143 -0
- package/dist/lite/lib/prose-scan-boundary.sh +171 -0
- package/dist/lite/lib/rewrite-check.sh +214 -0
- package/dist/lite/lib/session-rescue.sh +151 -0
- package/dist/lite/lib/source-graph-walker.sh +277 -0
- package/dist/lite/lib/state.sh +1372 -0
- package/dist/lite/lib/telemetry.sh +205 -0
- package/dist/lite/lib/tier-check.sh +187 -0
- package/dist/lite/lib/tier-dependency-audit.sh +1088 -0
- package/dist/lite/presence/install/bassclef-hook-connect.sh +178 -0
- package/dist/lite/presence/install/bassclef-sync.dispatcher.template.sh +841 -0
- package/dist/lite/presence/install/bassclef-sync.template.sh +2278 -0
- package/dist/lite/presence/install/schedule-auto-save.cron.sh +88 -0
- package/dist/lite/presence/install/schedule-auto-save.taskscheduler.md +122 -0
- package/dist/lite/scripts/aggregate-telemetry.sh +217 -0
- package/dist/lite/scripts/analyze-tier-dependencies.sh +239 -0
- package/dist/lite/scripts/generate-lite-manifest.sh +505 -0
- package/dist/lite/scripts/generate-tier-manifest.sh +28 -0
- package/dist/lite/scripts/intent-drift-check.sh +456 -0
- package/dist/lite/scripts/lite-manifest-drift-check.sh +146 -0
- package/dist/lite/scripts/render-lite-manifest-doc.sh +150 -0
- package/dist/lite/standards/adr-template.md +86 -0
- package/dist/lite/standards/api-conventions/nextjs.md +84 -0
- package/dist/lite/standards/artifact-composition.md +209 -0
- package/dist/lite/standards/bash-hook-safety.md +246 -0
- package/dist/lite/standards/bassclef-configs-schema.md +232 -0
- package/dist/lite/standards/bassclef-evolution.md +143 -0
- package/dist/lite/standards/bassclef-internal-jargon.md +244 -0
- package/dist/lite/standards/bassclef-managed-sentinel.md +96 -0
- package/dist/lite/standards/bassclef-source-config.md +228 -0
- package/dist/lite/standards/branch-stacking.md +408 -0
- package/dist/lite/standards/code-safety-principles.md +176 -0
- package/dist/lite/standards/composer-prerequisites.md +155 -0
- package/dist/lite/standards/deferred-actions-schema.md +204 -0
- package/dist/lite/standards/dependency-discipline/cargo.md +39 -0
- package/dist/lite/standards/dependency-discipline/gem.md +43 -0
- package/dist/lite/standards/dependency-discipline/go-mod.md +41 -0
- package/dist/lite/standards/dependency-discipline/npm.md +42 -0
- package/dist/lite/standards/dependency-discipline/pip.md +42 -0
- package/dist/lite/standards/deployment-topology/ec2-tailscale.md +225 -0
- package/dist/lite/standards/deployment-topology.md +69 -0
- package/dist/lite/standards/docs-sync-allowlist.md +76 -0
- package/dist/lite/standards/domain-and-dns.md +145 -0
- package/dist/lite/standards/frontend-stack.md +67 -0
- package/dist/lite/standards/frontmatter-schema.md +154 -0
- package/dist/lite/standards/graceful-exit.md +227 -0
- package/dist/lite/standards/hook-idempotency.md +102 -0
- package/dist/lite/standards/hook-injection-discipline.md +202 -0
- package/dist/lite/standards/hook-install-class.md +215 -0
- package/dist/lite/standards/input-handler-interface.md +152 -0
- package/dist/lite/standards/lite-manifest-schema-changes.md +180 -0
- package/dist/lite/standards/lite-manifest.json +2797 -0
- package/dist/lite/standards/luminary-matching.md +105 -0
- package/dist/lite/standards/luminary-problem-patterns.md +481 -0
- package/dist/lite/standards/migration-discipline/active-record.md +50 -0
- package/dist/lite/standards/migration-discipline/alembic.md +43 -0
- package/dist/lite/standards/migration-discipline/gorm.md +50 -0
- package/dist/lite/standards/migration-discipline/prisma.md +53 -0
- package/dist/lite/standards/migration-discipline/sqlalchemy.md +51 -0
- package/dist/lite/standards/mobile-ephemeral-session.md +167 -0
- package/dist/lite/standards/model-routing-discipline.md +160 -0
- package/dist/lite/standards/ogilvy-writing-rules.md +225 -0
- package/dist/lite/standards/opener-discipline.md +96 -0
- package/dist/lite/standards/operator-facing-prose-discipline.md +201 -0
- package/dist/lite/standards/persona-schema.md +229 -0
- package/dist/lite/standards/pluggable-luminaries.md +323 -0
- package/dist/lite/standards/pr-body-discipline.md +115 -0
- package/dist/lite/standards/preview-state-schema.md +189 -0
- package/dist/lite/standards/project-directory-layout.md +276 -0
- package/dist/lite/standards/release-tagging.md +137 -0
- package/dist/lite/standards/reserved-skill-names.md +120 -0
- package/dist/lite/standards/scannable-multi-option-output.md +265 -0
- package/dist/lite/standards/sdlc-compliance.md +286 -0
- package/dist/lite/standards/sdlc-gates/typescript.md +57 -0
- package/dist/lite/standards/secrets-lifecycle.md +210 -0
- package/dist/lite/standards/security-scanner-adapter.md +145 -0
- package/dist/lite/standards/session-board.md +256 -0
- package/dist/lite/standards/skill-output-discipline.md +121 -0
- package/dist/lite/standards/state-spine-contract.md +255 -0
- package/dist/lite/standards/state-spine.md +511 -0
- package/dist/lite/standards/steering-hints/kiss-words.md +11 -0
- package/dist/lite/standards/substrate-config-schema.md +267 -0
- package/dist/lite/standards/tech-stack-config.md +109 -0
- package/dist/lite/standards/tier-dependency-analysis.md +167 -0
- package/dist/lite/standards/tier-runtime-deps/lite.md +57 -0
- package/dist/lite/standards/tier-tag-schema.md +155 -0
- package/dist/lite/standards/two-layer-config.md +99 -0
- package/dist/lite/standards/use-case-format.md +292 -0
- package/dist/lite/standards/user-story-invest.md +268 -0
- package/dist/lite/standards/velocity-and-appetite.md +229 -0
- package/dist/lite/standards/voice-input-pattern.md +119 -0
- package/dist/lite/standards/whereami-schema.md +301 -0
- package/dist/lite/standards/worktree-management.md +211 -0
- package/dist/lite/standards/writing-guide.md +213 -0
- package/dist/lite/templates/chronicle-template.md +75 -0
- package/dist/lite/templates/deferred-action-template.md +45 -0
- package/dist/lite/templates/memory-proposal-template.md +77 -0
- package/dist/lite/templates/persona-template.md +200 -0
- package/dist/lite/templates/pr-faq.md +45 -0
- package/dist/lite/templates/secret-rotation-template.md +162 -0
- package/dist/lite/templates/spec-template.md +131 -0
- package/dist/lite/templates/use-case-template.md +194 -0
- package/dist/lite/templates/user-story-template.md +107 -0
- package/dist/lite/templates/whereami-template.md +101 -0
- package/package.json +1 -1
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
description: Per-file maturity-signal field that governs flow from bassclef-upstream (upstream experimental) → bassclef (public hardened release mirror).
|
|
4
|
+
---
|
|
5
|
+
<!-- andon-allow: operator-private -->
|
|
6
|
+
<!-- andon-allow: bassclef-upstream -->
|
|
7
|
+
|
|
8
|
+
# Tier-tag schema
|
|
9
|
+
|
|
10
|
+
Per-file maturity-signal field that governs flow from `bassclef-upstream` (upstream experimental) → `bassclef` (public hardened release mirror). The release script (`scripts/release-to-bassclef.sh`) reads this field on every substrate primitive and decides whether to include it in the release.
|
|
11
|
+
|
|
12
|
+
## Field
|
|
13
|
+
|
|
14
|
+
- **Name:** `tier`
|
|
15
|
+
- **Location per file type** (extended 2026-08-17 per ADR-052 D6):
|
|
16
|
+
- `.md` files (skills, luminaries, rules, ADRs, standards): YAML frontmatter, recommended as the first line after the opening `---`
|
|
17
|
+
- `.sh` files (hooks, scripts): header comment `# tier: <value>` on line 2 (after the shebang)
|
|
18
|
+
- `.yml`, `.yaml` files: comment `# tier: <value>` on line 1
|
|
19
|
+
- `.jsonc` files: line comment `// tier: <value>` on line 1
|
|
20
|
+
- `.json` (pure) files: underscored key `"_tier": "<value>"` in the top object (underscore signals metadata field per common convention)
|
|
21
|
+
- LICENSE, plain text: external entry in `standards/tier-file-allowlist.json`
|
|
22
|
+
- **Values (extended 2026-08-17 per ADR-043 D1 amendment):** `upstream | archive | unknown | lite | standard | standard-pro | ultra`
|
|
23
|
+
- **Default for untagged legacy files:** untagged .md and .sh files BLOCK release per #1209. Untagged JSON / YAML / LICENSE ship by default via ALLOWED_PATHS (per `scripts/release-to-bassclef.sh:508-513`).
|
|
24
|
+
- **Required on:** skills, rules (enforced by `substrate-clarity-gate.sh`). Luminaries, hooks, ADRs, standards SHOULD carry it; strict enforcement deferred to a follow-on.
|
|
25
|
+
|
|
26
|
+
## Scope — where the field applies
|
|
27
|
+
|
|
28
|
+
The `tier:` field applies to substrate building-block surfaces whose maturity governs release-script filtering. It does not apply to documentation surfaces that ship unconditionally.
|
|
29
|
+
|
|
30
|
+
**Applies to (field required or SHOULD carry):**
|
|
31
|
+
|
|
32
|
+
| Surface | Path pattern | Enforcement |
|
|
33
|
+
|---|---|---|
|
|
34
|
+
| Skills | `.claude/skills/*/SKILL.md` | `substrate-clarity-gate.sh` BLOCKs if missing |
|
|
35
|
+
| Rules | `.claude/rules/*.md` | `substrate-clarity-gate.sh` BLOCKs if missing |
|
|
36
|
+
| Luminaries | `.claude/luminaries/*.md` | SHOULD carry; strict enforcement deferred |
|
|
37
|
+
| Agents | `.claude/agents/*.md` | SHOULD carry; strict enforcement deferred |
|
|
38
|
+
| Hooks | `.claude/hooks/*.sh` | SHOULD carry; strict enforcement deferred |
|
|
39
|
+
| ADRs | `architecture/decisions/ADR-*.md` | SHOULD carry; strict enforcement deferred |
|
|
40
|
+
| Standards | `standards/*.md` | SHOULD carry; strict enforcement deferred |
|
|
41
|
+
| Strategy | `strategy/*` | SHOULD carry; strict enforcement deferred |
|
|
42
|
+
|
|
43
|
+
These paths match the building-block list in `scripts/release-to-bassclef.sh:254-263`. The release script reads the field per file and filters accordingly.
|
|
44
|
+
|
|
45
|
+
**Does NOT apply to (field MUST NOT appear):**
|
|
46
|
+
|
|
47
|
+
| Surface | Path pattern | Enforcement |
|
|
48
|
+
|---|---|---|
|
|
49
|
+
| Release notes | `docs/release-notes/*.md` | `substrate-clarity-gate.sh` BLOCKs if `tier:` present |
|
|
50
|
+
| Roadmaps | `docs/roadmaps/*.md` | `substrate-clarity-gate.sh` BLOCKs if `tier:` present |
|
|
51
|
+
| Canvases | `docs/canvases/*.md` | `substrate-clarity-gate.sh` BLOCKs if `tier:` present |
|
|
52
|
+
|
|
53
|
+
These paths ship unconditionally via the release script's fallback branch (`scripts/release-to-bassclef.sh:367-372` — "ship per allowed-path. No per-file tier needed"). Adding `tier:` there signals a distribution filter that does not exist.
|
|
54
|
+
|
|
55
|
+
**Rationale.** Per /luminary consult 2026-07-31 (Norman signifier discipline + Brooks conceptual integrity + Linus adopter contract): a field with two meanings across the substrate breaks coherence. A field that signals distribution but does not filter distribution misleads readers. Documentation surfaces describe shipped work; they are not themselves substrate building blocks whose maturity gates release.
|
|
56
|
+
|
|
57
|
+
**Legacy sweep.** Two release-notes shipped with `tier: standard` before this scope was clarified: `docs/release-notes/2026-07-10-v0.2.0.md` and `docs/release-notes/2026-07-10-v0.2.1.md`. Both swept in the same PR that added this Scope subsection.
|
|
58
|
+
|
|
59
|
+
## Value semantics
|
|
60
|
+
|
|
61
|
+
| Value | Ships in release? | Meaning to adopter |
|
|
62
|
+
|---|---|---|
|
|
63
|
+
| `private` | **No** | Operator-private even outside `docs/operator-private/`. Belt-and-braces per-file gate. |
|
|
64
|
+
| `lite` | Yes | Early-access; minimal viable; expect rough edges. Signals "use it, file issues, expect change." |
|
|
65
|
+
| `standard` | Yes (bassclef + bassclef-ultra) | Portfolio operator's product; adds atomic skills lite embeds. Ships in bassclef + bassclef-ultra. NOT in bassclef-lite. |
|
|
66
|
+
| `standard-pro` | Conditional (with license key) | Extends `standard` with pre-release content. Ships to adopters whose `.bassclef-source.json` carries `tier_extension: standard-pro` AND `license_key`. Added bet 24b Step 2 (goal 20a Task 3.2). Iteration 3 wires the gate; Iteration 1 accepts the tag only. |
|
|
67
|
+
| `ultra` | Yes (bassclef-ultra only) | Reflective intelligence; Voyage-driven skills. Ships in bassclef-ultra only. |
|
|
68
|
+
| `archive` | **No** | Kept for historical reference or debugging. Not part of active development. Filters out at release. Added 2026-08-17 per ADR-043 D1 amendment. |
|
|
69
|
+
| `unknown` | **No** | Awaiting operator triage. Not yet classified. Filters out at release. Should be resolved. Added 2026-08-17 per ADR-043 D1 amendment. |
|
|
70
|
+
|
|
71
|
+
## Maturity progression (lite → standard → ultra)
|
|
72
|
+
|
|
73
|
+
Promotion is **communicative, not mechanical.** A primitive that's ready for the next tier gets the frontmatter edited in a normal commit. The release script ships everything that isn't `private`; the tier name tells adopters how mature the file is.
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
new primitive → lite → standard → ultra
|
|
77
|
+
↓ ↓ ↓
|
|
78
|
+
ships, with maturity signal in name
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
There is no separate `/promote --tier-up` skill; if one is needed it'll be added when the operator notices friction.
|
|
82
|
+
|
|
83
|
+
## Gating
|
|
84
|
+
|
|
85
|
+
**Note (2026-08-17):** amended per ADR-052 D1 — concentric inclusion is the model. Each product ships every file tagged at a smaller-tier value plus its own value.
|
|
86
|
+
|
|
87
|
+
The release script per tier:
|
|
88
|
+
|
|
89
|
+
1. Reads `tier:` per file per format (see "Tier tag per file format" below)
|
|
90
|
+
2. If `tier ∈ {private, upstream, archive, unknown}` → **exclude from every downstream release**
|
|
91
|
+
3. If `tier == lite` → include in bassclef-lite + bassclef + bassclef-ultra
|
|
92
|
+
4. If `tier == standard` → include in bassclef + bassclef-ultra (NOT bassclef-lite)
|
|
93
|
+
5. If `tier == standard-pro` → include only when adopter carries `tier_extension: standard-pro` + `license_key`
|
|
94
|
+
6. If `tier == ultra` → include in bassclef-ultra only
|
|
95
|
+
7. If `tier == <anything else>` → refuse the release with "INVALID tier" error
|
|
96
|
+
8. If `tier == <empty>` on ANY file inside ALLOWED_PATHS → BLOCK release (add a tier tag per file format)
|
|
97
|
+
|
|
98
|
+
## Tier tag per file format
|
|
99
|
+
|
|
100
|
+
Every file format that ships (or could ship) inside ALLOWED_PATHS carries a tier tag in a format the file's parser accepts:
|
|
101
|
+
|
|
102
|
+
| Format | Tag mechanism | Example |
|
|
103
|
+
|---|---|---|
|
|
104
|
+
| `.md` | YAML frontmatter `tier: X` | `---\ntier: lite\n---` |
|
|
105
|
+
| `.sh`, `.py` | header comment `# tier: X` (line 2 after shebang) | `#!/usr/bin/env bash\n# tier: standard` |
|
|
106
|
+
| `.json` (data files) | top-level `"_tier": "X"` field | `{"_tier": "upstream", "data": ...}` |
|
|
107
|
+
| `.json` (JSON Schema files) | `"$comment": "tier: X"` — because `$comment` is a recognized draft-2020-12 keyword; top-level unknown keys fail ajv strict mode | `{"$comment": "tier: standard", "$schema": ...}` |
|
|
108
|
+
| `.jsonc` | header comment `// tier: X` | `// tier: standard\n{...}` |
|
|
109
|
+
| `.yml`, `.yaml` | frontmatter `tier: X` OR header comment `# tier: X` | `---\ntier: lite\n---` |
|
|
110
|
+
| Other text | header comment appropriate to format | — |
|
|
111
|
+
|
|
112
|
+
Non-taggable formats (binary files) go into `standards/tier-file-allowlist.json` external allowlist per ADR-052 D6.
|
|
113
|
+
|
|
114
|
+
Prior default-ship rule for non-md/sh files (superseded by this table 2026-08-20 per Wave 4 Option C Step 4): removed. Every file inside ALLOWED_PATHS now carries an explicit tag per format.
|
|
115
|
+
|
|
116
|
+
## Defense in depth — path exclusion registry
|
|
117
|
+
|
|
118
|
+
Files whose path matches an entry in `standards/path-exclusion-registry.json` are excluded from every release regardless of any inner `tier:` value. The path wins. Consumers (release script, audit tools) read the registry as the single source of truth for path-based exclusion classes: `session-runtime`, `operator-private`, `test-only`, `operator-internal-rd`, `prototype`, `config-per-repo`, `ephemeral-transient`.
|
|
119
|
+
|
|
120
|
+
The path exclusion registry (operator-only) tracks classes + rationale per entry + how to add a new exclusion.
|
|
121
|
+
|
|
122
|
+
The path-exclusion registry supersedes the prior inline `case` statement in `scripts/release-to-bassclef.sh` L415-460. The refactor to read the registry ships as a separate PR after this schema amendment.
|
|
123
|
+
|
|
124
|
+
## Validation
|
|
125
|
+
|
|
126
|
+
The `substrate-clarity-gate.sh` hook enforces on skill + rule edits:
|
|
127
|
+
1. `tier:` present (BLOCK if missing)
|
|
128
|
+
2. `tier:` value ∈ `{private, lite, standard, standard-pro, ultra}` (BLOCK if other value)
|
|
129
|
+
3. `tier:` accepted as a recognized field (no `UNKNOWN_FIELDS` warning)
|
|
130
|
+
|
|
131
|
+
The `bassclef-source-config-validate.sh` hook validates `.bassclef-source.json` `tier_extension` field against the same enum (minus `private` — adopters cannot opt into private content).
|
|
132
|
+
|
|
133
|
+
Override hatches:
|
|
134
|
+
- `SKIP_SUBSTRATE_CLARITY=1` (full hook bypass; logged via trace-helper)
|
|
135
|
+
- Allowlists: `.claude/hooks/substrate-clarity-allowlist.txt`, `.claude/hooks/substrate-frontmatter-allowlist.txt`
|
|
136
|
+
|
|
137
|
+
## Backfill provenance
|
|
138
|
+
|
|
139
|
+
- 392 primitives initially backfilled with `tier: public` 2026-06-21 (WU-1 commits 73c8fce + bc00f99 + e28d73f)
|
|
140
|
+
- 36 luminaries added to bassclef-upstream 2026-06-21 with `tier: public` (commit 54a65aa, WU-0 gap fix)
|
|
141
|
+
- 9 presence files added 2026-06-21 with `tier: public` (commit cf53a5f)
|
|
142
|
+
- All `tier: public` → `tier: standard` 2026-06-21 (commit TBD this session) per operator's rename to lite/standard/ultra vocabulary
|
|
143
|
+
|
|
144
|
+
## Relationship to other tier concepts
|
|
145
|
+
|
|
146
|
+
- `tiers:` (plural, in skill frontmatter): skill MODES like `[medium, full]` for /launch sizes. Distinct from `tier:` (release maturity).
|
|
147
|
+
- `model_tier:` (in skill frontmatter): which Claude model the skill prefers. Distinct from `tier:`.
|
|
148
|
+
|
|
149
|
+
## See also
|
|
150
|
+
|
|
151
|
+
- `architecture/dual-repo-flow.md` — the full architecture this tier field operationalizes
|
|
152
|
+
- `architecture/decisions/ADR-029-release-pipeline.md` — formalizes the release script that consumes this field
|
|
153
|
+
- `architecture/decisions/ADR-030-adopter-inbox-flow.md` — the ingestion direction; doesn't read tier but operates inside the same bounded-context model
|
|
154
|
+
- `scripts/release-to-bassclef.sh` — the consumer
|
|
155
|
+
- `.claude/hooks/substrate-clarity-gate.sh` — the gate that enforces this field on skill + rule
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
description: "Bassclef's config splits into two layers."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Two-Layer Config — Shared vs Operator
|
|
7
|
+
|
|
8
|
+
Bassclef's config splits into two layers. The **shared layer** is committed and identity-agnostic — every adopter sees it. The **operator layer** is gitignored and per-person — never committed, never shipped to adopters.
|
|
9
|
+
|
|
10
|
+
This standard exists because the line between "what bassclef needs" and "what one operator has set up" was blurry before the 2026-05-23 cold-adopter run. Operator-specific paths, allow lists, and preferences leaked into shared config. Adopters would have inherited the operator's identity on first clone.
|
|
11
|
+
|
|
12
|
+
## The two layers
|
|
13
|
+
|
|
14
|
+
### Shared layer (committed)
|
|
15
|
+
|
|
16
|
+
- `.claude/settings.json`
|
|
17
|
+
- `CLAUDE.md`
|
|
18
|
+
- `README.md`
|
|
19
|
+
- All skills, hooks, rules, standards under `.claude/` and root dirs
|
|
20
|
+
- All ADRs, decompositions, design docs
|
|
21
|
+
|
|
22
|
+
**Rules for the shared layer:**
|
|
23
|
+
|
|
24
|
+
1. Identity-agnostic. No absolute paths to specific home directories.
|
|
25
|
+
2. No personal allow-list entries (broad npm grants, macOS process control, etc.).
|
|
26
|
+
3. No "sunj-labs" references except in attribution.
|
|
27
|
+
4. Tested against cold-adopter personas (`strategy/personas/`) before publication.
|
|
28
|
+
|
|
29
|
+
### Operator layer (gitignored)
|
|
30
|
+
|
|
31
|
+
- `.claude/settings.local.json`
|
|
32
|
+
- `CLAUDE.local.md` (optional, if operator wants per-machine context)
|
|
33
|
+
- `.env.local`
|
|
34
|
+
- Anything ending in `.local`
|
|
35
|
+
|
|
36
|
+
**Rules for the operator layer:**
|
|
37
|
+
|
|
38
|
+
1. Holds operator-specific allow lists, machine paths, personal aliases.
|
|
39
|
+
2. Never committed. `.gitignore` enforces this by listing the files explicitly.
|
|
40
|
+
3. Each contributor creates their own. The shared `.gitignore` block tells them which files to create.
|
|
41
|
+
4. Where convenience accumulates — broad `Bash(rm *)` grants, machine-specific paths, etc.
|
|
42
|
+
|
|
43
|
+
## Mechanical enforcement
|
|
44
|
+
|
|
45
|
+
`.claude/hooks/pre-commit-gate.sh` includes a CCF-3 absolute-path guard. It runs on every `git commit` and BLOCKs when any staged non-exempt file contains `/Users/<name>` or `/home/<name>` patterns.
|
|
46
|
+
|
|
47
|
+
**Exempt paths** (where these patterns are legitimate — documentation, audits, test fixtures):
|
|
48
|
+
|
|
49
|
+
- `.claude/rules/`, `.claude/hooks/`, `.claude/skills/`, `.claude/luminaries/`, `.claude/agents/`
|
|
50
|
+
- `standards/`, `architecture/`, `design/`
|
|
51
|
+
- `docs/` (all subdirs)
|
|
52
|
+
- `chronicle/`, `strategy/`
|
|
53
|
+
- `scripts/tests/`
|
|
54
|
+
|
|
55
|
+
**Non-exempt** (where the guard fires): everything else. Most importantly `.claude/settings.json`, top-level configs, source code under `src/` or `lib/`.
|
|
56
|
+
|
|
57
|
+
When the guard fires, it points to `.claude/settings.local.json` as the right home for the offending entry.
|
|
58
|
+
|
|
59
|
+
## Override
|
|
60
|
+
|
|
61
|
+
`SKIP_OPERATOR_PATHS=1 git commit` — logged via `trace-helper.sh`. Use only for genuine cases where the absolute path must live in the shared layer (rare). Document the rationale in the commit message.
|
|
62
|
+
|
|
63
|
+
## What this fixes
|
|
64
|
+
|
|
65
|
+
Before this standard:
|
|
66
|
+
|
|
67
|
+
- `.claude/settings.json` shipped `Bash(rm /Users/<operator>/src/<org>/bassclef/*)` — F70 in the 2026-05-23 cold-adopter run. Every public clone would have inherited that operator-identity line.
|
|
68
|
+
- Allow-list entries reflected operator workflow rather than adopter safety — F73 in the same run.
|
|
69
|
+
|
|
70
|
+
After this standard:
|
|
71
|
+
|
|
72
|
+
- F70 is removed from the committed `.claude/settings.json`.
|
|
73
|
+
- The hook prevents the class from recurring.
|
|
74
|
+
- New operator-convenience entries go to `.claude/settings.local.json`.
|
|
75
|
+
|
|
76
|
+
## When to add a new field to the operator layer
|
|
77
|
+
|
|
78
|
+
Any of these signals mean it belongs in `settings.local.json`, not `settings.json`:
|
|
79
|
+
|
|
80
|
+
- Contains an absolute path matching `/Users/<name>` or `/home/<name>`.
|
|
81
|
+
- Grants a broad permission (`Bash(rm *)`, `Bash(npm*)`, `Bash(pkill*)`) that an adopter on a first session would not be expected to want.
|
|
82
|
+
- References operator-specific tools or paths (`/Applications/Tailscale.app/...`).
|
|
83
|
+
- Encodes machine-specific config (hostnames, ports tied to a specific dev setup).
|
|
84
|
+
|
|
85
|
+
When in doubt, default to the operator layer. It's cheaper to promote a setting from `settings.local.json` to `settings.json` later than to ship operator identity to every adopter.
|
|
86
|
+
|
|
87
|
+
## Sources read
|
|
88
|
+
|
|
89
|
+
- `docs/adoption-runs/2026-05-23-cold-adopter-1.md` — the cold-adopter run record (PR #735)
|
|
90
|
+
- Operator handoff CCF-3 + Step 5 Issue 4 — the policy specification
|
|
91
|
+
- F70 (operator path leak in committed `.claude/settings.json`)
|
|
92
|
+
- F73 (allow-list grants reflect operator workflow rather than adopter safety)
|
|
93
|
+
- `.claude/hooks/pre-commit-gate.sh` — the mechanical enforcement
|
|
94
|
+
- `.claude/rules/blocked-items.md` — the resolve-or-defer protocol the BLOCKED signal slots into
|
|
95
|
+
|
|
96
|
+
## Closes
|
|
97
|
+
|
|
98
|
+
- bassclef#740 (CCF-3 — two-layer config policy)
|
|
99
|
+
- bassclef#738 (Pre-launch cleanup — F70 instance)
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
description: - Alistair Cockburn — Writing Effective Use Cases (2000).
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## Sources read
|
|
7
|
+
|
|
8
|
+
- Alistair Cockburn — *Writing Effective Use Cases* (2000). Bassclef source for fully-dressed format, goal levels, extension enumeration, preconditions + guarantees, stakeholders + interests.
|
|
9
|
+
- Alistair Cockburn — *Unifying user stories, use cases, and story maps* (2024). Artifact non-overlap (use-case ≠ user-story ≠ task-scenario ≠ story-map); this standard respects the boundaries.
|
|
10
|
+
- `.claude/skills/use-case/SKILL.md` — the skill that produces this artifact; this standard codifies the format the skill emits.
|
|
11
|
+
- `standards/user-story-invest.md` — sibling standard; user-stories slice use-case lines with traceability back. INVEST validation there is orthogonal to Cockburn validation here.
|
|
12
|
+
- `standards/persona-schema.md` — primary-actor field MUST reference a persona slug per this schema.
|
|
13
|
+
|
|
14
|
+
## What I'm NOT reading (with reason)
|
|
15
|
+
|
|
16
|
+
- RUP, Jacobson "Use Case 2.0," and other use-case notation variants — Cockburn is the bassclef shape in sunj-labs per this standard. Alternatives may be adopted later with an explicit ADR.
|
|
17
|
+
|
|
18
|
+
# Use-Case Format Standard
|
|
19
|
+
|
|
20
|
+
Bassclef format for use cases in sunj-labs repos. The contract the
|
|
21
|
+
`/use-case` skill writes and every downstream consumer
|
|
22
|
+
(`/user-stories`, `/interaction-design`, `/decompose`, `/verify`,
|
|
23
|
+
`/spec`) composes against.
|
|
24
|
+
|
|
25
|
+
Template: `templates/use-case-template.md`.
|
|
26
|
+
Skill: `.claude/skills/use-case/SKILL.md`.
|
|
27
|
+
|
|
28
|
+
## Why this standard exists
|
|
29
|
+
|
|
30
|
+
Before /use-case, the user-centric chain had:
|
|
31
|
+
|
|
32
|
+
- `/jtbd-tasks` — WHY (job the product is hired for)
|
|
33
|
+
- `/task-scenarios` — CONTEXT (narrative day-in-the-life)
|
|
34
|
+
- `/user-stories` — WHAT (backlog tokens, INVEST-shaped)
|
|
35
|
+
- `/decompose` — HOW (responsibilities + patterns)
|
|
36
|
+
|
|
37
|
+
Missing: **goal-level behavior spec**. `/user-stories` slices
|
|
38
|
+
goals into INVEST-sized increments, but stories don't enumerate
|
|
39
|
+
alternate flows systematically. `/interaction-design` renders
|
|
40
|
+
flows as diagrams, but diagrams permit free-form omission —
|
|
41
|
+
nothing forces the designer to list every extension.
|
|
42
|
+
|
|
43
|
+
Use cases close the gap. Cockburn's format *requires* extension
|
|
44
|
+
enumeration (1a, 1b, 2a, 2b...), *requires* preconditions and
|
|
45
|
+
postconditions, *requires* stakeholders-and-interests. The
|
|
46
|
+
skill can't emit a valid use case without those fields, so
|
|
47
|
+
cross-cutting concerns (audit, compliance, rate limits) can't
|
|
48
|
+
be silently dropped on the way to `/decompose`.
|
|
49
|
+
|
|
50
|
+
## File convention
|
|
51
|
+
|
|
52
|
+
### Preferred path
|
|
53
|
+
|
|
54
|
+
`docs/use-cases/UC-NNN-{slug}.md` — one file per use case.
|
|
55
|
+
|
|
56
|
+
`NNN` is a zero-padded 3-digit number assigned in creation order.
|
|
57
|
+
`{slug}` is URL-safe: lowercase, hyphens, no spaces. Slug MUST
|
|
58
|
+
match a form of the goal (e.g., `sign-in-with-email` not
|
|
59
|
+
`login` — avoids ambiguity when multiple auth flows coexist).
|
|
60
|
+
|
|
61
|
+
### Matrix
|
|
62
|
+
|
|
63
|
+
`docs/use-cases/_matrix.md` — traceability table with one row
|
|
64
|
+
per use case. See `/use-case` skill Step 7 for columns.
|
|
65
|
+
|
|
66
|
+
## Required fields
|
|
67
|
+
|
|
68
|
+
Every use case MUST include these fields. The skill validates
|
|
69
|
+
presence and emits WARN/BLOCK per the validation matrix below.
|
|
70
|
+
|
|
71
|
+
### Header
|
|
72
|
+
|
|
73
|
+
```markdown
|
|
74
|
+
# UC-NNN — [imperative goal title]
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
The title is the goal statement, imperative mood, no period.
|
|
78
|
+
Examples: `UC-001 — Sign in with email and password`,
|
|
79
|
+
`UC-014 — Submit an expense for approval`.
|
|
80
|
+
|
|
81
|
+
### Metadata block
|
|
82
|
+
|
|
83
|
+
```markdown
|
|
84
|
+
- **Primary actor**: [persona-slug]
|
|
85
|
+
- **Goal level**: ☁️ summary | 🎯 user-goal | 🐟 subfunction
|
|
86
|
+
- **Scope**: [system-under-design]
|
|
87
|
+
- **Status**: draft | accepted | deprecated
|
|
88
|
+
- **Last validated**: YYYY-MM-DD
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
**Primary actor** MUST be a persona slug from `docs/personas/` or
|
|
92
|
+
equivalent. "User," "actor," or role words like "admin" without a
|
|
93
|
+
persona file are WARN.
|
|
94
|
+
|
|
95
|
+
**Goal level** exactly one of the three icons. Default ☁️/🎯/🐟
|
|
96
|
+
per `/use-case` Step 2. Summary only for multi-session goals;
|
|
97
|
+
subfunction only for reused-by-2+ use cases.
|
|
98
|
+
|
|
99
|
+
**Scope** names the system boundary: `POA web UI + auth service`,
|
|
100
|
+
`bassclef-sync hook`, `POA backend`. Fuzzy scope ("the app") is
|
|
101
|
+
WARN — split into distinct use cases.
|
|
102
|
+
|
|
103
|
+
### Stakeholders + interests
|
|
104
|
+
|
|
105
|
+
```markdown
|
|
106
|
+
## Stakeholders + interests
|
|
107
|
+
|
|
108
|
+
| Stakeholder | Interest |
|
|
109
|
+
|-------------|----------|
|
|
110
|
+
| [stakeholder] | [what they want to be true about this goal's execution] |
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
At least **2 non-actor** stakeholders required. Non-actor means:
|
|
114
|
+
not the primary actor. Examples: Compliance, Ops, Support, Billing,
|
|
115
|
+
Legal, Security, Partners, Regulators, Operator/Admin.
|
|
116
|
+
|
|
117
|
+
This block is load-bearing — it's what feeds `/decompose`'s -ility
|
|
118
|
+
audit. A use case with only the primary actor listed will pass
|
|
119
|
+
validation with a WARN but will produce a decomposition missing
|
|
120
|
+
cross-cutting concerns. The skill will flag the WARN explicitly.
|
|
121
|
+
|
|
122
|
+
### Preconditions + guarantees + trigger
|
|
123
|
+
|
|
124
|
+
```markdown
|
|
125
|
+
## Preconditions
|
|
126
|
+
- [state invariant 1]
|
|
127
|
+
- [state invariant 2]
|
|
128
|
+
|
|
129
|
+
## Minimal guarantees
|
|
130
|
+
- [what's true after, regardless of success/failure]
|
|
131
|
+
|
|
132
|
+
## Success guarantees
|
|
133
|
+
- [what's true after a successful run]
|
|
134
|
+
|
|
135
|
+
## Trigger
|
|
136
|
+
- [event that starts the use case]
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
**Preconditions** are checkable state invariants the use case
|
|
140
|
+
assumes on entry. "The system is running" is throat-clearing, not
|
|
141
|
+
a precondition — reject as WARN. Valid preconditions: "account
|
|
142
|
+
exists," "user is authenticated," "quota below limit."
|
|
143
|
+
|
|
144
|
+
**Minimal guarantees** hold on ANY exit (success or extension):
|
|
145
|
+
typically audit logging, state consistency, no secret leakage.
|
|
146
|
+
This is where the "audit-trail written even on failure" invariant
|
|
147
|
+
gets recorded.
|
|
148
|
+
|
|
149
|
+
**Success guarantees** hold on successful completion only.
|
|
150
|
+
|
|
151
|
+
**Trigger** is the specific event (actor action, scheduled event,
|
|
152
|
+
external signal) that starts the flow.
|
|
153
|
+
|
|
154
|
+
### Main success scenario
|
|
155
|
+
|
|
156
|
+
```markdown
|
|
157
|
+
## Main success scenario
|
|
158
|
+
|
|
159
|
+
1. [Actor action OR system response]
|
|
160
|
+
2. [Next step, actor↔system alternating]
|
|
161
|
+
3. [...]
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
Numbered list, 3-9 steps. Each step is either actor action or
|
|
165
|
+
system response; alternate between them. Steps >9 = split into
|
|
166
|
+
subfunction use case.
|
|
167
|
+
|
|
168
|
+
Implementation language prohibited: "System calls Postgres" ❌.
|
|
169
|
+
Say "System retrieves account" — let `/decompose` pick storage.
|
|
170
|
+
|
|
171
|
+
### Extensions
|
|
172
|
+
|
|
173
|
+
```markdown
|
|
174
|
+
## Extensions
|
|
175
|
+
|
|
176
|
+
- **Na. [condition]**:
|
|
177
|
+
- Na1. [step 1 of recovery]
|
|
178
|
+
- Na2. [step 2 of recovery]
|
|
179
|
+
- Na3. Use case ends with [outcome].
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
`N` = the main-scenario step number where the branch originates.
|
|
183
|
+
`a`, `b`, `c` = multiple extensions at the same step. Sub-steps
|
|
184
|
+
within an extension are `Na1`, `Na2`, `Na3`...
|
|
185
|
+
|
|
186
|
+
Nested extensions (`Na1a`) are allowed but nesting >2 levels
|
|
187
|
+
signals a subfunction extraction is needed.
|
|
188
|
+
|
|
189
|
+
**Every step in the main scenario MUST have at least one
|
|
190
|
+
extension considered.** If a step has no realistic branch, state
|
|
191
|
+
that explicitly: `*No extensions — [reason]*`. Silence is a
|
|
192
|
+
failure signal, not confirmation of happy path.
|
|
193
|
+
|
|
194
|
+
Extension enumeration prompts (Cockburn, per skill Step 4):
|
|
195
|
+
|
|
196
|
+
1. What if actor input is invalid?
|
|
197
|
+
2. What if system can't complete step (timeout, dependency, resource)?
|
|
198
|
+
3. What if a precondition silently broke?
|
|
199
|
+
4. What if actor abandons partway?
|
|
200
|
+
5. What if concurrent actor changed state?
|
|
201
|
+
|
|
202
|
+
### Technology/data variations (optional)
|
|
203
|
+
|
|
204
|
+
```markdown
|
|
205
|
+
## Technology / data variations
|
|
206
|
+
|
|
207
|
+
- *Step 3*: password may also be verified via WebAuthn credential
|
|
208
|
+
- *Step 4*: session cookie may be HttpOnly OR stored in SessionStorage per platform
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
Use when the same logical step has multiple implementation paths
|
|
212
|
+
with different -ility characteristics. Feeds `/decompose` with
|
|
213
|
+
variation points needing Strategy pattern.
|
|
214
|
+
|
|
215
|
+
### Related information
|
|
216
|
+
|
|
217
|
+
```markdown
|
|
218
|
+
## Related information
|
|
219
|
+
|
|
220
|
+
- Non-functional requirements: [rate limits, latency SLOs, etc.]
|
|
221
|
+
- References: [specs, ADRs, canvases, external docs]
|
|
222
|
+
- Sliced by stories: US-NNN, US-NNN, ...
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
Rate-limit, latency, and other cross-cutting NFRs live here when
|
|
226
|
+
they don't map cleanly to a stakeholder+interests row.
|
|
227
|
+
|
|
228
|
+
## Validation matrix
|
|
229
|
+
|
|
230
|
+
| # | Check | Fail signal | Severity |
|
|
231
|
+
|---|-------|-------------|----------|
|
|
232
|
+
| 1 | Goal level stated | Missing ☁️/🎯/🐟 | BLOCK |
|
|
233
|
+
| 2 | Primary actor is a persona slug | "user" / missing / role word without persona file | WARN |
|
|
234
|
+
| 3 | ≥2 non-actor stakeholders | Only primary actor listed | WARN |
|
|
235
|
+
| 4 | Preconditions are checkable state invariants | Throat-clearing ("system is running") | WARN |
|
|
236
|
+
| 5 | Main scenario steps numbered | Bullets or prose | BLOCK |
|
|
237
|
+
| 6 | Main scenario 3-9 steps | ≥10 steps | WARN (candidate for subfunction split) |
|
|
238
|
+
| 7 | Every step has ≥1 extension OR explicit "*No extensions — [reason]*" | Silence | BLOCK |
|
|
239
|
+
| 8 | Extensions use Na Nb format | Free-form bullets | BLOCK |
|
|
240
|
+
| 9 | Success guarantees trace back to trigger | Guarantee unrelated to trigger outcome | WARN |
|
|
241
|
+
| 10 | Scope names a specific system boundary | "The app" / missing | WARN |
|
|
242
|
+
| 11 | No implementation language in steps | "System calls Postgres" / framework names | WARN |
|
|
243
|
+
| 12 | Trigger is a specific event | Abstract ("when needed") | WARN |
|
|
244
|
+
|
|
245
|
+
BLOCK = skill refuses to emit; operator must fix.
|
|
246
|
+
WARN = skill emits with warnings recorded in `_matrix.md`.
|
|
247
|
+
|
|
248
|
+
## Relationship to adjacent standards
|
|
249
|
+
|
|
250
|
+
| Standard | Relationship |
|
|
251
|
+
|----------|-------------|
|
|
252
|
+
| `persona-schema.md` | Primary actor MUST reference a persona slug per this schema |
|
|
253
|
+
| `user-story-invest.md` | User stories slice use-case lines; stories cite UC-N step Xa in traceability |
|
|
254
|
+
| `vpc-fit-validation.md` | VPC Pain-Relievers + Gain-Creators inform the stakeholders+interests "why this matters" framing |
|
|
255
|
+
| `project-directory-layout.md` | `docs/use-cases/` is the bassclef path in app repos |
|
|
256
|
+
|
|
257
|
+
## Relationship to adjacent skills
|
|
258
|
+
|
|
259
|
+
| Skill | Role in use-case lifecycle |
|
|
260
|
+
|-------|----------------------------|
|
|
261
|
+
| `/use-case` | Produces use-case files per this standard |
|
|
262
|
+
| `/user-stories` | Slices use-case lines into backlog tokens |
|
|
263
|
+
| `/interaction-design` | Renders main scenario + extensions as diagrams |
|
|
264
|
+
| `/decompose` | Reads use-case as alternative input to sequence diagrams; stakeholders+interests drive -ility audit |
|
|
265
|
+
| `/verify` | Maps use-case lines to test assertions (1:1) |
|
|
266
|
+
| `/spec` | Consumes use cases + stories as input |
|
|
267
|
+
| `/shape` | `medium` + `full` tiers invoke /use-case as part of the chain |
|
|
268
|
+
|
|
269
|
+
## Evolution
|
|
270
|
+
|
|
271
|
+
- **v1.0 (2026-04-21)** — initial bassclef standard, Cockburn
|
|
272
|
+
fully-dressed format with goal levels, stakeholders+interests
|
|
273
|
+
discipline, and extension enumeration rules. Validation matrix
|
|
274
|
+
encodes BLOCK/WARN severities for skill-time gate.
|
|
275
|
+
|
|
276
|
+
## Open questions for future iteration
|
|
277
|
+
|
|
278
|
+
- **Concurrent-actor extensions**: Cockburn's rule 5 ("what if a
|
|
279
|
+
concurrent actor changed state?") is underspecified here. May
|
|
280
|
+
warrant a companion standard on optimistic-concurrency patterns
|
|
281
|
+
tied to use-case extensions.
|
|
282
|
+
- **Use-case reuse (subfunction callouts)**: current format inlines
|
|
283
|
+
subfunction use cases; larger systems may need explicit "include"
|
|
284
|
+
references (UC-001 includes UC-042). Defer until observed pain.
|
|
285
|
+
- **Use-case deprecation lifecycle**: `status: deprecated` is
|
|
286
|
+
noted but lifecycle (when to delete vs. archive) isn't codified.
|
|
287
|
+
Defer until first use-case is retired.
|
|
288
|
+
|
|
289
|
+
## Closes
|
|
290
|
+
|
|
291
|
+
- bassclef #213 (companion to `/use-case` skill)
|
|
292
|
+
- Part of spec-lineage family epic #155
|