@thebassclef/lite 1.0.4 → 1.1.1

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 (275) hide show
  1. package/dist/cli.cjs +298 -55
  2. package/dist/cli.js +298 -55
  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/.claude/agents/architect.md +70 -0
  7. package/dist/lite/.claude/agents/builder.md +114 -0
  8. package/dist/lite/.claude/agents/designer.md +156 -0
  9. package/dist/lite/.claude/agents/reviewer.md +88 -0
  10. package/dist/lite/.claude/hooks/bassclef-sync.sh +85 -27
  11. package/dist/lite/.claude/hooks/longrun-prep-compounding-axis-check.sh +492 -0
  12. package/dist/lite/.claude/hooks/longrun-prep-render-check.sh +236 -0
  13. package/dist/lite/.claude/hooks/persona-name-scrub-check.sh +105 -0
  14. package/dist/lite/.claude/hooks/skill-step-list-check.sh +171 -0
  15. package/dist/lite/.claude/luminaries/alan-cooper.md +170 -0
  16. package/dist/lite/.claude/luminaries/alistair-cockburn.md +140 -0
  17. package/dist/lite/.claude/luminaries/amazon-pr-faq.md +34 -0
  18. package/dist/lite/.claude/luminaries/andreas-zeller.md +74 -0
  19. package/dist/lite/.claude/luminaries/ash-maurya.md +121 -0
  20. package/dist/lite/.claude/luminaries/bill-buxton.md +210 -0
  21. package/dist/lite/.claude/luminaries/charles-sanders-peirce.md +150 -0
  22. package/dist/lite/.claude/luminaries/david-ogilvy.md +192 -0
  23. package/dist/lite/.claude/luminaries/don-norman.md +173 -0
  24. package/dist/lite/.claude/luminaries/edward-tufte.md +179 -0
  25. package/dist/lite/.claude/luminaries/eric-evans.md +160 -0
  26. package/dist/lite/.claude/luminaries/frederick-brooks.md +50 -0
  27. package/dist/lite/.claude/luminaries/gang-of-four.md +157 -0
  28. package/dist/lite/.claude/luminaries/glenford-myers.md +230 -0
  29. package/dist/lite/.claude/luminaries/hunt-thomas.md +115 -0
  30. package/dist/lite/.claude/luminaries/hyrum-wright.md +94 -0
  31. package/dist/lite/.claude/luminaries/jason-fried-dhh.md +46 -0
  32. package/dist/lite/.claude/luminaries/jesse-james-garrett.md +154 -0
  33. package/dist/lite/.claude/luminaries/john-ousterhout.md +94 -0
  34. package/dist/lite/.claude/luminaries/karl-popper.md +132 -0
  35. package/dist/lite/.claude/luminaries/kent-beck.md +168 -0
  36. package/dist/lite/.claude/luminaries/linus-torvalds.md +218 -0
  37. package/dist/lite/.claude/luminaries/martin-fowler.md +164 -0
  38. package/dist/lite/.claude/luminaries/michael-feathers.md +125 -0
  39. package/dist/lite/.claude/luminaries/michael-nygard.md +118 -0
  40. package/dist/lite/.claude/luminaries/robert-c-martin.md +164 -0
  41. package/dist/lite/.claude/luminaries/saltzer-schroeder.md +194 -0
  42. package/dist/lite/.claude/luminaries/sophia-prater.md +193 -0
  43. package/dist/lite/.claude/luminaries/stephen-toulmin.md +131 -0
  44. package/dist/lite/.claude/luminaries/tony-hoare.md +170 -0
  45. package/dist/lite/.claude/luminaries/vaughn-vernon.md +50 -0
  46. package/dist/lite/.claude/luminaries/w-edwards-deming.md +158 -0
  47. package/dist/lite/.claude/rules/accessor-library-discipline.md +110 -0
  48. package/dist/lite/.claude/rules/adr-discipline.md +96 -0
  49. package/dist/lite/.claude/rules/api-conventions.md +115 -0
  50. package/dist/lite/.claude/rules/artifact-ingestion.md +137 -0
  51. package/dist/lite/.claude/rules/assert-only-after-verify.md +111 -0
  52. package/dist/lite/.claude/rules/blocked-items.md +139 -0
  53. package/dist/lite/.claude/rules/bootstrap-pair-discipline.md +106 -0
  54. package/dist/lite/.claude/rules/branching.md +28 -0
  55. package/dist/lite/.claude/rules/cold-adopter-harness-discipline.md +93 -0
  56. package/dist/lite/.claude/rules/commit-conventions.md +22 -0
  57. package/dist/lite/.claude/rules/compounding-axis-fresh-analysis.md +173 -0
  58. package/dist/lite/.claude/rules/compounding-sequence-fresh-analysis.md +173 -0
  59. package/dist/lite/.claude/rules/context-engineering.md +155 -0
  60. package/dist/lite/.claude/rules/context-management.md +85 -0
  61. package/dist/lite/.claude/rules/defensive-bash.md +52 -0
  62. package/dist/lite/.claude/rules/deferred-actions.md +233 -0
  63. package/dist/lite/.claude/rules/destructive-operations.md +69 -0
  64. package/dist/lite/.claude/rules/diagnosis.md +38 -0
  65. package/dist/lite/.claude/rules/github-issue-flash-tweet.md +114 -0
  66. package/dist/lite/.claude/rules/guardrails.md +73 -0
  67. package/dist/lite/.claude/rules/hook-wire-on-author.md +77 -0
  68. package/dist/lite/.claude/rules/identifier-leak-prevention.md +73 -0
  69. package/dist/lite/.claude/rules/iteration-bet-brief-completeness.md +43 -0
  70. package/dist/lite/.claude/rules/lite-manifest-schema-change-discipline.md +79 -0
  71. package/dist/lite/.claude/rules/longrun-prep-plan-doc-compression.md +77 -0
  72. package/dist/lite/.claude/rules/loop-discipline.md +71 -0
  73. package/dist/lite/.claude/rules/manual-prod-approval.md +100 -0
  74. package/dist/lite/.claude/rules/marker-enrichment-discipline.md +72 -0
  75. package/dist/lite/.claude/rules/mobile-ephemeral-session.md +109 -0
  76. package/dist/lite/.claude/rules/new-dependency-check.md +44 -0
  77. package/dist/lite/.claude/rules/oo-ad-entry-point.md +95 -0
  78. package/dist/lite/.claude/rules/operator-facing-prose.md +177 -0
  79. package/dist/lite/.claude/rules/option-label-discipline.md +82 -0
  80. package/dist/lite/.claude/rules/pattern-annotation.md +83 -0
  81. package/dist/lite/.claude/rules/persona-name-leak-scrub.md +90 -0
  82. package/dist/lite/.claude/rules/plain-english-discipline.md +132 -0
  83. package/dist/lite/.claude/rules/plan-enumeration-needs-value-props.md +177 -0
  84. package/dist/lite/.claude/rules/pr-body-shape.md +195 -0
  85. package/dist/lite/.claude/rules/pr-strategy.md +142 -0
  86. package/dist/lite/.claude/rules/pr-title-shape.md +90 -0
  87. package/dist/lite/.claude/rules/prototype-workflow.md +53 -0
  88. package/dist/lite/.claude/rules/reserved-skill-names.md +103 -0
  89. package/dist/lite/.claude/rules/schema-management.md +42 -0
  90. package/dist/lite/.claude/rules/sdlc-gates.md +149 -0
  91. package/dist/lite/.claude/rules/security.md +37 -0
  92. package/dist/lite/.claude/rules/session-artifacts.md +236 -0
  93. package/dist/lite/.claude/rules/skill-composition-declarations.md +105 -0
  94. package/dist/lite/.claude/rules/skill-description-clarity.md +196 -0
  95. package/dist/lite/.claude/rules/skill-procedure-step-list.md +119 -0
  96. package/dist/lite/.claude/rules/sprint-prep-preset-picker.md +76 -0
  97. package/dist/lite/.claude/rules/state-schema-validation.md +156 -0
  98. package/dist/lite/.claude/rules/stuck-signal-diagnostic.md +111 -0
  99. package/dist/lite/.claude/rules/substrate-config-schema.md +85 -0
  100. package/dist/lite/.claude/rules/test-list-discipline.md +129 -0
  101. package/dist/lite/.claude/rules/test-sufficiency.md +186 -0
  102. package/dist/lite/.claude/rules/testing-tier-config.md +125 -0
  103. package/dist/lite/.claude/rules/testing.md +38 -0
  104. package/dist/lite/.claude/rules/turn-estimate-grounding.md +82 -0
  105. package/dist/lite/.claude/rules/visual-hierarchy.md +427 -0
  106. package/dist/lite/.claude/rules/we-dont-break-adopters.md +103 -0
  107. package/dist/lite/.claude/rules/whereami-load-bearing.md +184 -0
  108. package/dist/lite/.claude/rules/writing-craft-discipline.md +72 -0
  109. package/dist/lite/.claude/rules/wu-sequencing-compounds.md +119 -0
  110. package/dist/lite/.claude/skills/build/SKILL.md +640 -0
  111. package/dist/lite/.claude/skills/chronicle/SKILL.md +55 -0
  112. package/dist/lite/.claude/skills/clean-artifacts/SKILL.md +249 -0
  113. package/dist/lite/.claude/skills/decompose/SKILL.md +280 -0
  114. package/dist/lite/.claude/skills/diagnose/SKILL.md +297 -0
  115. package/dist/lite/.claude/skills/feynman/SKILL.md +90 -0
  116. package/dist/lite/.claude/skills/howdoi/SKILL.md +105 -0
  117. package/dist/lite/.claude/skills/ia-model/SKILL.md +108 -0
  118. package/dist/lite/.claude/skills/interaction-design/SKILL.md +112 -0
  119. package/dist/lite/.claude/skills/interpret-input/SKILL.md +180 -0
  120. package/dist/lite/.claude/skills/journal/SKILL.md +209 -0
  121. package/dist/lite/.claude/skills/kiss/SKILL.md +449 -0
  122. package/dist/lite/.claude/skills/launch/SKILL.md +915 -0
  123. package/dist/lite/.claude/skills/lean-canvas/SKILL.md +332 -0
  124. package/dist/lite/.claude/skills/longrun/SKILL.md +512 -0
  125. package/dist/lite/.claude/skills/luminary/SKILL.md +481 -0
  126. package/dist/lite/.claude/skills/ogilvy-writing-audit/SKILL.md +177 -0
  127. package/dist/lite/.claude/skills/onboard-repo/SKILL.md +1640 -0
  128. package/dist/lite/.claude/skills/pattern-review/SKILL.md +99 -0
  129. package/dist/lite/.claude/skills/personas/SKILL.md +207 -0
  130. package/dist/lite/.claude/skills/promote/SKILL.md +283 -0
  131. package/dist/lite/.claude/skills/requirement/SKILL.md +98 -0
  132. package/dist/lite/.claude/skills/retro/SKILL.md +117 -0
  133. package/dist/lite/.claude/skills/riff/SKILL.md +114 -0
  134. package/dist/lite/.claude/skills/roadmap-reconcile/SKILL.md +163 -0
  135. package/dist/lite/.claude/skills/session-end/SKILL.md +309 -0
  136. package/dist/lite/.claude/skills/session-log/SKILL.md +299 -0
  137. package/dist/lite/.claude/skills/skills/SKILL.md +228 -0
  138. package/dist/lite/.claude/skills/spec/SKILL.md +105 -0
  139. package/dist/lite/.claude/skills/sprint/SKILL.md +418 -0
  140. package/dist/lite/.claude/skills/stage/SKILL.md +384 -0
  141. package/dist/lite/.claude/skills/state-a-problem/SKILL.md +185 -0
  142. package/dist/lite/.claude/skills/temperance/SKILL.md +108 -0
  143. package/dist/lite/.claude/skills/use-case/SKILL.md +417 -0
  144. package/dist/lite/.claude/skills/user-stories/SKILL.md +268 -0
  145. package/dist/lite/.claude/skills/value-prop/SKILL.md +251 -0
  146. package/dist/lite/.claude/skills/verify/SKILL.md +160 -0
  147. package/dist/lite/.claude/skills/visual-review/SKILL.md +503 -0
  148. package/dist/lite/.claude/skills/whats-the-plan/SKILL.md +202 -0
  149. package/dist/lite/.claude/skills/whereami/SKILL.md +307 -0
  150. package/dist/lite/AGENTS.md +79 -0
  151. package/dist/lite/CLAUDE-lite.md +85 -0
  152. package/dist/lite/CODE_OF_CONDUCT.md +28 -0
  153. package/dist/lite/CONTRIBUTING.md +177 -0
  154. package/dist/lite/README.md +173 -0
  155. package/dist/lite/SECURITY.md +19 -0
  156. package/dist/lite/architecture/decisions/ADR-029-release-pipeline.md +79 -0
  157. package/dist/lite/architecture/decisions/ADR-031-non-breaking-changes-adopter-discipline.md +139 -0
  158. package/dist/lite/architecture/decisions/ADR-032-adopter-sync-dispatcher-architecture.md +192 -0
  159. package/dist/lite/architecture/decisions/ADR-039-release-tagging-scheme.md +145 -0
  160. package/dist/lite/architecture/decisions/ADR-040-planning-skill-vocabulary-and-lite-profile.md +155 -0
  161. package/dist/lite/architecture/decisions/ADR-044-unified-skill-body-template.md +162 -0
  162. package/dist/lite/lib/clean-artifacts-sweep.sh +112 -0
  163. package/dist/lite/lib/code-comment-discipline.sh +144 -0
  164. package/dist/lite/lib/composer-preflight.sh +459 -0
  165. package/dist/lite/lib/deferred-actions.sh +146 -0
  166. package/dist/lite/lib/hook-header-parser.sh +61 -0
  167. package/dist/lite/lib/hook-heartbeat.sh +152 -0
  168. package/dist/lite/lib/hook-inject.sh +255 -0
  169. package/dist/lite/lib/hook-installer.sh +195 -0
  170. package/dist/lite/lib/luminary-pick.sh +96 -0
  171. package/dist/lite/lib/output-discipline.sh +143 -0
  172. package/dist/lite/lib/prose-scan-boundary.sh +171 -0
  173. package/dist/lite/lib/rewrite-check.sh +214 -0
  174. package/dist/lite/lib/session-rescue.sh +151 -0
  175. package/dist/lite/lib/source-graph-walker.sh +277 -0
  176. package/dist/lite/lib/state.sh +1372 -0
  177. package/dist/lite/lib/telemetry.sh +205 -0
  178. package/dist/lite/lib/tier-check.sh +187 -0
  179. package/dist/lite/lib/tier-dependency-audit.sh +1088 -0
  180. package/dist/lite/presence/install/bassclef-hook-connect.sh +178 -0
  181. package/dist/lite/presence/install/bassclef-sync.dispatcher.template.sh +841 -0
  182. package/dist/lite/presence/install/bassclef-sync.template.sh +2278 -0
  183. package/dist/lite/presence/install/schedule-auto-save.cron.sh +88 -0
  184. package/dist/lite/presence/install/schedule-auto-save.taskscheduler.md +122 -0
  185. package/dist/lite/scripts/aggregate-telemetry.sh +217 -0
  186. package/dist/lite/scripts/analyze-tier-dependencies.sh +239 -0
  187. package/dist/lite/scripts/generate-lite-manifest.sh +505 -0
  188. package/dist/lite/scripts/generate-tier-manifest.sh +28 -0
  189. package/dist/lite/scripts/intent-drift-check.sh +456 -0
  190. package/dist/lite/scripts/lite-manifest-drift-check.sh +146 -0
  191. package/dist/lite/scripts/render-lite-manifest-doc.sh +150 -0
  192. package/dist/lite/standards/adr-template.md +86 -0
  193. package/dist/lite/standards/api-conventions/nextjs.md +84 -0
  194. package/dist/lite/standards/artifact-composition.md +209 -0
  195. package/dist/lite/standards/bash-hook-safety.md +246 -0
  196. package/dist/lite/standards/bassclef-configs-schema.md +232 -0
  197. package/dist/lite/standards/bassclef-evolution.md +143 -0
  198. package/dist/lite/standards/bassclef-internal-jargon.md +244 -0
  199. package/dist/lite/standards/bassclef-managed-sentinel.md +96 -0
  200. package/dist/lite/standards/bassclef-source-config.md +228 -0
  201. package/dist/lite/standards/branch-stacking.md +408 -0
  202. package/dist/lite/standards/code-safety-principles.md +176 -0
  203. package/dist/lite/standards/composer-prerequisites.md +155 -0
  204. package/dist/lite/standards/deferred-actions-schema.md +204 -0
  205. package/dist/lite/standards/dependency-discipline/cargo.md +39 -0
  206. package/dist/lite/standards/dependency-discipline/gem.md +43 -0
  207. package/dist/lite/standards/dependency-discipline/go-mod.md +41 -0
  208. package/dist/lite/standards/dependency-discipline/npm.md +42 -0
  209. package/dist/lite/standards/dependency-discipline/pip.md +42 -0
  210. package/dist/lite/standards/deployment-topology/ec2-tailscale.md +225 -0
  211. package/dist/lite/standards/deployment-topology.md +69 -0
  212. package/dist/lite/standards/docs-sync-allowlist.md +76 -0
  213. package/dist/lite/standards/domain-and-dns.md +145 -0
  214. package/dist/lite/standards/frontend-stack.md +67 -0
  215. package/dist/lite/standards/frontmatter-schema.md +154 -0
  216. package/dist/lite/standards/graceful-exit.md +227 -0
  217. package/dist/lite/standards/hook-idempotency.md +102 -0
  218. package/dist/lite/standards/hook-injection-discipline.md +202 -0
  219. package/dist/lite/standards/hook-install-class.md +215 -0
  220. package/dist/lite/standards/input-handler-interface.md +152 -0
  221. package/dist/lite/standards/lite-manifest-schema-changes.md +180 -0
  222. package/dist/lite/standards/lite-manifest.json +2797 -0
  223. package/dist/lite/standards/luminary-matching.md +105 -0
  224. package/dist/lite/standards/luminary-problem-patterns.md +481 -0
  225. package/dist/lite/standards/migration-discipline/active-record.md +50 -0
  226. package/dist/lite/standards/migration-discipline/alembic.md +43 -0
  227. package/dist/lite/standards/migration-discipline/gorm.md +50 -0
  228. package/dist/lite/standards/migration-discipline/prisma.md +53 -0
  229. package/dist/lite/standards/migration-discipline/sqlalchemy.md +51 -0
  230. package/dist/lite/standards/mobile-ephemeral-session.md +167 -0
  231. package/dist/lite/standards/model-routing-discipline.md +160 -0
  232. package/dist/lite/standards/ogilvy-writing-rules.md +225 -0
  233. package/dist/lite/standards/opener-discipline.md +96 -0
  234. package/dist/lite/standards/operator-facing-prose-discipline.md +201 -0
  235. package/dist/lite/standards/persona-schema.md +229 -0
  236. package/dist/lite/standards/pluggable-luminaries.md +323 -0
  237. package/dist/lite/standards/pr-body-discipline.md +115 -0
  238. package/dist/lite/standards/preview-state-schema.md +189 -0
  239. package/dist/lite/standards/project-directory-layout.md +276 -0
  240. package/dist/lite/standards/release-tagging.md +137 -0
  241. package/dist/lite/standards/reserved-skill-names.md +120 -0
  242. package/dist/lite/standards/scannable-multi-option-output.md +265 -0
  243. package/dist/lite/standards/sdlc-compliance.md +286 -0
  244. package/dist/lite/standards/sdlc-gates/typescript.md +57 -0
  245. package/dist/lite/standards/secrets-lifecycle.md +210 -0
  246. package/dist/lite/standards/security-scanner-adapter.md +145 -0
  247. package/dist/lite/standards/session-board.md +256 -0
  248. package/dist/lite/standards/skill-output-discipline.md +121 -0
  249. package/dist/lite/standards/state-spine-contract.md +255 -0
  250. package/dist/lite/standards/state-spine.md +511 -0
  251. package/dist/lite/standards/steering-hints/kiss-words.md +11 -0
  252. package/dist/lite/standards/substrate-config-schema.md +267 -0
  253. package/dist/lite/standards/tech-stack-config.md +109 -0
  254. package/dist/lite/standards/tier-dependency-analysis.md +167 -0
  255. package/dist/lite/standards/tier-runtime-deps/lite.md +57 -0
  256. package/dist/lite/standards/tier-tag-schema.md +155 -0
  257. package/dist/lite/standards/two-layer-config.md +99 -0
  258. package/dist/lite/standards/use-case-format.md +292 -0
  259. package/dist/lite/standards/user-story-invest.md +268 -0
  260. package/dist/lite/standards/velocity-and-appetite.md +229 -0
  261. package/dist/lite/standards/voice-input-pattern.md +119 -0
  262. package/dist/lite/standards/whereami-schema.md +301 -0
  263. package/dist/lite/standards/worktree-management.md +211 -0
  264. package/dist/lite/standards/writing-guide.md +213 -0
  265. package/dist/lite/templates/chronicle-template.md +75 -0
  266. package/dist/lite/templates/deferred-action-template.md +45 -0
  267. package/dist/lite/templates/memory-proposal-template.md +77 -0
  268. package/dist/lite/templates/persona-template.md +200 -0
  269. package/dist/lite/templates/pr-faq.md +45 -0
  270. package/dist/lite/templates/secret-rotation-template.md +162 -0
  271. package/dist/lite/templates/spec-template.md +131 -0
  272. package/dist/lite/templates/use-case-template.md +194 -0
  273. package/dist/lite/templates/user-story-template.md +107 -0
  274. package/dist/lite/templates/whereami-template.md +101 -0
  275. package/package.json +12 -5
