@thebassclef/lite 0.1.3 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (293) hide show
  1. package/dist/cli.cjs +216 -137
  2. package/dist/cli.js +218 -139
  3. package/dist/index.cjs +1 -1
  4. package/dist/index.d.ts +1 -1
  5. package/dist/index.js +1 -1
  6. package/dist/lite/.bassclef-source.json +10 -0
  7. package/dist/lite/.claude/settings.json +212 -0
  8. package/dist/lite/CLAUDE.md +41 -0
  9. package/dist/lite/gitignore +58 -0
  10. package/dist/lite/standards/bassclef-wiring-manifest.json +497 -0
  11. package/dist/lite/whereami.md +24 -0
  12. package/package.json +8 -2
  13. package/substrate/.bassclef/lite-manifest.json +0 -2701
  14. package/substrate/.claude/agents/architect.md +0 -70
  15. package/substrate/.claude/agents/builder.md +0 -114
  16. package/substrate/.claude/agents/designer.md +0 -156
  17. package/substrate/.claude/agents/reviewer.md +0 -88
  18. package/substrate/.claude/hooks/artifact-ingestion-gate.sh +0 -357
  19. package/substrate/.claude/hooks/assert-verify-steering.sh +0 -77
  20. package/substrate/.claude/hooks/bassclef-source-config-validate.sh +0 -215
  21. package/substrate/.claude/hooks/bassclef-sync.sh +0 -634
  22. package/substrate/.claude/hooks/compound-noun-scrub.sh +0 -292
  23. package/substrate/.claude/hooks/kiss-expansion-inject.sh +0 -69
  24. package/substrate/.claude/hooks/longrun-prep-compounding-axis-check.sh +0 -492
  25. package/substrate/.claude/hooks/longrun-prep-compounding-sequence-check.sh +0 -492
  26. package/substrate/.claude/hooks/plain-english-steering.sh +0 -156
  27. package/substrate/.claude/hooks/post-skill-friction-check.sh +0 -177
  28. package/substrate/.claude/hooks/post-skill-telemetry.sh +0 -62
  29. package/substrate/.claude/hooks/pre-build-gate.sh +0 -511
  30. package/substrate/.claude/hooks/pre-commit-gate.sh +0 -451
  31. package/substrate/.claude/hooks/session-end.sh +0 -433
  32. package/substrate/.claude/hooks/session-reflection.sh +0 -303
  33. package/substrate/.claude/hooks/skill-body-grade-gate.sh +0 -219
  34. package/substrate/.claude/hooks/skill-body-intent-drift.sh +0 -107
  35. package/substrate/.claude/hooks/skill-step-list-check.sh +0 -171
  36. package/substrate/.claude/hooks/state-validate.sh +0 -271
  37. package/substrate/.claude/hooks/substrate-clarity-gate.sh +0 -1110
  38. package/substrate/.claude/hooks/temperance-gate.sh +0 -147
  39. package/substrate/.claude/hooks/testing-tier-enforce.sh +0 -233
  40. package/substrate/.claude/hooks/turn-prose-grade-measure.sh +0 -219
  41. package/substrate/.claude/hooks/turn-prose-kiss-check.sh +0 -463
  42. package/substrate/.claude/hooks/vocabulary-migration-check.sh +0 -171
  43. package/substrate/.claude/hooks/whereami-utc-gate.sh +0 -142
  44. package/substrate/.claude/luminaries/alan-cooper.md +0 -170
  45. package/substrate/.claude/luminaries/alistair-cockburn.md +0 -140
  46. package/substrate/.claude/luminaries/amazon-pr-faq.md +0 -34
  47. package/substrate/.claude/luminaries/ash-maurya.md +0 -121
  48. package/substrate/.claude/luminaries/bill-buxton.md +0 -210
  49. package/substrate/.claude/luminaries/charles-sanders-peirce.md +0 -150
  50. package/substrate/.claude/luminaries/david-ogilvy.md +0 -192
  51. package/substrate/.claude/luminaries/don-norman.md +0 -173
  52. package/substrate/.claude/luminaries/edward-tufte.md +0 -179
  53. package/substrate/.claude/luminaries/eric-evans.md +0 -160
  54. package/substrate/.claude/luminaries/frederick-brooks.md +0 -50
  55. package/substrate/.claude/luminaries/gang-of-four.md +0 -157
  56. package/substrate/.claude/luminaries/glenford-myers.md +0 -230
  57. package/substrate/.claude/luminaries/hunt-thomas.md +0 -115
  58. package/substrate/.claude/luminaries/hyrum-wright.md +0 -94
  59. package/substrate/.claude/luminaries/jason-fried-dhh.md +0 -46
  60. package/substrate/.claude/luminaries/jesse-james-garrett.md +0 -154
  61. package/substrate/.claude/luminaries/john-ousterhout.md +0 -94
  62. package/substrate/.claude/luminaries/karl-popper.md +0 -132
  63. package/substrate/.claude/luminaries/kent-beck.md +0 -168
  64. package/substrate/.claude/luminaries/linus-torvalds.md +0 -218
  65. package/substrate/.claude/luminaries/martin-fowler.md +0 -164
  66. package/substrate/.claude/luminaries/michael-feathers.md +0 -125
  67. package/substrate/.claude/luminaries/michael-nygard.md +0 -118
  68. package/substrate/.claude/luminaries/robert-c-martin.md +0 -164
  69. package/substrate/.claude/luminaries/saltzer-schroeder.md +0 -194
  70. package/substrate/.claude/luminaries/sophia-prater.md +0 -193
  71. package/substrate/.claude/luminaries/stephen-toulmin.md +0 -131
  72. package/substrate/.claude/luminaries/tony-hoare.md +0 -170
  73. package/substrate/.claude/luminaries/vaughn-vernon.md +0 -50
  74. package/substrate/.claude/luminaries/w-edwards-deming.md +0 -158
  75. package/substrate/.claude/rules/accessor-library-discipline.md +0 -138
  76. package/substrate/.claude/rules/adr-discipline.md +0 -120
  77. package/substrate/.claude/rules/api-conventions.md +0 -125
  78. package/substrate/.claude/rules/artifact-ingestion.md +0 -179
  79. package/substrate/.claude/rules/assert-only-after-verify.md +0 -137
  80. package/substrate/.claude/rules/blocked-items.md +0 -146
  81. package/substrate/.claude/rules/bootstrap-pair-discipline.md +0 -141
  82. package/substrate/.claude/rules/branching.md +0 -28
  83. package/substrate/.claude/rules/cold-adopter-harness-discipline.md +0 -129
  84. package/substrate/.claude/rules/commit-conventions.md +0 -22
  85. package/substrate/.claude/rules/compounding-axis-fresh-analysis.md +0 -188
  86. package/substrate/.claude/rules/compounding-sequence-fresh-analysis.md +0 -188
  87. package/substrate/.claude/rules/context-engineering.md +0 -202
  88. package/substrate/.claude/rules/context-management.md +0 -85
  89. package/substrate/.claude/rules/defensive-bash.md +0 -68
  90. package/substrate/.claude/rules/deferred-actions.md +0 -233
  91. package/substrate/.claude/rules/destructive-operations.md +0 -69
  92. package/substrate/.claude/rules/diagnosis.md +0 -38
  93. package/substrate/.claude/rules/github-issue-flash-tweet.md +0 -156
  94. package/substrate/.claude/rules/guardrails.md +0 -73
  95. package/substrate/.claude/rules/hook-wire-on-author.md +0 -103
  96. package/substrate/.claude/rules/identifier-leak-prevention.md +0 -104
  97. package/substrate/.claude/rules/iteration-bet-brief-completeness.md +0 -54
  98. package/substrate/.claude/rules/lite-manifest-schema-change-discipline.md +0 -98
  99. package/substrate/.claude/rules/longrun-prep-plan-doc-compression.md +0 -89
  100. package/substrate/.claude/rules/loop-discipline.md +0 -81
  101. package/substrate/.claude/rules/manual-prod-approval.md +0 -100
  102. package/substrate/.claude/rules/marker-enrichment-discipline.md +0 -99
  103. package/substrate/.claude/rules/mobile-ephemeral-session.md +0 -109
  104. package/substrate/.claude/rules/new-dependency-check.md +0 -51
  105. package/substrate/.claude/rules/oo-ad-entry-point.md +0 -117
  106. package/substrate/.claude/rules/operator-facing-prose.md +0 -196
  107. package/substrate/.claude/rules/option-label-discipline.md +0 -108
  108. package/substrate/.claude/rules/pattern-annotation.md +0 -100
  109. package/substrate/.claude/rules/plain-english-discipline.md +0 -156
  110. package/substrate/.claude/rules/plan-enumeration-needs-value-props.md +0 -211
  111. package/substrate/.claude/rules/pr-body-shape.md +0 -317
  112. package/substrate/.claude/rules/pr-strategy.md +0 -167
  113. package/substrate/.claude/rules/pr-title-shape.md +0 -161
  114. package/substrate/.claude/rules/prototype-workflow.md +0 -65
  115. package/substrate/.claude/rules/reserved-skill-names.md +0 -123
  116. package/substrate/.claude/rules/schema-management.md +0 -49
  117. package/substrate/.claude/rules/sdlc-gates.md +0 -149
  118. package/substrate/.claude/rules/security.md +0 -37
  119. package/substrate/.claude/rules/session-artifacts.md +0 -236
  120. package/substrate/.claude/rules/skill-composition-declarations.md +0 -124
  121. package/substrate/.claude/rules/skill-description-clarity.md +0 -247
  122. package/substrate/.claude/rules/skill-procedure-step-list.md +0 -137
  123. package/substrate/.claude/rules/state-schema-validation.md +0 -162
  124. package/substrate/.claude/rules/stuck-signal-diagnostic.md +0 -140
  125. package/substrate/.claude/rules/substrate-config-schema.md +0 -98
  126. package/substrate/.claude/rules/test-list-discipline.md +0 -175
  127. package/substrate/.claude/rules/test-sufficiency.md +0 -210
  128. package/substrate/.claude/rules/testing-tier-config.md +0 -145
  129. package/substrate/.claude/rules/testing.md +0 -38
  130. package/substrate/.claude/rules/turn-estimate-grounding.md +0 -134
  131. package/substrate/.claude/rules/visual-hierarchy.md +0 -437
  132. package/substrate/.claude/rules/we-dont-break-adopters.md +0 -126
  133. package/substrate/.claude/rules/whereami-load-bearing.md +0 -202
  134. package/substrate/.claude/rules/writing-craft-discipline.md +0 -92
  135. package/substrate/.claude/rules/wu-sequencing-compounds.md +0 -145
  136. package/substrate/.claude/skills/build/SKILL.md +0 -640
  137. package/substrate/.claude/skills/chronicle/SKILL.md +0 -55
  138. package/substrate/.claude/skills/clean-artifacts/SKILL.md +0 -249
  139. package/substrate/.claude/skills/decompose/SKILL.md +0 -280
  140. package/substrate/.claude/skills/diagnose/SKILL.md +0 -297
  141. package/substrate/.claude/skills/feynman/SKILL.md +0 -90
  142. package/substrate/.claude/skills/howdoi/SKILL.md +0 -105
  143. package/substrate/.claude/skills/ia-model/SKILL.md +0 -108
  144. package/substrate/.claude/skills/interaction-design/SKILL.md +0 -112
  145. package/substrate/.claude/skills/interpret-input/SKILL.md +0 -180
  146. package/substrate/.claude/skills/journal/SKILL.md +0 -209
  147. package/substrate/.claude/skills/kiss/SKILL.md +0 -449
  148. package/substrate/.claude/skills/launch/SKILL.md +0 -915
  149. package/substrate/.claude/skills/lean-canvas/SKILL.md +0 -332
  150. package/substrate/.claude/skills/longrun/SKILL.md +0 -463
  151. package/substrate/.claude/skills/luminary/SKILL.md +0 -481
  152. package/substrate/.claude/skills/ogilvy-writing-audit/SKILL.md +0 -177
  153. package/substrate/.claude/skills/onboard-repo/SKILL.md +0 -1624
  154. package/substrate/.claude/skills/pattern-review/SKILL.md +0 -99
  155. package/substrate/.claude/skills/personas/SKILL.md +0 -207
  156. package/substrate/.claude/skills/promote/SKILL.md +0 -283
  157. package/substrate/.claude/skills/requirement/SKILL.md +0 -98
  158. package/substrate/.claude/skills/retro/SKILL.md +0 -117
  159. package/substrate/.claude/skills/riff/SKILL.md +0 -114
  160. package/substrate/.claude/skills/roadmap-reconcile/SKILL.md +0 -163
  161. package/substrate/.claude/skills/session-end/SKILL.md +0 -309
  162. package/substrate/.claude/skills/session-log/SKILL.md +0 -299
  163. package/substrate/.claude/skills/skills/SKILL.md +0 -228
  164. package/substrate/.claude/skills/spec/SKILL.md +0 -105
  165. package/substrate/.claude/skills/sprint/SKILL.md +0 -392
  166. package/substrate/.claude/skills/stage/SKILL.md +0 -384
  167. package/substrate/.claude/skills/state-a-problem/SKILL.md +0 -185
  168. package/substrate/.claude/skills/temperance/SKILL.md +0 -108
  169. package/substrate/.claude/skills/use-case/SKILL.md +0 -417
  170. package/substrate/.claude/skills/user-stories/SKILL.md +0 -268
  171. package/substrate/.claude/skills/value-prop/SKILL.md +0 -251
  172. package/substrate/.claude/skills/verify/SKILL.md +0 -160
  173. package/substrate/.claude/skills/visual-review/SKILL.md +0 -503
  174. package/substrate/.claude/skills/whats-the-plan/SKILL.md +0 -202
  175. package/substrate/.claude/skills/whereami/SKILL.md +0 -307
  176. package/substrate/AGENTS.md +0 -79
  177. package/substrate/CLAUDE-lite.md +0 -85
  178. package/substrate/CODE_OF_CONDUCT.md +0 -28
  179. package/substrate/CONTRIBUTING.md +0 -177
  180. package/substrate/README.md +0 -173
  181. package/substrate/SECURITY.md +0 -19
  182. package/substrate/architecture/decisions/ADR-029-release-pipeline.md +0 -79
  183. package/substrate/architecture/decisions/ADR-031-non-breaking-changes-adopter-discipline.md +0 -139
  184. package/substrate/architecture/decisions/ADR-032-adopter-sync-dispatcher-architecture.md +0 -192
  185. package/substrate/architecture/decisions/ADR-039-release-tagging-scheme.md +0 -145
  186. package/substrate/architecture/decisions/ADR-040-planning-skill-vocabulary-and-lite-profile.md +0 -155
  187. package/substrate/architecture/decisions/ADR-044-unified-skill-body-template.md +0 -162
  188. package/substrate/lib/clean-artifacts-sweep.sh +0 -112
  189. package/substrate/lib/code-comment-discipline.sh +0 -144
  190. package/substrate/lib/composer-preflight.sh +0 -459
  191. package/substrate/lib/hook-inject.sh +0 -255
  192. package/substrate/lib/luminary-pick.sh +0 -96
  193. package/substrate/lib/output-discipline.sh +0 -143
  194. package/substrate/lib/prose-scan-boundary.sh +0 -171
  195. package/substrate/lib/rewrite-check.sh +0 -214
  196. package/substrate/lib/state.sh +0 -1372
  197. package/substrate/lib/telemetry.sh +0 -205
  198. package/substrate/lib/tier-check.sh +0 -187
  199. package/substrate/lib/tier-dependency-audit.sh +0 -1088
  200. package/substrate/presence/install/bassclef-hook-connect.sh +0 -178
  201. package/substrate/presence/install/bassclef-sync.dispatcher.template.sh +0 -841
  202. package/substrate/presence/install/bassclef-sync.template.sh +0 -2076
  203. package/substrate/presence/install/schedule-auto-save.cron.sh +0 -88
  204. package/substrate/presence/install/schedule-auto-save.taskscheduler.md +0 -122
  205. package/substrate/scripts/aggregate-telemetry.sh +0 -217
  206. package/substrate/scripts/analyze-tier-dependencies.sh +0 -239
  207. package/substrate/scripts/generate-lite-manifest.sh +0 -505
  208. package/substrate/scripts/generate-tier-manifest.sh +0 -28
  209. package/substrate/scripts/intent-drift-check.sh +0 -456
  210. package/substrate/scripts/lite-manifest-drift-check.sh +0 -146
  211. package/substrate/scripts/render-lite-manifest-doc.sh +0 -150
  212. package/substrate/standards/adr-template.md +0 -86
  213. package/substrate/standards/api-conventions/nextjs.md +0 -84
  214. package/substrate/standards/artifact-composition.md +0 -209
  215. package/substrate/standards/bash-hook-safety.md +0 -246
  216. package/substrate/standards/bassclef-configs-schema.md +0 -232
  217. package/substrate/standards/bassclef-evolution.md +0 -143
  218. package/substrate/standards/bassclef-internal-jargon.md +0 -244
  219. package/substrate/standards/bassclef-managed-sentinel.md +0 -96
  220. package/substrate/standards/bassclef-source-config.md +0 -228
  221. package/substrate/standards/branch-stacking.md +0 -408
  222. package/substrate/standards/code-safety-principles.md +0 -176
  223. package/substrate/standards/composer-prerequisites.md +0 -155
  224. package/substrate/standards/deferred-actions-schema.md +0 -204
  225. package/substrate/standards/dependency-discipline/cargo.md +0 -39
  226. package/substrate/standards/dependency-discipline/gem.md +0 -43
  227. package/substrate/standards/dependency-discipline/go-mod.md +0 -41
  228. package/substrate/standards/dependency-discipline/npm.md +0 -42
  229. package/substrate/standards/dependency-discipline/pip.md +0 -42
  230. package/substrate/standards/deployment-topology/ec2-tailscale.md +0 -225
  231. package/substrate/standards/deployment-topology.md +0 -69
  232. package/substrate/standards/docs-sync-allowlist.md +0 -76
  233. package/substrate/standards/domain-and-dns.md +0 -145
  234. package/substrate/standards/frontend-stack.md +0 -67
  235. package/substrate/standards/frontmatter-schema.md +0 -154
  236. package/substrate/standards/graceful-exit.md +0 -227
  237. package/substrate/standards/hook-idempotency.md +0 -102
  238. package/substrate/standards/hook-injection-discipline.md +0 -202
  239. package/substrate/standards/hook-install-class.md +0 -215
  240. package/substrate/standards/input-handler-interface.md +0 -152
  241. package/substrate/standards/lite-manifest-schema-changes.md +0 -135
  242. package/substrate/standards/luminary-matching.md +0 -105
  243. package/substrate/standards/luminary-problem-patterns.md +0 -481
  244. package/substrate/standards/migration-discipline/active-record.md +0 -50
  245. package/substrate/standards/migration-discipline/alembic.md +0 -43
  246. package/substrate/standards/migration-discipline/gorm.md +0 -50
  247. package/substrate/standards/migration-discipline/prisma.md +0 -53
  248. package/substrate/standards/migration-discipline/sqlalchemy.md +0 -51
  249. package/substrate/standards/mobile-ephemeral-session.md +0 -167
  250. package/substrate/standards/model-routing-discipline.md +0 -160
  251. package/substrate/standards/ogilvy-writing-rules.md +0 -225
  252. package/substrate/standards/opener-discipline.md +0 -96
  253. package/substrate/standards/operator-facing-prose-discipline.md +0 -201
  254. package/substrate/standards/persona-schema.md +0 -229
  255. package/substrate/standards/pluggable-luminaries.md +0 -323
  256. package/substrate/standards/pr-body-discipline.md +0 -115
  257. package/substrate/standards/preview-state-schema.md +0 -189
  258. package/substrate/standards/project-directory-layout.md +0 -276
  259. package/substrate/standards/release-tagging.md +0 -137
  260. package/substrate/standards/reserved-skill-names.md +0 -120
  261. package/substrate/standards/scannable-multi-option-output.md +0 -261
  262. package/substrate/standards/sdlc-compliance.md +0 -286
  263. package/substrate/standards/sdlc-gates/typescript.md +0 -57
  264. package/substrate/standards/secrets-lifecycle.md +0 -210
  265. package/substrate/standards/security-scanner-adapter.md +0 -145
  266. package/substrate/standards/session-board.md +0 -256
  267. package/substrate/standards/skill-output-discipline.md +0 -90
  268. package/substrate/standards/state-spine-contract.md +0 -255
  269. package/substrate/standards/state-spine.md +0 -511
  270. package/substrate/standards/steering-hints/kiss-words.md +0 -11
  271. package/substrate/standards/substrate-config-schema.md +0 -267
  272. package/substrate/standards/tech-stack-config.md +0 -109
  273. package/substrate/standards/tier-dependency-analysis.md +0 -167
  274. package/substrate/standards/tier-runtime-deps/lite.md +0 -57
  275. package/substrate/standards/tier-tag-schema.md +0 -155
  276. package/substrate/standards/two-layer-config.md +0 -99
  277. package/substrate/standards/use-case-format.md +0 -292
  278. package/substrate/standards/user-story-invest.md +0 -268
  279. package/substrate/standards/velocity-and-appetite.md +0 -229
  280. package/substrate/standards/voice-input-pattern.md +0 -119
  281. package/substrate/standards/whereami-schema.md +0 -301
  282. package/substrate/standards/worktree-management.md +0 -211
  283. package/substrate/standards/writing-guide.md +0 -213
  284. package/substrate/templates/chronicle-template.md +0 -75
  285. package/substrate/templates/deferred-action-template.md +0 -45
  286. package/substrate/templates/memory-proposal-template.md +0 -77
  287. package/substrate/templates/persona-template.md +0 -200
  288. package/substrate/templates/pr-faq.md +0 -45
  289. package/substrate/templates/secret-rotation-template.md +0 -162
  290. package/substrate/templates/spec-template.md +0 -131
  291. package/substrate/templates/use-case-template.md +0 -194
  292. package/substrate/templates/user-story-template.md +0 -107
  293. package/substrate/templates/whereami-template.md +0 -101
