@thebassclef/lite 0.0.1 → 0.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.
Files changed (182) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +85 -4
  3. package/dist/cli.cjs +1610 -0
  4. package/dist/cli.js +1587 -0
  5. package/dist/index.cjs +4 -0
  6. package/dist/index.d.ts +2 -0
  7. package/dist/index.js +4 -0
  8. package/package.json +51 -3
  9. package/substrate/.bassclef/lite-manifest.json +1794 -0
  10. package/substrate/.claude/agents/architect.md +70 -0
  11. package/substrate/.claude/agents/builder.md +114 -0
  12. package/substrate/.claude/agents/designer.md +156 -0
  13. package/substrate/.claude/agents/reviewer.md +88 -0
  14. package/substrate/.claude/hooks/artifact-ingestion-gate.sh +357 -0
  15. package/substrate/.claude/hooks/assert-verify-steering.sh +77 -0
  16. package/substrate/.claude/hooks/bassclef-source-config-validate.sh +215 -0
  17. package/substrate/.claude/hooks/bassclef-sync.sh +634 -0
  18. package/substrate/.claude/hooks/compound-noun-scrub.sh +292 -0
  19. package/substrate/.claude/hooks/kiss-expansion-inject.sh +69 -0
  20. package/substrate/.claude/hooks/plain-english-steering.sh +156 -0
  21. package/substrate/.claude/hooks/post-skill-friction-check.sh +177 -0
  22. package/substrate/.claude/hooks/post-skill-telemetry.sh +62 -0
  23. package/substrate/.claude/hooks/pre-build-gate.sh +511 -0
  24. package/substrate/.claude/hooks/pre-commit-gate.sh +452 -0
  25. package/substrate/.claude/hooks/session-end.sh +433 -0
  26. package/substrate/.claude/hooks/session-reflection.sh +303 -0
  27. package/substrate/.claude/hooks/skill-body-grade-gate.sh +219 -0
  28. package/substrate/.claude/hooks/skill-body-intent-drift.sh +107 -0
  29. package/substrate/.claude/hooks/skill-step-list-check.sh +171 -0
  30. package/substrate/.claude/hooks/state-validate.sh +271 -0
  31. package/substrate/.claude/hooks/substrate-clarity-gate.sh +1110 -0
  32. package/substrate/.claude/hooks/temperance-gate.sh +147 -0
  33. package/substrate/.claude/hooks/testing-tier-enforce.sh +233 -0
  34. package/substrate/.claude/hooks/turn-prose-grade-measure.sh +219 -0
  35. package/substrate/.claude/hooks/turn-prose-kiss-check.sh +434 -0
  36. package/substrate/.claude/hooks/vocabulary-migration-check.sh +171 -0
  37. package/substrate/.claude/hooks/whereami-utc-gate.sh +142 -0
  38. package/substrate/.claude/luminaries/alan-cooper.md +170 -0
  39. package/substrate/.claude/luminaries/alistair-cockburn.md +140 -0
  40. package/substrate/.claude/luminaries/amazon-pr-faq.md +34 -0
  41. package/substrate/.claude/luminaries/ash-maurya.md +121 -0
  42. package/substrate/.claude/luminaries/bill-buxton.md +210 -0
  43. package/substrate/.claude/luminaries/charles-sanders-peirce.md +150 -0
  44. package/substrate/.claude/luminaries/david-ogilvy.md +192 -0
  45. package/substrate/.claude/luminaries/don-norman.md +173 -0
  46. package/substrate/.claude/luminaries/edward-tufte.md +179 -0
  47. package/substrate/.claude/luminaries/eric-evans.md +160 -0
  48. package/substrate/.claude/luminaries/frederick-brooks.md +50 -0
  49. package/substrate/.claude/luminaries/gang-of-four.md +157 -0
  50. package/substrate/.claude/luminaries/jason-fried-dhh.md +46 -0
  51. package/substrate/.claude/luminaries/jesse-james-garrett.md +154 -0
  52. package/substrate/.claude/luminaries/john-ousterhout.md +94 -0
  53. package/substrate/.claude/luminaries/karl-popper.md +132 -0
  54. package/substrate/.claude/luminaries/kent-beck.md +168 -0
  55. package/substrate/.claude/luminaries/linus-torvalds.md +218 -0
  56. package/substrate/.claude/luminaries/martin-fowler.md +164 -0
  57. package/substrate/.claude/luminaries/michael-feathers.md +125 -0
  58. package/substrate/.claude/luminaries/michael-nygard.md +118 -0
  59. package/substrate/.claude/luminaries/robert-c-martin.md +164 -0
  60. package/substrate/.claude/luminaries/saltzer-schroeder.md +194 -0
  61. package/substrate/.claude/luminaries/sophia-prater.md +193 -0
  62. package/substrate/.claude/luminaries/stephen-toulmin.md +131 -0
  63. package/substrate/.claude/rules/artifact-ingestion.md +179 -0
  64. package/substrate/.claude/rules/assert-only-after-verify.md +137 -0
  65. package/substrate/.claude/rules/blocked-items.md +146 -0
  66. package/substrate/.claude/rules/branching.md +28 -0
  67. package/substrate/.claude/rules/commit-conventions.md +22 -0
  68. package/substrate/.claude/rules/context-engineering.md +202 -0
  69. package/substrate/.claude/rules/context-management.md +85 -0
  70. package/substrate/.claude/rules/destructive-operations.md +69 -0
  71. package/substrate/.claude/rules/diagnosis.md +38 -0
  72. package/substrate/.claude/rules/guardrails.md +73 -0
  73. package/substrate/.claude/rules/identifier-leak-prevention.md +104 -0
  74. package/substrate/.claude/rules/lite-manifest-schema-change-discipline.md +98 -0
  75. package/substrate/.claude/rules/oo-ad-entry-point.md +117 -0
  76. package/substrate/.claude/rules/operator-facing-prose.md +196 -0
  77. package/substrate/.claude/rules/plain-english-discipline.md +154 -0
  78. package/substrate/.claude/rules/pr-body-shape.md +317 -0
  79. package/substrate/.claude/rules/pr-strategy.md +167 -0
  80. package/substrate/.claude/rules/sdlc-gates.md +149 -0
  81. package/substrate/.claude/rules/session-artifacts.md +236 -0
  82. package/substrate/.claude/rules/state-schema-validation.md +162 -0
  83. package/substrate/.claude/rules/whereami-load-bearing.md +202 -0
  84. package/substrate/.claude/rules/writing-craft-discipline.md +92 -0
  85. package/substrate/.claude/skills/build/SKILL.md +640 -0
  86. package/substrate/.claude/skills/decompose/SKILL.md +280 -0
  87. package/substrate/.claude/skills/diagnose/SKILL.md +297 -0
  88. package/substrate/.claude/skills/howdoi/SKILL.md +105 -0
  89. package/substrate/.claude/skills/ia-model/SKILL.md +108 -0
  90. package/substrate/.claude/skills/interaction-design/SKILL.md +112 -0
  91. package/substrate/.claude/skills/interpret-input/SKILL.md +180 -0
  92. package/substrate/.claude/skills/kiss/SKILL.md +449 -0
  93. package/substrate/.claude/skills/launch/SKILL.md +924 -0
  94. package/substrate/.claude/skills/lean-canvas/SKILL.md +332 -0
  95. package/substrate/.claude/skills/longrun/SKILL.md +426 -0
  96. package/substrate/.claude/skills/luminary/SKILL.md +481 -0
  97. package/substrate/.claude/skills/ogilvy-writing-audit/SKILL.md +177 -0
  98. package/substrate/.claude/skills/onboard-repo/SKILL.md +2190 -0
  99. package/substrate/.claude/skills/pattern-review/SKILL.md +99 -0
  100. package/substrate/.claude/skills/personas/SKILL.md +207 -0
  101. package/substrate/.claude/skills/promote/SKILL.md +283 -0
  102. package/substrate/.claude/skills/requirement/SKILL.md +98 -0
  103. package/substrate/.claude/skills/retro/SKILL.md +117 -0
  104. package/substrate/.claude/skills/riff/SKILL.md +114 -0
  105. package/substrate/.claude/skills/roadmap-reconcile/SKILL.md +163 -0
  106. package/substrate/.claude/skills/session-end/SKILL.md +309 -0
  107. package/substrate/.claude/skills/session-log/SKILL.md +299 -0
  108. package/substrate/.claude/skills/skills/SKILL.md +228 -0
  109. package/substrate/.claude/skills/spec/SKILL.md +105 -0
  110. package/substrate/.claude/skills/sprint/SKILL.md +392 -0
  111. package/substrate/.claude/skills/stage/SKILL.md +384 -0
  112. package/substrate/.claude/skills/state-a-problem/SKILL.md +185 -0
  113. package/substrate/.claude/skills/temperance/SKILL.md +108 -0
  114. package/substrate/.claude/skills/use-case/SKILL.md +417 -0
  115. package/substrate/.claude/skills/user-stories/SKILL.md +268 -0
  116. package/substrate/.claude/skills/value-prop/SKILL.md +251 -0
  117. package/substrate/.claude/skills/verify/SKILL.md +160 -0
  118. package/substrate/.claude/skills/whereami/SKILL.md +307 -0
  119. package/substrate/AGENTS.md +79 -0
  120. package/substrate/CLAUDE-lite.md +85 -0
  121. package/substrate/CODE_OF_CONDUCT.md +28 -0
  122. package/substrate/CONTRIBUTING.md +177 -0
  123. package/substrate/README.md +173 -0
  124. package/substrate/SECURITY.md +19 -0
  125. package/substrate/architecture/decisions/ADR-029-release-pipeline.md +79 -0
  126. package/substrate/architecture/decisions/ADR-031-non-breaking-changes-adopter-discipline.md +139 -0
  127. package/substrate/architecture/decisions/ADR-032-adopter-sync-dispatcher-architecture.md +192 -0
  128. package/substrate/architecture/decisions/ADR-039-release-tagging-scheme.md +145 -0
  129. package/substrate/architecture/decisions/ADR-040-planning-skill-vocabulary-and-lite-profile.md +155 -0
  130. package/substrate/architecture/decisions/ADR-044-unified-skill-body-template.md +162 -0
  131. package/substrate/lib/clean-artifacts-sweep.sh +112 -0
  132. package/substrate/lib/code-comment-discipline.sh +144 -0
  133. package/substrate/lib/composer-preflight.sh +459 -0
  134. package/substrate/lib/hook-inject.sh +255 -0
  135. package/substrate/lib/luminary-pick.sh +96 -0
  136. package/substrate/lib/output-discipline.sh +143 -0
  137. package/substrate/lib/rewrite-check.sh +214 -0
  138. package/substrate/lib/state.sh +1372 -0
  139. package/substrate/lib/telemetry.sh +205 -0
  140. package/substrate/lib/tier-check.sh +138 -0
  141. package/substrate/lib/tier-dependency-audit.sh +933 -0
  142. package/substrate/presence/install/bassclef-hook-connect.sh +178 -0
  143. package/substrate/presence/install/bassclef-sync.dispatcher.template.sh +841 -0
  144. package/substrate/presence/install/bassclef-sync.template.sh +2076 -0
  145. package/substrate/presence/install/schedule-auto-save.cron.sh +88 -0
  146. package/substrate/presence/install/schedule-auto-save.taskscheduler.md +122 -0
  147. package/substrate/scripts/aggregate-telemetry.sh +217 -0
  148. package/substrate/scripts/analyze-tier-dependencies.sh +239 -0
  149. package/substrate/scripts/generate-lite-manifest.sh +489 -0
  150. package/substrate/scripts/generate-tier-manifest.sh +28 -0
  151. package/substrate/scripts/intent-drift-check.sh +456 -0
  152. package/substrate/scripts/lite-manifest-drift-check.sh +146 -0
  153. package/substrate/scripts/render-lite-manifest-doc.sh +150 -0
  154. package/substrate/standards/bassclef-configs-schema.md +232 -0
  155. package/substrate/standards/bassclef-evolution.md +143 -0
  156. package/substrate/standards/bassclef-internal-jargon.md +244 -0
  157. package/substrate/standards/bassclef-managed-sentinel.md +96 -0
  158. package/substrate/standards/bassclef-source-config.md +228 -0
  159. package/substrate/standards/deferred-actions-schema.md +204 -0
  160. package/substrate/standards/docs-sync-allowlist.md +76 -0
  161. package/substrate/standards/graceful-exit.md +227 -0
  162. package/substrate/standards/hook-idempotency.md +102 -0
  163. package/substrate/standards/lite-manifest-schema-changes.md +75 -0
  164. package/substrate/standards/luminary-problem-patterns.md +481 -0
  165. package/substrate/standards/ogilvy-writing-rules.md +225 -0
  166. package/substrate/standards/opener-discipline.md +96 -0
  167. package/substrate/standards/operator-facing-prose-discipline.md +201 -0
  168. package/substrate/standards/project-directory-layout.md +276 -0
  169. package/substrate/standards/release-tagging.md +137 -0
  170. package/substrate/standards/sdlc-compliance.md +286 -0
  171. package/substrate/standards/secrets-lifecycle.md +210 -0
  172. package/substrate/standards/security-scanner-adapter.md +145 -0
  173. package/substrate/standards/skill-output-discipline.md +90 -0
  174. package/substrate/standards/state-spine.md +511 -0
  175. package/substrate/standards/tech-stack-config.md +109 -0
  176. package/substrate/standards/tier-dependency-analysis.md +167 -0
  177. package/substrate/standards/tier-runtime-deps/lite.md +57 -0
  178. package/substrate/standards/tier-tag-schema.md +155 -0
  179. package/substrate/standards/whereami-schema.md +301 -0
  180. package/substrate/standards/writing-guide.md +213 -0
  181. package/substrate/templates/deferred-action-template.md +45 -0
  182. package/substrate/templates/whereami-template.md +101 -0
