diff options
| author | Craig Jennings <c@cjennings.net> | 2026-05-26 03:03:48 -0500 |
|---|---|---|
| committer | Craig Jennings <c@cjennings.net> | 2026-05-26 03:03:48 -0500 |
| commit | 4fac2a09e5bd395f4058f2e2f5a3e1dab662af87 (patch) | |
| tree | faff5a4b79d6004437812805cc138e69456de51b | |
| parent | b7b932d208849b69917ab076f5d990ce6a208fdd (diff) | |
| download | rulesets-4fac2a09e5bd395f4058f2e2f5a3e1dab662af87.tar.gz rulesets-4fac2a09e5bd395f4058f2e2f5a3e1dab662af87.zip | |
feat(voice): add prose mode for Craig-authored prose + strengthen em-dash, fragments, formatting
The personal voice patterns only ran for commits and PRs, so the emails and documents I author never got my actual writing voice. General mode deliberately skips them. I added a third mode, prose, that applies my voice patterns to prose I write or send without dragging in the publish-artifact mechanics that misfire on free text.
The modes now nest. General (#1-31) handles anyone's prose, prose adds my voice patterns (em-dash zero-tolerance, contractions, semicolons to periods, sentence-split, felt-experience cut, fragment rewrite, terse-cut, no-emphasis-formatting), and personal adds the three artifact-mechanics patterns on top (first-person rewrite, public-artifact scope flag, praise/correction asymmetry). Those three stay personal-only because they assume a commit or PR: a document is legitimately third-person, a journal has no public-scope concern, and praise/correction asymmetry is a PR-review rule.
Three gaps closed along the way. #13 (em-dash) was "use fewer". It's now zero-tolerance in prose and personal modes, and the rule holds inside examples and quoted text, not just running prose. #37 (every prose sentence needs a subject and a verb) was locked to personal mode. It now applies to my prose too. And #41 is new: I make points with words, not bold or italics or underscores, so emphasis markup gets rephrased so the stress lives in the wording.
I updated commits.md to match. The publish flow still uses personal mode, but the pattern count is now 41 and the personal-only set is the three artifact-mechanics patterns.
| -rw-r--r-- | claude-rules/commits.md | 12 | ||||
| -rw-r--r-- | voice/SKILL.md | 73 |
2 files changed, 51 insertions, 34 deletions
diff --git a/claude-rules/commits.md b/claude-rules/commits.md index d5bcd10..412b610 100644 --- a/claude-rules/commits.md +++ b/claude-rules/commits.md @@ -286,7 +286,7 @@ enough to skip review" exemption on top of it. **Voice patterns and the approval gate are two independent decisions.** Don't bundle them. -*Voice patterns are always personal for publish artifacts.* Commit messages, PR titles + bodies, and PR review comments all go out under the user's name, so they always run through `/voice personal` (39 patterns, including the 8 personal-only ones), regardless of whether `.ai/` is tracked. These three are personal-voice artifacts by definition — the skill's personal mode exists for exactly them. Pattern #39 (public-artifact scope flag) matters *most* on team-visible artifacts, so it must never be skipped on a PR comment or PR body. There is no "general-voice mode" for publish artifacts. +*Voice patterns are always personal for publish artifacts.* Commit messages, PR titles + bodies, and PR review comments all go out under the user's name, so they always run through `/voice personal` (41 patterns — general + Craig's-voice + the three artifact-mechanics patterns: first-person rewrite, public-artifact scope flag, praise/correction asymmetry), regardless of whether `.ai/` is tracked. These three are personal-voice artifacts by definition — the skill's personal mode exists for exactly them. Pattern #39 (public-artifact scope flag) matters *most* on team-visible artifacts, so it must never be skipped on a PR comment or PR body. There is no "general-voice mode" for publish artifacts. *The approval gate is the only thing `.ai/`-tracking decides.* Before drafting, run this command: @@ -304,8 +304,8 @@ Either way the draft runs through `/voice personal` first. The subflows below de **For commit messages:** 1. Write the proposed message to `/tmp/commit-<short-slug>.md`. -2. Run `/voice personal` on the file. Always. The skill walks 39 patterns covering signs of AI writing, universal good-writing rules (Strunk & White, Orwell, Plain English, Garner), and the personal voice patterns (first-person rewrite, semicolons → periods/commas, contractions, sentence-split on conjunctions, felt-experience cut, sentence-fragment rewrite, terse cut for rhetorical padding, public-artifact scope flag). The commit subject line stays imperative per Conventional Commits — `/voice personal` rewrites the body, not the subject. Skip the pass for purely mechanical commits (a chore version bump, a typo fix) where the subject alone carries the message. -3. Print the final draft inline in the terminal. Every line, exactly as it'll be committed. No truncation, no summary. State that the skill ran (e.g. "/voice personal — 39 patterns walked"). If pattern #39 (public-artifact scope) flagged anything, surface those warnings; the user resolves them manually. +2. Run `/voice personal` on the file. Always. The skill walks 41 patterns covering signs of AI writing, universal good-writing rules (Strunk & White, Orwell, Plain English, Garner), and Craig's voice patterns (first-person rewrite, semicolons → periods/commas, contractions, sentence-split on conjunctions, felt-experience cut, sentence-fragment rewrite, terse cut for rhetorical padding, no-emphasis-formatting, public-artifact scope flag, praise/correction asymmetry). The commit subject line stays imperative per Conventional Commits — `/voice personal` rewrites the body, not the subject. Skip the pass for purely mechanical commits (a chore version bump, a typo fix) where the subject alone carries the message. +3. Print the final draft inline in the terminal. Every line, exactly as it'll be committed. No truncation, no summary. State that the skill ran (e.g. "/voice personal — 41 patterns walked"). If pattern #39 (public-artifact scope) flagged anything, surface those warnings; the user resolves them manually. 4. Ask: approve, request changes, or open in editor. Wait for an explicit answer. Do not open the file in `emacsclient` (or any editor) by default — print first, edit only if asked. - **Approve** → commit with `git commit -F /tmp/commit-<short-slug>.md`. - **Request changes** → make them, re-run `/voice personal`, re-print inline, ask again. @@ -353,9 +353,9 @@ Pick the shape first. Most reviews are Shape 1. The separator format is exactly `=== SUMMARY ===` and `=== INLINE path=<path> line=<n> ===`. The summary block is mandatory even for verdict-only reviews. Inline blocks are zero-or-more. -3. Run `/voice personal` on the file once. The skill walks all 39 patterns across every block at the same time. The separators stay intact because they aren't prose. +3. Run `/voice personal` on the file once. The skill walks all 41 patterns across every block at the same time. The separators stay intact because they aren't prose. -4. Print the final draft inline in the terminal. Every block, exactly as it'll be posted, with its separator header. State that the skill ran (e.g. "/voice personal — 39 patterns walked across summary + 3 inline"). Surface any pattern #39 warnings. +4. Print the final draft inline in the terminal. Every block, exactly as it'll be posted, with its separator header. State that the skill ran (e.g. "/voice personal — 41 patterns walked across summary + 3 inline"). Surface any pattern #39 warnings. 5. Ask: approve, request changes, or open in editor. Wait for an explicit answer. Do not open the file in `emacsclient` (or any editor) by default. - **Approve** → continue to step 6. @@ -414,7 +414,7 @@ conversation (e.g. "commit this as `chore: bump version`", "reply just `/review-code` in Step 1 still runs when it applies; Phase 0 of that skill handles trivial diffs, and acknowledgment-only replies don't need it at all. -**Single-skill gate.** Each of the three subflows above runs `/voice personal` before printing the draft — 39 patterns covering AI-writing signs, universal good-writing rules, and the 8 personal-only patterns. Publish artifacts (commits, PR titles + bodies, PR review comments) always use personal mode; the `.ai/`-tracking check at the top of Step 2 decides only whether the approval gate fires, not which patterns run. Running the skill is mandatory; the printed draft must have been through it. When the user asks mid-flow for "the voice pass" on an in-progress draft, that means re-run the full 39-pattern walk — not a subset. Always state that the skill ran when announcing the printed draft (e.g. "/voice personal — 39 patterns walked"). Skipping the pass without flagging it is a defect. +**Single-skill gate.** Each of the three subflows above runs `/voice personal` before printing the draft — 41 patterns covering AI-writing signs, universal good-writing rules, Craig's voice patterns, and the three artifact-mechanics patterns (first-person rewrite, public-artifact scope flag, praise/correction asymmetry). Publish artifacts (commits, PR titles + bodies, PR review comments) always use personal mode; the `.ai/`-tracking check at the top of Step 2 decides only whether the approval gate fires, not which patterns run. Running the skill is mandatory; the printed draft must have been through it. When the user asks mid-flow for "the voice pass" on an in-progress draft, that means re-run the full 41-pattern walk — not a subset. Always state that the skill ran when announcing the printed draft (e.g. "/voice personal — 41 patterns walked"). Skipping the pass without flagging it is a defect. **If `/voice` is unavailable.** The skill should be installed (it ships with rulesets), but a fresh or partial environment may not have it. Don't let that block the publish, and don't skip the discipline silently. Walk the same patterns inline — they're documented in the skill, and the publish flow already names which ones matter (first-person rewrite, semicolons → periods/commas, contractions, sentence-split, felt-experience cut, fragment rewrite, terse cut, the pattern #39 public-artifact scope flag, plus the AI-writing and good-writing passes). Then state that the skill was unavailable and the pass was applied by hand (e.g. "/voice unavailable — patterns walked inline"). The gate is the pattern walk, not the tooling; the skill is the convenient way to run it, not the only way. Flag the missing skill so it gets installed. diff --git a/voice/SKILL.md b/voice/SKILL.md index af10275..4572197 100644 --- a/voice/SKILL.md +++ b/voice/SKILL.md @@ -1,7 +1,7 @@ --- name: voice description: | - Multi-pass prose editor with two modes. General mode (default) edits arbitrary writing — research notes, essays, emails, README prose — by walking 31 patterns: Wikipedia's Signs of AI Writing patterns plus universal good-writing rules (long-word → short-word, active-over-passive, comma splices, cliché flag, jargon-fragment-in-prose rewrite, corporate-speak nominalizations). Personal mode adds 9 more patterns for commits, PR titles + bodies, and PR review comments (first-person rewrite, semicolons → periods/commas, contractions, sentence-split on conjunctions, felt-experience narration cut, sentence-fragment-in-prose rewrite, terse-cut for rhetorical padding, public-artifact scope flag, praise/correction asymmetry). Total 40 patterns; one editorial review covers all relevant ones for the chosen mode. Replaces the standalone humanizer skill. Use when editing prose. Do NOT use for code, structured data, or plain bullet lists where fragments are valid. + Multi-pass prose editor with three modes. General mode (default) edits arbitrary writing — research notes, essays, anyone's README prose — by walking 31 patterns: Wikipedia's Signs of AI Writing patterns plus universal good-writing rules (long-word → short-word, active-over-passive, comma splices, cliché flag, jargon-fragment-in-prose rewrite, corporate-speak nominalizations). Prose mode adds Craig's writing-voice patterns for prose he authors or sends — emails, documents, notes — on top of general (em-dash zero-tolerance, no-emphasis-formatting, contractions, semicolons → periods, sentence-split, felt-experience cut, sentence-fragment rewrite, terse-cut). Personal mode is for publish artifacts only (commits, PR titles + bodies, PR review comments) and adds the artifact-mechanics patterns on top of prose (first-person rewrite, public-artifact scope flag, praise/correction asymmetry). Total 41 patterns; one editorial review covers all relevant ones for the chosen mode. Replaces the standalone humanizer skill. Use when editing prose. Do NOT use for code, structured data, or plain bullet lists where fragments are valid. allowed-tools: - Read - Write @@ -17,18 +17,19 @@ You are a writing editor that walks a numbered pattern list against a piece of t ## Modes -Two modes determine which patterns to walk. +Three modes determine which patterns to walk. They nest: prose is general plus Craig's writing-voice patterns; personal is prose plus the artifact-mechanics patterns. -- **General** (default) — apply patterns **#1-31**. Use for any writing not bound for commits, PRs, or PR comments: research notes, philosophy or history essays, emails, README prose, journal entries, anything else. Output is well-edited human-sounding prose, but does not impose first-person voice, contraction enforcement, or other personal-style choices that conflict with academic, literary, or formal registers. -- **Personal** — apply all **#1-40**. Use only for commits, PR titles + bodies, and PR review comments. Patterns marked **(personal only)** are skipped in general mode because they conflict with non-publish registers (third-person is valid in academic prose, semicolons are conventional in long-form writing, fragments are valid stylistic devices in literary prose, felt-experience is the content of personal essays, and so on). +- **General** (default) — apply patterns **#1-31**. Use for writing whose author isn't Craig and that isn't a publish artifact: research notes you're editing for someone else, a quoted passage, README prose for a shared project, any third-party text. Output is well-edited human-sounding prose, but does not impose Craig's voice (first-person, contractions, em-dash elimination) — those conflict with academic, literary, or formal registers that aren't his. +- **Prose** — apply **#1-31** plus the patterns tagged **(prose + personal)**: em-dash zero-tolerance (#13), contractions (#34), semicolons → periods (#33), sentence-split (#35), felt-experience cut (#36), sentence-fragment rewrite (#37), terse-cut (#38), and no-emphasis-formatting (#41). Use for prose Craig authors or sends in his own voice that isn't a publish artifact: emails, documents he writes or hands to someone, working notes, journal entries. This is the mode that finally applies his actual writing voice to the documents he most wants it on. It skips the artifact-mechanics patterns (#32, #39, #40) — those assume a commit or PR and misfire on free prose (a document is legitimately third-person; a journal has no public-scope concern; praise/correction asymmetry is a PR-review rule). +- **Personal** — apply all **#1-41**. Use only for publish artifacts: commits, PR titles + bodies, and PR review comments. Adds the three artifact-mechanics patterns (#32 first-person rewrite, #39 public-artifact scope flag, #40 praise/correction asymmetry) on top of everything prose mode walks. -If invoked without a mode argument, default to general. Personal-context callers (`commits.md` publish flow, `respond-to-cj-comments.md`) invoke this skill explicitly with `/voice personal`. +If invoked without a mode argument, default to general. Prose mode is invoked explicitly with `/voice prose` (emails, authored documents). Personal-context callers (`commits.md` publish flow, `respond-to-cj-comments.md`) invoke `/voice personal`. ## Your Task When given text to edit: -1. **Identify which patterns apply** — Scan for the patterns numbered below. In general mode, skip anything tagged **(personal only)**. +1. **Identify which patterns apply** — Scan for the patterns numbered below. General mode walks #1-31 only. Prose mode adds the patterns tagged **(prose + personal)**. Personal mode adds those *and* the ones tagged **(personal only)** — i.e. all 41. 2. **Rewrite problematic sections** — Replace each detected pattern with its rewrite. 3. **Preserve meaning** — Keep the core message intact. 4. **Maintain voice** — Match the intended tone (formal, casual, technical, academic, literary). @@ -213,6 +214,8 @@ Avoiding AI patterns is half the job. Sterile, voiceless writing is just as obvi **Problem:** LLMs use em dashes (—) more than humans, mimicking "punchy" sales writing. +**Mode-dependent strength.** In **general mode** this is overuse-reduction: cut the excess, but an occasional em-dash in someone else's prose can stay. In **prose and personal modes** it's **zero-tolerance** — Craig's voice has no em-dashes at all. Replace every one with a comma, period, colon, or parentheses, whichever fits. The zero-tolerance rule holds *everywhere in the text*, including inside example blocks, code-fence prose, and quoted material — not just running prose. An em-dash in a quoted line still gets replaced. + **Before:** > The term is primarily promoted by Dutch institutions—not by the people themselves. You don't say "Netherlands, Europe" as an address—yet this mislabeling continues—even in official documents. @@ -435,9 +438,9 @@ These six patterns extend the AI-detection patterns above with canonical good-wr **After:** > The request was for a quick prototype. After the announcement, we'll review what worked. -## Personal Voice (personal mode only) +## Craig's Voice (prose + personal modes) -These eight patterns apply only when the skill is invoked in personal mode (`/voice personal`) for commits, PR titles + bodies, and PR review comments. They are explicitly skipped in general mode because they conflict with academic, literary, or formal registers — third-person is valid in academic prose, semicolons are conventional in long-form writing, contractions are typically avoided in formal text, and so on. +These patterns carry Craig's writing voice. Most apply in **both** prose mode (emails, documents, notes he authors) and personal mode (commits, PRs, PR comments) — tagged **(prose + personal)**. Three are publish-artifact-specific — tagged **(personal only)** — because they assume a commit or PR and misfire on free prose: #32 (first-person rewrite) wrongly imposes "I did X" voice on a document that's legitimately third-person, #39 (public-artifact scope flag) has nothing to guard in a private journal, and #40 (praise/correction asymmetry) is a PR-review rule. General mode skips all of them — it edits text that isn't Craig's, where contractions, em-dash elimination, and first-person would conflict with academic, literary, or formal registers. ### 32. First-Person Voice Rewrite (personal only) @@ -453,11 +456,11 @@ The subject line of a commit stays imperative per Conventional Commits ("feat: a **After:** > I added a validation step before saving. The previous flow let empty values leak into the database. I'm blocking them at the API boundary now. -### 33. Semicolon → Period or Comma (personal only) +### 33. Semicolon → Period or Comma (prose + personal) -**Detection:** Semicolons in commit-message bodies, PR descriptions, or PR review comments. +**Detection:** Semicolons in prose Craig authors — emails, documents, working notes, commit-message bodies, PR descriptions, PR review comments. -**Problem:** Few engineers use semicolons in prose. They make the writing feel unnecessarily literary. Replace with a period (split into two sentences) or a comma (when the clauses are tightly coupled). +**Problem:** Craig's voice avoids semicolons. They make the writing feel unnecessarily literary. Replace with a period (split into two sentences) or a comma (when the clauses are tightly coupled). In a genuinely formal long-form document the semicolon can be defensible, so weigh the register — but the default for his prose is to split. **Before:** > I added the validation; the previous flow allowed empty values to leak through. @@ -465,11 +468,11 @@ The subject line of a commit stays imperative per Conventional Commits ("feat: a **After:** > I added the validation. The previous flow allowed empty values to leak through. -### 34. Contractions (personal only) +### 34. Contractions (prose + personal) **Detection:** Uncontracted forms in publish-artifact prose where the contraction reads more naturally. -**Problem:** Uncontracted English reads stiff in a short prose body unless a negation or emphasis needs the weight. Prefer "it's", "that's", "don't", "we're", "I'd", "won't" in commit and PR prose. +**Problem:** Uncontracted English reads stiff in a short prose body unless a negation or emphasis needs the weight. Prefer "it's", "that's", "don't", "we're", "I'd", "won't" in his prose — emails, documents, commit and PR bodies. **Before:** > It is worth noting that the change does not break the existing flow. We are confident that this is the right approach. @@ -479,11 +482,11 @@ The subject line of a commit stays imperative per Conventional Commits ("feat: a (Note: pattern #38 catches "worth noting" as rhetorical padding — the example above shows isolated transformation; in practice both passes apply.) -### 35. Sentence Split on Conjunctions (personal only) +### 35. Sentence Split on Conjunctions (prose + personal) **Detection:** Sentences that stack three or four clauses with commas and conjunctions ("so", "and", "but"), where splitting on a conjunction would not lose meaning. -**Problem:** Long compound sentences read easier as two or three shorter ones in a publish-artifact body. Skip in academic or literary prose where deliberate long sentences are the register. +**Problem:** Long compound sentences read easier as two or three shorter ones in a prose or publish-artifact body. Skip in academic or literary prose where deliberate long sentences are the register. **Before:** > I added the validation step before saving so empty values get blocked at the API boundary, and I also added a regression test that exercises the empty-string case, but I did not change the upstream caller because that's a separate concern. @@ -491,7 +494,7 @@ The subject line of a commit stays imperative per Conventional Commits ("feat: a **After:** > I added the validation step before saving so empty values get blocked at the API boundary. I added a regression test that exercises the empty-string case. I didn't change the upstream caller because that's a separate concern. -### 36. Felt-Experience Narration (personal only) +### 36. Felt-Experience Narration (prose + personal) **Detection:** Phrases that tell the reader how the change will feel or how often the writer will use it. @@ -503,11 +506,11 @@ The subject line of a commit stays imperative per Conventional Commits ("feat: a **After:** > The build now finishes in roughly half the time it used to take. -### 37. Sentence Fragments → Complete (in prose, personal only) +### 37. Sentence Fragments → Complete (prose + personal) -**Detection:** Sentence fragments inside prose paragraphs in a commit or PR body. Bullets and headings remain fair game for fragments. +**Detection:** Sentence fragments inside prose paragraphs in any text Craig authors — an email, a document, a working note, a commit or PR body. Bullets and headings remain fair game for fragments. -**Problem:** Bullet shorthand leaking into running prose ("Two changes." "Fix incoming." "Body as decision log.") reads as bullet-list notes pasted into a paragraph. Every prose sentence needs a subject and a verb in personal mode. +**Problem:** Bullet shorthand leaking into running prose ("Two changes." "Fix incoming." "Body as decision log.") reads as bullet-list notes pasted into a paragraph. Every prose sentence needs a subject and a verb in prose and personal modes. (General mode keeps the softer #30, which exempts more — the strong "every sentence" rule is Craig's, so it rides with his voice, not with third-party text.) **Before:** > Big change to the validator. Three new patterns. Test coverage up. Old behavior preserved. @@ -515,11 +518,11 @@ The subject line of a commit stays imperative per Conventional Commits ("feat: a **After:** > I made a big change to the validator. There are three new patterns and the test coverage is up. The old behavior is preserved. -### 38. Terse Cut — Rhetorical Padding (personal only) +### 38. Terse Cut — Rhetorical Padding (prose + personal) **Detection:** Padding phrases that add length without meaning: "worth noting", "it's important to understand", "as you can see", "needless to say", "obviously", "of course", "in essence", "fundamentally". -**Problem:** Tier 1 omit-needless-words (#26) catches the most rigid offenders ("the fact that", "in order to"). Personal mode is more aggressive: also strip soft padding like "worth noting" and "it's important to understand". State the thing directly. Academic writing often retains these as transition markers; the aggressive cut is publish-only because it conflicts with that register. +**Problem:** Tier 1 omit-needless-words (#26) catches the most rigid offenders ("the fact that", "in order to"). Prose and personal modes are more aggressive: also strip soft padding like "worth noting" and "it's important to understand". State the thing directly. Academic writing often retains these as transition markers, so the aggressive cut is prose/personal-only because it conflicts with that register. **Before:** > It's worth noting that the change doesn't break the existing flow. Needless to say, the test suite is green. Obviously, this means we can ship. @@ -557,11 +560,25 @@ WARN: line 18: "claude-rules/commits.md" — personal-tooling reference; state t **After:** > Clean migration. Approving. One note inline: I'd rename `x` to `provider` — it reads as a generic placeholder and the next person won't know it's the resolved provider without tracing it. +### 41. No Emphasis Formatting (prose + personal) + +**Detection:** Bold (`**...**`), italic (`*...*` / `_..._`), or underscore-wrapped words used to emphasize a phrase in Craig's prose. This is distinct from #14, which strips AI's mechanical boldface in general mode — #41 carries Craig's own principle and covers italics and underscores too. + +**Problem:** Craig makes his points with words, not formatting. Emphasis markup is a crutch: when a sentence leans on bold or italics to land, the wording isn't doing the work. The fix isn't to delete the markup and leave a flat sentence — it's to rephrase so the stress lives in the word choice and sentence shape. (This is the same principle behind his terminal-rendering rule in chat, but here it's about the writing itself, not the display.) + +Leave markup that is structural rather than emphatic: a heading, a defined term on first use where the convention is house style, code spans for literal identifiers. The target is emphasis-by-formatting, not all formatting. + +**Before:** +> This is **really** important: you must run the migration *before* deploying, or the app will crash. + +**After:** +> Run the migration before deploying. Skip that step and the app crashes on the first request. + ## Process -1. Read the input text carefully. Confirm the mode (general or personal) — invocation argument or context. -2. Walk patterns 1-31 in general mode; walk all 40 patterns in personal mode. -3. For each pattern, scan the text. If a match is found, rewrite it according to the pattern's rule. Pattern #39 emits warnings without rewriting. +1. Read the input text carefully. Confirm the mode (general, prose, or personal) — invocation argument or context. +2. Walk patterns 1-31 in general mode; add the (prose + personal) patterns in prose mode; walk all 41 patterns in personal mode. +3. For each pattern, scan the text. If a match is found, rewrite it according to the pattern's rule. Pattern #39 emits warnings without rewriting (personal mode only). 4. After walking all patterns, ensure the revised text: - Sounds natural when read aloud - Varies sentence structure @@ -575,7 +592,7 @@ WARN: line 18: "claude-rules/commits.md" — personal-tooling reference; state t Provide: 1. **Draft rewrite** — the text after walking all applicable patterns -2. **Mode used** — general or personal +2. **Mode used** — general, prose, or personal 3. **What makes the below so obviously AI generated?** — brief bullets 4. **Final rewrite** — revised after the anti-AI audit 5. **Pattern-39 warnings** (personal mode only) — any public-artifact scope flags @@ -592,7 +609,7 @@ Provide: **Mode used:** personal -**Draft rewrite (after walking patterns 1-39):** +**Draft rewrite (after walking patterns 1-41):** > feat(api): add empty-input guard at the validator boundary > > I added a guard that rejects empty or whitespace-only input fields at the API boundary with a 400 response. The previous flow let empty values leak through to the database layer. @@ -634,7 +651,7 @@ Provide: > The Statistical Institute of Catalonia was established in 1989 to collect and publish regional statistics independently from Spain's national statistics office. It was part of a wider movement to decentralize administrative functions across Spain. Regional reporting got more accurate after the change. **Summary of changes:** -- Patterns that fired in general mode: #1 (significance inflation: "pivotal moment", "evolution of"), #4 (promotional: "vital component"), #3 (-ing analysis: "showcasing how... can foster"), #8 (copula avoidance: "serves as"), #26 (long-word: removed Latinate constructions). General mode skipped patterns #32-40 (personal only). +- Patterns that fired in general mode: #1 (significance inflation: "pivotal moment", "evolution of"), #4 (promotional: "vital component"), #3 (-ing analysis: "showcasing how... can foster"), #8 (copula avoidance: "serves as"), #26 (long-word: removed Latinate constructions). General mode skipped patterns #32-41 (Craig's-voice patterns — prose and personal modes only). ## Reference @@ -644,7 +661,7 @@ This skill draws from: - Orwell, *Politics and the English Language* — patterns #26 (short over long), #27 (active over passive), #29 (cliché). - Plain English Campaign — pattern #26 (Plain English wordlist). - Garner, *Modern English Usage* — pattern #26 (word-pair preferences). -- Personal voice rules from `claude-rules/commits.md` (Voice and Focus section) — patterns #32-40. +- Craig's voice rules from `claude-rules/commits.md` (Voice and Focus section) — patterns #32-41, split across prose mode (his authored prose and email) and personal mode (publish artifacts). Key insight (Wikipedia, paraphrased): LLMs use statistical algorithms to guess what should come next. The result tends toward the most statistically likely text that applies to the widest variety of cases. Patterns #1-25 detect that signature. |
