@thebassclef/lite 1.0.3 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.cjs +92 -6
- package/dist/cli.js +92 -6
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/lite/.claude/agents/architect.md +70 -0
- package/dist/lite/.claude/agents/builder.md +114 -0
- package/dist/lite/.claude/agents/designer.md +156 -0
- package/dist/lite/.claude/agents/reviewer.md +88 -0
- package/dist/lite/.claude/hooks/bassclef-sync.sh +85 -27
- package/dist/lite/.claude/hooks/longrun-prep-compounding-axis-check.sh +492 -0
- package/dist/lite/.claude/hooks/longrun-prep-render-check.sh +236 -0
- package/dist/lite/.claude/hooks/persona-name-scrub-check.sh +105 -0
- package/dist/lite/.claude/hooks/skill-step-list-check.sh +171 -0
- package/dist/lite/.claude/luminaries/alan-cooper.md +170 -0
- package/dist/lite/.claude/luminaries/alistair-cockburn.md +140 -0
- package/dist/lite/.claude/luminaries/amazon-pr-faq.md +34 -0
- package/dist/lite/.claude/luminaries/andreas-zeller.md +74 -0
- package/dist/lite/.claude/luminaries/ash-maurya.md +121 -0
- package/dist/lite/.claude/luminaries/bill-buxton.md +210 -0
- package/dist/lite/.claude/luminaries/charles-sanders-peirce.md +150 -0
- package/dist/lite/.claude/luminaries/david-ogilvy.md +192 -0
- package/dist/lite/.claude/luminaries/don-norman.md +173 -0
- package/dist/lite/.claude/luminaries/edward-tufte.md +179 -0
- package/dist/lite/.claude/luminaries/eric-evans.md +160 -0
- package/dist/lite/.claude/luminaries/frederick-brooks.md +50 -0
- package/dist/lite/.claude/luminaries/gang-of-four.md +157 -0
- package/dist/lite/.claude/luminaries/glenford-myers.md +230 -0
- package/dist/lite/.claude/luminaries/hunt-thomas.md +115 -0
- package/dist/lite/.claude/luminaries/hyrum-wright.md +94 -0
- package/dist/lite/.claude/luminaries/jason-fried-dhh.md +46 -0
- package/dist/lite/.claude/luminaries/jesse-james-garrett.md +154 -0
- package/dist/lite/.claude/luminaries/john-ousterhout.md +94 -0
- package/dist/lite/.claude/luminaries/karl-popper.md +132 -0
- package/dist/lite/.claude/luminaries/kent-beck.md +168 -0
- package/dist/lite/.claude/luminaries/linus-torvalds.md +218 -0
- package/dist/lite/.claude/luminaries/martin-fowler.md +164 -0
- package/dist/lite/.claude/luminaries/michael-feathers.md +125 -0
- package/dist/lite/.claude/luminaries/michael-nygard.md +118 -0
- package/dist/lite/.claude/luminaries/robert-c-martin.md +164 -0
- package/dist/lite/.claude/luminaries/saltzer-schroeder.md +194 -0
- package/dist/lite/.claude/luminaries/sophia-prater.md +193 -0
- package/dist/lite/.claude/luminaries/stephen-toulmin.md +131 -0
- package/dist/lite/.claude/luminaries/tony-hoare.md +170 -0
- package/dist/lite/.claude/luminaries/vaughn-vernon.md +50 -0
- package/dist/lite/.claude/luminaries/w-edwards-deming.md +158 -0
- package/dist/lite/.claude/rules/accessor-library-discipline.md +110 -0
- package/dist/lite/.claude/rules/adr-discipline.md +96 -0
- package/dist/lite/.claude/rules/api-conventions.md +115 -0
- package/dist/lite/.claude/rules/artifact-ingestion.md +137 -0
- package/dist/lite/.claude/rules/assert-only-after-verify.md +111 -0
- package/dist/lite/.claude/rules/blocked-items.md +139 -0
- package/dist/lite/.claude/rules/bootstrap-pair-discipline.md +106 -0
- package/dist/lite/.claude/rules/branching.md +28 -0
- package/dist/lite/.claude/rules/cold-adopter-harness-discipline.md +93 -0
- package/dist/lite/.claude/rules/commit-conventions.md +22 -0
- package/dist/lite/.claude/rules/compounding-axis-fresh-analysis.md +173 -0
- package/dist/lite/.claude/rules/compounding-sequence-fresh-analysis.md +173 -0
- package/dist/lite/.claude/rules/context-engineering.md +155 -0
- package/dist/lite/.claude/rules/context-management.md +85 -0
- package/dist/lite/.claude/rules/defensive-bash.md +52 -0
- package/dist/lite/.claude/rules/deferred-actions.md +233 -0
- package/dist/lite/.claude/rules/destructive-operations.md +69 -0
- package/dist/lite/.claude/rules/diagnosis.md +38 -0
- package/dist/lite/.claude/rules/github-issue-flash-tweet.md +114 -0
- package/dist/lite/.claude/rules/guardrails.md +73 -0
- package/dist/lite/.claude/rules/hook-wire-on-author.md +77 -0
- package/dist/lite/.claude/rules/identifier-leak-prevention.md +73 -0
- package/dist/lite/.claude/rules/iteration-bet-brief-completeness.md +43 -0
- package/dist/lite/.claude/rules/lite-manifest-schema-change-discipline.md +79 -0
- package/dist/lite/.claude/rules/longrun-prep-plan-doc-compression.md +77 -0
- package/dist/lite/.claude/rules/loop-discipline.md +71 -0
- package/dist/lite/.claude/rules/manual-prod-approval.md +100 -0
- package/dist/lite/.claude/rules/marker-enrichment-discipline.md +72 -0
- package/dist/lite/.claude/rules/mobile-ephemeral-session.md +109 -0
- package/dist/lite/.claude/rules/new-dependency-check.md +44 -0
- package/dist/lite/.claude/rules/oo-ad-entry-point.md +95 -0
- package/dist/lite/.claude/rules/operator-facing-prose.md +177 -0
- package/dist/lite/.claude/rules/option-label-discipline.md +82 -0
- package/dist/lite/.claude/rules/pattern-annotation.md +83 -0
- package/dist/lite/.claude/rules/persona-name-leak-scrub.md +90 -0
- package/dist/lite/.claude/rules/plain-english-discipline.md +132 -0
- package/dist/lite/.claude/rules/plan-enumeration-needs-value-props.md +177 -0
- package/dist/lite/.claude/rules/pr-body-shape.md +195 -0
- package/dist/lite/.claude/rules/pr-strategy.md +142 -0
- package/dist/lite/.claude/rules/pr-title-shape.md +90 -0
- package/dist/lite/.claude/rules/prototype-workflow.md +53 -0
- package/dist/lite/.claude/rules/reserved-skill-names.md +103 -0
- package/dist/lite/.claude/rules/schema-management.md +42 -0
- package/dist/lite/.claude/rules/sdlc-gates.md +149 -0
- package/dist/lite/.claude/rules/security.md +37 -0
- package/dist/lite/.claude/rules/session-artifacts.md +236 -0
- package/dist/lite/.claude/rules/skill-composition-declarations.md +105 -0
- package/dist/lite/.claude/rules/skill-description-clarity.md +196 -0
- package/dist/lite/.claude/rules/skill-procedure-step-list.md +119 -0
- package/dist/lite/.claude/rules/sprint-prep-preset-picker.md +76 -0
- package/dist/lite/.claude/rules/state-schema-validation.md +156 -0
- package/dist/lite/.claude/rules/stuck-signal-diagnostic.md +111 -0
- package/dist/lite/.claude/rules/substrate-config-schema.md +85 -0
- package/dist/lite/.claude/rules/test-list-discipline.md +129 -0
- package/dist/lite/.claude/rules/test-sufficiency.md +186 -0
- package/dist/lite/.claude/rules/testing-tier-config.md +125 -0
- package/dist/lite/.claude/rules/testing.md +38 -0
- package/dist/lite/.claude/rules/turn-estimate-grounding.md +82 -0
- package/dist/lite/.claude/rules/visual-hierarchy.md +427 -0
- package/dist/lite/.claude/rules/we-dont-break-adopters.md +103 -0
- package/dist/lite/.claude/rules/whereami-load-bearing.md +184 -0
- package/dist/lite/.claude/rules/writing-craft-discipline.md +72 -0
- package/dist/lite/.claude/rules/wu-sequencing-compounds.md +119 -0
- package/dist/lite/.claude/skills/build/SKILL.md +640 -0
- package/dist/lite/.claude/skills/chronicle/SKILL.md +55 -0
- package/dist/lite/.claude/skills/clean-artifacts/SKILL.md +249 -0
- package/dist/lite/.claude/skills/decompose/SKILL.md +280 -0
- package/dist/lite/.claude/skills/diagnose/SKILL.md +297 -0
- package/dist/lite/.claude/skills/feynman/SKILL.md +90 -0
- package/dist/lite/.claude/skills/howdoi/SKILL.md +105 -0
- package/dist/lite/.claude/skills/ia-model/SKILL.md +108 -0
- package/dist/lite/.claude/skills/interaction-design/SKILL.md +112 -0
- package/dist/lite/.claude/skills/interpret-input/SKILL.md +180 -0
- package/dist/lite/.claude/skills/journal/SKILL.md +209 -0
- package/dist/lite/.claude/skills/kiss/SKILL.md +449 -0
- package/dist/lite/.claude/skills/launch/SKILL.md +915 -0
- package/dist/lite/.claude/skills/lean-canvas/SKILL.md +332 -0
- package/dist/lite/.claude/skills/longrun/SKILL.md +512 -0
- package/dist/lite/.claude/skills/luminary/SKILL.md +481 -0
- package/dist/lite/.claude/skills/ogilvy-writing-audit/SKILL.md +177 -0
- package/dist/lite/.claude/skills/onboard-repo/SKILL.md +1640 -0
- package/dist/lite/.claude/skills/pattern-review/SKILL.md +99 -0
- package/dist/lite/.claude/skills/personas/SKILL.md +207 -0
- package/dist/lite/.claude/skills/promote/SKILL.md +283 -0
- package/dist/lite/.claude/skills/requirement/SKILL.md +98 -0
- package/dist/lite/.claude/skills/retro/SKILL.md +117 -0
- package/dist/lite/.claude/skills/riff/SKILL.md +114 -0
- package/dist/lite/.claude/skills/roadmap-reconcile/SKILL.md +163 -0
- package/dist/lite/.claude/skills/session-end/SKILL.md +309 -0
- package/dist/lite/.claude/skills/session-log/SKILL.md +299 -0
- package/dist/lite/.claude/skills/skills/SKILL.md +228 -0
- package/dist/lite/.claude/skills/spec/SKILL.md +105 -0
- package/dist/lite/.claude/skills/sprint/SKILL.md +418 -0
- package/dist/lite/.claude/skills/stage/SKILL.md +384 -0
- package/dist/lite/.claude/skills/state-a-problem/SKILL.md +185 -0
- package/dist/lite/.claude/skills/temperance/SKILL.md +108 -0
- package/dist/lite/.claude/skills/use-case/SKILL.md +417 -0
- package/dist/lite/.claude/skills/user-stories/SKILL.md +268 -0
- package/dist/lite/.claude/skills/value-prop/SKILL.md +251 -0
- package/dist/lite/.claude/skills/verify/SKILL.md +160 -0
- package/dist/lite/.claude/skills/visual-review/SKILL.md +503 -0
- package/dist/lite/.claude/skills/whats-the-plan/SKILL.md +202 -0
- package/dist/lite/.claude/skills/whereami/SKILL.md +307 -0
- package/dist/lite/AGENTS.md +79 -0
- package/dist/lite/CLAUDE-lite.md +85 -0
- package/dist/lite/CODE_OF_CONDUCT.md +28 -0
- package/dist/lite/CONTRIBUTING.md +177 -0
- package/dist/lite/README.md +173 -0
- package/dist/lite/SECURITY.md +19 -0
- package/dist/lite/architecture/decisions/ADR-029-release-pipeline.md +79 -0
- package/dist/lite/architecture/decisions/ADR-031-non-breaking-changes-adopter-discipline.md +139 -0
- package/dist/lite/architecture/decisions/ADR-032-adopter-sync-dispatcher-architecture.md +192 -0
- package/dist/lite/architecture/decisions/ADR-039-release-tagging-scheme.md +145 -0
- package/dist/lite/architecture/decisions/ADR-040-planning-skill-vocabulary-and-lite-profile.md +155 -0
- package/dist/lite/architecture/decisions/ADR-044-unified-skill-body-template.md +162 -0
- package/dist/lite/lib/clean-artifacts-sweep.sh +112 -0
- package/dist/lite/lib/code-comment-discipline.sh +144 -0
- package/dist/lite/lib/composer-preflight.sh +459 -0
- package/dist/lite/lib/deferred-actions.sh +146 -0
- package/dist/lite/lib/hook-header-parser.sh +61 -0
- package/dist/lite/lib/hook-heartbeat.sh +152 -0
- package/dist/lite/lib/hook-inject.sh +255 -0
- package/dist/lite/lib/hook-installer.sh +195 -0
- package/dist/lite/lib/luminary-pick.sh +96 -0
- package/dist/lite/lib/output-discipline.sh +143 -0
- package/dist/lite/lib/prose-scan-boundary.sh +171 -0
- package/dist/lite/lib/rewrite-check.sh +214 -0
- package/dist/lite/lib/session-rescue.sh +151 -0
- package/dist/lite/lib/source-graph-walker.sh +277 -0
- package/dist/lite/lib/state.sh +1372 -0
- package/dist/lite/lib/telemetry.sh +205 -0
- package/dist/lite/lib/tier-check.sh +187 -0
- package/dist/lite/lib/tier-dependency-audit.sh +1088 -0
- package/dist/lite/presence/install/bassclef-hook-connect.sh +178 -0
- package/dist/lite/presence/install/bassclef-sync.dispatcher.template.sh +841 -0
- package/dist/lite/presence/install/bassclef-sync.template.sh +2278 -0
- package/dist/lite/presence/install/schedule-auto-save.cron.sh +88 -0
- package/dist/lite/presence/install/schedule-auto-save.taskscheduler.md +122 -0
- package/dist/lite/scripts/aggregate-telemetry.sh +217 -0
- package/dist/lite/scripts/analyze-tier-dependencies.sh +239 -0
- package/dist/lite/scripts/generate-lite-manifest.sh +505 -0
- package/dist/lite/scripts/generate-tier-manifest.sh +28 -0
- package/dist/lite/scripts/intent-drift-check.sh +456 -0
- package/dist/lite/scripts/lite-manifest-drift-check.sh +146 -0
- package/dist/lite/scripts/render-lite-manifest-doc.sh +150 -0
- package/dist/lite/standards/adr-template.md +86 -0
- package/dist/lite/standards/api-conventions/nextjs.md +84 -0
- package/dist/lite/standards/artifact-composition.md +209 -0
- package/dist/lite/standards/bash-hook-safety.md +246 -0
- package/dist/lite/standards/bassclef-configs-schema.md +232 -0
- package/dist/lite/standards/bassclef-evolution.md +143 -0
- package/dist/lite/standards/bassclef-internal-jargon.md +244 -0
- package/dist/lite/standards/bassclef-managed-sentinel.md +96 -0
- package/dist/lite/standards/bassclef-source-config.md +228 -0
- package/dist/lite/standards/branch-stacking.md +408 -0
- package/dist/lite/standards/code-safety-principles.md +176 -0
- package/dist/lite/standards/composer-prerequisites.md +155 -0
- package/dist/lite/standards/deferred-actions-schema.md +204 -0
- package/dist/lite/standards/dependency-discipline/cargo.md +39 -0
- package/dist/lite/standards/dependency-discipline/gem.md +43 -0
- package/dist/lite/standards/dependency-discipline/go-mod.md +41 -0
- package/dist/lite/standards/dependency-discipline/npm.md +42 -0
- package/dist/lite/standards/dependency-discipline/pip.md +42 -0
- package/dist/lite/standards/deployment-topology/ec2-tailscale.md +225 -0
- package/dist/lite/standards/deployment-topology.md +69 -0
- package/dist/lite/standards/docs-sync-allowlist.md +76 -0
- package/dist/lite/standards/domain-and-dns.md +145 -0
- package/dist/lite/standards/frontend-stack.md +67 -0
- package/dist/lite/standards/frontmatter-schema.md +154 -0
- package/dist/lite/standards/graceful-exit.md +227 -0
- package/dist/lite/standards/hook-idempotency.md +102 -0
- package/dist/lite/standards/hook-injection-discipline.md +202 -0
- package/dist/lite/standards/hook-install-class.md +215 -0
- package/dist/lite/standards/input-handler-interface.md +152 -0
- package/dist/lite/standards/lite-manifest-schema-changes.md +180 -0
- package/dist/lite/standards/lite-manifest.json +2797 -0
- package/dist/lite/standards/luminary-matching.md +105 -0
- package/dist/lite/standards/luminary-problem-patterns.md +481 -0
- package/dist/lite/standards/migration-discipline/active-record.md +50 -0
- package/dist/lite/standards/migration-discipline/alembic.md +43 -0
- package/dist/lite/standards/migration-discipline/gorm.md +50 -0
- package/dist/lite/standards/migration-discipline/prisma.md +53 -0
- package/dist/lite/standards/migration-discipline/sqlalchemy.md +51 -0
- package/dist/lite/standards/mobile-ephemeral-session.md +167 -0
- package/dist/lite/standards/model-routing-discipline.md +160 -0
- package/dist/lite/standards/ogilvy-writing-rules.md +225 -0
- package/dist/lite/standards/opener-discipline.md +96 -0
- package/dist/lite/standards/operator-facing-prose-discipline.md +201 -0
- package/dist/lite/standards/persona-schema.md +229 -0
- package/dist/lite/standards/pluggable-luminaries.md +323 -0
- package/dist/lite/standards/pr-body-discipline.md +115 -0
- package/dist/lite/standards/preview-state-schema.md +189 -0
- package/dist/lite/standards/project-directory-layout.md +276 -0
- package/dist/lite/standards/release-tagging.md +137 -0
- package/dist/lite/standards/reserved-skill-names.md +120 -0
- package/dist/lite/standards/scannable-multi-option-output.md +265 -0
- package/dist/lite/standards/sdlc-compliance.md +286 -0
- package/dist/lite/standards/sdlc-gates/typescript.md +57 -0
- package/dist/lite/standards/secrets-lifecycle.md +210 -0
- package/dist/lite/standards/security-scanner-adapter.md +145 -0
- package/dist/lite/standards/session-board.md +256 -0
- package/dist/lite/standards/skill-output-discipline.md +121 -0
- package/dist/lite/standards/state-spine-contract.md +255 -0
- package/dist/lite/standards/state-spine.md +511 -0
- package/dist/lite/standards/steering-hints/kiss-words.md +11 -0
- package/dist/lite/standards/substrate-config-schema.md +267 -0
- package/dist/lite/standards/tech-stack-config.md +109 -0
- package/dist/lite/standards/tier-dependency-analysis.md +167 -0
- package/dist/lite/standards/tier-runtime-deps/lite.md +57 -0
- package/dist/lite/standards/tier-tag-schema.md +155 -0
- package/dist/lite/standards/two-layer-config.md +99 -0
- package/dist/lite/standards/use-case-format.md +292 -0
- package/dist/lite/standards/user-story-invest.md +268 -0
- package/dist/lite/standards/velocity-and-appetite.md +229 -0
- package/dist/lite/standards/voice-input-pattern.md +119 -0
- package/dist/lite/standards/whereami-schema.md +301 -0
- package/dist/lite/standards/worktree-management.md +211 -0
- package/dist/lite/standards/writing-guide.md +213 -0
- package/dist/lite/templates/chronicle-template.md +75 -0
- package/dist/lite/templates/deferred-action-template.md +45 -0
- package/dist/lite/templates/memory-proposal-template.md +77 -0
- package/dist/lite/templates/persona-template.md +200 -0
- package/dist/lite/templates/pr-faq.md +45 -0
- package/dist/lite/templates/secret-rotation-template.md +162 -0
- package/dist/lite/templates/spec-template.md +131 -0
- package/dist/lite/templates/use-case-template.md +194 -0
- package/dist/lite/templates/user-story-template.md +107 -0
- package/dist/lite/templates/whereami-template.md +101 -0
- package/package.json +1 -1
|
@@ -0,0 +1,194 @@
|
|
|
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
|
|
@@ -0,0 +1,193 @@
|
|
|
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.
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
name: Stephen Toulmin
|
|
4
|
+
slug: stephen-toulmin
|
|
5
|
+
claimed_by: [architect, reviewer, closer]
|
|
6
|
+
referenced_by_skills: [state-a-problem, diagnose, architect-review, promote]
|
|
7
|
+
primary_domain: philosophy
|
|
8
|
+
depth: full
|
|
9
|
+
sources:
|
|
10
|
+
- type: book
|
|
11
|
+
title: "The Uses of Argument"
|
|
12
|
+
authors: ["Stephen E. Toulmin"]
|
|
13
|
+
year: 1958
|
|
14
|
+
url: "https://www.cambridge.org/core/books/uses-of-argument/26CF801BC12004587B66778297D5567C"
|
|
15
|
+
isbn: "9780521534833"
|
|
16
|
+
methodology_covered:
|
|
17
|
+
- "Six-part argument model — claim, data, warrant, backing, qualifier, rebuttal"
|
|
18
|
+
- "Field-invariant logical shape distinct from field-dependent standards"
|
|
19
|
+
- "Practical reasoning over formal deduction as the actual shape of argument"
|
|
20
|
+
- type: book
|
|
21
|
+
title: "An Introduction to Reasoning"
|
|
22
|
+
authors: ["Stephen Toulmin", "Richard Rieke", "Allan Janik"]
|
|
23
|
+
year: 1984
|
|
24
|
+
url: "https://www.routledge.com/An-Introduction-to-Reasoning/Toulmin-Rieke-Janik/p/book/9780024211606"
|
|
25
|
+
isbn: "9780024211606"
|
|
26
|
+
methodology_covered:
|
|
27
|
+
- "Applied Toulmin model across disciplines (law, science, ethics, management)"
|
|
28
|
+
- "Argument analysis as diagnostic tool for weak reasoning"
|
|
29
|
+
- "Field-invariant discipline extended with field-dependent examples"
|
|
30
|
+
- type: book
|
|
31
|
+
title: "Human Understanding: The Collective Use and Evolution of Concepts"
|
|
32
|
+
authors: ["Stephen Toulmin"]
|
|
33
|
+
year: 1972
|
|
34
|
+
url: "https://press.princeton.edu/books/paperback/9780691019963/human-understanding"
|
|
35
|
+
isbn: "9780691019963"
|
|
36
|
+
methodology_covered:
|
|
37
|
+
- "Rationality as historical practice, not fixed standard"
|
|
38
|
+
- "Concepts evolve inside disciplines that judge their fitness"
|
|
39
|
+
- "Substrate discipline as living evolving practice"
|
|
40
|
+
verification_status: verified
|
|
41
|
+
description: "\"An argument is a whole organism. Take out one part and the rest collapses.\""
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
# Stephen Toulmin
|
|
45
|
+
|
|
46
|
+
## Signature
|
|
47
|
+
|
|
48
|
+
*"An argument is a whole organism. Take out one part and the rest collapses."*
|
|
49
|
+
|
|
50
|
+
British philosopher (1922-2009). Author of *The Uses of Argument* (Cambridge, 1958) — the book that gave rhetoric, law, science, and now agent substrate a shared vocabulary for what an argument actually IS. The bassclef voice on assertion discipline, claim shape, and argument structure at the reasoning boundary.
|
|
51
|
+
|
|
52
|
+
## Core methods
|
|
53
|
+
|
|
54
|
+
- **The six-part argument** — every real argument has: **claim** (what you assert), **data** (the source that grounds it), **warrant** (the bridge from data to claim), **backing** (why the warrant holds in this field), **qualifier** (how strong the claim is — "usually," "in most cases," "with 95% confidence"), and **rebuttal** (the conditions under which the claim would fail).
|
|
55
|
+
- **Field-invariant vs field-dependent** — the shape (claim/data/warrant) holds across every field. The evidence standards inside each cell vary by field. Physics accepts different data than law; the shape is the same.
|
|
56
|
+
- **Practical reasoning over formal deduction** — real reasoning is about warrant-quality, not syllogism-completeness. A proof from clean premises rarely captures the actual work of a claim.
|
|
57
|
+
- **Argument as diagnostic** — when a claim feels wrong, decompose it into the six parts. The weak part surfaces immediately. Usually it is the warrant.
|
|
58
|
+
|
|
59
|
+
## When to channel this luminary
|
|
60
|
+
|
|
61
|
+
When the primary risk is unverified assertions shipping to operator or adopters. Toulmin dominates for audit authoring, cure recommendations, root-cause diagnoses, ADR bodies, and any operator-facing prose where the agent makes a claim. Pair with Popper (falsifiability sharpens the rebuttal cell) and Peirce (abductive reasoning fills the alternative-consideration gap Toulmin leaves implicit).
|
|
62
|
+
|
|
63
|
+
Pass-through cases (Toulmin adds no value):
|
|
64
|
+
|
|
65
|
+
- Single-sentence status updates. INSTEAD of applying the six-part shape: preserve the update; it carries no claim to decompose.
|
|
66
|
+
- Tool-output relay (test output, git output). INSTEAD of applying the six-part shape: preserve the raw output; the tool IS the source.
|
|
67
|
+
- Operator-quoted text preserved verbatim. INSTEAD of applying the six-part shape: preserve the quote; attribution IS the citation.
|
|
68
|
+
|
|
69
|
+
## Stack translation
|
|
70
|
+
|
|
71
|
+
In bassclef substrate work:
|
|
72
|
+
|
|
73
|
+
- **Audit finding** → claim (the finding) + data (source path with line reference) + warrant (why the source proves the finding) + qualifier (severity + observation count) + rebuttal (what would falsify).
|
|
74
|
+
- **Cure recommendation** → claim (the cure) + data (source chronicle + line) + warrant (why the source shows the class needs this cure) + rebuttal (alternative cures that fit the same data).
|
|
75
|
+
- **Root-cause diagnosis** → claim (the cause) + data (repro + logs) + warrant (why the repro proves causation, not correlation) + qualifier (confidence + N repros).
|
|
76
|
+
- **Turn estimate** → claim (N turns) + data (prior WU turn counts) + warrant (why those WUs match this scope) + qualifier (range not point).
|
|
77
|
+
- **Severity rank** → claim (HIGH/MEDIUM/LOW) + data (audit criteria the rank comes from) + warrant (why this instance meets those criteria).
|
|
78
|
+
|
|
79
|
+
## Anti-patterns it prevents
|
|
80
|
+
|
|
81
|
+
- **Assertion without cited source** — "The hook is broken." No data cell. Falls apart on inspection.
|
|
82
|
+
|
|
83
|
+
INSTEAD: state the hook's file path + the observation that shows it breaks + why the observation supports the claim.
|
|
84
|
+
|
|
85
|
+
- **Assertion pointing at a source but no warrant** — "Per chronicle 2026-06-30." What in the chronicle? Which line? Which claim does it support?
|
|
86
|
+
|
|
87
|
+
INSTEAD: quote the chronicle line + state why the line supports the claim.
|
|
88
|
+
|
|
89
|
+
- **Severity without observation criteria** — "This is HIGH-severity" with no data cell naming the threshold and no warrant naming the measurement.
|
|
90
|
+
|
|
91
|
+
INSTEAD: state the threshold (from an audit doc or standard) + the measurement (from the repro) + why the measurement exceeds the threshold.
|
|
92
|
+
|
|
93
|
+
- **Root cause attribution without qualifier** — "The cause is X" as absolute, when the actual claim is "X fits the data best but two alternatives remain unfalsified."
|
|
94
|
+
|
|
95
|
+
INSTEAD: state the qualifier (confidence + N observations) + name the remaining alternatives.
|
|
96
|
+
|
|
97
|
+
- **Turn estimate without data cell** — a bare number, no prior evidence, no warrant. This is the R8 pattern named at bassclef#559.
|
|
98
|
+
|
|
99
|
+
INSTEAD: state the prior WU turn counts the estimate anchors on + why those WUs match this scope's shape.
|
|
100
|
+
|
|
101
|
+
## Worked example
|
|
102
|
+
|
|
103
|
+
For an audit finding about a hook that appears broken:
|
|
104
|
+
|
|
105
|
+
Toulmin's shape:
|
|
106
|
+
|
|
107
|
+
- **Claim**: The hook `turn-prose-kiss-check.sh` silent-fails under operator install.
|
|
108
|
+
- **Data**: Chronicle `2026-06-27-operator-install-kiss-defect.md` L23; reproduced with `HOME_OVERRIDE=/nowhere echo '{}' | bash .claude/hooks/turn-prose-kiss-check.sh` → exits 0 with no stderr.
|
|
109
|
+
- **Warrant**: The hook sources `standards/bassclef-internal-jargon.md` via SCRIPT_DIR/../../ path. Under operator install, that path does not exist. The hook's `if` check for path existence exits silent.
|
|
110
|
+
- **Qualifier**: HIGH severity. Reproduced across 3 sessions.
|
|
111
|
+
- **Rebuttal**: Falsified if the hook is expected to silent-fail under operator install by design. Checked ADR-035 — install-class: dual commits to firing under both layouts. Falsification test fails; claim holds.
|
|
112
|
+
|
|
113
|
+
Without Toulmin: "The kiss hook is broken." Six words, no evidence, easy to dismiss or accept without inspection. INSTEAD: state the six cells; each cell earns its place.
|
|
114
|
+
|
|
115
|
+
## Sources
|
|
116
|
+
|
|
117
|
+
- *The Uses of Argument* — Toulmin, Cambridge University Press (1958; 2nd ed 2003)
|
|
118
|
+
- *An Introduction to Reasoning* — Toulmin, Rieke, Janik, Macmillan (1979; 2nd ed 1984)
|
|
119
|
+
- *Human Understanding: The Collective Use and Evolution of Concepts* — Toulmin, Princeton University Press (1972)
|
|
120
|
+
- *Return to Reason* — Toulmin, Harvard University Press (2001)
|
|
121
|
+
- Stanford Encyclopedia of Philosophy: entry on Toulmin — plato.stanford.edu/entries/toulmin/
|
|
122
|
+
|
|
123
|
+
## Related luminaries
|
|
124
|
+
|
|
125
|
+
- **Karl Popper** — Popper's falsifiability sharpens the rebuttal cell of Toulmin's model. Toulmin gives the shape; Popper names what would break the claim. Both ship in bet 2026-07-01b WU-2.
|
|
126
|
+
- **Charles Sanders Peirce** — Peirce's abductive reasoning fills the alternative-consideration gap Toulmin leaves implicit. A well-shaped Toulmin argument names ONE claim; Peirce insists on naming multiple candidates before committing. Both ship in bet 2026-07-01b WU-2.
|
|
127
|
+
- **Andrej Karpathy** — Karpathy's context engineering treats the model's context window as finite RAM. Toulmin's argument model is what fills that RAM with claim shape when the operator asks the agent to reason. Together they close the reasoning-boundary discipline surface.
|
|
128
|
+
- **Michael Feathers** — Feathers' characterization tests are the data cell for the substrate-as-system tenet. Toulmin's warrant becomes "the characterization test proves the mechanism ships the claim."
|
|
129
|
+
- **Kent Beck** — Beck's red-green-refactor cycle IS a Toulmin argument at the code layer. Red is the falsifiable claim; green is the passing data; refactor sharpens the warrant.
|
|
130
|
+
|
|
131
|
+
Anchors `.claude/rules/assert-only-after-verify.md` alongside Popper + Peirce. Primary luminary for `/state-a-problem` skill in Problem-section drafting.
|