@@ -0,0 +1,202 @@
1
+ ---
2
+ tier: lite
3
+ description: docs/whereami.md is the authoritative project-state snapshot in every bassclef-substrate repo.
4
+ ---
5
+
6
+ # Whereami Load-Bearing
7
+
8
+ `docs/whereami.md` is the authoritative project-state snapshot in
9
+ every bassclef-substrate repo. This rule establishes its load-bearing
10
+ obligations: session-start read, session-end write, and protocol when
11
+ the artifact is missing or stale.
12
+
13
+ ## Why this rule exists
14
+
15
+ Whereami existed as an optional artifact and rotted because nothing
16
+ demanded its maintenance. Evidence observed 2026-04-16:
17
+
18
+ - Bassclef's own whereami dated same day but field said "Active
19
+ agents: None" during active mid-session work — stale by default
20
+ - POA (first app consumer) has no whereami at all — `/sprint` has
21
+ to reconstruct state from iteration-bets + chronicles + git log
22
+ - `/sprint` skill's own procedure (step 4) phrased whereami as
23
+ conditional ("if docs/whereami.md exists") — treating it as a
24
+ nice-to-have reinforced its rot
25
+
26
+ Load-bearing means: the artifact is required input for at least one
27
+ skill, required output for at least one other, hook-enforced fresh,
28
+ and operator-visible when it goes stale. This rule establishes all
29
+ four.
30
+
31
+ ## Protocol
32
+
33
+ ### Session-start read (MUST)
34
+
35
+ Every session's orientation pass reads `docs/whereami.md` BEFORE
36
+ consulting iteration-bets or chronicles for project-state questions.
37
+ Downstream skills (`/sprint`, `/substrate-check`) use whereami as
38
+ primary source, not fallback.
39
+
40
+ If the artifact is missing or stale (per freshness rules below), the
41
+ `bassclef-sync.sh` session-start hook fires BLOCKED (per
42
+ `blocked-items.md`). The session does not proceed with substantive
43
+ work until resolved or explicitly deferred.
44
+
45
+ ### Session-end write (MUST)
46
+
47
+ Every `/session-end` execution updates `docs/whereami.md`:
48
+
49
+ - Bump `last_updated` to current UTC timestamp
50
+ - Set `session:` field to the chronicle filename just written
51
+ - Update any field that materially changed during the session:
52
+ - `phase:` if project phase transitioned
53
+ - `iteration_bet:` if bet opened or closed
54
+ - `iteration_phase:` if WS advanced
55
+ - Subsystem row if subsystem moved
56
+ - Gate progress checkboxes if any toggled
57
+
58
+ Same tier as chronicle — non-negotiable session artifact.
59
+
60
+ ### Freshness rules
61
+
62
+ Hook checks two signals: `last_updated` field age **AND** commits-since-
63
+ last-whereami-update (computed via `git log -1 --format=%H -- docs/whereami.md`
64
+ + `git rev-list --count <commit>..HEAD`). Both signals together close the
65
+ "idle consumer" false-positive loop where calendar age alone fired BLOCKED
66
+ on repos that hadn't done any work since the last update (bassclef#514).
67
+
68
+ | Age | Commits since whereami | Signal | Session behavior |
69
+ |-----|------------------------|--------|-----------------|
70
+ | <3 days | any | Green | Proceed normally |
71
+ | 3–7 days | any | Warning | Warning surfaced; session proceeds |
72
+ | ≥7 days | 0 (idle) | **INFO** | Friendly note that repo's idle; session proceeds |
73
+ | ≥7 days | >0 (work happened) | BLOCKED | Session halts on substantive work until refreshed |
74
+ | Missing file | n/a | BLOCKED | Session halts; create from template |
75
+
76
+ The idle-as-INFO downgrade matters because bassclef-substrate consumers
77
+ get session-start hook output even when they're not actively iterating.
78
+ A consumer paused for two weeks should get a "you're idle" note, not a
79
+ gate that interrupts the next time someone opens the repo.
80
+
81
+ Operator may override with explicit "skip whereami this session" per
82
+ `blocked-items.md` deferral rules. Silence is not deferral. INFO does
83
+ not require deferral (it's not a gate).
84
+
85
+ ### On session-start BLOCKED
86
+
87
+ When the hook surfaces a whereami-stale BLOCKED block, the agent:
88
+
89
+ 1. Echo the BLOCKED block verbatim to the operator (same pattern as
90
+ `bassclef-hook-drift-blocker.md`)
91
+ 2. Offer two paths:
92
+ - **Refresh now**: run `/session-end`-style whereami update step
93
+ at session-start as the first action
94
+ - **Defer**: operator explicitly says "skip whereami"
95
+ 3. Do NOT start other substantive work until one of the paths is
96
+ taken
97
+
98
+ ### On missing file
99
+
100
+ Fresh consumer repo scenario. `bassclef-sync.sh` surfaces BLOCKED:
101
+ "docs/whereami.md missing; create from templates/whereami-template.md"
102
+
103
+ Agent proposes to copy the template and fill minimal fields
104
+ (phase, iteration — or "none — new repo"). Operator approves or
105
+ overrides.
106
+
107
+ ## What counts as a material change (session-end trigger)
108
+
109
+ Anything that changed the answer to "where are we?":
110
+
111
+ - Phase transition (Inception → Elaboration, etc.)
112
+ - Iteration opened, closed, or re-shaped
113
+ - WS within active goal advanced (WS-1 → WS-2)
114
+ - Subsystem row's phase or "last iteration" date changed
115
+ - Gate progress checkbox toggled
116
+ - Active agents changed (sequential→multi-agent or vice versa)
117
+
118
+ What does NOT trigger: just timestamp refresh without any field change
119
+ is still a valid update (keeps freshness meter green). The obligation
120
+ is to bump `last_updated` every session; field changes are additive.
121
+
122
+ ## Who reads whereami (and relies on it being fresh)
123
+
124
+ - `/sprint` — primary source for orientation (step 1, not step 4
125
+ fallback)
126
+ - `bassclef-sync.sh` — freshness check only
127
+ - `/substrate-check` — presence + schema validation
128
+ - Operator — ad-hoc project-state eyeballing
129
+ - Chronicle writer — phase context for retrospective
130
+
131
+ ## Live vs archive split (per bassclef-upstream#1080)
132
+
133
+ `docs/whereami.md` is the LIVE file — carries frontmatter + recap blocks from the last 7 days. Older recap blocks move to `docs/whereami-archive/YYYY-MM.md` — one file per calendar month, appended chronologically.
134
+
135
+ The split exists because `docs/whereami.md` grew past the `Read` tool's 256KB ceiling on 2026-08-04. Session-start Step 0.4 mandatory read broke. Rotation restores the Read path; archive preserves history.
136
+
137
+ **Contract:**
138
+
139
+ - Live keeps the last 7 days of `operator_recap_*` blocks (default; override via `scripts/rotate-whereami.py --days N`)
140
+ - Archive holds older blocks grouped by month
141
+ - Live carries an `archive_dir:` field in frontmatter naming the archive location
142
+ - Session-start freshness signal reads live only — archive is read-only historical
143
+ - Rotation runs on SessionStart when live file exceeds 250KB via `.claude/hooks/session-reflection.d/36-whereami-size-check.sh`. Fires with `--days 3` (tighter than the 7-day default) because dense session weeks fill 7 days past the Read tool 256KB ceiling per bassclef-upstream#1284. Operator can run manually anytime with `--days N`; the script is idempotent (re-runs do not duplicate).
144
+
145
+ **What reads from archive:**
146
+
147
+ - Operator when they need >7 day historical context
148
+ - `/journal` when writing session narratives that span the rotation boundary
149
+ - Explicit follow-up queries (e.g., "what happened in 2026-07?")
150
+
151
+ **What reads from live only:**
152
+
153
+ - Session-start freshness signals (per this rule)
154
+ - `/sprint` orientation (primary source)
155
+ - `/substrate-check` (presence + schema validation)
156
+ - Chronicle writer at session-end (updates live only)
157
+
158
+ ## What whereami is NOT
159
+
160
+ Artifacts adjacent to whereami have distinct roles. Don't conflate:
161
+
162
+ - **Iteration bet** (scope contract) — whereami references it by path
163
+ - **Chronicle** (retrospective narrative) — whereami is current-state
164
+ snapshot
165
+ - **substrate.config.md** (external resources) — different concern
166
+ (where is X vs. where are we)
167
+ - **Risk register** — separate artifact; whereami points to it
168
+
169
+ ## Override paths
170
+
171
+ - `SKIP_WHEREAMI=1 <command>` — per-command override (logged to trace)
172
+ - Operator statement: "skip whereami this session" — verbatim deferral
173
+ per `blocked-items.md`
174
+ - `substrate.config.md: whereami_freshness_days: N` — per-repo
175
+ threshold override (if N=0, freshness check disabled, but presence
176
+ still required)
177
+
178
+ ## Relationship to other rules
179
+
180
+ - `blocked-items.md` — BLOCKED protocol; whereami staleness fires it
181
+ - `session-artifacts.md` — chronicle + journal-entry obligations; whereami
182
+ joins this tier
183
+ - `bassclef-hook-drift-blocker.md` — same hook-fired BLOCKED pattern;
184
+ whereami BLOCKED mirrors its shape
185
+ - `sdlc-gates.md` — session-start orientation is where whereami fires
186
+ in the gate ordering
187
+ - `artifact-ingestion.md` — whereami is one of the "prior artifacts" a
188
+ session-start orientation MUST read before producing
189
+
190
+ ## Enforcement
191
+
192
+ - Hook: `bassclef-sync.sh` section emits BLOCKED on stale/missing
193
+ (added `BASSCLEF_SYNC_VERSION` bump in WS-3 of bet 2026-04-16c)
194
+ - Skill: `/session-end` procedure includes whereami-update as MUST
195
+ tier
196
+ - Skill: `/sprint` procedure reads whereami as step 1 primary source
197
+ - Skill: `/substrate-check` validates presence + schema conformance
198
+ - Template: `templates/whereami-template.md` provides start
199
+ shape; `/autonomous start` creates from template
200
+
201
+ The rule stands regardless of hook availability. The hook is the
202
+ mechanical backstop; the rule is the reasoning.
@@ -0,0 +1,92 @@
1
+ ---
2
+ tier: lite
3
+ description: Plain check. Before I ship any operator-facing prose in this turn, I run the six Ogilvy tests against my draft. If any test fails, I rewrite before I ship.
4
+ ---
5
+
6
+ # Writing-craft discipline
7
+
8
+ **Plain check.** Before I ship any operator-facing prose in this turn, I run the six Ogilvy tests against my draft. If any test fails, I rewrite before I ship.
9
+
10
+ ---
11
+
12
+ This rule loads every session. It sits alongside `.claude/rules/plain-english-discipline.md` (grade + vocabulary) and adds writing-craft tests grounded in Ogilvy's 1982 "How to Write" memo plus Roman and Raphaelson's *Writing That Works* (1981). Full reference: `standards/ogilvy-writing-rules.md`. Luminary anchor: `.claude/luminaries/david-ogilvy.md`.
13
+
14
+ ## The six first-person composition tests
15
+
16
+ Before I write each sentence or paragraph in operator-facing prose, I ask:
17
+
18
+ **1. Natural voice.** Would a real person say this to a respected peer? If it sounds like corporate throat-clearing ("Please be advised that...", "It has come to my attention..."), I rewrite in natural voice.
19
+
20
+ **2. Short units.** Is this sentence past 25 words? If yes, I split it. Is this paragraph past 6 sentences? If yes, I split it. Is there a shorter word for what I mean? If yes, I use the shorter word (utilize → use; commence → start; endeavor → try).
21
+
22
+ **3. Read-aloud.** When I read this passage in my head, does it stumble? Tongue-twisters, long lines with no comma rest, unintentional rhymes, repeated words — any of those means I rewrite until it flows.
23
+
24
+ **4. Completeness.** 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? If the point is implied but not stated, I state it.
25
+
26
+ **5. Honesty.** Am I saying what I mean or hiding behind softening language? Weasel words ("arguably", "somewhat", "perhaps"), euphemisms ("right-sizing", "reached out"), passive voice hiding the actor ("mistakes were made") — any of these means I rewrite straight.
27
+
28
+ **6. Facts with context.** For each number, fact, or data point in my draft: does the reader know why it matters? If I have "Revenue was 4.2M" with no interpretation, either I add the interpretation ("up 30 percent year over year") or I drop the fact.
29
+
30
+ ## When this rule fires
31
+
32
+ Every operator-facing surface:
33
+
34
+ - Turn prose in agent responses
35
+ - PR body Summary and Test plan sections
36
+ - Ticket body Problem sections
37
+ - Chronicle body sections
38
+ - Journal entries
39
+ - Handoff notes
40
+ - Deferred-action entries
41
+
42
+ Skips (Ogilvy's rules do not apply, or apply differently):
43
+
44
+ - Code blocks
45
+ - File paths and function names
46
+ - Structured schema output (JSON, YAML)
47
+ - Backticked terms and API references
48
+ - Test-list blocks in test files (structured audit surface)
49
+ - Frontmatter fields (structured metadata)
50
+
51
+ ## Composes with
52
+
53
+ - `.claude/rules/plain-english-discipline.md` — grade level + vocabulary substitution table. Composes: this rule covers craft; that rule covers grade + jargon list.
54
+ - `.claude/rules/operator-facing-prose.md` — gloss + `/kiss` meta-discipline at every operator-facing surface
55
+ - `.claude/rules/context-engineering.md` — INSTEAD-block discipline foundational to bassclef's rule writing
56
+ - `standards/ogilvy-writing-rules.md` — full reference with violation patterns and fixes
57
+ - `standards/bassclef-internal-jargon.md` — extended wordlist Rule 3 references
58
+ - `.claude/luminaries/david-ogilvy.md` — luminary anchor
59
+ - `.claude/skills/ogilvy-writing-audit/SKILL.md` — operator-invocable audit (produces severity-tagged violations)
60
+ - `.claude/skills/kiss/SKILL.md` — /kiss words composes with the audit (audit diagnoses, kiss fixes)
61
+
62
+ ## Distinct from
63
+
64
+ - **plain-english-discipline** — that rule targets grade 8-9 (grade 8 after ticket #935 lands) and enforces the jargon list. This rule targets craft — natural voice, short units, read-aloud, completeness, honesty, facts-with-context. The two fire together at every surface.
65
+ - **operator-facing-prose** — that rule is the meta-discipline (gloss shorthand, /kiss pass on SKILL.md edits). This rule is the compose-time check.
66
+
67
+ ## Anti-patterns
68
+
69
+ **Draft-and-ship without running the six tests.** The rule loads but the agent skips the checks at composition time. Failure mode: prose ships jargon-heavy, long-sentenced, or facts-without-context. Fix: read each sentence against the six tests before I ship the turn.
70
+
71
+ **Rewriting only on hook flag.** The turn-prose-kiss-check hook fires post-Stop; running the six tests only when the hook flags means catching after the fact. Fix: run at composition time, per the Plain check at the top of this rule.
72
+
73
+ **Selective application.** Applying the tests to some paragraphs but not others (e.g., only the opener). Failure mode: middle paragraphs drift. Fix: every sentence in every operator-facing paragraph gets the six-test check.
74
+
75
+ ## Override
76
+
77
+ `SKIP_WRITING_CRAFT=1 <command>` — logged via trace-helper. Use only for quoted external content that must ship verbatim (e.g., quoting Ogilvy's memo in the reference standard).
78
+
79
+ ## Refs
80
+
81
+ - Ticket #934 — this rule's filing (Ogilvy skill + luminary + rule + standard)
82
+ - Sister rule `plain-english-discipline.md` (bassclef#790)
83
+ - Sister rule `operator-facing-prose.md` (bassclef#790)
84
+ - Parent /diagnose #833 (why /kiss drifts)
85
+ - Standard `standards/ogilvy-writing-rules.md`
86
+ - Luminary `.claude/luminaries/david-ogilvy.md`
87
+ - Ogilvy — "How to Write" memo (1982)
88
+ - Roman + Raphaelson — *Writing That Works* (Harper and Row, 1981)
89
+
90
+ ## Retirement condition
91
+
92
+ This rule retires only if bassclef stops shipping operator-facing prose. Specific tests may evolve; the discipline of prose-as-craft persists.