@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.
Files changed (293) hide show
  1. package/dist/cli.cjs +238 -127
  2. package/dist/cli.js +240 -129
  3. package/dist/index.cjs +1 -1
  4. package/dist/index.d.ts +1 -1
  5. package/dist/index.js +1 -1
  6. package/dist/lite/.bassclef-source.json +10 -0
  7. package/dist/lite/.claude/settings.json +212 -0
  8. package/dist/lite/CLAUDE.md +41 -0
  9. package/dist/lite/gitignore +58 -0
  10. package/dist/lite/standards/bassclef-wiring-manifest.json +497 -0
  11. package/dist/lite/whereami.md +24 -0
  12. package/package.json +8 -2
  13. package/substrate/.bassclef/lite-manifest.json +0 -2701
  14. package/substrate/.claude/agents/architect.md +0 -70
  15. package/substrate/.claude/agents/builder.md +0 -114
  16. package/substrate/.claude/agents/designer.md +0 -156
  17. package/substrate/.claude/agents/reviewer.md +0 -88
  18. package/substrate/.claude/hooks/artifact-ingestion-gate.sh +0 -357
  19. package/substrate/.claude/hooks/assert-verify-steering.sh +0 -77
  20. package/substrate/.claude/hooks/bassclef-source-config-validate.sh +0 -215
  21. package/substrate/.claude/hooks/bassclef-sync.sh +0 -634
  22. package/substrate/.claude/hooks/compound-noun-scrub.sh +0 -292
  23. package/substrate/.claude/hooks/kiss-expansion-inject.sh +0 -69
  24. package/substrate/.claude/hooks/longrun-prep-compounding-axis-check.sh +0 -492
  25. package/substrate/.claude/hooks/longrun-prep-compounding-sequence-check.sh +0 -492
  26. package/substrate/.claude/hooks/plain-english-steering.sh +0 -156
  27. package/substrate/.claude/hooks/post-skill-friction-check.sh +0 -177
  28. package/substrate/.claude/hooks/post-skill-telemetry.sh +0 -62
  29. package/substrate/.claude/hooks/pre-build-gate.sh +0 -511
  30. package/substrate/.claude/hooks/pre-commit-gate.sh +0 -451
  31. package/substrate/.claude/hooks/session-end.sh +0 -433
  32. package/substrate/.claude/hooks/session-reflection.sh +0 -303
  33. package/substrate/.claude/hooks/skill-body-grade-gate.sh +0 -219
  34. package/substrate/.claude/hooks/skill-body-intent-drift.sh +0 -107
  35. package/substrate/.claude/hooks/skill-step-list-check.sh +0 -171
  36. package/substrate/.claude/hooks/state-validate.sh +0 -271
  37. package/substrate/.claude/hooks/substrate-clarity-gate.sh +0 -1110
  38. package/substrate/.claude/hooks/temperance-gate.sh +0 -147
  39. package/substrate/.claude/hooks/testing-tier-enforce.sh +0 -233
  40. package/substrate/.claude/hooks/turn-prose-grade-measure.sh +0 -219
  41. package/substrate/.claude/hooks/turn-prose-kiss-check.sh +0 -463
  42. package/substrate/.claude/hooks/vocabulary-migration-check.sh +0 -171
  43. package/substrate/.claude/hooks/whereami-utc-gate.sh +0 -142
  44. package/substrate/.claude/luminaries/alan-cooper.md +0 -170
  45. package/substrate/.claude/luminaries/alistair-cockburn.md +0 -140
  46. package/substrate/.claude/luminaries/amazon-pr-faq.md +0 -34
  47. package/substrate/.claude/luminaries/ash-maurya.md +0 -121
  48. package/substrate/.claude/luminaries/bill-buxton.md +0 -210
  49. package/substrate/.claude/luminaries/charles-sanders-peirce.md +0 -150
  50. package/substrate/.claude/luminaries/david-ogilvy.md +0 -192
  51. package/substrate/.claude/luminaries/don-norman.md +0 -173
  52. package/substrate/.claude/luminaries/edward-tufte.md +0 -179
  53. package/substrate/.claude/luminaries/eric-evans.md +0 -160
  54. package/substrate/.claude/luminaries/frederick-brooks.md +0 -50
  55. package/substrate/.claude/luminaries/gang-of-four.md +0 -157
  56. package/substrate/.claude/luminaries/glenford-myers.md +0 -230
  57. package/substrate/.claude/luminaries/hunt-thomas.md +0 -115
  58. package/substrate/.claude/luminaries/hyrum-wright.md +0 -94
  59. package/substrate/.claude/luminaries/jason-fried-dhh.md +0 -46
  60. package/substrate/.claude/luminaries/jesse-james-garrett.md +0 -154
  61. package/substrate/.claude/luminaries/john-ousterhout.md +0 -94
  62. package/substrate/.claude/luminaries/karl-popper.md +0 -132
  63. package/substrate/.claude/luminaries/kent-beck.md +0 -168
  64. package/substrate/.claude/luminaries/linus-torvalds.md +0 -218
  65. package/substrate/.claude/luminaries/martin-fowler.md +0 -164
  66. package/substrate/.claude/luminaries/michael-feathers.md +0 -125
  67. package/substrate/.claude/luminaries/michael-nygard.md +0 -118
  68. package/substrate/.claude/luminaries/robert-c-martin.md +0 -164
  69. package/substrate/.claude/luminaries/saltzer-schroeder.md +0 -194
  70. package/substrate/.claude/luminaries/sophia-prater.md +0 -193
  71. package/substrate/.claude/luminaries/stephen-toulmin.md +0 -131
  72. package/substrate/.claude/luminaries/tony-hoare.md +0 -170
  73. package/substrate/.claude/luminaries/vaughn-vernon.md +0 -50
  74. package/substrate/.claude/luminaries/w-edwards-deming.md +0 -158
  75. package/substrate/.claude/rules/accessor-library-discipline.md +0 -138
  76. package/substrate/.claude/rules/adr-discipline.md +0 -120
  77. package/substrate/.claude/rules/api-conventions.md +0 -125
  78. package/substrate/.claude/rules/artifact-ingestion.md +0 -179
  79. package/substrate/.claude/rules/assert-only-after-verify.md +0 -137
  80. package/substrate/.claude/rules/blocked-items.md +0 -146
  81. package/substrate/.claude/rules/bootstrap-pair-discipline.md +0 -141
  82. package/substrate/.claude/rules/branching.md +0 -28
  83. package/substrate/.claude/rules/cold-adopter-harness-discipline.md +0 -129
  84. package/substrate/.claude/rules/commit-conventions.md +0 -22
  85. package/substrate/.claude/rules/compounding-axis-fresh-analysis.md +0 -188
  86. package/substrate/.claude/rules/compounding-sequence-fresh-analysis.md +0 -188
  87. package/substrate/.claude/rules/context-engineering.md +0 -202
  88. package/substrate/.claude/rules/context-management.md +0 -85
  89. package/substrate/.claude/rules/defensive-bash.md +0 -68
  90. package/substrate/.claude/rules/deferred-actions.md +0 -233
  91. package/substrate/.claude/rules/destructive-operations.md +0 -69
  92. package/substrate/.claude/rules/diagnosis.md +0 -38
  93. package/substrate/.claude/rules/github-issue-flash-tweet.md +0 -156
  94. package/substrate/.claude/rules/guardrails.md +0 -73
  95. package/substrate/.claude/rules/hook-wire-on-author.md +0 -103
  96. package/substrate/.claude/rules/identifier-leak-prevention.md +0 -104
  97. package/substrate/.claude/rules/iteration-bet-brief-completeness.md +0 -54
  98. package/substrate/.claude/rules/lite-manifest-schema-change-discipline.md +0 -98
  99. package/substrate/.claude/rules/longrun-prep-plan-doc-compression.md +0 -89
  100. package/substrate/.claude/rules/loop-discipline.md +0 -81
  101. package/substrate/.claude/rules/manual-prod-approval.md +0 -100
  102. package/substrate/.claude/rules/marker-enrichment-discipline.md +0 -99
  103. package/substrate/.claude/rules/mobile-ephemeral-session.md +0 -109
  104. package/substrate/.claude/rules/new-dependency-check.md +0 -51
  105. package/substrate/.claude/rules/oo-ad-entry-point.md +0 -117
  106. package/substrate/.claude/rules/operator-facing-prose.md +0 -196
  107. package/substrate/.claude/rules/option-label-discipline.md +0 -108
  108. package/substrate/.claude/rules/pattern-annotation.md +0 -100
  109. package/substrate/.claude/rules/plain-english-discipline.md +0 -156
  110. package/substrate/.claude/rules/plan-enumeration-needs-value-props.md +0 -211
  111. package/substrate/.claude/rules/pr-body-shape.md +0 -317
  112. package/substrate/.claude/rules/pr-strategy.md +0 -167
  113. package/substrate/.claude/rules/pr-title-shape.md +0 -161
  114. package/substrate/.claude/rules/prototype-workflow.md +0 -65
  115. package/substrate/.claude/rules/reserved-skill-names.md +0 -123
  116. package/substrate/.claude/rules/schema-management.md +0 -49
  117. package/substrate/.claude/rules/sdlc-gates.md +0 -149
  118. package/substrate/.claude/rules/security.md +0 -37
  119. package/substrate/.claude/rules/session-artifacts.md +0 -236
  120. package/substrate/.claude/rules/skill-composition-declarations.md +0 -124
  121. package/substrate/.claude/rules/skill-description-clarity.md +0 -247
  122. package/substrate/.claude/rules/skill-procedure-step-list.md +0 -137
  123. package/substrate/.claude/rules/state-schema-validation.md +0 -162
  124. package/substrate/.claude/rules/stuck-signal-diagnostic.md +0 -140
  125. package/substrate/.claude/rules/substrate-config-schema.md +0 -98
  126. package/substrate/.claude/rules/test-list-discipline.md +0 -175
  127. package/substrate/.claude/rules/test-sufficiency.md +0 -210
  128. package/substrate/.claude/rules/testing-tier-config.md +0 -145
  129. package/substrate/.claude/rules/testing.md +0 -38
  130. package/substrate/.claude/rules/turn-estimate-grounding.md +0 -134
  131. package/substrate/.claude/rules/visual-hierarchy.md +0 -437
  132. package/substrate/.claude/rules/we-dont-break-adopters.md +0 -126
  133. package/substrate/.claude/rules/whereami-load-bearing.md +0 -202
  134. package/substrate/.claude/rules/writing-craft-discipline.md +0 -92
  135. package/substrate/.claude/rules/wu-sequencing-compounds.md +0 -145
  136. package/substrate/.claude/skills/build/SKILL.md +0 -640
  137. package/substrate/.claude/skills/chronicle/SKILL.md +0 -55
  138. package/substrate/.claude/skills/clean-artifacts/SKILL.md +0 -249
  139. package/substrate/.claude/skills/decompose/SKILL.md +0 -280
  140. package/substrate/.claude/skills/diagnose/SKILL.md +0 -297
  141. package/substrate/.claude/skills/feynman/SKILL.md +0 -90
  142. package/substrate/.claude/skills/howdoi/SKILL.md +0 -105
  143. package/substrate/.claude/skills/ia-model/SKILL.md +0 -108
  144. package/substrate/.claude/skills/interaction-design/SKILL.md +0 -112
  145. package/substrate/.claude/skills/interpret-input/SKILL.md +0 -180
  146. package/substrate/.claude/skills/journal/SKILL.md +0 -209
  147. package/substrate/.claude/skills/kiss/SKILL.md +0 -449
  148. package/substrate/.claude/skills/launch/SKILL.md +0 -915
  149. package/substrate/.claude/skills/lean-canvas/SKILL.md +0 -332
  150. package/substrate/.claude/skills/longrun/SKILL.md +0 -463
  151. package/substrate/.claude/skills/luminary/SKILL.md +0 -481
  152. package/substrate/.claude/skills/ogilvy-writing-audit/SKILL.md +0 -177
  153. package/substrate/.claude/skills/onboard-repo/SKILL.md +0 -1624
  154. package/substrate/.claude/skills/pattern-review/SKILL.md +0 -99
  155. package/substrate/.claude/skills/personas/SKILL.md +0 -207
  156. package/substrate/.claude/skills/promote/SKILL.md +0 -283
  157. package/substrate/.claude/skills/requirement/SKILL.md +0 -98
  158. package/substrate/.claude/skills/retro/SKILL.md +0 -117
  159. package/substrate/.claude/skills/riff/SKILL.md +0 -114
  160. package/substrate/.claude/skills/roadmap-reconcile/SKILL.md +0 -163
  161. package/substrate/.claude/skills/session-end/SKILL.md +0 -309
  162. package/substrate/.claude/skills/session-log/SKILL.md +0 -299
  163. package/substrate/.claude/skills/skills/SKILL.md +0 -228
  164. package/substrate/.claude/skills/spec/SKILL.md +0 -105
  165. package/substrate/.claude/skills/sprint/SKILL.md +0 -392
  166. package/substrate/.claude/skills/stage/SKILL.md +0 -384
  167. package/substrate/.claude/skills/state-a-problem/SKILL.md +0 -185
  168. package/substrate/.claude/skills/temperance/SKILL.md +0 -108
  169. package/substrate/.claude/skills/use-case/SKILL.md +0 -417
  170. package/substrate/.claude/skills/user-stories/SKILL.md +0 -268
  171. package/substrate/.claude/skills/value-prop/SKILL.md +0 -251
  172. package/substrate/.claude/skills/verify/SKILL.md +0 -160
  173. package/substrate/.claude/skills/visual-review/SKILL.md +0 -503
  174. package/substrate/.claude/skills/whats-the-plan/SKILL.md +0 -202
  175. package/substrate/.claude/skills/whereami/SKILL.md +0 -307
  176. package/substrate/AGENTS.md +0 -79
  177. package/substrate/CLAUDE-lite.md +0 -85
  178. package/substrate/CODE_OF_CONDUCT.md +0 -28
  179. package/substrate/CONTRIBUTING.md +0 -177
  180. package/substrate/README.md +0 -173
  181. package/substrate/SECURITY.md +0 -19
  182. package/substrate/architecture/decisions/ADR-029-release-pipeline.md +0 -79
  183. package/substrate/architecture/decisions/ADR-031-non-breaking-changes-adopter-discipline.md +0 -139
  184. package/substrate/architecture/decisions/ADR-032-adopter-sync-dispatcher-architecture.md +0 -192
  185. package/substrate/architecture/decisions/ADR-039-release-tagging-scheme.md +0 -145
  186. package/substrate/architecture/decisions/ADR-040-planning-skill-vocabulary-and-lite-profile.md +0 -155
  187. package/substrate/architecture/decisions/ADR-044-unified-skill-body-template.md +0 -162
  188. package/substrate/lib/clean-artifacts-sweep.sh +0 -112
  189. package/substrate/lib/code-comment-discipline.sh +0 -144
  190. package/substrate/lib/composer-preflight.sh +0 -459
  191. package/substrate/lib/hook-inject.sh +0 -255
  192. package/substrate/lib/luminary-pick.sh +0 -96
  193. package/substrate/lib/output-discipline.sh +0 -143
  194. package/substrate/lib/prose-scan-boundary.sh +0 -171
  195. package/substrate/lib/rewrite-check.sh +0 -214
  196. package/substrate/lib/state.sh +0 -1372
  197. package/substrate/lib/telemetry.sh +0 -205
  198. package/substrate/lib/tier-check.sh +0 -187
  199. package/substrate/lib/tier-dependency-audit.sh +0 -1088
  200. package/substrate/presence/install/bassclef-hook-connect.sh +0 -178
  201. package/substrate/presence/install/bassclef-sync.dispatcher.template.sh +0 -841
  202. package/substrate/presence/install/bassclef-sync.template.sh +0 -2076
  203. package/substrate/presence/install/schedule-auto-save.cron.sh +0 -88
  204. package/substrate/presence/install/schedule-auto-save.taskscheduler.md +0 -122
  205. package/substrate/scripts/aggregate-telemetry.sh +0 -217
  206. package/substrate/scripts/analyze-tier-dependencies.sh +0 -239
  207. package/substrate/scripts/generate-lite-manifest.sh +0 -505
  208. package/substrate/scripts/generate-tier-manifest.sh +0 -28
  209. package/substrate/scripts/intent-drift-check.sh +0 -456
  210. package/substrate/scripts/lite-manifest-drift-check.sh +0 -146
  211. package/substrate/scripts/render-lite-manifest-doc.sh +0 -150
  212. package/substrate/standards/adr-template.md +0 -86
  213. package/substrate/standards/api-conventions/nextjs.md +0 -84
  214. package/substrate/standards/artifact-composition.md +0 -209
  215. package/substrate/standards/bash-hook-safety.md +0 -246
  216. package/substrate/standards/bassclef-configs-schema.md +0 -232
  217. package/substrate/standards/bassclef-evolution.md +0 -143
  218. package/substrate/standards/bassclef-internal-jargon.md +0 -244
  219. package/substrate/standards/bassclef-managed-sentinel.md +0 -96
  220. package/substrate/standards/bassclef-source-config.md +0 -228
  221. package/substrate/standards/branch-stacking.md +0 -408
  222. package/substrate/standards/code-safety-principles.md +0 -176
  223. package/substrate/standards/composer-prerequisites.md +0 -155
  224. package/substrate/standards/deferred-actions-schema.md +0 -204
  225. package/substrate/standards/dependency-discipline/cargo.md +0 -39
  226. package/substrate/standards/dependency-discipline/gem.md +0 -43
  227. package/substrate/standards/dependency-discipline/go-mod.md +0 -41
  228. package/substrate/standards/dependency-discipline/npm.md +0 -42
  229. package/substrate/standards/dependency-discipline/pip.md +0 -42
  230. package/substrate/standards/deployment-topology/ec2-tailscale.md +0 -225
  231. package/substrate/standards/deployment-topology.md +0 -69
  232. package/substrate/standards/docs-sync-allowlist.md +0 -76
  233. package/substrate/standards/domain-and-dns.md +0 -145
  234. package/substrate/standards/frontend-stack.md +0 -67
  235. package/substrate/standards/frontmatter-schema.md +0 -154
  236. package/substrate/standards/graceful-exit.md +0 -227
  237. package/substrate/standards/hook-idempotency.md +0 -102
  238. package/substrate/standards/hook-injection-discipline.md +0 -202
  239. package/substrate/standards/hook-install-class.md +0 -215
  240. package/substrate/standards/input-handler-interface.md +0 -152
  241. package/substrate/standards/lite-manifest-schema-changes.md +0 -135
  242. package/substrate/standards/luminary-matching.md +0 -105
  243. package/substrate/standards/luminary-problem-patterns.md +0 -481
  244. package/substrate/standards/migration-discipline/active-record.md +0 -50
  245. package/substrate/standards/migration-discipline/alembic.md +0 -43
  246. package/substrate/standards/migration-discipline/gorm.md +0 -50
  247. package/substrate/standards/migration-discipline/prisma.md +0 -53
  248. package/substrate/standards/migration-discipline/sqlalchemy.md +0 -51
  249. package/substrate/standards/mobile-ephemeral-session.md +0 -167
  250. package/substrate/standards/model-routing-discipline.md +0 -160
  251. package/substrate/standards/ogilvy-writing-rules.md +0 -225
  252. package/substrate/standards/opener-discipline.md +0 -96
  253. package/substrate/standards/operator-facing-prose-discipline.md +0 -201
  254. package/substrate/standards/persona-schema.md +0 -229
  255. package/substrate/standards/pluggable-luminaries.md +0 -323
  256. package/substrate/standards/pr-body-discipline.md +0 -115
  257. package/substrate/standards/preview-state-schema.md +0 -189
  258. package/substrate/standards/project-directory-layout.md +0 -276
  259. package/substrate/standards/release-tagging.md +0 -137
  260. package/substrate/standards/reserved-skill-names.md +0 -120
  261. package/substrate/standards/scannable-multi-option-output.md +0 -261
  262. package/substrate/standards/sdlc-compliance.md +0 -286
  263. package/substrate/standards/sdlc-gates/typescript.md +0 -57
  264. package/substrate/standards/secrets-lifecycle.md +0 -210
  265. package/substrate/standards/security-scanner-adapter.md +0 -145
  266. package/substrate/standards/session-board.md +0 -256
  267. package/substrate/standards/skill-output-discipline.md +0 -90
  268. package/substrate/standards/state-spine-contract.md +0 -255
  269. package/substrate/standards/state-spine.md +0 -511
  270. package/substrate/standards/steering-hints/kiss-words.md +0 -11
  271. package/substrate/standards/substrate-config-schema.md +0 -267
  272. package/substrate/standards/tech-stack-config.md +0 -109
  273. package/substrate/standards/tier-dependency-analysis.md +0 -167
  274. package/substrate/standards/tier-runtime-deps/lite.md +0 -57
  275. package/substrate/standards/tier-tag-schema.md +0 -155
  276. package/substrate/standards/two-layer-config.md +0 -99
  277. package/substrate/standards/use-case-format.md +0 -292
  278. package/substrate/standards/user-story-invest.md +0 -268
  279. package/substrate/standards/velocity-and-appetite.md +0 -229
  280. package/substrate/standards/voice-input-pattern.md +0 -119
  281. package/substrate/standards/whereami-schema.md +0 -301
  282. package/substrate/standards/worktree-management.md +0 -211
  283. package/substrate/standards/writing-guide.md +0 -213
  284. package/substrate/templates/chronicle-template.md +0 -75
  285. package/substrate/templates/deferred-action-template.md +0 -45
  286. package/substrate/templates/memory-proposal-template.md +0 -77
  287. package/substrate/templates/persona-template.md +0 -200
  288. package/substrate/templates/pr-faq.md +0 -45
  289. package/substrate/templates/secret-rotation-template.md +0 -162
  290. package/substrate/templates/spec-template.md +0 -131
  291. package/substrate/templates/use-case-template.md +0 -194
  292. package/substrate/templates/user-story-template.md +0 -107
  293. 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.