@thebassclef/lite 0.1.3 → 1.0.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.
- package/dist/cli.cjs +431 -135
- package/dist/cli.js +433 -137
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/lite/.bassclef-source.json +10 -0
- package/{substrate → dist/lite}/.claude/hooks/artifact-ingestion-gate.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/assert-verify-steering.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/bassclef-source-config-validate.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/bassclef-sync.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/compound-noun-scrub.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/kiss-expansion-inject.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/longrun-prep-compounding-sequence-check.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/plain-english-steering.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/post-skill-friction-check.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/post-skill-telemetry.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/pre-build-gate.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/pre-commit-gate.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/session-end.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/session-reflection.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/skill-body-grade-gate.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/skill-body-intent-drift.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/state-validate.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/substrate-clarity-gate.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/temperance-gate.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/testing-tier-enforce.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/turn-prose-grade-measure.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/turn-prose-kiss-check.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/vocabulary-migration-check.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/whereami-utc-gate.sh +0 -0
- package/dist/lite/.claude/settings.json +212 -0
- package/dist/lite/CLAUDE.md +41 -0
- package/dist/lite/gitignore +58 -0
- package/dist/lite/standards/bassclef-wiring-manifest.json +497 -0
- package/dist/lite/whereami.md +24 -0
- package/package.json +8 -2
- package/substrate/.bassclef/lite-manifest.json +0 -2701
- package/substrate/.claude/agents/architect.md +0 -70
- package/substrate/.claude/agents/builder.md +0 -114
- package/substrate/.claude/agents/designer.md +0 -156
- package/substrate/.claude/agents/reviewer.md +0 -88
- package/substrate/.claude/hooks/longrun-prep-compounding-axis-check.sh +0 -492
- package/substrate/.claude/hooks/skill-step-list-check.sh +0 -171
- package/substrate/.claude/luminaries/alan-cooper.md +0 -170
- package/substrate/.claude/luminaries/alistair-cockburn.md +0 -140
- package/substrate/.claude/luminaries/amazon-pr-faq.md +0 -34
- package/substrate/.claude/luminaries/ash-maurya.md +0 -121
- package/substrate/.claude/luminaries/bill-buxton.md +0 -210
- package/substrate/.claude/luminaries/charles-sanders-peirce.md +0 -150
- package/substrate/.claude/luminaries/david-ogilvy.md +0 -192
- package/substrate/.claude/luminaries/don-norman.md +0 -173
- package/substrate/.claude/luminaries/edward-tufte.md +0 -179
- package/substrate/.claude/luminaries/eric-evans.md +0 -160
- package/substrate/.claude/luminaries/frederick-brooks.md +0 -50
- package/substrate/.claude/luminaries/gang-of-four.md +0 -157
- package/substrate/.claude/luminaries/glenford-myers.md +0 -230
- package/substrate/.claude/luminaries/hunt-thomas.md +0 -115
- package/substrate/.claude/luminaries/hyrum-wright.md +0 -94
- package/substrate/.claude/luminaries/jason-fried-dhh.md +0 -46
- package/substrate/.claude/luminaries/jesse-james-garrett.md +0 -154
- package/substrate/.claude/luminaries/john-ousterhout.md +0 -94
- package/substrate/.claude/luminaries/karl-popper.md +0 -132
- package/substrate/.claude/luminaries/kent-beck.md +0 -168
- package/substrate/.claude/luminaries/linus-torvalds.md +0 -218
- package/substrate/.claude/luminaries/martin-fowler.md +0 -164
- package/substrate/.claude/luminaries/michael-feathers.md +0 -125
- package/substrate/.claude/luminaries/michael-nygard.md +0 -118
- package/substrate/.claude/luminaries/robert-c-martin.md +0 -164
- package/substrate/.claude/luminaries/saltzer-schroeder.md +0 -194
- package/substrate/.claude/luminaries/sophia-prater.md +0 -193
- package/substrate/.claude/luminaries/stephen-toulmin.md +0 -131
- package/substrate/.claude/luminaries/tony-hoare.md +0 -170
- package/substrate/.claude/luminaries/vaughn-vernon.md +0 -50
- package/substrate/.claude/luminaries/w-edwards-deming.md +0 -158
- package/substrate/.claude/rules/accessor-library-discipline.md +0 -138
- package/substrate/.claude/rules/adr-discipline.md +0 -120
- package/substrate/.claude/rules/api-conventions.md +0 -125
- package/substrate/.claude/rules/artifact-ingestion.md +0 -179
- package/substrate/.claude/rules/assert-only-after-verify.md +0 -137
- package/substrate/.claude/rules/blocked-items.md +0 -146
- package/substrate/.claude/rules/bootstrap-pair-discipline.md +0 -141
- package/substrate/.claude/rules/branching.md +0 -28
- package/substrate/.claude/rules/cold-adopter-harness-discipline.md +0 -129
- package/substrate/.claude/rules/commit-conventions.md +0 -22
- package/substrate/.claude/rules/compounding-axis-fresh-analysis.md +0 -188
- package/substrate/.claude/rules/compounding-sequence-fresh-analysis.md +0 -188
- package/substrate/.claude/rules/context-engineering.md +0 -202
- package/substrate/.claude/rules/context-management.md +0 -85
- package/substrate/.claude/rules/defensive-bash.md +0 -68
- package/substrate/.claude/rules/deferred-actions.md +0 -233
- package/substrate/.claude/rules/destructive-operations.md +0 -69
- package/substrate/.claude/rules/diagnosis.md +0 -38
- package/substrate/.claude/rules/github-issue-flash-tweet.md +0 -156
- package/substrate/.claude/rules/guardrails.md +0 -73
- package/substrate/.claude/rules/hook-wire-on-author.md +0 -103
- package/substrate/.claude/rules/identifier-leak-prevention.md +0 -104
- package/substrate/.claude/rules/iteration-bet-brief-completeness.md +0 -54
- package/substrate/.claude/rules/lite-manifest-schema-change-discipline.md +0 -98
- package/substrate/.claude/rules/longrun-prep-plan-doc-compression.md +0 -89
- package/substrate/.claude/rules/loop-discipline.md +0 -81
- package/substrate/.claude/rules/manual-prod-approval.md +0 -100
- package/substrate/.claude/rules/marker-enrichment-discipline.md +0 -99
- package/substrate/.claude/rules/mobile-ephemeral-session.md +0 -109
- package/substrate/.claude/rules/new-dependency-check.md +0 -51
- package/substrate/.claude/rules/oo-ad-entry-point.md +0 -117
- package/substrate/.claude/rules/operator-facing-prose.md +0 -196
- package/substrate/.claude/rules/option-label-discipline.md +0 -108
- package/substrate/.claude/rules/pattern-annotation.md +0 -100
- package/substrate/.claude/rules/plain-english-discipline.md +0 -156
- package/substrate/.claude/rules/plan-enumeration-needs-value-props.md +0 -211
- package/substrate/.claude/rules/pr-body-shape.md +0 -317
- package/substrate/.claude/rules/pr-strategy.md +0 -167
- package/substrate/.claude/rules/pr-title-shape.md +0 -161
- package/substrate/.claude/rules/prototype-workflow.md +0 -65
- package/substrate/.claude/rules/reserved-skill-names.md +0 -123
- package/substrate/.claude/rules/schema-management.md +0 -49
- package/substrate/.claude/rules/sdlc-gates.md +0 -149
- package/substrate/.claude/rules/security.md +0 -37
- package/substrate/.claude/rules/session-artifacts.md +0 -236
- package/substrate/.claude/rules/skill-composition-declarations.md +0 -124
- package/substrate/.claude/rules/skill-description-clarity.md +0 -247
- package/substrate/.claude/rules/skill-procedure-step-list.md +0 -137
- package/substrate/.claude/rules/state-schema-validation.md +0 -162
- package/substrate/.claude/rules/stuck-signal-diagnostic.md +0 -140
- package/substrate/.claude/rules/substrate-config-schema.md +0 -98
- package/substrate/.claude/rules/test-list-discipline.md +0 -175
- package/substrate/.claude/rules/test-sufficiency.md +0 -210
- package/substrate/.claude/rules/testing-tier-config.md +0 -145
- package/substrate/.claude/rules/testing.md +0 -38
- package/substrate/.claude/rules/turn-estimate-grounding.md +0 -134
- package/substrate/.claude/rules/visual-hierarchy.md +0 -437
- package/substrate/.claude/rules/we-dont-break-adopters.md +0 -126
- package/substrate/.claude/rules/whereami-load-bearing.md +0 -202
- package/substrate/.claude/rules/writing-craft-discipline.md +0 -92
- package/substrate/.claude/rules/wu-sequencing-compounds.md +0 -145
- package/substrate/.claude/skills/build/SKILL.md +0 -640
- package/substrate/.claude/skills/chronicle/SKILL.md +0 -55
- package/substrate/.claude/skills/clean-artifacts/SKILL.md +0 -249
- package/substrate/.claude/skills/decompose/SKILL.md +0 -280
- package/substrate/.claude/skills/diagnose/SKILL.md +0 -297
- package/substrate/.claude/skills/feynman/SKILL.md +0 -90
- package/substrate/.claude/skills/howdoi/SKILL.md +0 -105
- package/substrate/.claude/skills/ia-model/SKILL.md +0 -108
- package/substrate/.claude/skills/interaction-design/SKILL.md +0 -112
- package/substrate/.claude/skills/interpret-input/SKILL.md +0 -180
- package/substrate/.claude/skills/journal/SKILL.md +0 -209
- package/substrate/.claude/skills/kiss/SKILL.md +0 -449
- package/substrate/.claude/skills/launch/SKILL.md +0 -915
- package/substrate/.claude/skills/lean-canvas/SKILL.md +0 -332
- package/substrate/.claude/skills/longrun/SKILL.md +0 -463
- package/substrate/.claude/skills/luminary/SKILL.md +0 -481
- package/substrate/.claude/skills/ogilvy-writing-audit/SKILL.md +0 -177
- package/substrate/.claude/skills/onboard-repo/SKILL.md +0 -1624
- package/substrate/.claude/skills/pattern-review/SKILL.md +0 -99
- package/substrate/.claude/skills/personas/SKILL.md +0 -207
- package/substrate/.claude/skills/promote/SKILL.md +0 -283
- package/substrate/.claude/skills/requirement/SKILL.md +0 -98
- package/substrate/.claude/skills/retro/SKILL.md +0 -117
- package/substrate/.claude/skills/riff/SKILL.md +0 -114
- package/substrate/.claude/skills/roadmap-reconcile/SKILL.md +0 -163
- package/substrate/.claude/skills/session-end/SKILL.md +0 -309
- package/substrate/.claude/skills/session-log/SKILL.md +0 -299
- package/substrate/.claude/skills/skills/SKILL.md +0 -228
- package/substrate/.claude/skills/spec/SKILL.md +0 -105
- package/substrate/.claude/skills/sprint/SKILL.md +0 -392
- package/substrate/.claude/skills/stage/SKILL.md +0 -384
- package/substrate/.claude/skills/state-a-problem/SKILL.md +0 -185
- package/substrate/.claude/skills/temperance/SKILL.md +0 -108
- package/substrate/.claude/skills/use-case/SKILL.md +0 -417
- package/substrate/.claude/skills/user-stories/SKILL.md +0 -268
- package/substrate/.claude/skills/value-prop/SKILL.md +0 -251
- package/substrate/.claude/skills/verify/SKILL.md +0 -160
- package/substrate/.claude/skills/visual-review/SKILL.md +0 -503
- package/substrate/.claude/skills/whats-the-plan/SKILL.md +0 -202
- package/substrate/.claude/skills/whereami/SKILL.md +0 -307
- package/substrate/AGENTS.md +0 -79
- package/substrate/CLAUDE-lite.md +0 -85
- package/substrate/CODE_OF_CONDUCT.md +0 -28
- package/substrate/CONTRIBUTING.md +0 -177
- package/substrate/README.md +0 -173
- package/substrate/SECURITY.md +0 -19
- package/substrate/architecture/decisions/ADR-029-release-pipeline.md +0 -79
- package/substrate/architecture/decisions/ADR-031-non-breaking-changes-adopter-discipline.md +0 -139
- package/substrate/architecture/decisions/ADR-032-adopter-sync-dispatcher-architecture.md +0 -192
- package/substrate/architecture/decisions/ADR-039-release-tagging-scheme.md +0 -145
- package/substrate/architecture/decisions/ADR-040-planning-skill-vocabulary-and-lite-profile.md +0 -155
- package/substrate/architecture/decisions/ADR-044-unified-skill-body-template.md +0 -162
- package/substrate/lib/clean-artifacts-sweep.sh +0 -112
- package/substrate/lib/code-comment-discipline.sh +0 -144
- package/substrate/lib/composer-preflight.sh +0 -459
- package/substrate/lib/hook-inject.sh +0 -255
- package/substrate/lib/luminary-pick.sh +0 -96
- package/substrate/lib/output-discipline.sh +0 -143
- package/substrate/lib/prose-scan-boundary.sh +0 -171
- package/substrate/lib/rewrite-check.sh +0 -214
- package/substrate/lib/state.sh +0 -1372
- package/substrate/lib/telemetry.sh +0 -205
- package/substrate/lib/tier-check.sh +0 -187
- package/substrate/lib/tier-dependency-audit.sh +0 -1088
- package/substrate/presence/install/bassclef-hook-connect.sh +0 -178
- package/substrate/presence/install/bassclef-sync.dispatcher.template.sh +0 -841
- package/substrate/presence/install/bassclef-sync.template.sh +0 -2076
- package/substrate/presence/install/schedule-auto-save.cron.sh +0 -88
- package/substrate/presence/install/schedule-auto-save.taskscheduler.md +0 -122
- package/substrate/scripts/aggregate-telemetry.sh +0 -217
- package/substrate/scripts/analyze-tier-dependencies.sh +0 -239
- package/substrate/scripts/generate-lite-manifest.sh +0 -505
- package/substrate/scripts/generate-tier-manifest.sh +0 -28
- package/substrate/scripts/intent-drift-check.sh +0 -456
- package/substrate/scripts/lite-manifest-drift-check.sh +0 -146
- package/substrate/scripts/render-lite-manifest-doc.sh +0 -150
- package/substrate/standards/adr-template.md +0 -86
- package/substrate/standards/api-conventions/nextjs.md +0 -84
- package/substrate/standards/artifact-composition.md +0 -209
- package/substrate/standards/bash-hook-safety.md +0 -246
- package/substrate/standards/bassclef-configs-schema.md +0 -232
- package/substrate/standards/bassclef-evolution.md +0 -143
- package/substrate/standards/bassclef-internal-jargon.md +0 -244
- package/substrate/standards/bassclef-managed-sentinel.md +0 -96
- package/substrate/standards/bassclef-source-config.md +0 -228
- package/substrate/standards/branch-stacking.md +0 -408
- package/substrate/standards/code-safety-principles.md +0 -176
- package/substrate/standards/composer-prerequisites.md +0 -155
- package/substrate/standards/deferred-actions-schema.md +0 -204
- package/substrate/standards/dependency-discipline/cargo.md +0 -39
- package/substrate/standards/dependency-discipline/gem.md +0 -43
- package/substrate/standards/dependency-discipline/go-mod.md +0 -41
- package/substrate/standards/dependency-discipline/npm.md +0 -42
- package/substrate/standards/dependency-discipline/pip.md +0 -42
- package/substrate/standards/deployment-topology/ec2-tailscale.md +0 -225
- package/substrate/standards/deployment-topology.md +0 -69
- package/substrate/standards/docs-sync-allowlist.md +0 -76
- package/substrate/standards/domain-and-dns.md +0 -145
- package/substrate/standards/frontend-stack.md +0 -67
- package/substrate/standards/frontmatter-schema.md +0 -154
- package/substrate/standards/graceful-exit.md +0 -227
- package/substrate/standards/hook-idempotency.md +0 -102
- package/substrate/standards/hook-injection-discipline.md +0 -202
- package/substrate/standards/hook-install-class.md +0 -215
- package/substrate/standards/input-handler-interface.md +0 -152
- package/substrate/standards/lite-manifest-schema-changes.md +0 -135
- package/substrate/standards/luminary-matching.md +0 -105
- package/substrate/standards/luminary-problem-patterns.md +0 -481
- package/substrate/standards/migration-discipline/active-record.md +0 -50
- package/substrate/standards/migration-discipline/alembic.md +0 -43
- package/substrate/standards/migration-discipline/gorm.md +0 -50
- package/substrate/standards/migration-discipline/prisma.md +0 -53
- package/substrate/standards/migration-discipline/sqlalchemy.md +0 -51
- package/substrate/standards/mobile-ephemeral-session.md +0 -167
- package/substrate/standards/model-routing-discipline.md +0 -160
- package/substrate/standards/ogilvy-writing-rules.md +0 -225
- package/substrate/standards/opener-discipline.md +0 -96
- package/substrate/standards/operator-facing-prose-discipline.md +0 -201
- package/substrate/standards/persona-schema.md +0 -229
- package/substrate/standards/pluggable-luminaries.md +0 -323
- package/substrate/standards/pr-body-discipline.md +0 -115
- package/substrate/standards/preview-state-schema.md +0 -189
- package/substrate/standards/project-directory-layout.md +0 -276
- package/substrate/standards/release-tagging.md +0 -137
- package/substrate/standards/reserved-skill-names.md +0 -120
- package/substrate/standards/scannable-multi-option-output.md +0 -261
- package/substrate/standards/sdlc-compliance.md +0 -286
- package/substrate/standards/sdlc-gates/typescript.md +0 -57
- package/substrate/standards/secrets-lifecycle.md +0 -210
- package/substrate/standards/security-scanner-adapter.md +0 -145
- package/substrate/standards/session-board.md +0 -256
- package/substrate/standards/skill-output-discipline.md +0 -90
- package/substrate/standards/state-spine-contract.md +0 -255
- package/substrate/standards/state-spine.md +0 -511
- package/substrate/standards/steering-hints/kiss-words.md +0 -11
- package/substrate/standards/substrate-config-schema.md +0 -267
- package/substrate/standards/tech-stack-config.md +0 -109
- package/substrate/standards/tier-dependency-analysis.md +0 -167
- package/substrate/standards/tier-runtime-deps/lite.md +0 -57
- package/substrate/standards/tier-tag-schema.md +0 -155
- package/substrate/standards/two-layer-config.md +0 -99
- package/substrate/standards/use-case-format.md +0 -292
- package/substrate/standards/user-story-invest.md +0 -268
- package/substrate/standards/velocity-and-appetite.md +0 -229
- package/substrate/standards/voice-input-pattern.md +0 -119
- package/substrate/standards/whereami-schema.md +0 -301
- package/substrate/standards/worktree-management.md +0 -211
- package/substrate/standards/writing-guide.md +0 -213
- package/substrate/templates/chronicle-template.md +0 -75
- package/substrate/templates/deferred-action-template.md +0 -45
- package/substrate/templates/memory-proposal-template.md +0 -77
- package/substrate/templates/persona-template.md +0 -200
- package/substrate/templates/pr-faq.md +0 -45
- package/substrate/templates/secret-rotation-template.md +0 -162
- package/substrate/templates/spec-template.md +0 -131
- package/substrate/templates/use-case-template.md +0 -194
- package/substrate/templates/user-story-template.md +0 -107
- package/substrate/templates/whereami-template.md +0 -101
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
tier: lite
|
|
3
|
-
name: Robert C. Martin (Uncle Bob)
|
|
4
|
-
slug: robert-c-martin
|
|
5
|
-
claimed_by: [architect, builder, reviewer]
|
|
6
|
-
referenced_by_skills: [pattern-review, decompose, architect-review]
|
|
7
|
-
primary_domain: engineering
|
|
8
|
-
depth: full
|
|
9
|
-
sources:
|
|
10
|
-
- type: book
|
|
11
|
-
title: "Clean Code: A Handbook of Agile Software Craftsmanship"
|
|
12
|
-
authors: ["Robert C. Martin"]
|
|
13
|
-
year: 2008
|
|
14
|
-
url: "https://www.pearson.com/en-us/subject-catalog/p/clean-code-a-handbook-of-agile-software-craftsmanship/P200000009044"
|
|
15
|
-
isbn: "9780132350884"
|
|
16
|
-
methodology_covered:
|
|
17
|
-
- "Functions should do one thing and do it well"
|
|
18
|
-
- "Meaningful names + small functions + no comments needed"
|
|
19
|
-
- "Code smells inventory + remediation patterns"
|
|
20
|
-
- "Boy Scout rule — leave the code cleaner than you found it"
|
|
21
|
-
- type: book
|
|
22
|
-
title: "Clean Architecture: A Craftsman's Guide to Software Structure and Design"
|
|
23
|
-
authors: ["Robert C. Martin"]
|
|
24
|
-
year: 2017
|
|
25
|
-
url: "https://www.pearson.com/en-us/subject-catalog/p/clean-architecture-a-craftsmans-guide-to-software-structure-and-design/P200000009454"
|
|
26
|
-
isbn: "9780134494166"
|
|
27
|
-
methodology_covered:
|
|
28
|
-
- "The Dependency Rule — source code dependencies always point inward"
|
|
29
|
-
- "Business rules never import frameworks, UI, or databases"
|
|
30
|
-
- "Boundaries between layers minimize ripple effects from external changes"
|
|
31
|
-
- type: book
|
|
32
|
-
title: "Agile Software Development: Principles, Patterns, and Practices"
|
|
33
|
-
authors: ["Robert C. Martin"]
|
|
34
|
-
year: 2002
|
|
35
|
-
url: "https://www.pearson.com/en-us/subject-catalog/p/agile-software-development-principles-patterns-and-practices/P200000009250"
|
|
36
|
-
isbn: "9780135974445"
|
|
37
|
-
methodology_covered:
|
|
38
|
-
- "SOLID principles — Single Responsibility, Open/Closed, Liskov Substitution, Interface Segregation, Dependency Inversion"
|
|
39
|
-
- "Original codification of the SOLID acronym and each principle"
|
|
40
|
-
- type: book
|
|
41
|
-
title: "The Clean Coder: A Code of Conduct for Professional Programmers"
|
|
42
|
-
authors: ["Robert C. Martin"]
|
|
43
|
-
year: 2011
|
|
44
|
-
url: "https://www.pearson.com/en-us/subject-catalog/p/clean-coder-the-a-code-of-conduct-for-professional-programmers/P200000009422"
|
|
45
|
-
isbn: "9780137081073"
|
|
46
|
-
methodology_covered:
|
|
47
|
-
- "Professional discipline — saying no, estimating honestly, practicing"
|
|
48
|
-
- "Programming as profession with codes of conduct"
|
|
49
|
-
verification_status: verified
|
|
50
|
-
description: "\"Architecture is about intent, not frameworks."
|
|
51
|
-
---
|
|
52
|
-
|
|
53
|
-
# Robert C. Martin (Uncle Bob)
|
|
54
|
-
|
|
55
|
-
## Signature
|
|
56
|
-
|
|
57
|
-
*"Architecture is about intent, not frameworks. The only way to go fast is to go well."*
|
|
58
|
-
|
|
59
|
-
Author of **Clean Code**, **Clean Architecture**, and **Clean Coder**.
|
|
60
|
-
Coined SOLID. The bassclef voice on code quality as a continuous
|
|
61
|
-
practice, not an end-of-project polish. We invoke Martin for SOLID,
|
|
62
|
-
boundaries, testability, and functions that do one thing.
|
|
63
|
-
|
|
64
|
-
## Core methods
|
|
65
|
-
|
|
66
|
-
- **SOLID principles** — Single Responsibility, Open/Closed, Liskov
|
|
67
|
-
Substitution, Interface Segregation, Dependency Inversion. Five
|
|
68
|
-
rules for OO design that survive decades of reapplication.
|
|
69
|
-
- **Clean Architecture / Dependency Rule** — Source-code dependencies
|
|
70
|
-
always point inward toward higher-level policy. Business rules don't
|
|
71
|
-
know about frameworks, UI, or databases. Frameworks are plugins.
|
|
72
|
-
- **Boundaries as architecture** — Architecture's job is defining which
|
|
73
|
-
parts of the system are volatile and which are stable, and drawing
|
|
74
|
-
boundaries between them. Boundaries allow deferral of decisions.
|
|
75
|
-
- **Functions do one thing** — Small, single-purpose functions with
|
|
76
|
-
descriptive names. Longest function should fit on a screen.
|
|
77
|
-
- **Tests as first-class design constraint** — Code not written for
|
|
78
|
-
testability produces code that can't be tested. TDD is the practice
|
|
79
|
-
that enforces this discipline from the start.
|
|
80
|
-
|
|
81
|
-
## When to channel this luminary
|
|
82
|
-
|
|
83
|
-
When the primary risk is code entropy — the product works today but
|
|
84
|
-
becomes unmaintainable tomorrow. Martin dominates for long-lived
|
|
85
|
-
codebases, teams that rotate, and systems that will be extended over
|
|
86
|
-
years. Pair with Fowler (refactoring, patterns) and Beck (TDD,
|
|
87
|
-
XP practices) for the engineering-quality triad.
|
|
88
|
-
|
|
89
|
-
Do NOT channel Martin for: throwaway prototypes, one-off scripts,
|
|
90
|
-
pure research code where cleanup isn't the point.
|
|
91
|
-
|
|
92
|
-
## Stack translation
|
|
93
|
-
|
|
94
|
-
In Next.js + Prisma + TypeScript:
|
|
95
|
-
|
|
96
|
-
- **Single Responsibility** → one component per concern; extract
|
|
97
|
-
`useXHook` when a component has multiple reasons to change.
|
|
98
|
-
- **Open/Closed** → extend via props/config, not by modifying existing
|
|
99
|
-
components. Strategy pattern for varying behavior.
|
|
100
|
-
- **Liskov** → interface contracts respected across implementations.
|
|
101
|
-
React component prop types that subtypes must honor.
|
|
102
|
-
- **Interface Segregation** → component prop types that don't force
|
|
103
|
-
consumers to provide unneeded props. Split large prop types into
|
|
104
|
-
focused ones.
|
|
105
|
-
- **Dependency Inversion** → depend on interfaces, not concrete
|
|
106
|
-
services. Facade pattern + interface → enables test stubs and
|
|
107
|
-
provider swaps (see `/decompose` Phase 1 Interface Registry).
|
|
108
|
-
- **Clean Architecture** → business logic in `lib/services/`;
|
|
109
|
-
adapters in `lib/adapters/`; controllers in `app/api/` + `app/actions/`;
|
|
110
|
-
frameworks stay at the edges.
|
|
111
|
-
|
|
112
|
-
## Anti-patterns it prevents
|
|
113
|
-
|
|
114
|
-
- **God components** — one component doing validation + business logic
|
|
115
|
-
+ DB call + side effects. Violates Single Responsibility.
|
|
116
|
-
- **Framework coupling in business logic** — Prisma imports in
|
|
117
|
-
domain-logic files, React hooks in pure computation. Violates
|
|
118
|
-
Dependency Rule.
|
|
119
|
-
- **Feature envy** — a class/component that reaches into another's
|
|
120
|
-
internals. Signal the responsibility is mis-assigned.
|
|
121
|
-
- **Untested code** — if it's not covered, it's broken by default.
|
|
122
|
-
Covered code is the minimum bar.
|
|
123
|
-
- **Clever code** — concise-but-unreadable constructs. Clean Code
|
|
124
|
-
requires clarity over brevity.
|
|
125
|
-
|
|
126
|
-
## Worked example
|
|
127
|
-
|
|
128
|
-
For POA's deal-scoring system:
|
|
129
|
-
|
|
130
|
-
Martin's approach:
|
|
131
|
-
- `ScoringService` (Pure Fabrication per GRASP + SRP per SOLID) —
|
|
132
|
-
orchestrates scoring, doesn't own score data
|
|
133
|
-
- `IScoringStrategy` interface — Open/Closed: new scoring rules as
|
|
134
|
-
new classes, not edits to existing code
|
|
135
|
-
- `WeightedScorer` / `BooleanScorer` / `MLScorer` — concrete strategies
|
|
136
|
-
- `ScoringController` as a thin server action — no business logic,
|
|
137
|
-
just wires strategy + service + response
|
|
138
|
-
- All of the above: unit tested. The service mocks the strategy; the
|
|
139
|
-
strategy is tested in isolation; the controller is tested with
|
|
140
|
-
service stub.
|
|
141
|
-
|
|
142
|
-
What Martin would NOT produce: a 400-line server action that directly
|
|
143
|
-
queries Prisma, applies scoring math inline, sends notifications, and
|
|
144
|
-
logs telemetry. That's every SOLID principle violated in one route.
|
|
145
|
-
|
|
146
|
-
## Sources
|
|
147
|
-
|
|
148
|
-
- *Clean Code* — Martin, Prentice Hall (2008)
|
|
149
|
-
- *Clean Architecture* — Martin, Prentice Hall (2017)
|
|
150
|
-
- *The Clean Coder* — Martin (2011)
|
|
151
|
-
- *Agile Software Development: Principles, Patterns, and Practices* — Martin (2002)
|
|
152
|
-
- cleancoders.com — video series
|
|
153
|
-
- blog.cleancoder.com
|
|
154
|
-
|
|
155
|
-
## Related luminaries
|
|
156
|
-
|
|
157
|
-
- **Martin Fowler** — Shared rigor; Fowler provides patterns + refactoring,
|
|
158
|
-
Martin provides principles. Pair always.
|
|
159
|
-
- **Kent Beck** — TDD discipline Martin endorses; Beck operational,
|
|
160
|
-
Martin principles.
|
|
161
|
-
- **Alistair Cockburn** — Hexagonal Architecture is a specific
|
|
162
|
-
implementation of Clean Architecture's boundary rule.
|
|
163
|
-
- **Gang of Four** — Martin recommends GoF patterns as implementation
|
|
164
|
-
vocabulary for SOLID principles.
|
|
@@ -1,194 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
tier: lite
|
|
3
|
-
name: Jerome Saltzer & Michael Schroeder
|
|
4
|
-
slug: saltzer-schroeder
|
|
5
|
-
claimed_by: [architect, reviewer, builder, security-auditor]
|
|
6
|
-
referenced_by_skills: [security-review, architect-review, pattern-review, diagnose]
|
|
7
|
-
primary_domain: security
|
|
8
|
-
depth: full
|
|
9
|
-
sources:
|
|
10
|
-
- type: paper
|
|
11
|
-
title: "The Protection of Information in Computer Systems"
|
|
12
|
-
authors: ["Jerome H. Saltzer", "Michael D. Schroeder"]
|
|
13
|
-
year: 1975
|
|
14
|
-
edition: "Proceedings of the IEEE, vol. 63, no. 9, pp. 1278-1308"
|
|
15
|
-
url: "https://www.cs.virginia.edu/~evans/cs551/saltzer/"
|
|
16
|
-
methodology_covered:
|
|
17
|
-
- "Eight design principles for secure systems — economy of mechanism, fail-safe defaults, complete mediation, open design, separation of privilege, least privilege, least common mechanism, psychological acceptability"
|
|
18
|
-
- "The model of protected objects and authorized subjects; access matrix as the conceptual base"
|
|
19
|
-
- "Capability and ACL implementations of the access matrix"
|
|
20
|
-
- "Authentication vs authorization as separate concerns"
|
|
21
|
-
- type: paper
|
|
22
|
-
title: "Computer Security in the Real World"
|
|
23
|
-
authors: ["Butler W. Lampson"]
|
|
24
|
-
year: 2004
|
|
25
|
-
url: "https://www.microsoft.com/en-us/research/publication/computer-security-in-the-real-world/"
|
|
26
|
-
methodology_covered:
|
|
27
|
-
- "Modern reframing of the 1975 principles for distributed systems"
|
|
28
|
-
- "Gold standard — authenticate, authorize, audit — three legs every protection scheme requires"
|
|
29
|
-
verification_status: verified
|
|
30
|
-
description: "\"The principles are intended to guide the design of protection mechanisms..."
|
|
31
|
-
---
|
|
32
|
-
|
|
33
|
-
# Jerome Saltzer & Michael Schroeder
|
|
34
|
-
|
|
35
|
-
## Signature
|
|
36
|
-
|
|
37
|
-
*"The principles are intended to guide the design of protection mechanisms... they do not by themselves guarantee security, but they make insecurity easier to spot."*
|
|
38
|
-
|
|
39
|
-
MIT computer scientists. Their 1975 paper articulated eight design principles for secure systems that remain SENTINEL_the_bassclef_reference fifty years later. The principles predate the public internet, predate the web, predate every modern threat model — and still hold because they are about the *shape* of protection mechanisms, not the threats they defend against. When a new attack class lands, the analysis tool that maps it back to which principle was violated is almost always Saltzer & Schroeder.
|
|
40
|
-
|
|
41
|
-
The principles pair with later work: Lampson's "gold standard" (authenticate, authorize, audit) extends complete mediation; Anderson's *Security Engineering* puts every principle through industrial worked examples; OWASP's top-10 is a downstream symptom catalog whose root causes the principles name.
|
|
42
|
-
|
|
43
|
-
## Discipline anchor
|
|
44
|
-
|
|
45
|
-
**Designing protection mechanisms whose failure modes are visible at write-time.**
|
|
46
|
-
|
|
47
|
-
Saltzer & Schroeder fire on every moment a substrate component touches access, authority, scope, default behavior, or trust boundaries.
|
|
48
|
-
INSTEAD of waiting for an exploit to surface a missing check: the principles ask, at write-time, whether the mechanism's shape *makes* insecurity possible. Code that violates a principle is a defect even if no exploit has yet been demonstrated; code that conforms is a defense against threats the author did not foresee.
|
|
49
|
-
|
|
50
|
-
This luminary anchors the security lens for:
|
|
51
|
-
- `/security-review` — checks PRs against the 8 principles
|
|
52
|
-
- `/architect-review` — system-level design reviews look for principle violations at architectural boundaries
|
|
53
|
-
- `/pattern-review` — pattern selection (e.g., Decorator for logging, Strategy for auth) gets the principle lens
|
|
54
|
-
|
|
55
|
-
For usability-first questions, route to `@luminary don-norman` (cognitive load of mode prompts).
|
|
56
|
-
INSTEAD of citing Saltzer & Schroeder there: cite Norman. For API ergonomics, route to `@luminary john-ousterhout` (deep modules); for test mechanics, route to `@luminary kent-beck`.
|
|
57
|
-
|
|
58
|
-
## The eight principles
|
|
59
|
-
|
|
60
|
-
### 1. Economy of mechanism
|
|
61
|
-
|
|
62
|
-
Keep the design as small and simple as possible. Protection mechanisms are inspected for correctness by reasoning about their behavior; the smaller and simpler the mechanism, the more reliable the inspection.
|
|
63
|
-
|
|
64
|
-
Clever checks that require careful reasoning to verify carry inspection cost forever.
|
|
65
|
-
INSTEAD of building one: build a check that any reviewer can read once and accept.
|
|
66
|
-
|
|
67
|
-
**Bassclef example.** `.claude/rules/destructive-operations.md` instructs agents to pause before any state-modifying command. The rule is one page. A sophisticated heuristic engine would carry hidden states.
|
|
68
|
-
INSTEAD: a short rule + a hard list of trigger verbs. Small mechanism; correctness inspectable in a single read.
|
|
69
|
-
|
|
70
|
-
### 2. Fail-safe defaults
|
|
71
|
-
|
|
72
|
-
Base access decisions on permission rather than exclusion. The default situation is *lack of access*; the protection scheme identifies conditions under which access is permitted.
|
|
73
|
-
|
|
74
|
-
The shape "permit by default, deny on explicit refusal" produces a permanent risk surface — every new code path or branch type opens an unintended hole.
|
|
75
|
-
INSTEAD: deny by default, permit on explicit authorization.
|
|
76
|
-
|
|
77
|
-
**Bassclef example — the failure that motivated this luminary.** PR #1058's original auto-save design committed to whatever branch was active by default; the safety check was a list of refused branches (main, master, spike). Adding a new branch type (e.g., release/, hotfix/) silently worked — auto-save would commit there too. The default was "save" and the exceptions were "refuse." That violates fail-safe defaults.
|
|
78
|
-
INSTEAD: auto-save should DENY by default; an explicit allowlist (chore/, scratch/, feature/, fix/) permits. A new branch type is denied until explicitly added. The author of the new branch is forced to make the decision visible.
|
|
79
|
-
|
|
80
|
-
### 3. Complete mediation
|
|
81
|
-
|
|
82
|
-
Every access to every object must be checked for authority. The mechanism must intercept every attempt without exception.
|
|
83
|
-
|
|
84
|
-
A "check at the boundary and trust internal callers" shape produces a permanent silent-bypass surface — any internal path that skips the boundary skips the check.
|
|
85
|
-
INSTEAD: check at every access. The cost of one extra check is small; the cost of one missed check can be the whole system.
|
|
86
|
-
|
|
87
|
-
**Bassclef example.** `.claude/hooks/state-validate.sh` fires on every Edit / Write / MultiEdit to a state-spine path. Validating only at "official" entry points leaves alternative tool paths unmediated.
|
|
88
|
-
INSTEAD: the hook intercepts every write regardless of which tool made it. An agent that writes via a less-common tool path does not slip past the validator.
|
|
89
|
-
|
|
90
|
-
### 4. Open design
|
|
91
|
-
|
|
92
|
-
The protection mechanism's design should not depend on attacker ignorance of mechanism. Security through obscurity is weak; security through inspectable, public, well-reasoned design is strong.
|
|
93
|
-
|
|
94
|
-
"They will not know about this hidden flag" is a fragile assumption that erodes on the first leak.
|
|
95
|
-
INSTEAD: publish the flag, document the threat model, and rely on the mechanism (e.g., cryptographic key separation) for the actual protection.
|
|
96
|
-
|
|
97
|
-
**Bassclef example.** Bassclef's hooks, rules, and skills are all readable in the repo. Hiding which checks fire when would produce ambiguity about safety state.
|
|
98
|
-
INSTEAD: hooks announce themselves in chronicle, in BLOCKED banners, in trace logs. An agent that knows every hook's trigger condition cannot evade them by accident; the safety is in the hook firing on the trigger, not in the trigger being secret.
|
|
99
|
-
|
|
100
|
-
### 5. Separation of privilege
|
|
101
|
-
|
|
102
|
-
A protection mechanism that requires two independent checks is stronger than one that requires a single check. (The classic two-key safe analog.)
|
|
103
|
-
|
|
104
|
-
A single-signature unlock shape produces a single point of compromise.
|
|
105
|
-
INSTEAD: require operator confirmation AND a CI passing AND a manual approval gate.
|
|
106
|
-
|
|
107
|
-
**Bassclef example.** Production deploys require GitHub Environment with `required_reviewers` (per `.claude/rules/manual-prod-approval.md`) AND the deploy-guard.sh hook firing AND `gh pr merge` from an operator account. Three independent checks. A single compromise (e.g., agent's GitHub token) cannot deploy to production by itself.
|
|
108
|
-
|
|
109
|
-
### 6. Least privilege
|
|
110
|
-
|
|
111
|
-
Every program and every user of the system should operate using the least set of privileges necessary to complete the job.
|
|
112
|
-
|
|
113
|
-
Granting "read + write + delete + admin" because it is easier produces a permanent blast-radius surface.
|
|
114
|
-
INSTEAD: grant only what the specific operation requires. A read-only operation gets a read-only credential. A write to one path gets write access to that path only.
|
|
115
|
-
|
|
116
|
-
**Bassclef example — the failure that motivated this luminary.** PR #1058's original auto-save design granted auto-save the privilege to commit to *every* branch the agent visited. Auto-save needs the privilege to checkpoint work-in-progress on chore + scratch branches.
|
|
117
|
-
INSTEAD: scope auto-save to the branches that actually need it; deny everywhere else.
|
|
118
|
-
|
|
119
|
-
Bassclef token discipline (per memory `feedback_never_paste_tokens_in_chat`) applies the same principle.
|
|
120
|
-
INSTEAD of granting broad-scope tokens for narrow-scope work: use fine-grained PATs with minimal target-repo scope rather than full-org admin tokens.
|
|
121
|
-
|
|
122
|
-
### 7. Least common mechanism
|
|
123
|
-
|
|
124
|
-
Minimize the amount of mechanism shared by multiple users (or programs). Shared mechanisms are potential information paths and attack surfaces.
|
|
125
|
-
|
|
126
|
-
"One big config file for all secrets" produces cross-purpose attack surface.
|
|
127
|
-
INSTEAD: separate per-purpose stores. For multi-tenant systems: isolate per-tenant where the cost is reasonable rather than running one daemon for every tenant.
|
|
128
|
-
|
|
129
|
-
**Bassclef example.** `state/markers/temperance/` writes per-branch marker files instead of a single shared marker. A single global "temperance fired this session" flag would carry cross-scope trust.
|
|
130
|
-
INSTEAD: per-branch markers isolate the trust decision to its scope. A marker on branch A cannot grant temperance approval to branch B.
|
|
131
|
-
|
|
132
|
-
### 8. Psychological acceptability
|
|
133
|
-
|
|
134
|
-
Human interface to the protection mechanism must be designed for ease of use. If users find the mechanism annoying or confusing, they will work around it.
|
|
135
|
-
|
|
136
|
-
"Secure but unusable" produces operator workarounds — the most cryptographically perfect protection scheme is worthless if operators bypass it.
|
|
137
|
-
INSTEAD: secure AND usable.
|
|
138
|
-
|
|
139
|
-
**Bassclef example.** The `SKIP_*=1` override pattern across bassclef's hooks (e.g., `SKIP_TEMPERANCE=1`, `SKIP_DIAGNOSE=1`) provides an escape valve for cases where the gate is wrong. "Hard block with no override" produces operators who disable hooks entirely.
|
|
140
|
-
INSTEAD: hard block with a logged override. Operators bypass per-call when they understand the trade-off, and the trace surfaces the bypass.
|
|
141
|
-
|
|
142
|
-
Override usage is signal, not failure.
|
|
143
|
-
INSTEAD of treating override usage as failure: track override frequency. If a hook is overridden >10% of the time, the hook is mistargeted — psychological acceptability is failing and the hook needs redesign.
|
|
144
|
-
|
|
145
|
-
## Stack translation — applying the principles to bassclef's bash hooks
|
|
146
|
-
|
|
147
|
-
Bassclef's hooks are bash scripts under `.claude/hooks/*.sh`. The eight principles map directly to bash hook authoring:
|
|
148
|
-
|
|
149
|
-
| Principle | Bash hook discipline |
|
|
150
|
-
|---|---|
|
|
151
|
-
| **Economy of mechanism** | Hook body ≤200 lines for inspectability; helpers in `lib/*.sh` so the hook reads top-to-bottom |
|
|
152
|
-
| **Fail-safe defaults** | `set -euo pipefail` at top of every hook — undefined variables and pipe failures FAIL rather than passing silently |
|
|
153
|
-
| **Complete mediation** | PreToolUse hooks fire on every matching tool call, not "first call per session" |
|
|
154
|
-
| **Open design** | Hook trigger conditions documented in `docs/hooks-index.md`; BLOCKED banners name the path the hook reads |
|
|
155
|
-
| **Separation of privilege** | Destructive hooks (e.g., deploy-guard.sh) check operator confirmation AND state-spine signal AND env var — three independent conditions |
|
|
156
|
-
| **Least privilege** | Hooks `cd` to repo root only when needed; `git` commands scope to specific paths; file modes scoped to minimum-needed (644 for data, 755 for executables) |
|
|
157
|
-
| **Least common mechanism** | Per-hook test files (`.claude/hooks/tests/<name>.test.sh`); per-hook trace context; no shared global state between hooks |
|
|
158
|
-
| **Psychological acceptability** | `SKIP_<HOOK>=1` per-call override; logged via trace-helper; operator-bypass is per-call, surface-visible |
|
|
159
|
-
|
|
160
|
-
This translation block is the substrate-internal reference for Phase X-3 (`standards/bash-hook-safety.md` + `.claude/rules/defensive-bash.md`). The standard codifies the discipline; this luminary names the principles the discipline implements.
|
|
161
|
-
|
|
162
|
-
## When to cite this luminary
|
|
163
|
-
|
|
164
|
-
Cite `@luminary saltzer-schroeder` when:
|
|
165
|
-
|
|
166
|
-
- **Reviewing protection mechanisms** (`/security-review`, `/architect-review`) — does this default deny or permit? Is mediation complete? Is privilege minimal?
|
|
167
|
-
- **Designing default behaviors** — particularly when a default determines whether dangerous-by-default or safe-by-default applies (the auto-save case is the SENTINEL_bassclef_example)
|
|
168
|
-
- **Adding override paths** — does the override get logged? Is the trade-off named? Is the override scope per-call or per-session?
|
|
169
|
-
- **Authoring hooks** — bash hook safety (Phase X-3) instantiates the principles; the luminary names what the hook discipline is implementing
|
|
170
|
-
- **Diagnosing security regressions** — `/diagnose` reaches for this luminary when the failure surface involves trust boundaries, default behavior, scope creep, or missed checks
|
|
171
|
-
- **Designing tenant isolation** — least common mechanism + least privilege apply to multi-tenant systems directly
|
|
172
|
-
|
|
173
|
-
For threat-model authoring (analyzing what attackers can do given the protection mechanisms), route to Schneier — separate luminary candidate; Phase X+ follow-on.
|
|
174
|
-
INSTEAD of stretching Saltzer & Schroeder into threat modeling: cite Schneier when the catalog lands.
|
|
175
|
-
|
|
176
|
-
For cryptographic primitive selection — out of bassclef's anchor catalog today.
|
|
177
|
-
|
|
178
|
-
## Composes with
|
|
179
|
-
|
|
180
|
-
- **John Ousterhout** — Deep modules + define errors out of existence overlap with economy-of-mechanism + complete-mediation. Ousterhout's design judgment frames WHEN to apply Saltzer & Schroeder.
|
|
181
|
-
- **Kent Beck** — Tests for protection mechanisms verify the default behavior matches the design intent. A test that asserts "auto-save refuses main" is the mechanical guarantee fail-safe-defaults specifies.
|
|
182
|
-
- **Don Norman** — Psychological acceptability is the same surface as Norman's cognitive-load principle for system design. The operator-facing behavior of a security mechanism IS its UX.
|
|
183
|
-
INSTEAD of treating them as separate concerns: Norman's lens applies directly to override design + BLOCKED banner phrasing + hook-error message clarity.
|
|
184
|
-
- **Edward Tufte** — When protection mechanisms produce telemetry (e.g., trace logs of overrides), Tufte's information-design discipline anchors how that telemetry surfaces to operators.
|
|
185
|
-
|
|
186
|
-
## Refs
|
|
187
|
-
|
|
188
|
-
- bassclef#1058 — concrete failure (auto-save scope hole) that surfaced the need for this luminary at the substrate
|
|
189
|
-
- bassclef#1060 / PR #1061 — temperance mechanical block (sibling discipline-becomes-mechanical pattern; complete-mediation in action)
|
|
190
|
-
- `.claude/rules/destructive-operations.md` — agent self-assessment rule that this luminary anchors
|
|
191
|
-
- `.claude/rules/security.md` — existing rule scoped to `.ts/.tsx/.json/.env/Dockerfile`; bash extension is Phase X-3
|
|
192
|
-
- `docs/iteration-bets/2026-06-17a-secure-coding-foundations-longrun.md` Phase X scope
|
|
193
|
-
- `standards/code-safety-principles.md` (Phase X-2) — language-agnostic principles document this luminary anchors
|
|
194
|
-
- `standards/bash-hook-safety.md` (Phase X-3) — bash-specific instantiation of the stack-translation table above
|
|
@@ -1,193 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
tier: lite
|
|
3
|
-
name: Sophia V. Prater
|
|
4
|
-
slug: sophia-prater
|
|
5
|
-
claimed_by: [designer]
|
|
6
|
-
referenced_by_skills: [ia-model, prototype-variants, interaction-design]
|
|
7
|
-
primary_domain: ux
|
|
8
|
-
depth: full
|
|
9
|
-
verification_status: verified
|
|
10
|
-
sources:
|
|
11
|
-
- type: article
|
|
12
|
-
title: "Object-Oriented UX"
|
|
13
|
-
authors: ["Sophia V. Prater"]
|
|
14
|
-
year: 2016
|
|
15
|
-
url: "https://alistapart.com/article/object-oriented-ux/"
|
|
16
|
-
methodology_covered: ["OOUX methodology introduction", "objects vs tasks framing", "object-first IA"]
|
|
17
|
-
- type: website
|
|
18
|
-
title: "ooux.com — Object-Oriented UX"
|
|
19
|
-
authors: ["Sophia V. Prater"]
|
|
20
|
-
url: "https://ooux.com"
|
|
21
|
-
methodology_covered: ["ORCA process (Objects/Relationships/CTAs/Attributes)", "OOUX certification and training"]
|
|
22
|
-
- type: course
|
|
23
|
-
title: "OOUX Certified Course"
|
|
24
|
-
authors: ["Sophia V. Prater"]
|
|
25
|
-
url: "https://ooux.com/learn"
|
|
26
|
-
methodology_covered: ["Full ORCA process methodology", "object inventory technique", "system model alignment"]
|
|
27
|
-
solves_problems_brownfield:
|
|
28
|
-
- "Existing multi-entity app where users mentally model objects but UI exposes screens or processes"
|
|
29
|
-
- "Same entity appears in many flows but isn't unified as a concept"
|
|
30
|
-
- "Navigation doesn't reflect the domain's noun structure"
|
|
31
|
-
solves_problems_greenfield:
|
|
32
|
-
- "Designing a CRUD-heavy or domain-rich product where entity relationships should drive the UI"
|
|
33
|
-
- "Planning IA from the domain model first, not from process flows"
|
|
34
|
-
- "Building an app where users will mentally manipulate objects and the UI should match from day one"
|
|
35
|
-
- "Designing a multi-entity product where consistent entity expression matters across surfaces"
|
|
36
|
-
anti_patterns:
|
|
37
|
-
- "Process-driven workflows where actions matter more than objects"
|
|
38
|
-
- "Single-entity tools or marketing surfaces"
|
|
39
|
-
description: "\"Objects first, then actions. Never the reverse.\""
|
|
40
|
-
---
|
|
41
|
-
|
|
42
|
-
# Sophia V. Prater
|
|
43
|
-
|
|
44
|
-
## Signature
|
|
45
|
-
|
|
46
|
-
*"Objects first, then actions. Never the reverse."*
|
|
47
|
-
|
|
48
|
-
The interface should mirror the user's mental model of the domain — not
|
|
49
|
-
the database schema that powers it. Complexity in data-heavy products is
|
|
50
|
-
a symptom of letting system structure leak into the UI. Structure the
|
|
51
|
-
content first, rigorously, and the interface follows.
|
|
52
|
-
|
|
53
|
-
## Core methods
|
|
54
|
-
|
|
55
|
-
- **ORCA process** — Objects, Relationships, CTAs, Attributes. The four-step
|
|
56
|
-
method for structuring messy domains before any wireframe. Apply when a
|
|
57
|
-
spec has 5+ entities with non-trivial relationships or when a domain
|
|
58
|
-
has regulatory/data-density pressure. [ref:2]
|
|
59
|
-
|
|
60
|
-
- **Mental model vs system model** — Before accepting any information
|
|
61
|
-
architecture, ask: "Does this match how the *user* thinks about this
|
|
62
|
-
domain, or how the *database* stores it?" They are rarely the same.
|
|
63
|
-
Schema-mirror UIs pass code review but fail in the wild. [ref:1]
|
|
64
|
-
|
|
65
|
-
- **Progressive disclosure for data density** — Stratify information by
|
|
66
|
-
user journey stage. Data novices should see the core "heavy" nouns at
|
|
67
|
-
first glance; power users get the full attribute surface on demand.
|
|
68
|
-
Visual weight encodes priority; collapsed sections encode optionality.
|
|
69
|
-
|
|
70
|
-
- **Componentized content** — Build a structured object model first, then
|
|
71
|
-
derive UI components from objects (not from feature lists). Each object
|
|
72
|
-
gets a detail view; relationships drive navigation; attributes map to
|
|
73
|
-
field-level components. This is what makes OOUX modular under scale.
|
|
74
|
-
|
|
75
|
-
## When to channel this luminary
|
|
76
|
-
|
|
77
|
-
When the domain is **data-heavy and relationally complex** — multiple
|
|
78
|
-
entities with non-trivial relationships, regulatory or compliance density,
|
|
79
|
-
or a user population that spans novice-to-power-user ranges. Prater
|
|
80
|
-
dominates when the biggest risk is that the interface will mirror the
|
|
81
|
-
schema instead of the user's mental model. Think: deal pipelines,
|
|
82
|
-
compliance dashboards, clinical records, logistics systems, financial
|
|
83
|
-
portfolios.
|
|
84
|
-
|
|
85
|
-
Do NOT channel Prater for simple CRUD apps, single-entity workflows, or
|
|
86
|
-
consumer-facing surfaces where entity structure is irrelevant to the user.
|
|
87
|
-
|
|
88
|
-
## Stack translation
|
|
89
|
-
|
|
90
|
-
In our Next.js + Prisma + React stack, ORCA maps concretely:
|
|
91
|
-
|
|
92
|
-
- **Objects** → Prisma models (Deal, Broker, Seller, Buyer, Listing).
|
|
93
|
-
Prater's object inventory is essentially the domain-driven subset of
|
|
94
|
-
the Prisma schema.
|
|
95
|
-
- **Relationships** → Prisma relations (`@relation`) and `/ia-model`
|
|
96
|
-
entity diagrams. Every relation is a potential navigation path.
|
|
97
|
-
- **CTAs** → server actions (`src/app/actions/`) + route handlers
|
|
98
|
-
(`src/app/api/`). Each CTA is an action the user can take on an object.
|
|
99
|
-
- **Attributes** → field-level visibility rules. Not every attribute
|
|
100
|
-
belongs on every screen — progressive disclosure means the detail view
|
|
101
|
-
shows priority attributes first, secondary attributes behind expansion.
|
|
102
|
-
|
|
103
|
-
The IA step in `/ia-model` IS Prater's ORCA. When we say "entity inventory
|
|
104
|
-
+ task flows," we're describing ORCA without naming it. The `/decompose`
|
|
105
|
-
skill inherits this: its Responsibility Matrix is downstream of ORCA's
|
|
106
|
-
object inventory.
|
|
107
|
-
|
|
108
|
-
## Anti-patterns it prevents
|
|
109
|
-
|
|
110
|
-
- **Schema-mirror UI** — The biggest data-heavy failure: the UI exposes
|
|
111
|
-
join tables, foreign keys, and normalization artifacts as navigation.
|
|
112
|
-
Users see "Deal-Broker Junction Records" instead of "Deals this broker
|
|
113
|
-
touched." Prater's mental-vs-system-model check catches this.
|
|
114
|
-
|
|
115
|
-
- **Attribute flood** — Detail views that dump every field without
|
|
116
|
-
hierarchy. 47 fields in a grid, no prioritization, no progressive
|
|
117
|
-
disclosure. Users scan and bounce. Prater's visual-weight layering
|
|
118
|
-
forces a priority decision per field.
|
|
119
|
-
|
|
120
|
-
- **Feature-first navigation** — Primary nav organized by feature ("Deals,"
|
|
121
|
-
"Search," "Import," "Reports") instead of by object ("Deals, Brokers,
|
|
122
|
-
Sellers"). Features multiply and the nav collapses under its own
|
|
123
|
-
weight. Object-first nav scales with the domain, not the feature set.
|
|
124
|
-
|
|
125
|
-
- **Task-flow-only IA** — Designing only for the happy path, ignoring
|
|
126
|
-
that users need to browse, compare, and navigate across objects. Prater
|
|
127
|
-
insists on both: task flows AND object structure. Task flows without
|
|
128
|
-
object structure produce funnel interfaces that break on sideways use.
|
|
129
|
-
|
|
130
|
-
- **Monolithic list-detail pattern** — Every entity gets the same "list
|
|
131
|
-
→ detail → edit" treatment regardless of its role in the mental model.
|
|
132
|
-
Prater's componentized content says: the list-detail pattern is one of
|
|
133
|
-
several, not the default. Some objects are better as graphs, timelines,
|
|
134
|
-
or maps.
|
|
135
|
-
|
|
136
|
-
## Worked example
|
|
137
|
-
|
|
138
|
-
For a POA deal pipeline (our primary Five Pandas surface), applying Prater
|
|
139
|
-
looks like this:
|
|
140
|
-
|
|
141
|
-
1. **Objects inventory**: Deal, Broker, Seller, Buyer, Listing Source
|
|
142
|
-
(BizBuySell, LoopNet, direct), Stage (Discovery, Valuation, LOI, etc.),
|
|
143
|
-
Note, Attachment. Not tables. Not features. Nouns.
|
|
144
|
-
|
|
145
|
-
2. **Relationships**: A Deal has one Seller, zero-or-more Brokers, one
|
|
146
|
-
Source, passes through ordered Stages, accumulates Notes and
|
|
147
|
-
Attachments. Each relation is a potential nav path the user might
|
|
148
|
-
traverse: "show me everything this broker touched," "show me all deals
|
|
149
|
-
in LOI stage," "show me all deals from BizBuySell this month."
|
|
150
|
-
|
|
151
|
-
3. **CTAs per object**: Deal has Advance-Stage, Log-Note, Attach-Document,
|
|
152
|
-
Reassign-Broker, Archive. Broker has Log-Interaction, Flag-Inactive.
|
|
153
|
-
These become server actions, not buttons-on-a-page.
|
|
154
|
-
|
|
155
|
-
4. **Attributes with priority**: Deal's detail view shows Stage, Seller,
|
|
156
|
-
Source, Score above the fold. Financial attributes (asking price, SDE
|
|
157
|
-
multiple, cash required) in the next tier. Enrichment data (real
|
|
158
|
-
estate, relocatability, expansion potential) collapsed until the user
|
|
159
|
-
expands it. Audit fields (created_at, updated_at, last_touched_by)
|
|
160
|
-
footer-level.
|
|
161
|
-
|
|
162
|
-
What Prater would NOT produce: a left-nav with "Database / Deal-Broker
|
|
163
|
-
Relationships" exposed. A detail view dumping all 47 fields in a grid.
|
|
164
|
-
A "features" top-level nav. These are all schema-mirror tells.
|
|
165
|
-
|
|
166
|
-
## Sources
|
|
167
|
-
|
|
168
|
-
- **ooux.com** — primary site, ORCA method articulated
|
|
169
|
-
- **"Object-Oriented UX"** — A List Apart article (2016) introducing OOUX
|
|
170
|
-
to a mainstream UX audience
|
|
171
|
-
- **"A UX Designer's Guide to OOUX"** — Medium essay series by Prater
|
|
172
|
-
- **OOUX Strategist certification course** — Prater's structured
|
|
173
|
-
curriculum; the most complete treatment of ORCA as a teachable method
|
|
174
|
-
- **Rosenfeld Media OOUX book** — forthcoming; will be canonical reference
|
|
175
|
-
when published
|
|
176
|
-
|
|
177
|
-
## Related luminaries
|
|
178
|
-
|
|
179
|
-
- **Peter Morville & Louis Rosenfeld** — Findability and IA foundations;
|
|
180
|
-
Prater's work builds on their "Information Architecture for the Web"
|
|
181
|
-
tradition with a sharper object-orientation focus.
|
|
182
|
-
- **Alan Cooper** — Goal-Directed Design shares Prater's "start from
|
|
183
|
-
user, not system" orientation; Cooper frames it as goals, Prater as
|
|
184
|
-
objects. Complementary, not conflicting.
|
|
185
|
-
- **Don Norman** — Affordances and signifiers operate at the interaction
|
|
186
|
-
level; Prater operates at the structural level above. Use both: Prater
|
|
187
|
-
for IA, Norman for the interaction patterns within each screen.
|
|
188
|
-
- **Richard Saul Wurman** — LATCH (Location, Alphabet, Time, Category,
|
|
189
|
-
Hierarchy) is a pre-OOUX attempt at content structuring. Prater's ORCA
|
|
190
|
-
is a sharper descendant for relational domains.
|
|
191
|
-
- **Jenifer Tidwell** — Pattern library sits downstream of OOUX: once
|
|
192
|
-
objects are identified, Tidwell's patterns inform how each object's
|
|
193
|
-
views are composed.
|