@thebassclef/lite 0.1.2 → 1.0.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 +238 -127
- package/dist/cli.js +240 -129
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/lite/.bassclef-source.json +10 -0
- package/dist/lite/.claude/settings.json +212 -0
- package/dist/lite/CLAUDE.md +41 -0
- package/dist/lite/gitignore +58 -0
- package/dist/lite/standards/bassclef-wiring-manifest.json +497 -0
- package/dist/lite/whereami.md +24 -0
- package/package.json +8 -2
- package/substrate/.bassclef/lite-manifest.json +0 -2701
- package/substrate/.claude/agents/architect.md +0 -70
- package/substrate/.claude/agents/builder.md +0 -114
- package/substrate/.claude/agents/designer.md +0 -156
- package/substrate/.claude/agents/reviewer.md +0 -88
- package/substrate/.claude/hooks/artifact-ingestion-gate.sh +0 -357
- package/substrate/.claude/hooks/assert-verify-steering.sh +0 -77
- package/substrate/.claude/hooks/bassclef-source-config-validate.sh +0 -215
- package/substrate/.claude/hooks/bassclef-sync.sh +0 -634
- package/substrate/.claude/hooks/compound-noun-scrub.sh +0 -292
- package/substrate/.claude/hooks/kiss-expansion-inject.sh +0 -69
- package/substrate/.claude/hooks/longrun-prep-compounding-axis-check.sh +0 -492
- package/substrate/.claude/hooks/longrun-prep-compounding-sequence-check.sh +0 -492
- package/substrate/.claude/hooks/plain-english-steering.sh +0 -156
- package/substrate/.claude/hooks/post-skill-friction-check.sh +0 -177
- package/substrate/.claude/hooks/post-skill-telemetry.sh +0 -62
- package/substrate/.claude/hooks/pre-build-gate.sh +0 -511
- package/substrate/.claude/hooks/pre-commit-gate.sh +0 -451
- package/substrate/.claude/hooks/session-end.sh +0 -433
- package/substrate/.claude/hooks/session-reflection.sh +0 -303
- package/substrate/.claude/hooks/skill-body-grade-gate.sh +0 -219
- package/substrate/.claude/hooks/skill-body-intent-drift.sh +0 -107
- package/substrate/.claude/hooks/skill-step-list-check.sh +0 -171
- package/substrate/.claude/hooks/state-validate.sh +0 -271
- package/substrate/.claude/hooks/substrate-clarity-gate.sh +0 -1110
- package/substrate/.claude/hooks/temperance-gate.sh +0 -147
- package/substrate/.claude/hooks/testing-tier-enforce.sh +0 -233
- package/substrate/.claude/hooks/turn-prose-grade-measure.sh +0 -219
- package/substrate/.claude/hooks/turn-prose-kiss-check.sh +0 -463
- package/substrate/.claude/hooks/vocabulary-migration-check.sh +0 -171
- package/substrate/.claude/hooks/whereami-utc-gate.sh +0 -142
- package/substrate/.claude/luminaries/alan-cooper.md +0 -170
- package/substrate/.claude/luminaries/alistair-cockburn.md +0 -140
- package/substrate/.claude/luminaries/amazon-pr-faq.md +0 -34
- package/substrate/.claude/luminaries/ash-maurya.md +0 -121
- package/substrate/.claude/luminaries/bill-buxton.md +0 -210
- package/substrate/.claude/luminaries/charles-sanders-peirce.md +0 -150
- package/substrate/.claude/luminaries/david-ogilvy.md +0 -192
- package/substrate/.claude/luminaries/don-norman.md +0 -173
- package/substrate/.claude/luminaries/edward-tufte.md +0 -179
- package/substrate/.claude/luminaries/eric-evans.md +0 -160
- package/substrate/.claude/luminaries/frederick-brooks.md +0 -50
- package/substrate/.claude/luminaries/gang-of-four.md +0 -157
- package/substrate/.claude/luminaries/glenford-myers.md +0 -230
- package/substrate/.claude/luminaries/hunt-thomas.md +0 -115
- package/substrate/.claude/luminaries/hyrum-wright.md +0 -94
- package/substrate/.claude/luminaries/jason-fried-dhh.md +0 -46
- package/substrate/.claude/luminaries/jesse-james-garrett.md +0 -154
- package/substrate/.claude/luminaries/john-ousterhout.md +0 -94
- package/substrate/.claude/luminaries/karl-popper.md +0 -132
- package/substrate/.claude/luminaries/kent-beck.md +0 -168
- package/substrate/.claude/luminaries/linus-torvalds.md +0 -218
- package/substrate/.claude/luminaries/martin-fowler.md +0 -164
- package/substrate/.claude/luminaries/michael-feathers.md +0 -125
- package/substrate/.claude/luminaries/michael-nygard.md +0 -118
- package/substrate/.claude/luminaries/robert-c-martin.md +0 -164
- package/substrate/.claude/luminaries/saltzer-schroeder.md +0 -194
- package/substrate/.claude/luminaries/sophia-prater.md +0 -193
- package/substrate/.claude/luminaries/stephen-toulmin.md +0 -131
- package/substrate/.claude/luminaries/tony-hoare.md +0 -170
- package/substrate/.claude/luminaries/vaughn-vernon.md +0 -50
- package/substrate/.claude/luminaries/w-edwards-deming.md +0 -158
- package/substrate/.claude/rules/accessor-library-discipline.md +0 -138
- package/substrate/.claude/rules/adr-discipline.md +0 -120
- package/substrate/.claude/rules/api-conventions.md +0 -125
- package/substrate/.claude/rules/artifact-ingestion.md +0 -179
- package/substrate/.claude/rules/assert-only-after-verify.md +0 -137
- package/substrate/.claude/rules/blocked-items.md +0 -146
- package/substrate/.claude/rules/bootstrap-pair-discipline.md +0 -141
- package/substrate/.claude/rules/branching.md +0 -28
- package/substrate/.claude/rules/cold-adopter-harness-discipline.md +0 -129
- package/substrate/.claude/rules/commit-conventions.md +0 -22
- package/substrate/.claude/rules/compounding-axis-fresh-analysis.md +0 -188
- package/substrate/.claude/rules/compounding-sequence-fresh-analysis.md +0 -188
- package/substrate/.claude/rules/context-engineering.md +0 -202
- package/substrate/.claude/rules/context-management.md +0 -85
- package/substrate/.claude/rules/defensive-bash.md +0 -68
- package/substrate/.claude/rules/deferred-actions.md +0 -233
- package/substrate/.claude/rules/destructive-operations.md +0 -69
- package/substrate/.claude/rules/diagnosis.md +0 -38
- package/substrate/.claude/rules/github-issue-flash-tweet.md +0 -156
- package/substrate/.claude/rules/guardrails.md +0 -73
- package/substrate/.claude/rules/hook-wire-on-author.md +0 -103
- package/substrate/.claude/rules/identifier-leak-prevention.md +0 -104
- package/substrate/.claude/rules/iteration-bet-brief-completeness.md +0 -54
- package/substrate/.claude/rules/lite-manifest-schema-change-discipline.md +0 -98
- package/substrate/.claude/rules/longrun-prep-plan-doc-compression.md +0 -89
- package/substrate/.claude/rules/loop-discipline.md +0 -81
- package/substrate/.claude/rules/manual-prod-approval.md +0 -100
- package/substrate/.claude/rules/marker-enrichment-discipline.md +0 -99
- package/substrate/.claude/rules/mobile-ephemeral-session.md +0 -109
- package/substrate/.claude/rules/new-dependency-check.md +0 -51
- package/substrate/.claude/rules/oo-ad-entry-point.md +0 -117
- package/substrate/.claude/rules/operator-facing-prose.md +0 -196
- package/substrate/.claude/rules/option-label-discipline.md +0 -108
- package/substrate/.claude/rules/pattern-annotation.md +0 -100
- package/substrate/.claude/rules/plain-english-discipline.md +0 -156
- package/substrate/.claude/rules/plan-enumeration-needs-value-props.md +0 -211
- package/substrate/.claude/rules/pr-body-shape.md +0 -317
- package/substrate/.claude/rules/pr-strategy.md +0 -167
- package/substrate/.claude/rules/pr-title-shape.md +0 -161
- package/substrate/.claude/rules/prototype-workflow.md +0 -65
- package/substrate/.claude/rules/reserved-skill-names.md +0 -123
- package/substrate/.claude/rules/schema-management.md +0 -49
- package/substrate/.claude/rules/sdlc-gates.md +0 -149
- package/substrate/.claude/rules/security.md +0 -37
- package/substrate/.claude/rules/session-artifacts.md +0 -236
- package/substrate/.claude/rules/skill-composition-declarations.md +0 -124
- package/substrate/.claude/rules/skill-description-clarity.md +0 -247
- package/substrate/.claude/rules/skill-procedure-step-list.md +0 -137
- package/substrate/.claude/rules/state-schema-validation.md +0 -162
- package/substrate/.claude/rules/stuck-signal-diagnostic.md +0 -140
- package/substrate/.claude/rules/substrate-config-schema.md +0 -98
- package/substrate/.claude/rules/test-list-discipline.md +0 -175
- package/substrate/.claude/rules/test-sufficiency.md +0 -210
- package/substrate/.claude/rules/testing-tier-config.md +0 -145
- package/substrate/.claude/rules/testing.md +0 -38
- package/substrate/.claude/rules/turn-estimate-grounding.md +0 -134
- package/substrate/.claude/rules/visual-hierarchy.md +0 -437
- package/substrate/.claude/rules/we-dont-break-adopters.md +0 -126
- package/substrate/.claude/rules/whereami-load-bearing.md +0 -202
- package/substrate/.claude/rules/writing-craft-discipline.md +0 -92
- package/substrate/.claude/rules/wu-sequencing-compounds.md +0 -145
- package/substrate/.claude/skills/build/SKILL.md +0 -640
- package/substrate/.claude/skills/chronicle/SKILL.md +0 -55
- package/substrate/.claude/skills/clean-artifacts/SKILL.md +0 -249
- package/substrate/.claude/skills/decompose/SKILL.md +0 -280
- package/substrate/.claude/skills/diagnose/SKILL.md +0 -297
- package/substrate/.claude/skills/feynman/SKILL.md +0 -90
- package/substrate/.claude/skills/howdoi/SKILL.md +0 -105
- package/substrate/.claude/skills/ia-model/SKILL.md +0 -108
- package/substrate/.claude/skills/interaction-design/SKILL.md +0 -112
- package/substrate/.claude/skills/interpret-input/SKILL.md +0 -180
- package/substrate/.claude/skills/journal/SKILL.md +0 -209
- package/substrate/.claude/skills/kiss/SKILL.md +0 -449
- package/substrate/.claude/skills/launch/SKILL.md +0 -915
- package/substrate/.claude/skills/lean-canvas/SKILL.md +0 -332
- package/substrate/.claude/skills/longrun/SKILL.md +0 -463
- package/substrate/.claude/skills/luminary/SKILL.md +0 -481
- package/substrate/.claude/skills/ogilvy-writing-audit/SKILL.md +0 -177
- package/substrate/.claude/skills/onboard-repo/SKILL.md +0 -1624
- package/substrate/.claude/skills/pattern-review/SKILL.md +0 -99
- package/substrate/.claude/skills/personas/SKILL.md +0 -207
- package/substrate/.claude/skills/promote/SKILL.md +0 -283
- package/substrate/.claude/skills/requirement/SKILL.md +0 -98
- package/substrate/.claude/skills/retro/SKILL.md +0 -117
- package/substrate/.claude/skills/riff/SKILL.md +0 -114
- package/substrate/.claude/skills/roadmap-reconcile/SKILL.md +0 -163
- package/substrate/.claude/skills/session-end/SKILL.md +0 -309
- package/substrate/.claude/skills/session-log/SKILL.md +0 -299
- package/substrate/.claude/skills/skills/SKILL.md +0 -228
- package/substrate/.claude/skills/spec/SKILL.md +0 -105
- package/substrate/.claude/skills/sprint/SKILL.md +0 -392
- package/substrate/.claude/skills/stage/SKILL.md +0 -384
- package/substrate/.claude/skills/state-a-problem/SKILL.md +0 -185
- package/substrate/.claude/skills/temperance/SKILL.md +0 -108
- package/substrate/.claude/skills/use-case/SKILL.md +0 -417
- package/substrate/.claude/skills/user-stories/SKILL.md +0 -268
- package/substrate/.claude/skills/value-prop/SKILL.md +0 -251
- package/substrate/.claude/skills/verify/SKILL.md +0 -160
- package/substrate/.claude/skills/visual-review/SKILL.md +0 -503
- package/substrate/.claude/skills/whats-the-plan/SKILL.md +0 -202
- package/substrate/.claude/skills/whereami/SKILL.md +0 -307
- package/substrate/AGENTS.md +0 -79
- package/substrate/CLAUDE-lite.md +0 -85
- package/substrate/CODE_OF_CONDUCT.md +0 -28
- package/substrate/CONTRIBUTING.md +0 -177
- package/substrate/README.md +0 -173
- package/substrate/SECURITY.md +0 -19
- package/substrate/architecture/decisions/ADR-029-release-pipeline.md +0 -79
- package/substrate/architecture/decisions/ADR-031-non-breaking-changes-adopter-discipline.md +0 -139
- package/substrate/architecture/decisions/ADR-032-adopter-sync-dispatcher-architecture.md +0 -192
- package/substrate/architecture/decisions/ADR-039-release-tagging-scheme.md +0 -145
- package/substrate/architecture/decisions/ADR-040-planning-skill-vocabulary-and-lite-profile.md +0 -155
- package/substrate/architecture/decisions/ADR-044-unified-skill-body-template.md +0 -162
- package/substrate/lib/clean-artifacts-sweep.sh +0 -112
- package/substrate/lib/code-comment-discipline.sh +0 -144
- package/substrate/lib/composer-preflight.sh +0 -459
- package/substrate/lib/hook-inject.sh +0 -255
- package/substrate/lib/luminary-pick.sh +0 -96
- package/substrate/lib/output-discipline.sh +0 -143
- package/substrate/lib/prose-scan-boundary.sh +0 -171
- package/substrate/lib/rewrite-check.sh +0 -214
- package/substrate/lib/state.sh +0 -1372
- package/substrate/lib/telemetry.sh +0 -205
- package/substrate/lib/tier-check.sh +0 -187
- package/substrate/lib/tier-dependency-audit.sh +0 -1088
- package/substrate/presence/install/bassclef-hook-connect.sh +0 -178
- package/substrate/presence/install/bassclef-sync.dispatcher.template.sh +0 -841
- package/substrate/presence/install/bassclef-sync.template.sh +0 -2076
- package/substrate/presence/install/schedule-auto-save.cron.sh +0 -88
- package/substrate/presence/install/schedule-auto-save.taskscheduler.md +0 -122
- package/substrate/scripts/aggregate-telemetry.sh +0 -217
- package/substrate/scripts/analyze-tier-dependencies.sh +0 -239
- package/substrate/scripts/generate-lite-manifest.sh +0 -505
- package/substrate/scripts/generate-tier-manifest.sh +0 -28
- package/substrate/scripts/intent-drift-check.sh +0 -456
- package/substrate/scripts/lite-manifest-drift-check.sh +0 -146
- package/substrate/scripts/render-lite-manifest-doc.sh +0 -150
- package/substrate/standards/adr-template.md +0 -86
- package/substrate/standards/api-conventions/nextjs.md +0 -84
- package/substrate/standards/artifact-composition.md +0 -209
- package/substrate/standards/bash-hook-safety.md +0 -246
- package/substrate/standards/bassclef-configs-schema.md +0 -232
- package/substrate/standards/bassclef-evolution.md +0 -143
- package/substrate/standards/bassclef-internal-jargon.md +0 -244
- package/substrate/standards/bassclef-managed-sentinel.md +0 -96
- package/substrate/standards/bassclef-source-config.md +0 -228
- package/substrate/standards/branch-stacking.md +0 -408
- package/substrate/standards/code-safety-principles.md +0 -176
- package/substrate/standards/composer-prerequisites.md +0 -155
- package/substrate/standards/deferred-actions-schema.md +0 -204
- package/substrate/standards/dependency-discipline/cargo.md +0 -39
- package/substrate/standards/dependency-discipline/gem.md +0 -43
- package/substrate/standards/dependency-discipline/go-mod.md +0 -41
- package/substrate/standards/dependency-discipline/npm.md +0 -42
- package/substrate/standards/dependency-discipline/pip.md +0 -42
- package/substrate/standards/deployment-topology/ec2-tailscale.md +0 -225
- package/substrate/standards/deployment-topology.md +0 -69
- package/substrate/standards/docs-sync-allowlist.md +0 -76
- package/substrate/standards/domain-and-dns.md +0 -145
- package/substrate/standards/frontend-stack.md +0 -67
- package/substrate/standards/frontmatter-schema.md +0 -154
- package/substrate/standards/graceful-exit.md +0 -227
- package/substrate/standards/hook-idempotency.md +0 -102
- package/substrate/standards/hook-injection-discipline.md +0 -202
- package/substrate/standards/hook-install-class.md +0 -215
- package/substrate/standards/input-handler-interface.md +0 -152
- package/substrate/standards/lite-manifest-schema-changes.md +0 -135
- package/substrate/standards/luminary-matching.md +0 -105
- package/substrate/standards/luminary-problem-patterns.md +0 -481
- package/substrate/standards/migration-discipline/active-record.md +0 -50
- package/substrate/standards/migration-discipline/alembic.md +0 -43
- package/substrate/standards/migration-discipline/gorm.md +0 -50
- package/substrate/standards/migration-discipline/prisma.md +0 -53
- package/substrate/standards/migration-discipline/sqlalchemy.md +0 -51
- package/substrate/standards/mobile-ephemeral-session.md +0 -167
- package/substrate/standards/model-routing-discipline.md +0 -160
- package/substrate/standards/ogilvy-writing-rules.md +0 -225
- package/substrate/standards/opener-discipline.md +0 -96
- package/substrate/standards/operator-facing-prose-discipline.md +0 -201
- package/substrate/standards/persona-schema.md +0 -229
- package/substrate/standards/pluggable-luminaries.md +0 -323
- package/substrate/standards/pr-body-discipline.md +0 -115
- package/substrate/standards/preview-state-schema.md +0 -189
- package/substrate/standards/project-directory-layout.md +0 -276
- package/substrate/standards/release-tagging.md +0 -137
- package/substrate/standards/reserved-skill-names.md +0 -120
- package/substrate/standards/scannable-multi-option-output.md +0 -261
- package/substrate/standards/sdlc-compliance.md +0 -286
- package/substrate/standards/sdlc-gates/typescript.md +0 -57
- package/substrate/standards/secrets-lifecycle.md +0 -210
- package/substrate/standards/security-scanner-adapter.md +0 -145
- package/substrate/standards/session-board.md +0 -256
- package/substrate/standards/skill-output-discipline.md +0 -90
- package/substrate/standards/state-spine-contract.md +0 -255
- package/substrate/standards/state-spine.md +0 -511
- package/substrate/standards/steering-hints/kiss-words.md +0 -11
- package/substrate/standards/substrate-config-schema.md +0 -267
- package/substrate/standards/tech-stack-config.md +0 -109
- package/substrate/standards/tier-dependency-analysis.md +0 -167
- package/substrate/standards/tier-runtime-deps/lite.md +0 -57
- package/substrate/standards/tier-tag-schema.md +0 -155
- package/substrate/standards/two-layer-config.md +0 -99
- package/substrate/standards/use-case-format.md +0 -292
- package/substrate/standards/user-story-invest.md +0 -268
- package/substrate/standards/velocity-and-appetite.md +0 -229
- package/substrate/standards/voice-input-pattern.md +0 -119
- package/substrate/standards/whereami-schema.md +0 -301
- package/substrate/standards/worktree-management.md +0 -211
- package/substrate/standards/writing-guide.md +0 -213
- package/substrate/templates/chronicle-template.md +0 -75
- package/substrate/templates/deferred-action-template.md +0 -45
- package/substrate/templates/memory-proposal-template.md +0 -77
- package/substrate/templates/persona-template.md +0 -200
- package/substrate/templates/pr-faq.md +0 -45
- package/substrate/templates/secret-rotation-template.md +0 -162
- package/substrate/templates/spec-template.md +0 -131
- package/substrate/templates/use-case-template.md +0 -194
- package/substrate/templates/user-story-template.md +0 -107
- package/substrate/templates/whereami-template.md +0 -101
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
tier: lite
|
|
3
|
-
name: Gang of Four (Gamma, Helm, Johnson, Vlissides)
|
|
4
|
-
slug: gang-of-four
|
|
5
|
-
claimed_by: [builder]
|
|
6
|
-
referenced_by_skills: [pattern-review, decompose, architect-review]
|
|
7
|
-
primary_domain: engineering
|
|
8
|
-
depth: full
|
|
9
|
-
sources:
|
|
10
|
-
- type: book
|
|
11
|
-
title: "Design Patterns: Elements of Reusable Object-Oriented Software"
|
|
12
|
-
authors: ["Erich Gamma", "Richard Helm", "Ralph Johnson", "John Vlissides"]
|
|
13
|
-
year: 1994
|
|
14
|
-
url: "https://www.pearson.com/en-us/subject-catalog/p/design-patterns-elements-of-reusable-object-oriented-software/P200000009480"
|
|
15
|
-
isbn: "9780201633610"
|
|
16
|
-
methodology_covered:
|
|
17
|
-
- "23 named patterns across Creational, Structural, Behavioral categories"
|
|
18
|
-
- "Program to an interface, not an implementation"
|
|
19
|
-
- "Favor object composition over class inheritance"
|
|
20
|
-
- "Decorator for cross-cutting concerns; Strategy for algorithm variation; Observer for event propagation"
|
|
21
|
-
- "Pattern language as shared vocabulary for design discussion"
|
|
22
|
-
verification_status: verified
|
|
23
|
-
description: "\"Program to an interface, not an implementation."
|
|
24
|
-
---
|
|
25
|
-
|
|
26
|
-
# Gang of Four (GoF)
|
|
27
|
-
|
|
28
|
-
## Signature
|
|
29
|
-
|
|
30
|
-
*"Program to an interface, not an implementation. Favor object composition over class inheritance."*
|
|
31
|
-
|
|
32
|
-
Authors of **Design Patterns: Elements of Reusable Object-Oriented
|
|
33
|
-
Software** (1994). The bassclef reference for 23 named OO patterns
|
|
34
|
-
across three categories (Creational, Structural, Behavioral). The
|
|
35
|
-
book every serious engineer has read; the patterns every codebase
|
|
36
|
-
implements, named or not.
|
|
37
|
-
|
|
38
|
-
## Core methods
|
|
39
|
-
|
|
40
|
-
### Creational patterns (how objects are made)
|
|
41
|
-
- **Factory Method** — defer instantiation to subclasses
|
|
42
|
-
- **Abstract Factory** — families of related objects
|
|
43
|
-
- **Builder** — step-by-step complex construction
|
|
44
|
-
- **Prototype** — clone existing instances
|
|
45
|
-
- **Singleton** — one shared instance (use sparingly)
|
|
46
|
-
|
|
47
|
-
### Structural patterns (how objects compose)
|
|
48
|
-
- **Adapter** — translate one interface to another
|
|
49
|
-
- **Bridge** — decouple abstraction from implementation
|
|
50
|
-
- **Composite** — tree structures of uniform objects
|
|
51
|
-
- **Decorator** — add behavior without subclassing (critical for
|
|
52
|
-
cross-cutting concerns — see `/decompose` Phase 3)
|
|
53
|
-
- **Facade** — simplified interface to subsystem
|
|
54
|
-
- **Flyweight** — share state for many small objects
|
|
55
|
-
- **Proxy** — placeholder controlling access
|
|
56
|
-
|
|
57
|
-
### Behavioral patterns (how objects collaborate)
|
|
58
|
-
- **Chain of Responsibility** — pass request through handlers
|
|
59
|
-
- **Command** — encapsulate request as object
|
|
60
|
-
- **Interpreter** — language grammar evaluation
|
|
61
|
-
- **Iterator** — sequential access without exposing structure
|
|
62
|
-
- **Mediator** — reduce inter-object coupling
|
|
63
|
-
- **Memento** — capture and restore state
|
|
64
|
-
- **Observer** — notify dependents of state change
|
|
65
|
-
- **State** — behavior varies by internal state
|
|
66
|
-
- **Strategy** — algorithm varies at runtime
|
|
67
|
-
- **Template Method** — skeleton with overridable steps
|
|
68
|
-
- **Visitor** — operations over object structure
|
|
69
|
-
|
|
70
|
-
## When to channel this luminary
|
|
71
|
-
|
|
72
|
-
When the primary risk is reinventing solved structural problems badly.
|
|
73
|
-
GoF dominates for Construction pattern selection, code review, and
|
|
74
|
-
decomposition work. Pair with Fowler (enterprise patterns extend GoF),
|
|
75
|
-
Uncle Bob (SOLID shapes how patterns apply), and Cockburn (Hexagonal
|
|
76
|
-
Architecture places patterns in structural context).
|
|
77
|
-
|
|
78
|
-
Do NOT channel GoF for: trivial code where no pattern applies,
|
|
79
|
-
greenfield work where you should first ask whether the problem is
|
|
80
|
-
really structural, or to justify over-engineering.
|
|
81
|
-
|
|
82
|
-
## Stack translation
|
|
83
|
-
|
|
84
|
-
In Next.js + React + TypeScript:
|
|
85
|
-
|
|
86
|
-
- **Facade** → server actions composing multiple services for a single
|
|
87
|
-
operation (`app/actions/create-deal.ts`).
|
|
88
|
-
- **Adapter** → `lib/adapters/[vendor].ts` wraps external APIs with
|
|
89
|
-
consistent interface.
|
|
90
|
-
- **Strategy** → `IScoringStrategy` with multiple implementations;
|
|
91
|
-
registry selects at runtime.
|
|
92
|
-
- **Decorator** → `ObservedImputer` wraps `IAssociationImputer` for
|
|
93
|
-
tracing; `CachedRepository` wraps `IRepository` for caching. THE
|
|
94
|
-
pattern for cross-cutting concerns per `/decompose` Phase 3.
|
|
95
|
-
- **Observer** → React context + useEffect for subscription; Prisma
|
|
96
|
-
middleware for data-change events.
|
|
97
|
-
- **Factory** → `createClient()` functions that return configured instances.
|
|
98
|
-
- **State** → XState machines for complex UI state (deal-stage wizard).
|
|
99
|
-
- **Template Method** → base classes with abstract steps (rare in
|
|
100
|
-
modern React; prefer composition).
|
|
101
|
-
- **Proxy** → Next.js middleware for auth; SWR for cached API access.
|
|
102
|
-
|
|
103
|
-
## Anti-patterns it prevents
|
|
104
|
-
|
|
105
|
-
- **Pattern invention** — creating novel structural solutions to solved
|
|
106
|
-
problems. Results are always worse than the pattern.
|
|
107
|
-
- **Pattern without need** — using Observer where a simple callback
|
|
108
|
-
works; Strategy where an if-statement works. Pattern overhead without
|
|
109
|
-
variation pressure.
|
|
110
|
-
- **Mis-fit pattern** — applying a pattern whose preconditions don't
|
|
111
|
-
hold. Factory for simple `new` calls. Decorator for behavior that's
|
|
112
|
-
intrinsic (not cross-cutting).
|
|
113
|
-
- **Pattern stacking** — using five patterns where two would suffice.
|
|
114
|
-
Each pattern has cognitive cost.
|
|
115
|
-
- **Inheritance as default structural tool** — GoF's opening principle
|
|
116
|
-
is "favor composition over inheritance." Deep inheritance hierarchies
|
|
117
|
-
are usually wrong.
|
|
118
|
-
|
|
119
|
-
## Worked example
|
|
120
|
-
|
|
121
|
-
For POA's email-imputation facade (per `/decompose` Phase 3):
|
|
122
|
-
|
|
123
|
-
GoF pattern selection:
|
|
124
|
-
- **Facade**: `AssociationImputer` exposes simple interface, hides
|
|
125
|
-
LLM provider complexity
|
|
126
|
-
- **Strategy**: Different providers (Haiku, Gemma) as interchangeable
|
|
127
|
-
implementations of `IAssociationImputer`
|
|
128
|
-
- **Adapter**: `AnthropicAdapter`, `GeminiAdapter` wrap vendor SDKs
|
|
129
|
-
behind common interface
|
|
130
|
-
- **Decorator**: `ObservedImputer` wraps any imputer with Langfuse
|
|
131
|
-
tracing — cross-cutting observability
|
|
132
|
-
- **Proxy**: `CachedImputer` wraps any imputer with recent-result
|
|
133
|
-
caching — cross-cutting performance
|
|
134
|
-
- **Chain of Responsibility** (future): multiple imputers in fallback
|
|
135
|
-
chain — Haiku first, Gemma on low confidence, human review on very
|
|
136
|
-
low confidence
|
|
137
|
-
|
|
138
|
-
What GoF would NOT produce: one concrete `HaikuImputer` class with
|
|
139
|
-
observability, caching, error handling, and provider logic all
|
|
140
|
-
intertwined. That's the anti-pattern `/decompose` evolution was
|
|
141
|
-
built to prevent.
|
|
142
|
-
|
|
143
|
-
## Sources
|
|
144
|
-
|
|
145
|
-
- *Design Patterns: Elements of Reusable Object-Oriented Software* —
|
|
146
|
-
Gamma, Helm, Johnson, Vlissides, Addison-Wesley (1994)
|
|
147
|
-
- No primary website (the book is the source)
|
|
148
|
-
|
|
149
|
-
## Related luminaries
|
|
150
|
-
|
|
151
|
-
- **Robert C. Martin** — SOLID principles guide pattern application.
|
|
152
|
-
- **Martin Fowler** — PoEAA extends GoF patterns to enterprise context.
|
|
153
|
-
- **Erich Gamma** individually — co-author, later led VS Code.
|
|
154
|
-
- **Christopher Alexander** — "A Pattern Language" (architecture, 1977)
|
|
155
|
-
inspired the software pattern movement.
|
|
156
|
-
- **Head First Design Patterns** (Freeman, Robson) — accessible entry
|
|
157
|
-
to GoF for learners.
|
|
@@ -1,230 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
tier: lite
|
|
3
|
-
name: Glenford J. Myers
|
|
4
|
-
slug: glenford-myers
|
|
5
|
-
claimed_by: [reviewer, builder]
|
|
6
|
-
referenced_by_skills: [verify, pattern-review]
|
|
7
|
-
primary_domain: testing
|
|
8
|
-
depth: full
|
|
9
|
-
sources:
|
|
10
|
-
- type: book
|
|
11
|
-
title: "The Art of Software Testing"
|
|
12
|
-
authors: ["Glenford J. Myers"]
|
|
13
|
-
year: 1979
|
|
14
|
-
edition: "1st (3rd ed 2011 with Sandler & Badgett)"
|
|
15
|
-
isbn: "9780471043287"
|
|
16
|
-
methodology_covered:
|
|
17
|
-
- "Decision coverage — every branch (if/else) is exercised by at least one test"
|
|
18
|
-
- "Condition coverage — every boolean sub-expression is independently exercised true and false"
|
|
19
|
-
- "Boundary value analysis — tests target the edges of input domains (min, max, off-by-one)"
|
|
20
|
-
- "Equivalence partitioning — divide input space into classes where one representative tests the whole class"
|
|
21
|
-
- "Error guessing — heuristic enumeration of likely failure modes"
|
|
22
|
-
- type: book
|
|
23
|
-
title: "Reliable Software through Composite Design"
|
|
24
|
-
authors: ["Glenford J. Myers"]
|
|
25
|
-
year: 1975
|
|
26
|
-
methodology_covered:
|
|
27
|
-
- "Cohesion / coupling — module-design quality metrics that pre-date Constantine + Yourdon's structured-design framing"
|
|
28
|
-
verification_status: verified
|
|
29
|
-
description: "\"The purpose of testing is to find errors, not to demonstrate the absence of errors.\""
|
|
30
|
-
---
|
|
31
|
-
|
|
32
|
-
# Glenford J. Myers
|
|
33
|
-
|
|
34
|
-
## Signature
|
|
35
|
-
|
|
36
|
-
*"The purpose of testing is to find errors, not to demonstrate the absence of errors."*
|
|
37
|
-
|
|
38
|
-
IBM systems researcher (1960s-80s). Author of **The Art of Software Testing** (1979) — the foundational text that named decision coverage, condition coverage, boundary value analysis, and equivalence partitioning as systematic disciplines. Pairs with Beck (TDD cycle), Hoare (contract testing), and Ousterhout (design judgment): Beck owns the rhythm, Hoare owns the contract semantics, Ousterhout owns the shape, Myers owns the taxonomy of what-to-cover.
|
|
39
|
-
|
|
40
|
-
## Core methods
|
|
41
|
-
|
|
42
|
-
- **Decision coverage** — Every branch in the source has at least one test that exercises it. A function with three if/else paths needs at least three tests. The discipline maps directly to grep-count: count branches in source; count test cases; the second number is at least the first.
|
|
43
|
-
|
|
44
|
-
INSTEAD of one test that "covers the happy path": one test per branch. The cost is small at write-time and compounds as the source grows.
|
|
45
|
-
|
|
46
|
-
- **Condition coverage** — Every boolean sub-expression in a compound condition is independently exercised true AND false. A condition `(a && b) || c` has three sub-expressions; sufficient coverage exercises each one in both states. Decision coverage alone misses this: `(a && b)` can be false because `a` is false OR because `b` is false; the two cases hit different bugs.
|
|
47
|
-
|
|
48
|
-
INSTEAD of one true/false pair per compound condition: one true/false pair per sub-expression. Especially important for hook tool-matchers that combine path-globs with environment checks.
|
|
49
|
-
|
|
50
|
-
- **Boundary value analysis** — Tests target the edges of input domains, not the middles. A function accepting integers `1..100` is tested at 1, 100, 0, 101, and one mid-range value. The bugs that ship are almost always at edges: off-by-one, empty input, max input, just-past-max input.
|
|
51
|
-
|
|
52
|
-
INSTEAD of one test at a representative middle value: at least four tests at min, max, just-below-min, just-above-max. Middle values catch zero bugs that boundary values miss; boundary values catch many bugs that middle values miss.
|
|
53
|
-
|
|
54
|
-
- **Equivalence partitioning** — Divide input space into classes where one representative tests the whole class. Inputs `2, 5, 17, 42` are in the same "positive small integer" class; one test of them tests the class. Inputs `-1, 0, 1.5, "abc"` represent different classes (negative, zero, non-integer, non-numeric); each class owes a test.
|
|
55
|
-
|
|
56
|
-
INSTEAD of testing one input per literal value: identify the classes; test one representative per class plus the boundaries between classes. Reduces redundant tests; surfaces unconsidered classes.
|
|
57
|
-
|
|
58
|
-
- **Error guessing** — Heuristic enumeration of likely failure modes based on the function's shape and history. Not algorithmic; expert-judgment-driven. Augments the systematic categories with experience-based pattern recognition.
|
|
59
|
-
|
|
60
|
-
INSTEAD of treating error guessing as inferior to systematic categories: use it as the additive layer that catches what taxonomy misses. The systematic categories are the floor; error guessing is the ceiling.
|
|
61
|
-
|
|
62
|
-
## When to channel this luminary
|
|
63
|
-
|
|
64
|
-
When the primary risk is sufficiency rather than rhythm. Myers dominates at test-authoring moments where the question is "I have a test that passes — is the test enough?" Specifically: per-hook test suites, state-spine accessor tests, API route validation tests, anywhere the function takes structured input and produces structured output with branches.
|
|
65
|
-
|
|
66
|
-
Pair with Beck (TDD rhythm — Myers tells you what to write tests for; Beck tells you when to write them), Hoare (contract semantics — Myers categories operationalize Hoare's `(P, Q)` pair enumeration), Ousterhout (deep modules earn easier Myers coverage; shallow modules decay it).
|
|
67
|
-
|
|
68
|
-
Skip Myers when: the test is a smoke test (bassclef/'smoke-test' skill scope), the work is a one-off script with no caller, or the relevant risk is design-quality rather than test-completeness (route to Ousterhout). Myers's discipline costs ~3x the write-time of a single happy-path test; apply where the function's correctness has compounding downstream impact.
|
|
69
|
-
|
|
70
|
-
INSTEAD of citing Myers for test rhythm, refactoring tactics, or design quality: route to Beck, Fowler, and Ousterhout respectively.
|
|
71
|
-
|
|
72
|
-
## Stack translation
|
|
73
|
-
|
|
74
|
-
In bassclef's bash hook + state-spine substrate:
|
|
75
|
-
|
|
76
|
-
- **Decision coverage applied to hook source** — Run `grep -cE '^\s*(if|elif|else|case)' <hook>.sh` to count branches. The test file's test-list owes at least that many `[x]` lines. For `auto-save-idle.sh` with 4 branches (no-changes / lock-present / defer-present / proceed), the test file owes 4 tests minimum.
|
|
77
|
-
- **Condition coverage applied to compound `[ ... ]` tests** — A bash condition `[ -f LOCK -a AGE -lt TTL ]` has two sub-conditions. Tests must exercise: LOCK absent + AGE doesn't matter; LOCK present + AGE within TTL; LOCK present + AGE beyond TTL. Three cases for two sub-conditions; the `[ -a ... -a ... ]` compound earns the multi-case treatment.
|
|
78
|
-
- **Boundary value analysis applied to numeric inputs** — For hooks with TTL / age / count thresholds: test exact threshold, one-below, one-above. For `auto-save-idle.sh` with `IDLE_THRESHOLD=300` (seconds): test AGE=299, AGE=300, AGE=301. Off-by-one bugs surface here.
|
|
79
|
-
- **Equivalence partitioning applied to stdin / env-var shapes** — Hooks discriminate on `tool_name` (Bash | Edit | Write | etc), `file_path` glob matches, env-var presence. Each discriminator's value space partitions into classes; one test per class is the Myers minimum.
|
|
80
|
-
- **Error guessing applied to bassclef-specific failure modes** — Experience accumulated from prior incidents: marker file unwritable (sandbox teardown); jq missing on alpine container; trace-helper.sh permission denied; concurrent hook invocations racing on the same marker. Each becomes one additional test that taxonomy alone would miss.
|
|
81
|
-
|
|
82
|
-
In Next.js + TypeScript + vitest adopter stacks:
|
|
83
|
-
|
|
84
|
-
- **Decision coverage in vitest** — `it.each` table-driven tests; one row per source branch
|
|
85
|
-
- **Condition coverage for compound predicates** — `if (user.isAdmin && tenant.active)` owes both true/false variants for each sub-predicate
|
|
86
|
-
- **Boundary value for pagination / limits** — page=0, page=1, page=MAX_PAGE, page=MAX_PAGE+1
|
|
87
|
-
- **Equivalence partitioning for Zod input parsing** — one representative valid input per schema variant; one representative invalid per error class
|
|
88
|
-
- **Error guessing for adopter-stack failures** — token-expired mid-request; rate-limit hit at the wrong tenant boundary; cache stampede on cold start
|
|
89
|
-
|
|
90
|
-
## Anti-patterns it prevents
|
|
91
|
-
|
|
92
|
-
- **"Happy path only"** — A single test that exercises the success case while every error branch is untested. Tier 0 hook (bassclef#1037) passes because a test exists; Myers's discipline fails because decision coverage is 1/N where N > 1.
|
|
93
|
-
|
|
94
|
-
INSTEAD: count branches; write one test per branch in the same commit. The marginal cost per test is small; the marginal cost of a shipped error-branch bug is large.
|
|
95
|
-
|
|
96
|
-
- **"All branches but no boundary"** — Decision coverage achieved (each branch has a test) but every test uses mid-range input. Off-by-one bugs at branch boundaries ship to production.
|
|
97
|
-
|
|
98
|
-
INSTEAD: for any test with a numeric / string-length / count input, add the off-by-one neighbors as additional test cases. Three cases (mid, edge, just-past-edge) per branch is the floor.
|
|
99
|
-
|
|
100
|
-
- **"Boundary but no equivalence"** — Tests at edges but redundant testing of mid-range values from the same class (e.g., 50 different positive-integer tests; zero negative-integer tests).
|
|
101
|
-
|
|
102
|
-
INSTEAD: partition the input space into classes before writing tests; pick one representative per class; the redundancy savings fund the edge-case coverage.
|
|
103
|
-
|
|
104
|
-
- **"Equivalence but no error guessing"** — Formal Myers categories covered but experience-based failure modes ignored. The test suite is taxonomy-complete but production-incomplete.
|
|
105
|
-
|
|
106
|
-
INSTEAD: after applying the four systematic categories, ask "what could go wrong that taxonomy missed?" and add tests for each. The answer comes from incident history (chronicles), monitoring (alerts), and operator pattern recognition.
|
|
107
|
-
|
|
108
|
-
- **"Tautological tests"** — Assertions that mirror the implementation rather than the intent. `assert(x === f(x))` where f is the function under test asserts implementation, not behavior. The test passes regardless of whether `f` is correct.
|
|
109
|
-
|
|
110
|
-
INSTEAD: assert the behavior the caller depends on, expressed in terms the caller would use. For a sorter, assert "result is sorted ascending" not "result equals sort(input)". The first is a property; the second is implementation-shaped.
|
|
111
|
-
|
|
112
|
-
- **"Coverage-percentage gaming"** — Driving the coverage tool's percentage up by adding tests that exercise lines without exercising decisions. Myers's discipline rejects line coverage as the metric.
|
|
113
|
-
|
|
114
|
-
INSTEAD: decision coverage (every branch taken) + condition coverage (every sub-expression true and false) + boundary value (edges of input domains) are the essential metrics. Line coverage is a lagging indicator at best.
|
|
115
|
-
|
|
116
|
-
## Worked example
|
|
117
|
-
|
|
118
|
-
Tightening bassclef's `pre-commit-gate.sh` test under Myers's discipline:
|
|
119
|
-
|
|
120
|
-
Step 1 — Decision coverage analysis (grep + count):
|
|
121
|
-
|
|
122
|
-
```bash
|
|
123
|
-
$ grep -cE '^\s*(if|elif|else|case|\|\|)' .claude/hooks/pre-commit-gate.sh
|
|
124
|
-
14
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
14 decision points. Minimum 14 tests for decision coverage. Existing test file (allowlisted-pre-hardening) has 3 tests. Coverage = 3/14 = 21%. Failing.
|
|
128
|
-
|
|
129
|
-
Step 2 — Condition coverage analysis:
|
|
130
|
-
|
|
131
|
-
Find compound conditions:
|
|
132
|
-
|
|
133
|
-
```bash
|
|
134
|
-
$ grep -nE '\[\s+.*-(a|o)\s+.*\]|&&|\|\|' .claude/hooks/pre-commit-gate.sh
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
Each compound condition with `-a` / `-o` / `&&` / `||` owes one true/false per sub-expression. If 4 compound conditions average 2 sub-expressions each, that's 8 additional test variants beyond decision coverage.
|
|
138
|
-
|
|
139
|
-
Step 3 — Boundary value analysis:
|
|
140
|
-
|
|
141
|
-
Identify numeric / string-length thresholds in the hook:
|
|
142
|
-
- Marker file age: write age=now, age=24h-1s, age=24h+1s tests
|
|
143
|
-
- Branch-name length: 0 chars, 1 char, max-githook-supports, max+1
|
|
144
|
-
- Diff line count if any: 0, 1, MAX, MAX+1
|
|
145
|
-
|
|
146
|
-
Each threshold = 4 test variants.
|
|
147
|
-
|
|
148
|
-
Step 4 — Equivalence partitioning:
|
|
149
|
-
|
|
150
|
-
Discriminator: `tool_name` matcher
|
|
151
|
-
- Class 1: Edit (matched, fires)
|
|
152
|
-
- Class 2: Write (matched, fires)
|
|
153
|
-
- Class 3: MultiEdit (matched, fires)
|
|
154
|
-
- Class 4: Bash (not matched, pass-through)
|
|
155
|
-
- Class 5: NotebookEdit (not matched, pass-through)
|
|
156
|
-
- Class 6: malformed JSON stdin (error path)
|
|
157
|
-
|
|
158
|
-
6 representatives = 6 test cases for this discriminator alone.
|
|
159
|
-
|
|
160
|
-
Step 5 — Error guessing:
|
|
161
|
-
|
|
162
|
-
From bassclef incident history (chronicles + memory):
|
|
163
|
-
- marker directory missing entirely (fresh-clone scenario)
|
|
164
|
-
- trace-helper.sh exits non-zero (broken log endpoint)
|
|
165
|
-
- git binary version skew (BSD vs GNU date — caught bassclef#1085 yesterday)
|
|
166
|
-
- Concurrent hook invocations (two PreToolUse fires on overlapping Edit calls)
|
|
167
|
-
|
|
168
|
-
4 additional test cases from experience.
|
|
169
|
-
|
|
170
|
-
Step 6 — Test list assembled:
|
|
171
|
-
|
|
172
|
-
```bash
|
|
173
|
-
# test-list:
|
|
174
|
-
# Decision coverage (14 tests)
|
|
175
|
-
# [x] Branch 1: no marker file, fix/ branch → BLOCKED
|
|
176
|
-
# [x] Branch 2: temperance marker present, feature/ branch → pass
|
|
177
|
-
# [ ] Branch 3: stacked manifest declares branch → suppress
|
|
178
|
-
# ... (11 more decision-coverage entries)
|
|
179
|
-
# Condition coverage (8 additional)
|
|
180
|
-
# [ ] Compound: marker present AND mtime within 24h
|
|
181
|
-
# [ ] Compound: marker present AND mtime older than 24h
|
|
182
|
-
# ... (6 more)
|
|
183
|
-
# Boundary value (12 additional)
|
|
184
|
-
# [ ] Marker mtime = now
|
|
185
|
-
# [ ] Marker mtime = exactly 24h ago
|
|
186
|
-
# [ ] Marker mtime = 24h - 1s ago
|
|
187
|
-
# [ ] Marker mtime = 24h + 1s ago
|
|
188
|
-
# ... (8 more)
|
|
189
|
-
# Equivalence partitioning (6)
|
|
190
|
-
# [ ] tool_name = Edit
|
|
191
|
-
# [ ] tool_name = Write
|
|
192
|
-
# [ ] tool_name = MultiEdit
|
|
193
|
-
# [ ] tool_name = Bash (pass-through)
|
|
194
|
-
# [ ] tool_name = NotebookEdit (pass-through)
|
|
195
|
-
# [ ] stdin malformed JSON
|
|
196
|
-
# Error guessing (4)
|
|
197
|
-
# [ ] marker directory missing entirely
|
|
198
|
-
# [ ] trace-helper.sh exits non-zero
|
|
199
|
-
# [ ] git binary BSD vs GNU date skew
|
|
200
|
-
# [ ] concurrent PreToolUse fires
|
|
201
|
-
```
|
|
202
|
-
|
|
203
|
-
44 test cases for one hook. That sounds like a lot — until you remember pre-commit-gate.sh is essential for every commit in every consumer repo. The marginal cost of one hidden bug at this layer is multiplied by every adopter session.
|
|
204
|
-
|
|
205
|
-
What this discipline catches that lazy testing misses: the BSD-vs-GNU date skew that bit bassclef#1085 yesterday morning. Decision coverage alone would miss it because both code paths use the same date-formatting function. Error-guessing from prior incidents (the "what's bit us before" lens) IS the category that catches it.
|
|
206
|
-
|
|
207
|
-
## Sources
|
|
208
|
-
|
|
209
|
-
- *The Art of Software Testing* — Myers, Wiley (1979); 3rd ed 2011 with Sandler & Badgett, ISBN 9780471043287
|
|
210
|
-
- *Reliable Software through Composite Design* — Myers (1975)
|
|
211
|
-
- ACM Digital Library entry for 1979 first edition
|
|
212
|
-
- Cross-citation in Kaner, C. — *Testing Computer Software* (Wiley, 1993) crediting Myers as the systematic-testing forebear
|
|
213
|
-
|
|
214
|
-
## Related luminaries
|
|
215
|
-
|
|
216
|
-
- **Kent Beck** — TDD rhythm produces tests; Myers categories tell you whether the tests are enough. Tier 0 mtime enforcement (bassclef#1037) plus test-list discipline (bassclef#1090) plus Myers coverage taxonomy = the full TDD discipline bassclef operationalizes.
|
|
217
|
-
- **Tony Hoare / Bertrand Meyer** — Contract-driven testing (precondition/postcondition/invariant) is a sub-shape of Myers's taxonomy applied at the API boundary. Hoare asks WHAT the contract is; Myers asks WHICH categories of input exercise the contract.
|
|
218
|
-
- **John Ousterhout** — Deep modules with small interfaces are easier to fully cover under Myers categories; shallow modules expose so much surface that coverage decays. Myers's discipline implicitly rewards Ousterhout's design quality.
|
|
219
|
-
- **Edsger Dijkstra** — Famously argued "testing shows the presence, not the absence, of bugs" — the counterweight that says even Myers-complete suites do not prove correctness in the formal sense. Read together: Myers operationalizes test-as-bug-discovery; Dijkstra reminds us proof is a different discipline.
|
|
220
|
-
- **James Bach / Cem Kaner** (exploratory testing successors) — Modern testing heuristics built on Myers's foundation. Bassclef may add their luminaries in a future wave if exploratory testing earns a skill citation.
|
|
221
|
-
|
|
222
|
-
## Verification
|
|
223
|
-
|
|
224
|
-
Myers's authorship of *The Art of Software Testing* (1979) and his coining of the coverage taxonomy is verified via:
|
|
225
|
-
|
|
226
|
-
1. ACM Digital Library entry for the 1979 first edition (ISBN 9780471043287)
|
|
227
|
-
2. Wiley's listing of the 3rd edition (2011) with Sandler & Badgett
|
|
228
|
-
3. Cross-citation in Kaner's *Testing Computer Software* (1993) crediting Myers as the systematic-testing forebear
|
|
229
|
-
|
|
230
|
-
Per bassclef#867 anchor-luminary verification: name + dates + text title + taxonomy attribution confirmed from authoritative sources.
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
tier: lite
|
|
3
|
-
name: Hunt & Thomas (Pragmatic Programmers)
|
|
4
|
-
slug: hunt-thomas
|
|
5
|
-
claimed_by: [builder, reviewer]
|
|
6
|
-
referenced_by_skills: []
|
|
7
|
-
primary_domain: engineering
|
|
8
|
-
depth: full
|
|
9
|
-
solves_problems_brownfield:
|
|
10
|
-
- "Same logic duplicated in three places; any fix requires finding all three"
|
|
11
|
-
- "A change in one module causes unexpected breakage in an unrelated module — tight coupling masked as shared code"
|
|
12
|
-
- "Code written by trial-and-error with no clear intent; passing tests but nobody knows why"
|
|
13
|
-
- "Developers fear changing old code because they can't tell what will break"
|
|
14
|
-
solves_problems_greenfield:
|
|
15
|
-
- "Building a system where every piece of knowledge lives in exactly one place"
|
|
16
|
-
- "Designing modules that can be changed independently without ripple effects"
|
|
17
|
-
- "Starting a new codebase where developer discipline must prevent rot from day one"
|
|
18
|
-
- "Choosing which parts of a feature to prototype as throwaway vs which to keep as tracer bullets"
|
|
19
|
-
anti_patterns:
|
|
20
|
-
- "Large deployed monoliths where DRY and orthogonality would require full rewrites — Feathers seam-first applies before this"
|
|
21
|
-
- "Spec-driven contexts requiring precise fidelity to a fixed requirement"
|
|
22
|
-
- "Teams in regulatory environments where prototype-vs-production distinction must be documented formally"
|
|
23
|
-
sources:
|
|
24
|
-
- type: book
|
|
25
|
-
title: "The Pragmatic Programmer: From Journeyman to Master"
|
|
26
|
-
authors: ["Andrew Hunt", "David Thomas"]
|
|
27
|
-
year: 1999
|
|
28
|
-
url: "https://pragprog.com/titles/tpp20/the-pragmatic-programmer-20th-anniversary-edition/"
|
|
29
|
-
isbn: "9780135957059"
|
|
30
|
-
methodology_covered:
|
|
31
|
-
- "DRY (single knowledge source) — Every piece of knowledge must have one, unambiguous, authoritative representation"
|
|
32
|
-
- "Orthogonality — Two components are orthogonal if changing one requires no change in the other"
|
|
33
|
-
- "Tracer bullets — build a thin, working end-to-end path first"
|
|
34
|
-
- "Broken windows — small decay normalizes fast"
|
|
35
|
-
- type: book
|
|
36
|
-
title: "The Pragmatic Programmer: 20th Anniversary Edition"
|
|
37
|
-
authors: ["Andrew Hunt", "David Thomas"]
|
|
38
|
-
year: 2019
|
|
39
|
-
url: "https://pragprog.com/titles/tpp20/the-pragmatic-programmer-20th-anniversary-edition/"
|
|
40
|
-
isbn: "9780135957059"
|
|
41
|
-
methodology_covered:
|
|
42
|
-
- "DRY (single knowledge source)"
|
|
43
|
-
- "Orthogonality"
|
|
44
|
-
- "Tracer bullets"
|
|
45
|
-
- "Broken windows"
|
|
46
|
-
- type: blog_post
|
|
47
|
-
title: "Pragmatic Bookshelf publisher site"
|
|
48
|
-
authors: ["David Thomas"]
|
|
49
|
-
year: 1999
|
|
50
|
-
url: "https://pragprog.com/"
|
|
51
|
-
methodology_covered:
|
|
52
|
-
- "Primary publisher site for all Pragmatic Programmer editions; co-founded by Thomas"
|
|
53
|
-
verification_status: verified
|
|
54
|
-
description: "\"Every piece of knowledge must have a single, unambiguous, authoritative representation in a system."
|
|
55
|
-
---
|
|
56
|
-
|
|
57
|
-
# Hunt & Thomas (Pragmatic Programmers)
|
|
58
|
-
|
|
59
|
-
## Signature
|
|
60
|
-
|
|
61
|
-
*"Every piece of knowledge must have a single, unambiguous, authoritative representation in a system. Duplication is the root of all software evil."* [ref:1]
|
|
62
|
-
|
|
63
|
-
Andrew Hunt and David Thomas; authors of **The Pragmatic Programmer** (1999 [ref:1], 20th anniversary edition 2019 [ref:2]). The bassclef voice on day-to-day development discipline — the habits, heuristics, and mental models that separate journeymen from craftspeople. Where Uncle Bob covers SOLID principles and Clean Code covers naming, Hunt & Thomas cover the practical engineering ethos that holds it all together.
|
|
64
|
-
|
|
65
|
-
## Core methods
|
|
66
|
-
|
|
67
|
-
- **DRY (single knowledge source)** — Every piece of knowledge must have one, unambiguous, authoritative representation [ref:1]. Not just code duplication — DRY applies to data schemas, documentation, tests, configuration. When knowledge is duplicated, changes require parallel updates; one update will eventually be missed.
|
|
68
|
-
- **Orthogonality** — Two components are orthogonal if changing one requires no change in the other [ref:1]. Build systems where responsibilities are independent. Orthogonality enables testing in isolation, deployment of parts independently, and fearless refactoring. Ask: "If I change this component, how many other things must change?" More than one means non-orthogonal design.
|
|
69
|
-
- **Tracer bullets** — When starting a new feature or system, build a thin, working end-to-end path first [ref:1]. Unlike a prototype (thrown away after learning), a tracer bullet is production code; it proves the architectural path works with real infrastructure. Flesh out the path once the tracer lands.
|
|
70
|
-
- **Broken windows** — A single unaddressed TODO, a failing test ignored, a function that clearly misrepresents what it does — these signal that quality is not a priority [ref:1]. Teams that tolerate one broken window soon tolerate ten. Small decay normalizes fast.
|
|
71
|
-
|
|
72
|
-
## When to channel this luminary
|
|
73
|
-
|
|
74
|
-
When the primary risk is accumulated developer slop: duplication creeping in across a growing codebase, modules coupling accidentally because it was easier, or a team building by coincidence rather than by intent. Hunt & Thomas dominate code review and initial architecture sessions where discipline habits are being established. Channel them when the team is growing and shared engineering standards need grounding.
|
|
75
|
-
|
|
76
|
-
INSTEAD of channeling Hunt & Thomas for systems under acute failure: use Nygard for production stability, Newman or Hohpe for large-scale distributed architecture. Hunt & Thomas are everyday discipline, not the crisis response.
|
|
77
|
-
|
|
78
|
-
## Stack translation
|
|
79
|
-
|
|
80
|
-
In Next.js + Prisma + TypeScript:
|
|
81
|
-
|
|
82
|
-
- **DRY** — schema types derived from Prisma output (single source of truth); API response shapes defined once as Zod schemas, reused for both server-side validation and client-side type inference; environment variables loaded and typed in a single `env.ts`, imported everywhere else.
|
|
83
|
-
- **Orthogonality** — service layer functions that do not import from UI components; Prisma models that contain no business rules; server actions that contain no formatting logic. If a test for deal enrichment requires importing a React component, the design is non-orthogonal.
|
|
84
|
-
- **Tracer bullets** — first commit on a new feature: end-to-end slice touching DB → server action → component → route — with minimal data but fully wired. Real code that runs, not a mock. The tracer confirms the path works. Then add fields, edge cases, and polish.
|
|
85
|
-
- **Broken windows** — failing tests in CI block the pipeline (no exceptions); TypeScript strict mode enforced from day one; no `any` types in production code without a comment explaining why.
|
|
86
|
-
|
|
87
|
-
## Anti-patterns it prevents
|
|
88
|
-
|
|
89
|
-
- **Knowledge duplication** — the same business rule encoded in the Prisma schema, a Zod schema, a TypeScript type, AND inline validation. When the rule changes, three of four are updated; one is not. DRY discipline collapses these to one source.
|
|
90
|
-
- **Programming by coincidence** — code that "happens to work" without the developer understanding why. Characterized by careful arrangement of boilerplate without testing the assumptions. If you cannot explain why it works, it will stop working in a condition you have not tested.
|
|
91
|
-
- **Accidental coupling** — two modules share a utility or helper that grows to carry business logic for both. Changing the helper to serve one module breaks the other. Orthogonality discipline prevents this: ask whether the helper carries knowledge that belongs to only one module. If yes, extract.
|
|
92
|
-
- **Prototype rot** — throwaway prototypes that become production because "it mostly works." Prototypes are discarded after learning; tracer bullets are production code from the start. Calling something a prototype does not justify shipping it.
|
|
93
|
-
|
|
94
|
-
## Worked example
|
|
95
|
-
|
|
96
|
-
For POA's deal enrichment pipeline, Hunt & Thomas's approach:
|
|
97
|
-
|
|
98
|
-
**DRY check**: the definition of "enrichment fields" (company name, headcount, industry) appears in the Prisma schema, an enrichment TypeScript type, an API response shape, AND a table column list in the UI. Four representations of one piece of knowledge. DRY says: Prisma is the single source; derive the TypeScript type from Prisma's generated types; derive the API response from the same type; derive the table columns from a central field registry. Adding a new field changes one file.
|
|
99
|
-
|
|
100
|
-
**Orthogonality check**: the enrichment worker imports from the email module because a previous developer wanted to send a notification when enrichment completes. Extract the notification logic: enrichment worker emits an event or calls a notification interface; the email module listens. The enrichment worker no longer depends on email infrastructure.
|
|
101
|
-
|
|
102
|
-
**Tracer bullet**: first day on "bulk enrichment" — wire a single deal through the new batch endpoint, job queue, and enrichment function. No retry logic, no bulk UI, no progress tracking. But it runs end-to-end with real data. The tracer confirms the queue can dispatch enrichment jobs. Then add batch size, retries, and UI.
|
|
103
|
-
|
|
104
|
-
## Sources
|
|
105
|
-
|
|
106
|
-
- *The Pragmatic Programmer: From Journeyman to Master* — Hunt, Thomas, Addison-Wesley (1999) [ref:1]
|
|
107
|
-
- *The Pragmatic Programmer: 20th Anniversary Edition* — Hunt, Thomas, Addison-Wesley (2019) — substantially revised [ref:2]
|
|
108
|
-
- pragprog.com — Pragmatic Bookshelf (co-founded by Thomas) [ref:3]
|
|
109
|
-
|
|
110
|
-
## Related luminaries
|
|
111
|
-
|
|
112
|
-
- **Robert C. Martin** — SOLID principles and Clean Code operate at the same altitude. Uncle Bob's Single Responsibility complements Hunt & Thomas's orthogonality; both reject coupling from different starting points.
|
|
113
|
-
- **Martin Fowler** — Refactoring is where you fix the broken windows and eliminate DRY violations that accumulated. Fowler's catalog operationalizes what Hunt & Thomas prescribe.
|
|
114
|
-
- **Kent Beck** — TDD is how you prove the tracer bullet works and keep the broken windows visible as failing tests.
|
|
115
|
-
- **Michael Feathers** — When the codebase is already non-orthogonal with high duplication, Feathers's seam-based approach is the path back before Hunt & Thomas's discipline can hold.
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
tier: lite
|
|
3
|
-
name: Hyrum Wright
|
|
4
|
-
slug: hyrum-wright
|
|
5
|
-
claimed_by: [architect]
|
|
6
|
-
referenced_by_skills: [release, decompose, architect-review]
|
|
7
|
-
primary_domain: api-stability
|
|
8
|
-
depth: stub
|
|
9
|
-
description: "\"With a sufficient number of users of an API, it does not matter what you promise in the contract: all observable behaviors of your system will be depended on by somebody.\""
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
# Hyrum Wright
|
|
13
|
-
|
|
14
|
-
## Signature
|
|
15
|
-
|
|
16
|
-
*"With a sufficient number of users of an API, it does not matter what you promise in the contract: all observable behaviors of your system will be depended on by somebody."*
|
|
17
|
-
|
|
18
|
-
This is **Hyrum's Law**. Wright is a Google software engineer who codified what kernel hackers, library maintainers, and protocol designers had been learning for decades. The law is the theoretical foundation for why "we don't break adopters" is a Tier 1 discipline.
|
|
19
|
-
|
|
20
|
-
## Core principle
|
|
21
|
-
|
|
22
|
-
**Observability creates dependency.** Hyrum's Law extends API stability beyond declared contracts to every observable behavior. The signature, the return type, the timing, the side effects, the order of error messages, the filename of an internal file — every observable surface accumulates dependencies once enough users exist.
|
|
23
|
-
|
|
24
|
-
The law has three implications:
|
|
25
|
-
|
|
26
|
-
1. **You cannot fully specify behavior.** Whatever you document as "the contract," some adopter will be depending on something you didn't document.
|
|
27
|
-
2. **Refactor risk grows with adoption.** A change "safe under the contract" can break adopters who depend on observable side effects.
|
|
28
|
-
3. **The cost of cleanup is asymmetric.** Producers want to clean up. Adopters want stability. Once N adopters depend on observed behavior, the producer's cleanup cost is N × (each adopter's migration effort).
|
|
29
|
-
|
|
30
|
-
## How this applies to bassclef
|
|
31
|
-
|
|
32
|
-
Tonight's example: bassclef never declared `~/src/sunj-labs/canonical/` as a stable filesystem path. The directory name was an internal convention, not a contract. But every adopter on the operator's machine had observed that path — through their symlinks, through their `settings.json`, through their `additionalDirectories` references. The rename `mv canonical bassclef` broke an undeclared but heavily-observed surface.
|
|
33
|
-
|
|
34
|
-
Hyrum's Law says: that path was a contract whether bassclef declared it or not. With enough adopters (10+ siblings on this one machine), every observable surface becomes load-bearing.
|
|
35
|
-
|
|
36
|
-
The discipline answer:
|
|
37
|
-
|
|
38
|
-
- Treat **every** adopter-observable surface as part of the contract, not just declared ones.
|
|
39
|
-
- When unsure if a surface is observable, **assume it is** and ship the compat shim.
|
|
40
|
-
- Use Hyrum's Law as the budget against premature refactoring — "would I want to maintain this surface forever?" If no, don't ship it as observable.
|
|
41
|
-
|
|
42
|
-
## Key insight: the contract is what users observe, not what you wrote
|
|
43
|
-
|
|
44
|
-
This reframes substrate evolution:
|
|
45
|
-
|
|
46
|
-
| You wrote | Adopters observe | What's actually the contract |
|
|
47
|
-
|---|---|---|
|
|
48
|
-
| "Sync from `bassclef-source.json`" | `~/src/sunj-labs/canonical/` path | The path |
|
|
49
|
-
| "Hook X fires on PreToolUse" | Hook X's filename and location | The filename + location |
|
|
50
|
-
| "Skills load from `.claude/skills/`" | Symlink targets, agent names, directory structure | All three |
|
|
51
|
-
| "State spine entities follow schema S" | Every field name, every default value, every error message | All of it |
|
|
52
|
-
|
|
53
|
-
The substrate's "contract" is much bigger than what's written down. Every change must respect the observable surface.
|
|
54
|
-
|
|
55
|
-
## How to apply
|
|
56
|
-
|
|
57
|
-
1. **Enumerate observable surfaces before changing them.** Run `grep -rn` across known adopter repos for any reference to the surface you're about to change.
|
|
58
|
-
2. **When in doubt, assume it's observed.** The cost of an unnecessary compat shim is small. The cost of a broken adopter is large.
|
|
59
|
-
3. **Test against real adopter consumption.** Not unit tests on the substrate side; integration tests that clone a representative adopter and exercise their consumption paths.
|
|
60
|
-
4. **Account for the multiplier.** A surface used by 10 adopters has 10× the migration cost. The math: "is the rename benefit > 10 × (migration cost per adopter)?" usually says no.
|
|
61
|
-
|
|
62
|
-
## Anti-patterns
|
|
63
|
-
|
|
64
|
-
- **"It's not in the public API"** — Hyrum's Law doesn't care. Adopters depend on whatever they can observe.
|
|
65
|
-
- **"We never documented that"** — same response. Documentation isn't the contract; observability is.
|
|
66
|
-
- **"Only one adopter uses it"** — that's still one broken adopter. And tomorrow there will be more.
|
|
67
|
-
- **"We can deprecate and migrate"** — Hyrum's Law warns that deprecation periods are always shorter than the actual migration tail. Plan for permanent shims, not eventual cleanup.
|
|
68
|
-
|
|
69
|
-
## How bassclef channels Hyrum
|
|
70
|
-
|
|
71
|
-
The discipline lives in:
|
|
72
|
-
|
|
73
|
-
- `.claude/rules/we-dont-break-adopters.md` — methodology layer; cites Hyrum's Law as the why
|
|
74
|
-
- `architecture/dual-repo-flow.md` "Non-breaking changes to adopters" section — enumerates adopter-observable surfaces
|
|
75
|
-
- Phase 2 mechanical layer (bassclef#1360) — pre-rename CI test surfaces every observable adopter dependency before a substrate change ships
|
|
76
|
-
|
|
77
|
-
## Sources
|
|
78
|
-
|
|
79
|
-
- Hyrum Wright, "Hyrum's Law" — https://www.hyrumslaw.com/
|
|
80
|
-
- *Software Engineering at Google* — Wright, Winters, Manshreck; O'Reilly (2020)
|
|
81
|
-
- Titus Winters talks on long-term codebase maintenance (Google C++ committee chair); CppCon
|
|
82
|
-
- XKCD 1172 ("Workflow") — the cultural reference Wright codified into a law
|
|
83
|
-
|
|
84
|
-
## Distinct from
|
|
85
|
-
|
|
86
|
-
- @luminary linus-torvalds — applies Hyrum's Law to operating system kernels; provides the discipline answer (we just don't break userspace, ever)
|
|
87
|
-
- @luminary michael-nygard — stability patterns at runtime; complements but doesn't anchor the design-time discipline
|
|
88
|
-
- @luminary frederick-brooks — provides the cost framing (cumulative cleanup cost vs single-rename benefit); Hyrum provides the why (observability multiplies the cost across adopters)
|
|
89
|
-
|
|
90
|
-
## Refs
|
|
91
|
-
|
|
92
|
-
- bassclef#1360 — Phase 2 mechanical layer
|
|
93
|
-
- 2026-06-21 chronicle — first documented Hyrum's-Law cascade in bassclef's history
|
|
94
|
-
- ADR-031 — non-breaking-change adopter discipline (decision layer)
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
tier: lite
|
|
3
|
-
name: Jason Fried / DHH (David Heinemeier Hansson)
|
|
4
|
-
slug: jason-fried-dhh
|
|
5
|
-
claimed_by: [shaper]
|
|
6
|
-
referenced_by_skills: [canvas, sprint]
|
|
7
|
-
primary_domain: shaping
|
|
8
|
-
depth: stub
|
|
9
|
-
description: "\"It doesn't have to be crazy at work.\""
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
# Jason Fried / DHH
|
|
13
|
-
|
|
14
|
-
## Signature
|
|
15
|
-
|
|
16
|
-
*"It doesn't have to be crazy at work."*
|
|
17
|
-
|
|
18
|
-
Basecamp founders; the philosophical foundation behind Shape Up. Canonical
|
|
19
|
-
voices on **calm, independent, opinionated product work** — small teams
|
|
20
|
-
shipping polished software on a rhythm, without the manufactured urgency
|
|
21
|
-
of startup culture.
|
|
22
|
-
|
|
23
|
-
## Core methods
|
|
24
|
-
|
|
25
|
-
- **Appetite over estimation** (later operationalized by Singer as Shape Up) —
|
|
26
|
-
Fixed time, variable scope. Don't estimate; bet.
|
|
27
|
-
- **Six-week cycles + two-week cool-down** — Deliberately slow cadence.
|
|
28
|
-
Reject agile theater of weekly sprints.
|
|
29
|
-
- **Interruption is the enemy** — Long uninterrupted time is the actual
|
|
30
|
-
productivity multiplier. Meetings, chat, "quick syncs" destroy it.
|
|
31
|
-
- **Opinionated software** — Products that make choices for users reduce
|
|
32
|
-
decision fatigue. Neutrality is a design failure.
|
|
33
|
-
|
|
34
|
-
## Sources
|
|
35
|
-
|
|
36
|
-
- *Rework* — Fried, Hansson, Crown Business (2010)
|
|
37
|
-
- *It Doesn't Have to Be Crazy at Work* — Fried, Hansson, Harper Business (2018)
|
|
38
|
-
- *Getting Real* — 37signals (2006), free online at gettingreal.37signals.com
|
|
39
|
-
- basecamp.com/books — all 37signals/Basecamp books free
|
|
40
|
-
|
|
41
|
-
## Related luminaries
|
|
42
|
-
|
|
43
|
-
- **Ryan Singer** — Singer operationalized Fried/DHH's philosophy into
|
|
44
|
-
Shape Up; they are the underlying philosophy, he is the method.
|
|
45
|
-
- **Catherine Wu (Anthropic)** — "Underfund on purpose" echoes Fried/DHH's
|
|
46
|
-
appetite discipline.
|