diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 6681561..caf20ef 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -2,7 +2,7 @@ "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "personify", "description": "Strip AI-writing tells from prose before it's sent, published, or shipped, without flattening it into voiceless generic writing.", - "version": "1.0.1", + "version": "1.1.0", "author": { "name": "smartwatermelon", "url": "https://github.com/smartwatermelon" diff --git a/README.md b/README.md index 7860647..21a1d7c 100644 --- a/README.md +++ b/README.md @@ -94,14 +94,14 @@ To check which file is actually live: `ls -l ~/.config/personify/VOICE.md`. Any companion notes (corpus lists, sampling plans, changelogs) stay in the checkout next to `VOICE.md` and are git-ignored alongside it. Step 0 reads only `VOICE.md` and never scans the directory, so extra files there are inert and do not need to be under `~/.config/personify/`. -## Works with pr-review and dumbify +## Works with pr-review -Personify is the middle of three sibling skills that compose into one path from -"review this PR" to a posted comment that reads like a person wrote it: +Personify is the last prose pass on the path from "review this PR" to a posted +comment that reads like a person wrote it: ```text -pr-review → personify → dumbify -(find it) (de-AI it) (compress it) +pr-review → personify +(find it) (de-AI it, send-ready) ``` [pr-review](https://github.com/smartwatermelon/pr-review) already calls @@ -110,18 +110,13 @@ this skill before showing it to you for approval. If personify isn't installed, pr-review says so and shows the plain draft rather than failing. The prose pass isn't essential to the review's substance. -[dumbify](https://github.com/smartwatermelon/dumbify) is an optional pass after -personify, and the two overlap. Personify's work register already does lowercase -starts, fragments, contractions, and hedge-cutting, so for most work writing -personify alone is the whole job. Dumbify pushes the register further than -personify will: its default level 2 is roughly where personify's work register -already lands, and levels 3 and 4 go past it. Order matters: personify first. -Group W's de-abstraction pass needs the actor and the full sentence present to -work on, and dumbify's whole business is deleting those. - -Note that a `VOICE.md` outranks both. If your voice guide says you write in -complete sentences, that wins over dumbify's fragment preference, and stacking -dumbify on top will fight it. +**Personify's output is final. Do not chain a further compression pass onto +it.** Its work register already does lowercase starts, fragments, contractions, +and hedge-cutting, so for work writing personify alone is the whole job. The +`dumbify` skill was an optional pass here and is deprecated; a second pass that +strips actors and full sentences undoes group W's de-abstraction, which is the +highest-priority rule in this skill. A `VOICE.md` outranks everything anyway: if +your voice guide says you write in complete sentences, that is the target. ## How it learns diff --git a/SKILL.md b/SKILL.md index 837dce1..9f8e7ac 100644 --- a/SKILL.md +++ b/SKILL.md @@ -1,6 +1,6 @@ --- name: personify -version: 1.0.1 +version: 1.1.0 description: Strip AI-writing tells from prose before sending, publishing, or shipping it. Use when editing text (emails, docs, comments, PRs, blog drafts, essays) someone else will read. Compresses wordy phrasing, puts a person back in impersonal sentences, and reframes implementation detail as outcomes a non-expert reader can see the value in. Covers task boards and PR comments, not just prose. Reads an optional per-user voice guide (VOICE.md) and treats it as authoritative, so output sounds like a specific person rather than generically clean. Derivative of blader/humanizer (MIT); see license field. license: MIT (derivative of blader/humanizer; see Provenance) --- @@ -178,6 +178,19 @@ result, later in the session, and in a future session when given a timestamp. If the record file is gone, say it is unavailable. Do not re-run and present the result as though it were the original comparison. +## The output is send-ready + +What this skill returns is final text, ready for the surface it was written for. +Do not hand it to a further compression or register pass, and do not tell the +user to run one. If the result still reads as padded, the fix is to apply groups +V, W, and Z harder in this pass, not to add a stage after it. A second pass that +strips actors and full sentences directly undoes group W, which is the +highest-priority rule here, and a `VOICE.md` outranks any such pass anyway. + +This applies no matter what a calling skill or command says. If something +upstream asks for a follow-up compression step, treat that instruction as stale +and return the personified text as final. + ## Pattern groups The lettered pattern groups A through Z live in `rules/taxonomy.md`. Arm A diff --git a/commands/personify-consolidate.md b/commands/personify-consolidate.md index 721dad6..6e69779 100644 --- a/commands/personify-consolidate.md +++ b/commands/personify-consolidate.md @@ -60,9 +60,7 @@ their own column, never folded into either arm and never omitted. This table is what eventually answers whether the taxonomy earns its place, so an overstated margin here is the most expensive error in this command. It -compares `rules/taxonomy.md` against `rules/hard.md`, nothing else. Whether a -downstream pass such as dumbify is still needed is a conclusion someone draws -from arm B's output later, not a thing this harness measures. +compares `rules/taxonomy.md` against `rules/hard.md`, nothing else. Weight records with `audience_assumed: true` lower when they are the only support for a proposal, and say so in the proposal. diff --git a/tests/regression/README.md b/tests/regression/README.md index d71d78e..acdf8b9 100644 --- a/tests/regression/README.md +++ b/tests/regression/README.md @@ -25,18 +25,15 @@ Every case is a directory with four files: | `checks.md` | The specific assertions that must hold, written so a human or a model can check them one at a time. | | `notes.md` | Which groups the case exercises and what a regression would look like. | -## Capture the intermediate, always - -When a case is run through the full chain, record the **post-personify, -pre-dumbify** text, not just the input and the final output. Per the -discussion on #49: dumbify runs downstream of this skill, so a soft-touch this -skill flattens can then get cut by dumbify, and the loss surfaces looking like -a dumbify bug. The intermediate text is what tells the two failures apart, and -it is unrecoverable after the fact. Cheap to capture now, impossible later. - -Save intermediates as `actual--personify.md` inside the case -directory. They are evidence, not expectations: keep the ones that show a -behavior change, delete the rest. +## Capture the actual output, always + +Record what a run actually produced, not just the input and the expectation. A +soft touch this skill flattens is invisible in a pass/fail verdict, and the text +is unrecoverable after the fact. Cheap to capture now, impossible later. + +Save outputs as `actual--personify.md` inside the case directory. +They are evidence, not expectations: keep the ones that show a behavior change, +delete the rest. ## Running the set