@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,99 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
name: pattern-review
|
|
4
|
+
description: "Review code through the lens of world-class engineering patterns \u2014 GoF, Fowler, SOLID, DDD. Flag violations and suggest improvements. Complements /architect-review which is system-level."
|
|
5
|
+
problem: "Code review catches style but misses architecture. A wrong pattern ships and blocks future work."
|
|
6
|
+
value: "Review through the lens of GoF and Fowler and SOLID and DDD. Names the pattern gap or misuse."
|
|
7
|
+
inputs: [A file path or PR ref or code block]
|
|
8
|
+
outputs: [Pattern gap list, Misuse findings, Suggested pattern per finding]
|
|
9
|
+
user_invocable: true
|
|
10
|
+
disable_model_invocation: false
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Principal Engineer Review
|
|
14
|
+
|
|
15
|
+
Apply time-tested software engineering patterns as a review lens.
|
|
16
|
+
|
|
17
|
+
## Patterns to Apply
|
|
18
|
+
|
|
19
|
+
### Design judgment — per @luminary john-ousterhout
|
|
20
|
+
|
|
21
|
+
The lens that asks whether the shape is right in the first place. Beck (TDD) and Fowler (refactoring tactics) presume a target shape; Ousterhout supplies the criteria for choosing the target.
|
|
22
|
+
|
|
23
|
+
- **Deep modules** — a module is deep when it has a small interface and a large, complex implementation hidden behind it. When a class is being split for "smaller files," check: does the split produce TWO deep modules, or TWO shallow ones?
|
|
24
|
+
INSTEAD of accepting file-size as the splitting metric: use interface-shape as the metric. Two shallow modules from a split is a regression even if the line count drops.
|
|
25
|
+
- **Comments encode design decisions code cannot** — every non-obvious comment must say WHY (invariant), WHAT-IF (alternative considered and rejected), or WATCH-OUT (subtle constraint). Comments that restate code are noise; comments that record design decisions are essential. Flag the noise; preserve the design comments.
|
|
26
|
+
- **Complexity is incremental** — flag the small drips at review time, not the large refactor later. A single special case, a single dependency, a single inconsistency adds nothing visible today and compounds across releases.
|
|
27
|
+
- **Define errors out of existence** — when a review surfaces an API that throws errors callers must handle, ask whether the API can be redesigned so the error condition cannot occur. Idempotent operations and bootstrapping-on-missing are stronger than BLOCK-on-missing.
|
|
28
|
+
|
|
29
|
+
When you cite `@luminary john-ousterhout`, you are citing the design-judgment lens. Pair it with Beck (test mechanics), Fowler (refactoring tactics), or GoF (pattern selection) when the review needs those lenses too.
|
|
30
|
+
|
|
31
|
+
### SOLID Principles — per @luminary robert-c-martin
|
|
32
|
+
- **SRP** — Does this module do one thing? Would you change it for more than one reason?
|
|
33
|
+
- **OCP** — Can you extend behavior without modifying existing code?
|
|
34
|
+
- **LSP** — Can subtypes replace their parents without breaking callers?
|
|
35
|
+
- **ISP** — Are interfaces lean? Do implementers stub methods they don't use?
|
|
36
|
+
- **DIP** — Do high-level modules depend on abstractions, not concretions?
|
|
37
|
+
|
|
38
|
+
Check: does business logic import framework or persistence code? That violates the Dependency Rule per @luminary robert-c-martin (Clean Architecture). Functions that do more than one thing, and modules with multiple reasons to change, are SOLID red flags. Boy Scout rule applies — leave the code cleaner than you found it.
|
|
39
|
+
|
|
40
|
+
### Gang of Four (GoF) patterns — per @luminary gang-of-four — Apply When Relevant
|
|
41
|
+
- **Strategy** — scoring dimensions, data sources (each implements same interface)
|
|
42
|
+
- **Observer** — job completion events, webhook callbacks
|
|
43
|
+
- **Factory** — creating agents/workers by type
|
|
44
|
+
- **Template Method** — base class with customizable steps
|
|
45
|
+
- **Adapter** — wrapping external APIs with consistent interface
|
|
46
|
+
- **Decorator** — cross-cutting concerns (observability, caching, auth) wrapping interfaces
|
|
47
|
+
|
|
48
|
+
Per @luminary gang-of-four — the two opening principles of *Design Patterns*: program to an interface, not an implementation; favor object composition over class inheritance. Apply patterns when variation pressure or structural friction exists — not for aesthetics. Pattern stacking (five patterns where two would do) carries cognitive cost; each pattern earns its place.
|
|
49
|
+
|
|
50
|
+
### Fowler patterns — per @luminary martin-fowler
|
|
51
|
+
- **Repository** — data access abstraction (are queries leaking business logic?)
|
|
52
|
+
- **Service Layer** — is business logic in the right layer?
|
|
53
|
+
- **Domain Events** — should actions trigger other actions?
|
|
54
|
+
- **Value Objects** — are primitives used where domain types would be clearer?
|
|
55
|
+
- **Specification** — complex query filters should be composable
|
|
56
|
+
|
|
57
|
+
Code smells per @luminary martin-fowler (*Refactoring*): Long Method, Feature Envy, Shotgun Surgery (one change touches many unrelated files), Primitive Obsession (strings where domain types would clarify), Data Clumps, Inappropriate Intimacy. Name the smell, then name the refactoring that addresses it. When a change is hard, first refactor to make the change easy — then make the easy change.
|
|
58
|
+
|
|
59
|
+
### Stability patterns — per @luminary michael-nygard (*Release It!*)
|
|
60
|
+
- **Circuit Breaker** — external service calls guarded; the three states (Closed / Open / Half-Open) prevent cascading failure
|
|
61
|
+
- **Bulkhead** — thread pools / queue slots bounded per integration; one slow dependency can't starve others
|
|
62
|
+
- **Timeout** — every integration point has explicit connect + read timeouts; no unbounded blocking calls
|
|
63
|
+
- **Fail Fast** — validate at system boundaries; reject requests immediately when a known failure condition exists
|
|
64
|
+
|
|
65
|
+
Check: any integration point without a circuit breaker is a cascading-failure risk per @luminary michael-nygard. Any call chain where one slow dependency can exhaust shared resources needs a bulkhead. Stability patterns are for integration points and external boundaries — not internal application logic.
|
|
66
|
+
|
|
67
|
+
### Domain-Driven Design — per @luminary eric-evans
|
|
68
|
+
- **Bounded Contexts** — are domains properly separated? Does each module use one consistent model?
|
|
69
|
+
- **Aggregates** — are entity boundaries correct? Does one root control access?
|
|
70
|
+
- **Ubiquitous Language** — do code terms match business terms? "DealRecord" for what the business calls "Deal" is a vocabulary leak.
|
|
71
|
+
|
|
72
|
+
Per @luminary eric-evans (DDD blue book): the model is the backbone of the design; bounded contexts let multiple models coexist without collapsing into mud. Watch for anemic domain models — objects that hold data without behavior, with business logic scattered across services.
|
|
73
|
+
|
|
74
|
+
### Pragmatic Rules
|
|
75
|
+
- **YAGNI** — Don't build what you don't need. DO build the boundary so it's easy to add later.
|
|
76
|
+
- **Tell, Don't Ask** — Objects should do things, not be interrogated for state
|
|
77
|
+
- **Law of Demeter** — Don't reach through objects
|
|
78
|
+
- **Composition over Inheritance** — Prefer composing behaviors (per @luminary gang-of-four opening principle)
|
|
79
|
+
- **Fail Fast** — Validate at boundaries, throw early (per @luminary michael-nygard)
|
|
80
|
+
|
|
81
|
+
## Review Procedure
|
|
82
|
+
|
|
83
|
+
1. Read the code being reviewed
|
|
84
|
+
2. For each file/module, check against the patterns above
|
|
85
|
+
3. Flag violations with: pattern violated, current code, suggested improvement, severity
|
|
86
|
+
4. Acknowledge good patterns already in place
|
|
87
|
+
5. Produce summary: N critical, N improvement, N nitpick
|
|
88
|
+
|
|
89
|
+
## When NOT to Apply
|
|
90
|
+
|
|
91
|
+
- Don't over-engineer simple CRUD
|
|
92
|
+
- Don't add abstractions for one-time operations
|
|
93
|
+
- Don't refactor working code just because it could be "more OOP"
|
|
94
|
+
- Three similar lines is better than a premature abstraction
|
|
95
|
+
- Apply patterns when they solve a real problem, not for aesthetics
|
|
96
|
+
|
|
97
|
+
## Output discipline
|
|
98
|
+
|
|
99
|
+
Dispatch `/kiss words --rewrite` on your skill output before you return it. See `standards/skill-output-discipline.md` for the contract.
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
name: personas
|
|
4
|
+
description: "Load, list, and manage user personas \u2014 the bassclef WHO record. Downstream skills (value-prop-canvas, synthetic-user, user-stories, jtbd-tasks) read from its output. Defaults to operator when no personas exist."
|
|
5
|
+
problem: "Product decisions get made for a nameless user. Downstream skills invent personas per session."
|
|
6
|
+
value: "One record of the WHO the product serves. Every skill reads the same personas."
|
|
7
|
+
inputs: [Manage command — list or add or edit or delete]
|
|
8
|
+
outputs: [Persona list with names and jobs, Loaded into session for downstream skills]
|
|
9
|
+
user_invocable: true
|
|
10
|
+
disable_model_invocation: false
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# /personas — Bassclef Persona Primitive
|
|
14
|
+
|
|
15
|
+
The WHO building block for bassclef. Load personas from a repo's persona
|
|
16
|
+
directory, list them with summary, get one by slug, or fall back to a
|
|
17
|
+
minimal operator-default when no personas exist.
|
|
18
|
+
|
|
19
|
+
Downstream skills read personas via the file-system convention below —
|
|
20
|
+
not via an in-memory API. The "interface" is a directory shape + a
|
|
21
|
+
schema, not a function signature. That keeps the primitive compatible
|
|
22
|
+
with every agent session regardless of runtime.
|
|
23
|
+
|
|
24
|
+
## Sources read
|
|
25
|
+
|
|
26
|
+
- Roman Pichler — *The Persona Template* (goal + tasks + approach + context + knowledge + biography). https://www.romanpichler.com/the-persona-template/ — .
|
|
27
|
+
- Agile Alliance — *Personas* glossary entry. https://agilealliance.org/glossary/personas/
|
|
28
|
+
- Atlassian — *User Stories + Personas* overview. https://www.atlassian.com/agile/project-management/user-stories
|
|
29
|
+
- `standards/persona-schema.md` — bassclef schema (this skill's companion standard; Stack-1 artifact)
|
|
30
|
+
- `templates/persona-template.md` — bassclef template (this skill's companion template; Stack-1 artifact)
|
|
31
|
+
- `.claude/skills/jtbd-tasks/SKILL.md` Step 0 — existing "minimum viable persona" (5 fields). Subset of Pichler; remains valid. Path `docs/design/personas/` supported as legacy.
|
|
32
|
+
- `.claude/skills/synthetic-user/SKILL.md` — existing consumer; reads `docs/design/personas/`. This skill keeps that read-path working.
|
|
33
|
+
- Quorum's `docs/personas/*.md` (3 files: couple-founders, cofounder-pair, operator-advisor) — evidence format reference. Schema validates them without forcing edits.
|
|
34
|
+
|
|
35
|
+
## What I'm NOT reading
|
|
36
|
+
|
|
37
|
+
- Alan Cooper *Inmates* archetype-persona framework — adjacent theory; schema is Pichler-shaped per ticket, Cooper referenced in the template as further reading
|
|
38
|
+
- Upstream persona generators (`/psychographic-mine`, `/auto-user-research`) — deferred to later bassclef promotion bet; this skill ships the consumer contract only
|
|
39
|
+
|
|
40
|
+
## When to invoke
|
|
41
|
+
|
|
42
|
+
- Before running `/value-prop-canvas`, `/synthetic-user`, `/risk-test-synthetic`, `/jtbd-tasks`, `/user-stories`, `/spec`, `/riff-prototypes` — those skills read persona output
|
|
43
|
+
- When onboarding a new repo that needs persona definitions
|
|
44
|
+
- When the operator asks "who are our users?"
|
|
45
|
+
|
|
46
|
+
## Usage
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
/personas → list all personas in the repo (summary table)
|
|
50
|
+
/personas list → same as default
|
|
51
|
+
/personas get [slug] → print full persona file
|
|
52
|
+
/personas default → emit operator-default (when no personas exist)
|
|
53
|
+
/personas validate → walk every persona file against the schema, report findings
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Procedure
|
|
57
|
+
|
|
58
|
+
### Step 1: Locate persona files
|
|
59
|
+
|
|
60
|
+
Search for persona files in this order:
|
|
61
|
+
|
|
62
|
+
1. `docs/personas/*.md` — **preferred bassclef path**
|
|
63
|
+
2. `docs/design/personas/*.md` — legacy path (supported for backward compat with `/jtbd-tasks` + `/synthetic-user`)
|
|
64
|
+
3. If neither directory exists: proceed to operator-default fallback (Step 4)
|
|
65
|
+
|
|
66
|
+
Both paths are valid. When both exist, prefer `docs/personas/` and warn the operator that legacy path files are being ignored (offer to migrate).
|
|
67
|
+
|
|
68
|
+
### Step 2: List mode (default)
|
|
69
|
+
|
|
70
|
+
Emit a summary table:
|
|
71
|
+
|
|
72
|
+
```markdown
|
|
73
|
+
| Slug | Name | Goal (1-line) | Evidence quality | Location |
|
|
74
|
+
|------|------|---------------|-----------------|----------|
|
|
75
|
+
| ... | ... | ... | High/Medium/Low/— | docs/personas/... |
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
If a persona omits an evidence-quality field, render `—` (don't invent a rating).
|
|
79
|
+
|
|
80
|
+
### Step 3: Get mode
|
|
81
|
+
|
|
82
|
+
Print the full persona file content. Verify required fields (see schema) before emitting; if any required field is missing, print the file AND a WARN block listing gaps.
|
|
83
|
+
|
|
84
|
+
### Step 4: Operator-default fallback
|
|
85
|
+
|
|
86
|
+
When no persona files exist in the repo, auto-populate a minimal persona file for "you" (the operator) from:
|
|
87
|
+
|
|
88
|
+
- `CLAUDE.md` — read the "What this repo is" / "Active initiative" sections for goal context
|
|
89
|
+
- `substrate.config.md` — read `agents:` and `deploy_targets:` for role context
|
|
90
|
+
- If a git `user.email` exists, use it to derive a rough slug (`operator-[local-part]`), otherwise `operator`
|
|
91
|
+
|
|
92
|
+
Emit the operator default to the conversation (not to disk — operator decides whether to persist it):
|
|
93
|
+
|
|
94
|
+
```markdown
|
|
95
|
+
# Persona — Operator (you)
|
|
96
|
+
|
|
97
|
+
**Slug:** operator
|
|
98
|
+
**Name:** you
|
|
99
|
+
**Goal:** [inferred from CLAUDE.md "Active initiative" or similar section, one line]
|
|
100
|
+
**Context:** [repo name + project_level + active iteration from whereami if present]
|
|
101
|
+
**Knowledge:** [domain cues from CLAUDE.md — frameworks, subsystems]
|
|
102
|
+
**Evidence quality:** — (auto-populated default; no source-trace)
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Tell the operator: "No personas found. Emitted operator-default for `you`. Run `/personas validate` after adding real persona files to `docs/personas/`."
|
|
106
|
+
|
|
107
|
+
### Step 5: Validate mode
|
|
108
|
+
|
|
109
|
+
For each file under `docs/personas/*.md` (and legacy path), check:
|
|
110
|
+
|
|
111
|
+
- [ ] Required fields present (slug, name) — FAIL if absent
|
|
112
|
+
- [ ] Slug matches filename basename (`couple-founders.md` → slug: couple-founders) — FAIL on mismatch
|
|
113
|
+
- [ ] Pichler recommended fields (goal, tasks, approach, context, knowledge, biography) present — WARN (not FAIL) on absence; small personas are valid, just thin. If `goal` is missing but the file has a `## JTBD statements` section, print an INFER line suggesting a goal line derived from the first JTBD — operator reviews, not auto-write.
|
|
114
|
+
- [ ] Evidence-traceability: if persona contains claims about pain points, workflows, or behavior, at least one claim is cited to a source (internal research doc OR external URL). WARN on orphan claims.
|
|
115
|
+
- [ ] No duplicate slugs across files — FAIL on duplicate
|
|
116
|
+
|
|
117
|
+
Output format:
|
|
118
|
+
|
|
119
|
+
```markdown
|
|
120
|
+
## Persona validation
|
|
121
|
+
|
|
122
|
+
**Files scanned**: N in docs/personas/, M in docs/design/personas/
|
|
123
|
+
|
|
124
|
+
| File | Required | Pichler | Evidence | Slug-match | Status |
|
|
125
|
+
|------|----------|---------|----------|-----------|--------|
|
|
126
|
+
| couple-founders.md | ✅ | ✅ (all 6) | ✅ (5 citations) | ✅ | PASS |
|
|
127
|
+
| minimal.md | ✅ | ⚠️ (goal + context only) | ⚠️ (1 orphan claim) | ✅ | WARN |
|
|
128
|
+
| ...
|
|
129
|
+
|
|
130
|
+
**Pass**: N | **Warn**: M | **Fail**: K
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Fail means a required field is missing — the persona can't be safely consumed. Warn means the persona works but would benefit from enrichment.
|
|
134
|
+
|
|
135
|
+
## Schema (summary)
|
|
136
|
+
|
|
137
|
+
Required (every persona — FAIL if absent):
|
|
138
|
+
- `slug` — URL-safe identifier; filename basename
|
|
139
|
+
- `name` — human-readable display name (H1 counts)
|
|
140
|
+
|
|
141
|
+
Recommended (Pichler — WARN if absent):
|
|
142
|
+
- `goal` — one-line "what this persona is trying to accomplish" (downstream skills infer from Role/Context/JTBD sections when missing, but the inference is lossy)
|
|
143
|
+
- `tasks` — recurring tasks in pursuit of the goal
|
|
144
|
+
- `approach` — how they go about it (habits, tools, rhythm)
|
|
145
|
+
- `context` — life / business / organizational context
|
|
146
|
+
- `knowledge` — domain expertise, jargon comfort, technical fluency
|
|
147
|
+
- `biography` — background, archetype, formative influences
|
|
148
|
+
|
|
149
|
+
Recommended (evidence-traceability):
|
|
150
|
+
- `provenance` section — where the persona comes from (research doc, interviews, analytics, external article URLs)
|
|
151
|
+
- Every claim about pain/behavior/workflow traces to a source
|
|
152
|
+
|
|
153
|
+
Full schema: `standards/persona-schema.md`. Template: `templates/persona-template.md`.
|
|
154
|
+
|
|
155
|
+
## Operator-default: when it's OK, when it isn't
|
|
156
|
+
|
|
157
|
+
The operator-default fallback prevents skills from crashing in repos without personas. **Use it to bootstrap, not to replace real personas.**
|
|
158
|
+
|
|
159
|
+
When operator-default is appropriate:
|
|
160
|
+
- New repo, first iteration, no user research yet
|
|
161
|
+
- Internal tooling where the operator IS the user
|
|
162
|
+
- Spike / prototype sessions where user identity is deliberately deferred
|
|
163
|
+
|
|
164
|
+
When it's a red flag:
|
|
165
|
+
- `/synthetic-user` running against operator-default at Tier 3 — you're testing whether the operator can use their own tool, which is not the same as user testing
|
|
166
|
+
- `/value-prop-canvas` built from operator-default — value props for "you" tell you nothing about fit for real customers
|
|
167
|
+
- Iteration bet's "lovability signal" tied to operator-default — that's the operator proxy-hypothesizing, not evidence
|
|
168
|
+
|
|
169
|
+
`/personas validate` surfaces these cases with a note: "Only operator-default persona found; consider adding real personas before [downstream skill]."
|
|
170
|
+
|
|
171
|
+
## Relationship to other skills
|
|
172
|
+
|
|
173
|
+
| Skill | How it composes with `/personas` |
|
|
174
|
+
|-------|---------------------------------|
|
|
175
|
+
| `/value-prop-canvas` | Reads `/personas list` → produces one canvas per persona. 1:1 with persona, never "one for all." |
|
|
176
|
+
| `/synthetic-user` | Reads personas; runs Tier 3 journeys per persona. Replaces the implicit "operator as user" assumption. |
|
|
177
|
+
| `/risk-test-synthetic` | Reads personas; produces risk × persona × artifact matrix. |
|
|
178
|
+
| `/jtbd-tasks` | Current Step 0 bootstraps a "minimum viable persona" (5 fields). That remains valid as a subset; consolidation to `/personas` tracked as follow-up. |
|
|
179
|
+
| `/user-stories` | Reads persona.name for the `As a [persona]` clause in INVEST stories. |
|
|
180
|
+
| `/spec` | Spec actors resolve to persona slugs when personas exist. |
|
|
181
|
+
| `/riff-prototypes` | Prototype evaluation references personas for fit checks. |
|
|
182
|
+
| `/psychographic-mine`, `/auto-user-research` | Upstream generators. Produce files that this skill reads. |
|
|
183
|
+
|
|
184
|
+
## Common pitfalls
|
|
185
|
+
|
|
186
|
+
- **Inventing personas from domain intuition** — personas without source traces fail silently. They look plausible, Synthesize plausibly in test journeys, but don't survive contact with actual users. If you don't have evidence, emit operator-default and flag the research gap.
|
|
187
|
+
- **One persona for all consumers** — if three real customer segments exist, three persona files exist. Compressing them into one loses the fit signal VPC depends on.
|
|
188
|
+
- **Persona file as a wall of text** — the schema is designed for skim. Put the goal + context in the first ~10 lines so downstream skills (and humans) can skim-read before deciding to dive deep.
|
|
189
|
+
- **Path confusion** — preferred path is `docs/personas/`. `docs/design/personas/` works but will eventually be deprecated. New repos should use the preferred path.
|
|
190
|
+
- **Silent schema drift** — running `/personas validate` regularly catches when persona files have been edited in ways that violate required-field invariants. Do this at the start of any iteration that reasons about users.
|
|
191
|
+
|
|
192
|
+
## Provenance & evolution
|
|
193
|
+
|
|
194
|
+
- Started as adopter work on user personas. Notes traced to real sources.
|
|
195
|
+
- Later shipped upstream to bassclef.
|
|
196
|
+
- Eight downstream skills read from `docs/personas/*.md`.
|
|
197
|
+
|
|
198
|
+
Future promotions referenced (separate goals):
|
|
199
|
+
- `/psychographic-mine` — upstream generator
|
|
200
|
+
- `/auto-user-research` — orchestrated research → personas pipeline
|
|
201
|
+
- `/user-stories` — downstream consumer
|
|
202
|
+
- `/risk-test-synthetic` — downstream consumer
|
|
203
|
+
- `/value-prop-canvas` — downstream consumer, shipping in Stack-2 of the same iteration as this skill
|
|
204
|
+
|
|
205
|
+
## Output discipline
|
|
206
|
+
|
|
207
|
+
Dispatch `/kiss words --rewrite` on your skill output before you return it. See `standards/skill-output-discipline.md` for the contract.
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
name: promote
|
|
4
|
+
description: "Propose promoting a pattern to bassclef. Creates an issue in the current repo (not bassclef) with the bassclef-evolution label. Three modes cover default, luminary upgrade, and substrate defect."
|
|
5
|
+
problem: "Good patterns in one adopter repo stay stuck there. Every other adopter reinvents the same wheel."
|
|
6
|
+
value: "Files a promote ticket in the current repo plus bassclef-upstream. Substrate evolves with real usage."
|
|
7
|
+
inputs: [A pattern description or code snippet or discipline learned]
|
|
8
|
+
outputs: [Promote ticket filed in current repo, Cross-repo mirror in bassclef-upstream]
|
|
9
|
+
user_invocable: true
|
|
10
|
+
disable_model_invocation: false
|
|
11
|
+
composes_with: [state-a-problem, kiss, value-prop]
|
|
12
|
+
requires:
|
|
13
|
+
cli: [gh]
|
|
14
|
+
network: true
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
# /promote
|
|
18
|
+
|
|
19
|
+
## What you get
|
|
20
|
+
|
|
21
|
+
An issue filed in the current app repo with the `bassclef-evolution` label, proposing that bassclef adopt a skill / rule / hook / workflow pattern you built locally. Three modes cover different promotion classes — the default files a general promotion issue; `--type luminary` files a full-depth upgrade for a stub luminary; `--type substrate-defect` files a mandatory promotion after fixing a bug in bassclef's own mechanism. Every issue body opens with a Problem section drafted by `/state-a-problem brief` and runs through `/kiss --grade10` inline.
|
|
22
|
+
|
|
23
|
+
The issue stays in your current repo. Bassclef's session-reflection hook scans for `bassclef-evolution` labeled issues across child repos and ingests during a bassclef session — accept, defer, or reject.
|
|
24
|
+
|
|
25
|
+
## When to use it
|
|
26
|
+
|
|
27
|
+
Any time you discover a skill, rule, hook, or workflow pattern in an app repo that would help other repos too. The SDLC checkpoint flags this ("Is this general or app-specific?"). Also fires automatically after resolving a BLOCKED item where the fix landed in bassclef's substrate itself (that path is mandatory, not optional — see FAQ).
|
|
28
|
+
|
|
29
|
+
Skip promotion for genuinely app-specific work (tenant-scoped logic, business rules, deploy details). Bassclef ingests general patterns; app-specific work stays local.
|
|
30
|
+
|
|
31
|
+
## FAQ
|
|
32
|
+
|
|
33
|
+
### What are the three modes?
|
|
34
|
+
|
|
35
|
+
- **Default** — the general path. File a promotion issue for a new skill / rule / hook you built, an extension to an existing bassclef standard, or a workflow pattern insight.
|
|
36
|
+
- **`--type luminary [slug]`** — upgrade a stub luminary you used as primary in an iteration. The issue body carries a full drop-in replacement for the luminary file, not just a description.
|
|
37
|
+
- **`--type substrate-defect [ref]`** — mandatory after fixing a bug in bassclef's own mechanism (hook, rule, counter, marker). The issue documents what was broken, what shipped locally, and why every consumer repo needs the fix. Trigger conditions in `.claude/rules/blocked-items.md` §"When resolution reveals a substrate defect".
|
|
38
|
+
|
|
39
|
+
### How do I know if I should use agent-self-proposed or agent-user-proposed?
|
|
40
|
+
|
|
41
|
+
Scan the current user message for explicit promotion imperatives — "file a bassclef", "promote this", "run /promote", "push to bassclef". If any imperative is present, use `agent-user-proposed`. Otherwise use `agent-self-proposed`.
|
|
42
|
+
|
|
43
|
+
Review requests like "check for /promote" are NOT imperatives to file. Read the intent and default to `agent-self-proposed` on review requests. When genuinely ambiguous, default `agent-self-proposed` and let bassclef triage flag if wrong.
|
|
44
|
+
|
|
45
|
+
The distinction matters — `agent-self-proposed` means the agent's self-awareness caught a gap (evidence of maturing agent). `agent-user-proposed` means the operator caught a gap the agent missed (evidence of a weak trigger condition — bassclef triage asks why the agent missed it).
|
|
46
|
+
|
|
47
|
+
### Why does the issue open with a Problem section?
|
|
48
|
+
|
|
49
|
+
Per `.claude/rules/github-issue-flash-tweet.md` V3 (bassclef#1178 retired Flash + Tweet at PR + issue surfaces). Every issue body opens with `**Problem (≤500 chars):**` drafted by `/state-a-problem brief` — 3-4 sentences carrying Who / What / When / Why-now / Outcome implicit. The Problem section is the headline; readers on mobile decide from it whether to scroll.
|
|
50
|
+
|
|
51
|
+
Then `---` (horizontal rule) then technical detail (`## Summary`, `## Why`, `## Acceptance`).
|
|
52
|
+
|
|
53
|
+
### Why is /kiss --grade10 the default?
|
|
54
|
+
|
|
55
|
+
Bassclef ships plain-English discipline per `.claude/rules/plain-english-discipline.md`. Issue bodies land in adopter-facing surfaces. The `/state-a-problem brief` skill runs `/kiss --grade10` inline by default so the Problem section is plain English without a separate pass. Body content after the Problem section runs through `/kiss words` as a second pass before submission.
|
|
56
|
+
|
|
57
|
+
The PR-CI body-clarity job catches jargon at PR-open time as a backstop, but pre-submission cleanup is faster and produces no comment noise.
|
|
58
|
+
|
|
59
|
+
### Why is substrate-defect mode mandatory?
|
|
60
|
+
|
|
61
|
+
Because silence about the mechanism defect keeps the bug local. Three sessions in April 2026 fixed local hook drift without firing /promote; the same drift re-surfaced in POA two weeks later. Bet `2026-04-21a-blocked-signal-integrity` filed this mode as the closing obligation — the agent doesn't choose whether to promote; the trigger fires it.
|
|
62
|
+
|
|
63
|
+
If you fix a hook, rule, or counter mechanism in the app repo but skip the bassclef promotion, every other consumer repo inherits the broken version until they hit the same failure and re-diagnose it.
|
|
64
|
+
|
|
65
|
+
### How does bassclef ingest these?
|
|
66
|
+
|
|
67
|
+
The bassclef session-reflection hook scans for `bassclef-evolution` labeled issues across all child repos. During a bassclef session, issues are reviewed for general applicability. Accepted issues result in content promoted to bassclef and the source issue closed. Deferred issues stay open with a rationale. Rejected issues close with an explanation.
|
|
68
|
+
|
|
69
|
+
App repos never need write access to bassclef. The pull-side ingestion is how promotions land.
|
|
70
|
+
|
|
71
|
+
## Details below the fold
|
|
72
|
+
|
|
73
|
+
### Label creation (one-time per app repo)
|
|
74
|
+
|
|
75
|
+
These labels don't exist by default. First time using `/promote` in a new repo, create them:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
gh label create agent-self-proposed \
|
|
79
|
+
--color 0E8A16 \
|
|
80
|
+
--description "Agent proactively identified this gap during reflection"
|
|
81
|
+
gh label create agent-user-proposed \
|
|
82
|
+
--color D93F0B \
|
|
83
|
+
--description "Operator caught this gap; agent's trigger needs review"
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Bassclef provides the convention; each repo creates the labels locally.
|
|
87
|
+
|
|
88
|
+
### Procedure — target resolution (all modes)
|
|
89
|
+
|
|
90
|
+
Before filing, resolve where the issue lands. Reads `promote_target` from `.claude/bassclef-configs.jsonc`. Two shapes accepted plus a fallback:
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
# Read promote_target from bassclef-configs.jsonc (strip JSONC comments first)
|
|
94
|
+
TARGET=$(sed 's|//.*||' .claude/bassclef-configs.jsonc 2>/dev/null | jq -r '.promote_target // empty' 2>/dev/null)
|
|
95
|
+
|
|
96
|
+
if [ -z "$TARGET" ]; then
|
|
97
|
+
# Backward-compat — file in current repo (skill's prior behavior)
|
|
98
|
+
GH_REPO_ARG=""
|
|
99
|
+
DISPATCH="gh"
|
|
100
|
+
elif [ "${TARGET#email:}" != "$TARGET" ]; then
|
|
101
|
+
# email:<address> — print mailto: URL, adopter sends
|
|
102
|
+
EMAIL_ADDR="${TARGET#email:}"
|
|
103
|
+
DISPATCH="mailto"
|
|
104
|
+
else
|
|
105
|
+
# <owner>/<repo> — gh issue create --repo <TARGET>
|
|
106
|
+
GH_REPO_ARG="--repo $TARGET"
|
|
107
|
+
DISPATCH="gh"
|
|
108
|
+
fi
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
When `$DISPATCH == "mailto"`, the procedure prints a ready-to-use `mailto:` URL instead of running `gh issue create`. The adopter sends. Nothing auto-sends.
|
|
112
|
+
|
|
113
|
+
When `$DISPATCH == "gh"`, all three procedure modes below run their `gh issue create` command as documented, with `$GH_REPO_ARG` inserted right after `gh issue create`.
|
|
114
|
+
|
|
115
|
+
Explicit env override — `PROMOTE_TARGET=<value> /promote ...` — beats the config field for one call.
|
|
116
|
+
|
|
117
|
+
Defaults per adopter tier (advisory):
|
|
118
|
+
|
|
119
|
+
| Adopter tier | Recommended `promote_target` |
|
|
120
|
+
|---|---|
|
|
121
|
+
| lite (npm-shipped) | `email:hello@bassclef.dev` (or your address) |
|
|
122
|
+
| standard (this repo, other operator repos) | `sunj-labs/bassclef-upstream` |
|
|
123
|
+
|
|
124
|
+
Adopter sets the value in `.claude/bassclef-configs.jsonc` once. `/promote` picks it up every call. Closes bassclef-upstream#1028.
|
|
125
|
+
|
|
126
|
+
### Procedure — default mode
|
|
127
|
+
|
|
128
|
+
1. Identify what to promote — which file(s) and why they're general
|
|
129
|
+
2. Classify — New (skill / rule / hook not in bassclef), Extension (improvement to an existing standard), Pattern (workflow insight, not a specific file)
|
|
130
|
+
3. Draft the Problem opener via `/state-a-problem brief` — Who benefits (bassclef adopters + future agents), what gap the local pattern fills, when adopters hit it, why now (concrete iteration evidence), what outcome promotion produces
|
|
131
|
+
4. Create the issue in THIS repo (not bassclef):
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
gh issue create $GH_REPO_ARG \
|
|
135
|
+
--label "bassclef-evolution,agent-self-proposed" \
|
|
136
|
+
--title "Promote to bassclef: [brief description]" \
|
|
137
|
+
--body "**Problem (≤500 chars):** [output from /state-a-problem brief]
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## What
|
|
142
|
+
[What should be promoted — file name, content summary]
|
|
143
|
+
|
|
144
|
+
## Why general
|
|
145
|
+
[What makes it reusable — not app-specific]
|
|
146
|
+
|
|
147
|
+
## Type
|
|
148
|
+
[New | Extension | Pattern]
|
|
149
|
+
|
|
150
|
+
## Content
|
|
151
|
+
[Paste the relevant content or reference the file]"
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
5. Note in the session's session log: "Proposed promotion: [description] → #NNN"
|
|
155
|
+
|
|
156
|
+
### Procedure — luminary upgrade mode
|
|
157
|
+
|
|
158
|
+
Fires when a stub-depth luminary was used as primary in an iteration and the iterating repo has concrete context to upgrade it.
|
|
159
|
+
|
|
160
|
+
App repos can't edit bassclef files directly (symlinks). This mode files a drop-in replacement so bassclef's agent gets a ready diff instead of having to reconstruct what the app repo's agent already figured out.
|
|
161
|
+
|
|
162
|
+
1. Read the current stub at `.claude/luminaries/[slug].md` (inherited from bassclef via symlinks)
|
|
163
|
+
2. Identify what's missing to reach full depth:
|
|
164
|
+
- When to channel this luminary (concrete conditions)
|
|
165
|
+
- Stack translation (specific to your stack)
|
|
166
|
+
- Anti-patterns it prevents (3-5 concrete failure modes)
|
|
167
|
+
- Worked example (using real entities from your domain)
|
|
168
|
+
- Related luminaries (3-5 named relationships)
|
|
169
|
+
3. Draft each section with evidence from the iteration that triggered the upgrade
|
|
170
|
+
4. Draft the Problem opener via `/state-a-problem brief`
|
|
171
|
+
5. Create the issue with the full-depth content pre-filled:
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
gh issue create $GH_REPO_ARG \
|
|
175
|
+
--label "bassclef-evolution,luminary-upgrade" \
|
|
176
|
+
--title "Promote to bassclef: upgrade [luminary name] stub → full" \
|
|
177
|
+
--body "**Problem (≤500 chars):** [output from /state-a-problem brief]
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## Context
|
|
182
|
+
Used [luminary] as primary in iteration [goal path]. Evidence reveals content the current stub doesn't capture.
|
|
183
|
+
|
|
184
|
+
## Proposed upgrade (drop-in replacement)
|
|
185
|
+
|
|
186
|
+
\`\`\`markdown
|
|
187
|
+
[full drafted content for .claude/luminaries/[slug].md]
|
|
188
|
+
\`\`\`
|
|
189
|
+
|
|
190
|
+
## Evidence from this iteration
|
|
191
|
+
|
|
192
|
+
- [concrete usage that informed the draft]
|
|
193
|
+
- [what was missing from the stub]
|
|
194
|
+
- [patterns and anti-patterns that emerged]
|
|
195
|
+
|
|
196
|
+
## Source references to verify
|
|
197
|
+
|
|
198
|
+
- [primary sources to check before merging]"
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### Procedure — substrate-defect mode
|
|
202
|
+
|
|
203
|
+
Fires when resolution of a BLOCKED item reveals that the hook / rule / counter mechanism itself was broken — not the work. Trigger conditions in `blocked-items.md` §"When resolution reveals a substrate defect".
|
|
204
|
+
|
|
205
|
+
**Trigger patterns:**
|
|
206
|
+
|
|
207
|
+
- Stuck signal resolved via mechanism-read + substrate edit
|
|
208
|
+
- Hook false-positive was the root cause (banner fired without real work being undone)
|
|
209
|
+
- Counter miscount / marker rot / path drift in the substrate
|
|
210
|
+
- Reviewer rejection that traces to a rule / hook producing wrong guidance
|
|
211
|
+
|
|
212
|
+
**Procedure:**
|
|
213
|
+
|
|
214
|
+
1. Identify the defect — which substrate file (hook, rule, skill, standard) was wrong, and what specifically broke
|
|
215
|
+
2. Confirm the fix landed — the PR / commit that fixes the local instance is in-flight or merged
|
|
216
|
+
3. Draft the Problem opener via `/state-a-problem brief`
|
|
217
|
+
4. Create the issue with the substrate-defect template:
|
|
218
|
+
|
|
219
|
+
```bash
|
|
220
|
+
gh issue create $GH_REPO_ARG \
|
|
221
|
+
--label "bassclef-evolution,agent-self-proposed,substrate-defect" \
|
|
222
|
+
--title "Promote to bassclef: substrate defect — [one-line description]" \
|
|
223
|
+
--body "**Problem (≤500 chars):** [output from /state-a-problem brief]
|
|
224
|
+
|
|
225
|
+
---
|
|
226
|
+
|
|
227
|
+
## Signal observed
|
|
228
|
+
[Banner text, chronicle dates showing the loop, or reviewer comment.
|
|
229
|
+
Include counter values across sessions if stuck-signal path applies.]
|
|
230
|
+
|
|
231
|
+
## Mechanism file read
|
|
232
|
+
- Path: [e.g., .claude/hooks/session-end.sh]
|
|
233
|
+
- Defect: [wrong path, stale regex, counter reading location the writer stopped using, calendar-date check in ephemeral env, etc.]
|
|
234
|
+
|
|
235
|
+
## Fix applied
|
|
236
|
+
- PR / commit: [ref]
|
|
237
|
+
- Change shape: [1-2 sentences — what the substrate now does differently]
|
|
238
|
+
|
|
239
|
+
## Propagation requirement
|
|
240
|
+
- Consumer repos that inherit this substrate: [list, or 'all per bassclef-sync.sh']
|
|
241
|
+
- What breaks in consumer repos without this fix: [concrete failure mode, with at least one observable signal]
|
|
242
|
+
- Urgency: [high if silent wrong signals; medium if noisy false positives; low if cosmetic]
|
|
243
|
+
|
|
244
|
+
## Source references
|
|
245
|
+
- Rule / standard governing this mechanism: [path]
|
|
246
|
+
- Related issues / prior drift: [issue refs if any]"
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
5. Cite in session log: `substrate defect promoted: #NNN`
|
|
250
|
+
|
|
251
|
+
**Label discipline:** substrate-defect promotions carry THREE labels — `bassclef-evolution` + `agent-self-proposed` (or `agent-user-proposed` if operator flagged) + `substrate-defect`. The third label routes bassclef triage to treat these at higher priority.
|
|
252
|
+
|
|
253
|
+
### Composes with
|
|
254
|
+
|
|
255
|
+
- `/state-a-problem brief` — drafts the Problem opener (≤500 chars) for every issue body; runs `/kiss --grade10` inline
|
|
256
|
+
- `/kiss words` — applied to body content after the Problem section before filing
|
|
257
|
+
- `/value-prop` — retained for non-issue surfaces (session log entries, journal openers, retro lines) where the tweet + brief sizes still apply
|
|
258
|
+
|
|
259
|
+
### Rules
|
|
260
|
+
|
|
261
|
+
- Issue goes in the CURRENT repo. App repos file in their own repo with `bassclef-evolution` label; bassclef's session-reflection hook scans and ingests.
|
|
262
|
+
- App repos never need write access to bassclef. The label routes promotion through pull-side ingestion.
|
|
263
|
+
- Use the `bassclef-evolution` label consistently. The ingestion hook reads this exact label across all child repos.
|
|
264
|
+
- Agent-proposed promotions get the `agent-self-proposed` or `agent-user-proposed` label for scrutiny routing.
|
|
265
|
+
- Bassclef sessions make the accept / defer / reject decision. App repos file and continue with current work; bassclef lands on its own cadence.
|
|
266
|
+
|
|
267
|
+
### Refs
|
|
268
|
+
|
|
269
|
+
- bassclef#1256 — this skill's V2 rewrite parent (Problem section opener replaces Flash + Tweet)
|
|
270
|
+
- bassclef#1178 — parent rule update (Problem section at PR + issue body surfaces)
|
|
271
|
+
- bassclef#559 — Phase II Trim the Fat plain-English discipline parent
|
|
272
|
+
- `.claude/skills/state-a-problem/SKILL.md` — drafts the Problem opener
|
|
273
|
+
- `.claude/skills/kiss/SKILL.md` — grade-10 substitution
|
|
274
|
+
- `.claude/rules/github-issue-flash-tweet.md` — V3 rule this skill aligns with
|
|
275
|
+
- `.claude/rules/plain-english-discipline.md` — master plain-English rule
|
|
276
|
+
- `.claude/rules/blocked-items.md` — substrate-defect mode mandatory trigger
|
|
277
|
+
- `.claude/rules/stuck-signal-diagnostic.md` — stuck-counter path that most often surfaces substrate defects
|
|
278
|
+
- `standards/bassclef-evolution.md` — full ingestion protocol + three-source model
|
|
279
|
+
- `standards/opener-discipline.md` — the three-block opener shape the Problem section fits into
|
|
280
|
+
|
|
281
|
+
## Output discipline
|
|
282
|
+
|
|
283
|
+
Dispatch `/kiss words --rewrite` on your skill output before you return it. See `standards/skill-output-discipline.md` for the contract.
|