@@ -0,0 +1,230 @@
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.
@@ -0,0 +1,115 @@
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.
@@ -0,0 +1,94 @@
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)
@@ -0,0 +1,46 @@
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.
@@ -0,0 +1,154 @@
1
+ ---
2
+ tier: lite
3
+ name: Jesse James Garrett
4
+ slug: jesse-james-garrett
5
+ claimed_by: [designer]
6
+ referenced_by_skills: [ia-model, canvas, spec]
7
+ primary_domain: ux
8
+ depth: full
9
+ sources:
10
+ - type: book
11
+ title: "The Elements of User Experience: User-Centered Design for the Web and Beyond (2nd edition)"
12
+ authors: ["Jesse James Garrett"]
13
+ year: 2010
14
+ url: "https://www.pearson.com/en-us/subject-catalog/p/elements-of-user-experience-the-user-centered-design-for-the-web-and-beyond/P200000009272"
15
+ isbn: "9780321683687"
16
+ methodology_covered:
17
+ - "Five planes of UX — Strategy, Scope, Structure, Skeleton, Surface"
18
+ - "Decisions sequence from abstract (strategy) to concrete (surface)"
19
+ - "Each plane constrains the next; clarity at one plane prevents thrashing at others"
20
+ - "Information architecture as a structural-plane concern, distinct from skeleton (wireframe) or surface (visual)"
21
+ verification_status: verified
22
+ solves_problems_brownfield:
23
+ - "Project mixes strategy, scope, structure, skeleton, and surface decisions in one conversation"
24
+ - "Surface decisions are over-determining structural choices in the existing UI"
25
+ - "Team can't agree on which decisions belong at which level"
26
+ solves_problems_greenfield:
27
+ - "Starting a multi-surface product where the five planes should sequence design decisions"
28
+ - "Building a UX strategy that decomposes work into orderable layers from day one"
29
+ - "Planning a product where strategy precedes scope precedes structure precedes skeleton precedes surface"
30
+ - "Designing a multi-month product where UX governance needs explicit decision-tier vocabulary"
31
+ anti_patterns:
32
+ - "Tactical UI fixes where the five planes is overhead"
33
+ - "Single-page or single-screen work"
34
+ description: "\"Every user experience has five planes: strategy, scope, structure, skeleton, surface."
35
+ ---
36
+
37
+ # Jesse James Garrett
38
+
39
+ ## Signature
40
+
41
+ *"Every user experience has five planes: strategy, scope, structure, skeleton, surface. Skip one and the next collapses."*
42
+
43
+ Co-founder of Adaptive Path; author of **The Elements of User Experience**.
44
+ Coiner of **Ajax** (2005). The bassclef framework for thinking about UX
45
+ as a layered set of decisions that must be made in sequence — each plane
46
+ constrains the next.
47
+
48
+ ## Core methods
49
+
50
+ - **The Five Planes of UX** — From bottom (abstract) to top (concrete):
51
+ - **Strategy** — user needs + product objectives. What success means.
52
+ - **Scope** — functional specifications + content requirements. What
53
+ the product contains.
54
+ - **Structure** — interaction design + information architecture. How
55
+ it's organized.
56
+ - **Skeleton** — interface design, navigation design, information
57
+ design. Where things are placed.
58
+ - **Surface** — sensory design (visual, auditory). How it looks and
59
+ feels.
60
+ - **Bottom-up sequence** — Each plane must be resolved before the plane
61
+ above it. Surface decisions made before strategy produce pretty
62
+ products that serve no one.
63
+ - **Plane consistency** — Decisions on one plane must cohere across that
64
+ plane. An app with two incompatible IAs (one by section, one by
65
+ feature) has a structure-plane failure.
66
+ - **Abstract-to-concrete progression** — Planes move from invisible
67
+ decisions (strategy) to visible output (surface). A team skipping
68
+ straight to surface design has no grounding for why.
69
+
70
+ ## When to channel this luminary
71
+
72
+ When the biggest risk is getting the layers out of sequence — jumping to
73
+ visual design before structure is resolved, or committing to scope
74
+ before strategy is clear. Garrett dominates in project planning and
75
+ SDLC-flow work: ensuring the right decisions happen in the right order.
76
+ Think: new-product definition, UX audits of existing products, pedagogy
77
+ for designers or teams new to systematic UX.
78
+
79
+ Do NOT channel Garrett for: tactical interaction design decisions (use
80
+ Norman, Tidwell), object-modeling (use Prater), visual polish (use
81
+ Lupton, Ive).
82
+
83
+ ## Stack translation
84
+
85
+ Garrett's planes map directly onto the bassclef SDLC:
86
+
87
+ - **Strategy plane** → `/canvas` (Thesis stage) + iteration bet framing
88
+ - **Scope plane** → `/canvas` (Shape stage) + `/spec` + feature list
89
+ - **Structure plane** → `/ia-model` + `/jtbd-tasks` + `/task-scenarios`
90
+ - **Skeleton plane** → `/interaction-design` + `/decompose` (responsibility)
91
+ - **Surface plane** → `/frontend-design` + `/visual-review` + design tokens
92
+
93
+ The bassclef UX translation chain (JTBD → HTA → IA → Interaction Design)
94
+ is Garrett's structure plane made operational. `/riff-prototypes`
95
+ skips to skeleton/surface only when the lower planes are resolved.
96
+
97
+ ## Anti-patterns it prevents
98
+
99
+ - **Surface-first design** — starting with visual mockups before
100
+ structure or scope is settled. Produces beautiful products that fail
101
+ strategy tests.
102
+ - **Premature plane commitment** — locking visual design before
103
+ interaction design is complete. Forces structure decisions to fit
104
+ pre-made mockups.
105
+ - **Plane-skipping** — jumping from strategy to surface, or scope to
106
+ skeleton. Missing planes leave load-bearing decisions implicit.
107
+ - **Plane inconsistency** — a strategy plane that says "operator tool"
108
+ paired with a surface plane that says "consumer SaaS." Reveals
109
+ uncoordinated decisions.
110
+ - **Deliverable confusion** — treating wireframes (skeleton) as final
111
+ design, or treating mockups (surface) as structure. Each plane has
112
+ its own deliverables and can't substitute.
113
+
114
+ ## Worked example
115
+
116
+ For POA's deal pipeline feature planning, Garrett's five planes produce:
117
+
118
+ 1. **Strategy**: Operator needs efficient pipeline management; product
119
+ objective is reducing time-to-close. Success = X% faster deal
120
+ throughput.
121
+ 2. **Scope**: Functional = deal CRUD, stage transitions, broker
122
+ association, note logging, search, export. Content = deal types,
123
+ stage definitions, standard fields, extension fields.
124
+ 3. **Structure**: Interaction = stage-transition flow, note-logging
125
+ flow, broker-assignment flow. IA = object-first nav (Deals, Brokers,
126
+ Sellers) with facets (stage, source, age).
127
+ 4. **Skeleton**: List-detail pattern for deals; right-rail for
128
+ secondary info; sticky stage-progress at top of detail view;
129
+ collapsed sections for enrichment data.
130
+ 5. **Surface**: Design tokens (colors, typography, spacing); dense
131
+ table view; status chips per stage; hover states and transitions.
132
+
133
+ Each plane's output is input to the next. Skipping directly from
134
+ Strategy to Surface (shopping for a pretty template) would produce a
135
+ product that looks great and serves no specific operator workflow.
136
+
137
+ ## Sources
138
+
139
+ - *The Elements of User Experience: User-Centered Design for the Web
140
+ and Beyond* — Garrett, New Riders (1st ed 2002, 2nd ed 2010)
141
+ - *"Ajax: A New Approach to Web Applications"* — Garrett, Adaptive
142
+ Path essay (2005) that coined the term
143
+ - jjg.net — Garrett's primary site (maintains classic Elements diagram)
144
+
145
+ ## Related luminaries
146
+
147
+ - **Sophia Prater** — OOUX lives at Garrett's structure plane. Not a
148
+ replacement; a specific method for that plane.
149
+ - **Alan Cooper** — Goal-Directed Design operates across planes but
150
+ grounds in strategy (user goals) and scope (task lists).
151
+ - **Peter Morville** — IA work is structure-plane; Morville + Garrett
152
+ pair naturally.
153
+ - **Ellen Lupton** — Typography is surface-plane; don't invoke until
154
+ skeleton is resolved.