@@ -1,51 +0,0 @@
1
- ---
2
- tier: lite
3
- description: The SQLAlchemy sibling of .claude/rules/schema-management.md.
4
- ---
5
-
6
- # SQLAlchemy + Alembic — migration discipline
7
-
8
- The SQLAlchemy sibling of `.claude/rules/schema-management.md`. Loads when adopter's `tech_stack.orm` is `sqlalchemy`. For standalone Alembic (non-SQLAlchemy use), see `alembic.md`.
9
-
10
- ## Non-negotiable rule
11
-
12
- **NEVER edit production schema directly via `Base.metadata.create_all()` or DB-side DDL.** SQLAlchemy's autogenerate is the migration source; bypassing it ships drift.
13
-
14
- ## Workflow (Alembic via SQLAlchemy autogen)
15
-
16
- 1. Edit the SQLAlchemy model in `models.py` (or wherever the adopter keeps declarative bases)
17
- 2. Generate the migration: `alembic revision --autogenerate -m "descriptive_name"`
18
- 3. **Review the generated migration before committing** — autogen misses many cases:
19
- - Server-side defaults (`server_default=`) are detected only with explicit `compare_server_default=True` in env.py
20
- - Enum changes need manual handling on Postgres
21
- - Index renames are usually drop+create (data loss risk)
22
- - Custom types (JSONB, ARRAY) need explicit handling
23
- 4. Apply locally: `alembic upgrade head`
24
- 5. Commit the migration file with the model change
25
- 6. On deploy, CI runs `alembic upgrade head` against prod
26
-
27
- ## After merging a branch with schema changes (MUST — not optional)
28
-
29
- 1. `alembic upgrade head` — apply pending migrations locally
30
- 2. Restart dev server — SQLAlchemy ORM models reload from source, but DB session connections may cache stale schema metadata
31
- 3. If DB was reset: re-run seed / fixture scripts
32
-
33
- ## Drift check
34
-
35
- ```bash
36
- alembic current
37
- alembic history --indicate-current
38
- ```
39
-
40
- If `alembic check` (Alembic 1.9+) reports model-vs-DB divergence, generate the missing migration.
41
-
42
- ## Common pitfalls
43
-
44
- - **Autogen comparing on outdated metadata** — make sure `target_metadata = Base.metadata` in `env.py` reflects the latest import path
45
- - **Multiple heads** after parallel branches — resolve via `alembic merge` before further development
46
- - **`alembic stamp head`** is a footgun — only use it when you know the DB is already at that state; otherwise you skip migrations silently
47
-
48
- ## Sources
49
-
50
- - Alembic docs (https://alembic.sqlalchemy.org/en/latest/)
51
- - SQLAlchemy migration discipline ports the operator's Prisma rule shape to the Python ecosystem.
@@ -1,167 +0,0 @@
1
- ---
2
- tier: lite
3
- description: Autonomous sessions running in ephemeral environments — claude.ai/code mobile sandbox, CI runners executing agentic work, temporary dev containers — have different state-continuity constraints than desktop sessions.
4
- ---
5
-
6
- # Mobile / Ephemeral Session Standard
7
-
8
- Autonomous sessions running in ephemeral environments — claude.ai/code
9
- mobile sandbox, CI runners executing agentic work, temporary dev
10
- containers — have different state-continuity constraints than desktop
11
- sessions. This standard defines what must be true for ephemeral
12
- sessions to produce reviewable, recoverable work.
13
-
14
- ## The core constraint
15
-
16
- Ephemeral sandbox state is destroyed when the session ends. Any
17
- artifact not committed AND pushed before exit is lost.
18
-
19
- This is different from desktop: desktop auto-save commits locally and
20
- pushes "when convenient." Ephemeral has no "later" — exit is terminal.
21
-
22
- ## Detection
23
-
24
- **Primary (required for certainty)**: operator sets `CLAUDE_EPHEMERAL=1`
25
- as the first command in the session. No heuristics beat explicit
26
- opt-in.
27
-
28
- **Fallback heuristics** (if operator doesn't set the flag):
29
- - `pwd` doesn't start with `/Users/`
30
- - `hostname` doesn't match known machines
31
- - `$HOME` isn't the operator's real home
32
- - Tailscale CLI not installed at `/Applications/Tailscale.app/Contents/MacOS/Tailscale`
33
- - Fresh-clone reflog (very short history)
34
-
35
- ≥2 heuristics firing → treat as ephemeral with surfaced warning.
36
- Single heuristic → surface but don't switch modes automatically.
37
-
38
- **Refine over time**: after the first few mobile sessions, update
39
- these heuristics based on actual claude.ai/code sandbox environment.
40
-
41
- ## Rules (MUST)
42
-
43
- ### 1. All session artifacts round-trip through git
44
-
45
- Chronicles, handoff docs, state files, diagnosis output, decomposition
46
- artifacts — everything MUST be committed AND pushed before the session
47
- naturally or unnaturally ends. Auto-save hooks in ephemeral mode must
48
- `git push` after every commit, not batch-push at exit.
49
-
50
- ### 2. No filesystem-only markers
51
-
52
- Desktop hooks use `/tmp/claude-verify-[branch]` and similar markers.
53
- These are lost on sandbox death. Every filesystem marker MUST have a
54
- git-tracked equivalent that the hook also writes and reads. When
55
- running in ephemeral mode, the git-tracked form is authoritative.
56
-
57
- | Desktop | Ephemeral-compatible |
58
- |---------|---------------------|
59
- | `/tmp/claude-verify-[branch]` | `state/markers/verify/[branch]` (git-tracked, committed by /verify) |
60
- | Session lock at `.claude/SESSION_LOCK` | Same, but with ISO timestamp + TTL — stale locks auto-clear with ≥30min age |
61
- | Iteration state in `.claude/iteration-state` | Committed to repo, not gitignored |
62
- | Agent memory at `~/.claude/projects/...` | Either: (a) commit a memory export to `memory/` in repo, OR (b) accept per-session memory loss, rely on chronicles as context substitute |
63
-
64
- ### 3. Auto-save pushes every commit
65
-
66
- Hook must:
67
- - Detect ephemeral mode (env var, hostname pattern, or explicit flag)
68
- - After each auto-save commit, invoke `git push origin HEAD` with
69
- reasonable backoff on failure
70
- - Coalesce commits within the last 10 min to avoid thrashing git
71
- history
72
- - If push fails (network, auth, conflict): retry once, then log
73
- failure visibly — operator sees it in session output
74
-
75
- ### 4. Session-lock TTL + ephemeral-safe
76
-
77
- Session locks must be:
78
- - Timestamp-bearing (ISO 8601 in UTC)
79
- - Stale-clearable (locks ≥30 min old are cleared with an announcement)
80
- - Git-committed if ephemeral (lives in the repo so other sessions
81
- can see it)
82
-
83
- Stale-lock clearing rule: agent reads lock file, checks timestamp, if
84
- age > TTL, clears lock and announces in session output. No polling;
85
- one-shot check at session start.
86
-
87
- ### 5. No credential-bearing tools in ephemeral
88
-
89
- Ephemeral sessions MUST NOT carry long-lived credentials:
90
- - No SSH keys for prod/staging boxes
91
- - No AWS access keys
92
- - No Tailscale auth tokens
93
- - No long-lived PATs (use fine-grained PATs with short TTL or
94
- GitHub App installation tokens only)
95
-
96
- Agents in ephemeral sessions work at the git layer — clone, branch,
97
- commit, push, open PR. Deploy work happens in CI after PR merge,
98
- never from the ephemeral sandbox directly.
99
-
100
- ### 6. Session-end rigor is absolute
101
-
102
- Ephemeral sessions MUST invoke `/session-end` explicitly before exit.
103
- Stop hook may not fire; operator may close the tab; sandbox may time
104
- out. Relying on shutdown hooks is the failure mode. Explicit
105
- session-end at natural stopping points is the rule.
106
-
107
- Session-end in ephemeral mode:
108
- 1. Write chronicle (commit + push)
109
- 2. Update whereami if changed (commit + push)
110
- 3. Write any LinkedIn drafts (commit + push)
111
- 4. Confirm working tree clean
112
- 5. Confirm HEAD matches origin
113
- 6. Exit only after verification
114
-
115
- ## Rules (SHOULD)
116
-
117
- ### 7. Recent-chronicle read at session start
118
-
119
- If project memory isn't available (no MCP memory server, no memory
120
- repo), read the last 2-3 chronicles at session start as context
121
- substitute. Substantial enough to recover current iteration state,
122
- open threads, and recent decisions.
123
-
124
- ### 8. Conservative auto-mode in ephemeral
125
-
126
- Ephemeral sessions default to operator-gated even if orchestrator-
127
- gated was requested. The ephemeral constraint adds risk that deserves
128
- confirmation at decision points. Override with explicit
129
- `orchestrator-gated --ephemeral-ok` flag.
130
-
131
- ### 9. Recipe for "hello world" mobile session
132
-
133
- First mobile session on any repo should be trivial: chronicle edit,
134
- doc fix, skill tweak, README update. Not a feature build. Validates
135
- the end-to-end loop (auth → clone → edit → commit → push → PR)
136
- before testing anything complex.
137
-
138
- ## Rationale
139
-
140
- Mobile autonomous is valuable because it compresses the feedback
141
- loop for idea-to-artifact work (operator has an insight on phone;
142
- captures it via agent; agent produces artifact; operator reviews on
143
- desktop). The tax is state continuity — easy to lose work to
144
- sandbox death.
145
-
146
- The rules here make state continuity a build-time property of the
147
- substrate, not a run-time discipline the operator has to remember.
148
- Every hook, every skill, every rule that already exists keeps working
149
- as long as it respects these constraints.
150
-
151
- ## Relationship to other standards
152
-
153
- - `standards/substrate-config-schema.md` — no secrets in
154
- substrate.config.md (already required); ephemeral just makes
155
- this more critical
156
- - `standards/deployment-topology.md` — deploy work happens in CI
157
- post-PR, never from ephemeral session
158
- - `.claude/rules/blocked-items.md` — BLOCKED: protocol continues to
159
- work in ephemeral; silence is not deferral in either mode
160
-
161
- ## Enforcement
162
-
163
- Hook layer enforces what it can (auto-save push, marker git-tracking,
164
- session lock TTL). Agent behavior enforces the rest (explicit
165
- session-end, no credential tools, conservative auto-mode).
166
- Self-test skill could validate hook configuration when run in
167
- ephemeral mode.
@@ -1,160 +0,0 @@
1
- ---
2
- tier: lite
3
- description: - ADR-021 — anchor catalog selection (cameo engine model context, now operator-internal) - bassclef#853 Sub-bet 16 + Sub-bet 19 — model routing substrate primitive - bassclef#944 — Voyage matcher excision (operator-internal pinning moved to…
4
- ---
5
-
6
- # Model routing discipline
7
-
8
- ## Sources read
9
-
10
- - ADR-021 — anchor catalog selection (cameo engine model context, now operator-internal)
11
- - bassclef#853 Sub-bet 16 + Sub-bet 19 — model routing substrate primitive
12
- - bassclef#944 — Voyage matcher excision (operator-internal pinning moved to bassclef-upstream)
13
- - `.claude/agents/*.md` existing tier declarations (Opus / Sonnet / Haiku across 13 agents)
14
- - Operator spec: provider-agnostic routing supporting 10+ providers
15
-
16
- ## What this is
17
-
18
- Model routing is how bassclef's agents, skills, and subagents pick which LLM to call at dispatch time. The substrate names four capability tiers — `cheap-fast`, `balanced`, `capable`, `embedding`. Each provider maps its concrete models to those tiers in `config/model-routing.yaml`.
19
-
20
- Agents declare a tier in frontmatter. Skills can override per invocation. The substrate resolves the concrete model at dispatch time from the active provider + tier mapping.
21
-
22
- ## Why this exists
23
-
24
- Three problems the old shape didn't solve:
25
-
26
- 1. Agent frontmatter pinned vendor-specific model IDs (`claude-opus-4-6`, `claude-sonnet-4-6`, `claude-haiku-4-5`). Switching providers meant editing every agent file.
27
- 2. Adopters using OpenAI, Gemini, Bedrock, etc. couldn't reuse bassclef's agent definitions without rewriting model declarations.
28
- 3. Per-skill or per-call model selection had no clean override path. Operator env vars worked but weren't documented.
29
-
30
- This primitive fixes all three: agents declare a tier, not a vendor. Adopters edit `config/model-routing.yaml` to pick their provider. Per-invocation overrides cascade through a clear precedence stack.
31
-
32
- ## The four capability tiers
33
-
34
- | Tier | When to use |
35
- |---|---|
36
- | **cheap-fast** | High-frequency, low-complexity, structured output. Checklist eval, file navigation, simple extraction, automation, runbook execution. |
37
- | **balanced** | Default for most agents. Code edits, planning, analysis, design, strategic reasoning. |
38
- | **capable** | High-complexity reasoning, architectural decisions, problem framing, synthesis across many docs. |
39
- | **embedding** | Vector embeddings for retrieval (semantic search, anchor matching). Not a chat model. |
40
-
41
- Tiers describe capability, not vendor. The same tier maps to different concrete models per provider.
42
-
43
- ### Tiers are vocabulary, not benchmark
44
-
45
- The four tier names describe **intent**, not measured cross-provider equivalence. A `capable` model on one provider is not strictly equal to a `capable` model on another — output quality, latency, cost, and context window all vary. The tier abstraction picks the right shape of model for a workload; adopters validate the concrete mapping against their own workloads before pinning a provider.
46
-
47
- INSTEAD of treating tiers as benchmark guarantees: read them as design intent. "Use capable" means "this work needs the strongest reasoning the provider ships." Whether that's Claude Opus, GPT-o1, Gemini 2.0 Pro, or Mistral Large 2 depends on the provider's roadmap — and on what the adopter measures against their own jobs.
48
-
49
- This framing prevents the cross-provider semantic-equivalence misread: tiers are a coordination mechanism, not a quality contract.
50
-
51
- ## How to declare
52
-
53
- ### In an agent definition
54
-
55
- ```yaml
56
- ---
57
- name: Closer
58
- model_tier: cheap-fast
59
- description: Administrative gate evaluation; checklists; retros.
60
- ---
61
- ```
62
-
63
- ### In a skill (optional per-call override)
64
-
65
- ```yaml
66
- ---
67
- name: example-skill
68
- model_tier: capable # overrides invoking agent's tier
69
- ---
70
- ```
71
-
72
- ### In substrate.config.md (per-repo provider default)
73
-
74
- ```markdown
75
- ## Model routing
76
-
77
- # Default provider for this repo. Tier-to-model mapping comes from
78
- # bassclef's config/model-routing.yaml unless overridden here.
79
- model_provider: anthropic
80
- ```
81
-
82
- ## Override precedence
83
-
84
- When resolving a model at dispatch, the substrate walks this stack from highest to lowest priority:
85
-
86
- | Priority | Source | Notes |
87
- |---|---|---|
88
- | 1 | `CLAUDE_MODEL_OVERRIDE` env var | Direct vendor model ID; bypasses tier resolution |
89
- | 2 | Per-invocation flag (skill arg) | `--model gpt-4o` style override |
90
- | 3 | Skill-level `model_tier:` declaration | Skill frontmatter |
91
- | 4 | Agent-level `model_tier:` declaration | Agent frontmatter |
92
- | 5 | Per-repo `model_provider:` in substrate.config.md | Repo default; pairs with tier above |
93
- | 6 | Substrate default in `config/model-routing.yaml` | `default_provider:` field |
94
-
95
- INSTEAD of hardcoding vendor model IDs in agent definitions: declare a tier; let the resolution stack pick the concrete model. The override path stays open at every layer for genuine reasons (vendor pinning, per-call experimentation, operator emergency override).
96
-
97
- ## How adopters extend
98
-
99
- Adopters use any LLM provider — Anthropic, OpenAI, Google Gemini, AWS Bedrock, Azure OpenAI, Mistral, Cohere, DeepSeek, xAI, local LLaMA, or any future provider.
100
-
101
- To add a new provider:
102
-
103
- 1. Edit `config/model-routing.yaml`. Add a provider block under `providers:` with tier mappings.
104
- 2. Set `default_provider:` to the new provider (or leave the default and set per-repo).
105
- 3. The agents work unchanged.
106
-
107
- No agent edits. No skill edits. The tier abstraction does the work.
108
-
109
- ## What the substrate ships
110
-
111
- `config/model-routing.yaml` ships defaults for ten providers:
112
-
113
- - **Anthropic** — Claude family (Opus 4.7, Sonnet 4.6, Haiku 4.5)
114
- - **OpenAI** — GPT family
115
- - **Google Gemini** — Gemini family
116
- - **AWS Bedrock** — Bedrock-hosted Anthropic models
117
- - **Azure OpenAI** — Azure-hosted GPT
118
- - **Mistral** — Mistral family
119
- - **Cohere** — Command family + embed models
120
- - **DeepSeek** — DeepSeek-V3 / DeepSeek-Coder
121
- - **xAI** — Grok family
122
- - **local-llama** — Self-hosted Llama 3
123
-
124
- The defaults are starting points. Operator can pin specific versions, swap models within a tier, or add new providers via config edit.
125
-
126
- ## How adopter-internal primitives reference this
127
-
128
- Operator-internal pinning decisions (anchor catalog model choices, embedding-vendor selection) stay in `bassclef-upstream/docs/operator-private/adrs/` per Tier 1 substrate. The pins reference this routing primitive: operator-internal substrate calls `state_routing_resolve(tier='embedding', purpose='<purpose>')` which reads the operator-internal config to pick the concrete embedding model.
129
-
130
- Adopters don't need the operator-internal pinning decisions. The substrate primitive gives them the tier abstraction; their config picks the concrete model.
131
-
132
- ## What this primitive does NOT do
133
-
134
- - Does not choose a tier for you. Agent definitions declare the tier.
135
- - Does not call the LLM. The harness does that with the resolved model ID.
136
- - Does not handle rate limits, retries, or fallbacks. Those are runtime concerns (separate primitive — see bassclef#853 Sub-bet 20 parallel-dispatch ceiling).
137
- - Does not move secrets. Provider API keys live in `substrate.secrets.md` per `standards/secrets-lifecycle.md`. This primitive only routes between providers; the secrets layer authenticates each call.
138
-
139
- ## Composes with
140
-
141
- - ADR-021 — anchor catalog selection (operator-internal; references this primitive)
142
- - ADR-023 — dependency-aware pre-flight dispatch (Sub-bet 13)
143
- - ADR-025 — atomic write-claim (Sub-bet 9)
144
- - bassclef#853 Sub-bet 17 — subagent isolation (different concern; both fire pre-dispatch)
145
- - bassclef#853 Sub-bet 18 — session marker handoff (different concern; both fire pre-dispatch)
146
- - bassclef#853 Sub-bet 20 — parallel-dispatch ceiling (caps concurrent agents per plan capacity)
147
- - `standards/vendor-bindings.md` — this primitive is the SENTINEL_bassclef_answer to "how do we stay portable across LLM vendors"
148
- - `standards/secrets-lifecycle.md` — provider API keys live there
149
-
150
- ## Override path
151
-
152
- `SKIP_MODEL_ROUTING=1 <command>` — bypasses tier resolution entirely. Logged via trace-helper. Use only when debugging a routing bug or when a one-off vendor model is needed for a specific call that isn't worth a permanent config entry.
153
-
154
- ## Retirement condition
155
-
156
- This primitive retires only if the harness ships a built-in tier abstraction that supersedes it. Until then, this discipline holds across all bassclef-substrate agents + skills + subagents.
157
-
158
- ## Closes
159
-
160
- bassclef#853 Sub-bet 16 (model routing substrate primitive) + Sub-bet 19 (provider-agnostic extension across 10+ providers).
@@ -1,225 +0,0 @@
1
- ---
2
- tier: lite
3
- title: Ogilvy writing rules — reference for the writing-craft discipline
4
- sources:
5
- - David Ogilvy — "How to Write" internal memo (1982; 10 rules to Ogilvy and Mather management)
6
- - Kenneth Roman + Joel Raphaelson — Writing That Works (Harper and Row, 1981)
7
- authoring_luminaries:
8
- primary: [david-ogilvy]
9
- supporting: [stephen-toulmin, rich-hickey, kent-beck]
10
- description: "This standard holds the 10 rules bassclef's writing-craft discipline references."
11
- ---
12
-
13
- # Ogilvy writing rules — bassclef reference
14
-
15
- This standard holds the 10 rules bassclef's writing-craft discipline references. Each rule names the test, the violation pattern, the fix. Grounded in David Ogilvy's 1982 "How to Write" memo and Kenneth Roman and Joel Raphaelson's *Writing That Works* (1981). No wording lifted from any other source — bassclef's own restatement of the public rules.
16
-
17
- Cited by:
18
-
19
- - `.claude/rules/writing-craft-discipline.md` — auto-loaded rule; first-person composition checks
20
- - `.claude/skills/ogilvy-writing-audit/SKILL.md` — audit skill; severity-tagged violations
21
- - `.claude/hooks/plain-english-steering.sh` (extension per ticket #935) — steering hook reads rule names from here
22
-
23
- ## Sources read
24
-
25
- - David Ogilvy 1982 "How to Write" memo — public circulation
26
- - Kenneth Roman + Joel Raphaelson 1981 *Writing That Works* — published book
27
- - `.claude/luminaries/david-ogilvy.md` — full luminary shipping alongside this standard
28
-
29
- ## The 10 rules
30
-
31
- ### Rule 1 — Natural voice
32
-
33
- Read the sentence aloud. Would a real person say it that way to a respected peer?
34
-
35
- **Fails.**
36
- - "Pursuant to our earlier discussion..."
37
- - "It has come to my attention that..."
38
- - "Please be advised that..."
39
- - Passive voice where active would fit: "A decision was made" → "We decided"
40
-
41
- **Fixes.**
42
- - "As we discussed..."
43
- - "I noticed..."
44
- - Just state the point without the preamble.
45
-
46
- Natural does NOT mean casual. Lawyers and engineers have natural voices that sound like lawyers and engineers. Natural means the writer sounds like themselves, speaking to a peer.
47
-
48
- ### Rule 2 — Short units
49
-
50
- Words, sentences, paragraphs — keep them short.
51
-
52
- **Word swaps (Ogilvy's list, extended).**
53
- - utilize → use
54
- - commence → start
55
- - endeavor → try
56
- - facilitate → help
57
- - terminate → end
58
- - implement → do
59
- - demonstrate → show
60
- - approximately → about
61
- - subsequent → next
62
- - in order to → to
63
-
64
- **Sentence rule.** If a sentence runs past 25 words, it hides two or three sentences. Split at the natural clause boundary.
65
-
66
- **Paragraph rule.** If a paragraph runs past 6 sentences (about 100 words), it covers more than one idea. Split.
67
-
68
- ### Rule 3 — No jargon
69
-
70
- If a normal word would carry the same meaning, use the normal word. Ogilvy's list — "reconceptualize," "demassification," "attitudinally," "judgmentally" — extends into modern consulting speak.
71
-
72
- **Common offenders in agent output.**
73
- - leverage (as verb), synergies, verticals, circle back, deep dive
74
- - ideate, iterate (vague), pivot (metaphorical)
75
- - value-add, move the needle, boil the ocean
76
- - robust, scalable, holistic (outside biology)
77
- - stakeholder (often no referent)
78
- - operationalize, incentivize, strategize
79
-
80
- **When jargon is fine.** Technical writing where the term has a precise meaning the audience shares. "API rate limit" in dev docs stays.
81
-
82
- **When jargon is not fine.** Anywhere the writer is trying to sound important instead of be precise.
83
-
84
- ### Rule 4 — Verify quotations
85
-
86
- Flag quotations for verification. Attributed quotes ("As Einstein said...") are misattributed 90 percent of the time.
87
-
88
- Bassclef does not usually quote outside sources. When we do — in journal entries, luminary bodies, R&R citations — verify the source.
89
-
90
- ### Rule 5 — Read-aloud test
91
-
92
- Read the passage in your head. If it stumbles, rewrite.
93
-
94
- **Fails.**
95
- - Tongue-twisters: "The situation's specification specifies..."
96
- - Long lines with no comma rest — a 35-word sentence is physically hard to speak
97
- - Unintentional rhymes: "The initiation of the presentation caused frustration..."
98
- - Repeated words within one sentence: "review the review of the review process"
99
-
100
- **Fix.** Split, rearrange, cut. The passage should flow at reading speed.
101
-
102
- ### Rule 6 — Clear ask
103
-
104
- If the message requests action, is the ask crystal clear? Can the reader state, in one sentence, what they should do next?
105
-
106
- **Fails.**
107
- - Information dump with no ask at the end
108
- - Buried ask: "...and if you could send over the Q3 numbers as well..."
109
- - Vague ask: "Let me know your thoughts."
110
- - Passive ask: "It would be great if someone could..."
111
-
112
- **Fix.** State the ask directly at the top or bottom. Name the decision, the format, the deadline.
113
-
114
- When no ask is needed — pure information — say so: "No action needed — sharing for awareness."
115
-
116
- ### Rule 7 — Comprehension (Roman + Raphaelson)
117
-
118
- "People seldom act on what they cannot understand."
119
-
120
- Could the intended reader — not an insider, but the actual recipient — understand what is being said on first read?
121
-
122
- **Fails.**
123
- - Unexplained acronyms (especially internal ones — "the PM flagged KR slippage")
124
- - Assumed context: "as discussed in the offsite"
125
- - Compressed logic that skips steps
126
- - Pronouns without clear antecedents: "They said this would happen"
127
-
128
- **Fix.** Write for the reader who was not in the last meeting. Expand acronyms first mention. Name the people. Show the steps.
129
-
130
- Different from Rule 3 (jargon). Jargon is bad words. Comprehension is the bigger question: after reading the whole thing, does the reader actually know what is going on?
131
-
132
- ### Rule 8 — Completeness (Roman + Raphaelson)
133
-
134
- "When you say something, make sure you have said it. The chances of your having said it are only fair."
135
-
136
- Did the writer actually state the thing they meant to state, or did they dance around it?
137
-
138
- **Fails.**
139
- - Questions implied but not asked
140
- - Requests implied but not made
141
- - Conclusions implied but not stated
142
- - Main point arrives halfway through
143
-
144
- **Diagnostic.** What is the ONE thing the reader needs to take from this? Is that thing actually written down, in plain language, somewhere the reader will see it?
145
-
146
- Overlaps with Rule 6 (clear ask) but broader. Rule 6 covers action. Rule 8 covers whether the message itself is fully delivered.
147
-
148
- ### Rule 9 — Honesty / no hedging (Roman + Raphaelson)
149
-
150
- "Intelligent readers develop a nose for deceptive writing and are seldom taken in by it."
151
- "Bad news is not made better by being baffling as well as unwelcome."
152
-
153
- Is the writer saying what they mean, or hiding behind softening language?
154
-
155
- **Fails (euphemisms).**
156
- - "right-sizing" → layoffs
157
- - "we're going in a different direction" → we're rejecting your proposal
158
- - "challenging" → bad, failing
159
- - "opportunity for improvement" → problem
160
- - "reached out" → contacted, called, emailed
161
-
162
- **Fails (weasel words).**
163
- - "arguably," "somewhat," "perhaps," "it could be argued"
164
- - "we believe" as a shield for controversial claims
165
- - Hedging adverbs stacked: "potentially," "possibly," "likely"
166
- - Passive voice hiding the actor: "mistakes were made"
167
-
168
- **Fix.** Say the thing straight. Bad news arrives first, then the reason, then the next step.
169
-
170
- **When hedging IS fine.** Genuine uncertainty honestly acknowledged: "I'm not sure — it might be A or B" is fine. Calibrated confidence: "likely" used when the probability is around 70 percent is fine.
171
-
172
- ### Rule 10 — Facts with context (Roman + Raphaelson)
173
-
174
- "Never present facts on their own, like unstrung gems."
175
-
176
- For each fact, number, or data point: does the reader know why it matters? Is it connected to a point?
177
-
178
- **Fails.**
179
- - "Revenue was 4.2M." (What matters? Up? Down? Compared to what?)
180
- - Bullet lists of numbers with no interpretation
181
- - "The data shows..." followed by data but no "therefore..."
182
- - Percentages without denominators: "engagement up 40 percent" (from what? over what period?)
183
-
184
- **Fix.** For every fact, ask "so what?" Answer inline.
185
-
186
- **Diagnostic.** R&R's metaphor: facts are building materials. Readers are not impressed by a pile of bricks. They want to see the building.
187
-
188
- ## Severity guidance
189
-
190
- When flagging a violation, tag severity:
191
-
192
- - **🔴 Critical** — The violation actively undermines the message. The reader will be confused, misled, or fail to act. Must fix.
193
- - **🟡 Moderate** — The violation weakens the writing. A sharp reader will notice. Should fix.
194
- - **🟢 Minor** — A small stumble. The message works without fixing it. Optional polish.
195
-
196
- **Calibration examples.**
197
-
198
- - Jargon in a customer-facing headline = Critical. Jargon in paragraph 4 of a memo = Moderate.
199
- - Missing ask in an action-requesting email = Critical. Unclear ask in an FYI update = Moderate.
200
- - A 30-word sentence in dense technical copy = Moderate. A 30-word sentence in a memo intro = Critical.
201
- - A stray euphemism in a friendly update = Minor. A euphemism burying bad news = Critical.
202
-
203
- **When in doubt, ask.** Would the intended reader still take the intended action after reading this? If no, it's Critical.
204
-
205
- ## What the rules do NOT cover
206
-
207
- Ogilvy's memo names four more behavioral rules that prose alone cannot audit:
208
-
209
- 1. Have you read *Writing That Works* three times? (Ogilvy's Rule 1)
210
- 2. Did you check your quotations? (Rule 6 in text form is above; the behavioral check is separate)
211
- 3. Did you sleep on it? "Never send a letter or memo on the day you write it. Read it aloud the next morning, then edit." (Rule 7)
212
- 4. If it is important, did you get a colleague to improve it? (Rule 8)
213
- 5. If you want action, is writing actually the right medium? Ogilvy's Rule 10: "Don't write — go tell the person what you want."
214
-
215
- The audit surface — `/ogilvy-writing-audit` skill — flags these as reminders at the end of every audit, without trying to check them from text.
216
-
217
- ## Rules bassclef adds on top
218
-
219
- - **`/kiss words` composes with this standard.** After `/ogilvy-writing-audit` flags the violations, `/kiss words` mechanical substitution fixes what a wordlist covers. The audit diagnoses; the fix skill applies.
220
- - **`standards/bassclef-internal-jargon.md` extends the Rule 3 list.** Bassclef adds business jargon Ogilvy's 1982 memo did not cover (leverage as verb, synergies, circle back, deep dive, ideate, value-add, robust, scalable, holistic, stakeholder without referent).
221
- - **`.claude/rules/plain-english-discipline.md` sits alongside.** Grade-level target (grade 8-9 today; grade 8 after ticket #935 lands). This standard covers writing craft; that rule covers vocabulary and grade.
222
-
223
- ## Retirement condition
224
-
225
- This standard retires only if bassclef stops shipping operator-facing prose. The specific rules may evolve (the wordlist grows; severity calibration adjusts) but the discipline of prose-as-craft persists.