zero-slop 2.8.7 → 2.8.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
  <img alt="tests" src="https://img.shields.io/badge/tests-passing-227B5B">
6
6
  <img alt="dependencies" src="https://img.shields.io/badge/runtime%20dependencies-0-227B5B">
7
7
  <img alt="privacy" src="https://img.shields.io/badge/learning-private-227B5B">
8
- <img alt="version" src="https://img.shields.io/badge/version-2.8.7-72528F">
8
+ <img alt="version" src="https://img.shields.io/badge/version-2.8.8-72528F">
9
9
  <a href="https://hol.org/guard/plugins"><img alt="Listed in the HOL plugin registry" src="https://img.shields.io/badge/HOL%20registry-listed-2C6E8F"></a>
10
10
  <a href="https://github.com/hashgraph-online/awesome-ai-plugins#tools--integrations"><img alt="Listed in awesome-ai-plugins" src="https://img.shields.io/badge/awesome--ai--plugins-listed-2C6E8F"></a>
11
11
  <a href="https://zero-slop.ai/try/"><img alt="This README scores 11.6 out of 100 on the slop score, inside the human range" src="https://img.shields.io/badge/slop%20score-11.6%2F100-0f7d55"></a>
@@ -14,8 +14,7 @@
14
14
  Less slop, more pop in your writing.
15
15
 
16
16
  Zero Slop finds stock phrasing, mechanical rhythm, vague claims, and canned
17
- formatting, then gives your AI assistant or agent harness an editing workflow on guardrails. Its
18
- MIT-licensed local checks run offline; your existing AI assistant or harness does the editing.
17
+ formatting. Local checks run offline; your existing AI assistant does the editing.
19
18
  Score a draft at [zero-slop.ai/try](https://zero-slop.ai/try/); benchmark at
20
19
  [zero-slop.ai](https://zero-slop.ai).
21
20
 
@@ -63,12 +62,12 @@ Writing score: 9.5/100 [clear]
63
62
  ## Problem
64
63
 
65
64
  AI-assisted writing often converges on the same constructions: "It's not X. It's Y."
66
- "Here's the thing nobody tells you." One emdash is fine. Multiple emdashes, definitely slop. The same effect can come from repetition in the wording or the structure. Mechanical rhythm and overworked formatting can do it too.
65
+ "Here's the thing nobody tells you." Repeated wording, uniform rhythm, and
66
+ overworked formatting can have the same effect.
67
67
 
68
68
  Zero Slop is an Agent Skill and ships no model. Claude, GPT, or another compatible
69
- model edits; local tools check names, numbers, quotations, links, code, tables, and
70
- paths. Your AI compares meaning because matching words cannot catch every changed
71
- claim. It runs in any harness that reads `SKILL.md`.
69
+ model edits; local tools protect names, numbers, quotations, links, code, tables,
70
+ and paths. Your AI compares meaning that word matching cannot judge.
72
71
 
73
72
  ## How to install Zero Slop
74
73
 
@@ -84,10 +83,7 @@ Or install it with `npx`:
84
83
  npx skills add manavmishra/ZeroSlop --global
85
84
  ```
86
85
 
87
- Or from the registry, which also installs the scorer as a command. Zero Slop is
88
- listed in [awesome-ai-plugins](https://github.com/hashgraph-online/awesome-ai-plugins#tools--integrations)
89
- and carries a public profile in the [HOL plugin registry](https://hol.org/guard/plugins),
90
- where its trust score and scanner results are published:
86
+ Or install from npm, which also adds the scoring command:
91
87
 
92
88
  ```sh
93
89
  npx zero-slop install # add --harness codex|cursor|opencode|zed
@@ -95,8 +91,7 @@ npx zero-slop score draft.md # score without installing anything
95
91
  ```
96
92
 
97
93
  ChatGPT users can download [`dist/zero-slop-single-file.md`](dist/zero-slop-single-file.md).
98
- Claude.ai users can upload the [latest release ZIP](https://github.com/manavmishra/ZeroSlop/releases/latest/download/zero-slop.zip).
99
- `npx skills update zero-slop --global` updates a skills CLI installation later.
94
+ Claude.ai users can upload the [release ZIP](https://github.com/manavmishra/ZeroSlop/releases/latest/download/zero-slop.zip).
100
95
 
101
96
  ## How to use Zero Slop
102
97
 
@@ -135,9 +130,8 @@ above.
135
130
  9. Synonym cycling: the agent, the assistant, the tool, all one thing.
136
131
  10. Marketing riders: "robust" and "leverage" score only beside a marketing trigger, so a runbook stays quiet.
137
132
 
138
- A reading pass covers document-wide problems: repeated shapes, crowded statistics,
139
- and paragraphs that shuffle without loss. [`references/eval.md`](references/eval.md)
140
- has all 80 checks.
133
+ A reading pass covers repeated shapes, crowded statistics, and paragraphs that
134
+ shuffle without loss. [`references/eval.md`](references/eval.md) has all 80 checks.
141
135
 
142
136
  Human writing scored 9 to 21 in [`data/corpus/must-not-flag/`](data/corpus/must-not-flag/);
143
137
  unedited AI drafts averaged 77 across [`bench/examples.json`](bench/examples.json).
@@ -147,7 +141,13 @@ unedited AI drafts averaged 77 across [`bench/examples.json`](bench/examples.jso
147
141
 
148
142
  ![Eight editorial roles, a private learning loop, and a separate release review](assets/engine.svg)
149
143
 
150
- Eight roles form one workflow. Each is a job rather than a service, run as its own pass so nothing grades its own output. The research supports the checks, not the number eight, which is an engineering choice.
144
+ Eight responsibilities form one workflow. They are jobs, not separate models. An
145
+ installed assistant can isolate them.
146
+ The free web editor combines
147
+ the five AI responsibilities into one model response, then runs the scorer and source
148
+ checks locally. It makes at most one live model call and never describes that response
149
+ as independent review. The research supports the checks, not the number eight, which
150
+ is an engineering choice.
151
151
 
152
152
  | Role | Who does it | What happens |
153
153
  |---|---|---|
@@ -155,14 +155,15 @@ Eight roles form one workflow. Each is a job rather than a service, run as its o
155
155
  | 2. Interpreter | Your AI assistant | Reads the claims, purpose, audience, structure, and voice before changing anything. |
156
156
  | 3. Rewriter | Your AI assistant | Removes stock language and rebuilds order, rhythm, and tone without inventing detail. |
157
157
  | 4. Fact gate | Local tools | Rejects any version that changes names, numbers, quotations, links, code, tables, paths, or structure. |
158
- | 5. Copy desk | Fresh AI pass | Corrects grammar, spelling, usage, and consistency in the actual deliverable. |
159
- | 6. Read-aloud editor | Fresh AI pass | Fixes stumbles, repetition, weak transitions, and awkward flow. |
160
- | 7. Verifier | Local tools and your AI assistant | Compares text with source for facts, meaning, qualifiers, voice, format, structure. |
161
- | 8. Fresh-eyes finalizer | Fresh AI pass | Reads the verified text as a first-time reader, applying only safe polish. Any final polish restarts the final checks; the same text must return unchanged before release. |
158
+ | 5. Copy desk | Your AI assistant | Corrects grammar, spelling, usage, and consistency in the actual deliverable. |
159
+ | 6. Read-aloud editor | Your AI assistant | Fixes stumbles, repetition, weak transitions, and awkward flow. |
160
+ | 7. Verifier | Local tools and your AI assistant | Compares text with source for facts, meaning, qualifiers, voice, format, structure. In the web editor, source safety is checked locally. |
161
+ | 8. Fresh-eyes finalizer | Your AI assistant | Reads the finished text as a first-time reader and applies only safe polish. Any change receives one final local recheck. |
162
162
 
163
- Missed editorial targets trigger repair, not erasure. After three rounds, Zero Slop
164
- returns the safest source-preserving edit with a warning. Only a model outage or an
165
- edit that changes protected material leaves the source untouched.
163
+ Missed editorial targets do not erase a useful edit or start an open-ended loop. Zero
164
+ Slop permits one targeted repair and one local recheck, then returns the safest
165
+ source-preserving edit with a plain warning. On the website, a failed model call falls
166
+ back to a conservative local edit instead of retrying through more providers.
166
167
 
167
168
  Studies find
168
169
  [predictable wording](https://arxiv.org/abs/2301.11305) and
@@ -197,7 +198,7 @@ The saved replay ran Zero Slop, [avoid-ai-writing](https://github.com/conorbrons
197
198
  [no-ai-slop](https://github.com/petergyang/no-ai-slop) and
198
199
  [humanizer](https://github.com/blader/humanizer) over 18 drafts with GPT-5.4, high
199
200
  reasoning, and pinned instructions. Zero Slop's outputs came from v2.5.9; later
200
- releases rescore those frozen outputs rather than pretend to regenerate them.
201
+ releases only rescore those frozen outputs.
201
202
 
202
203
  | Method | Mean writing score ↓ | Passed Zero Slop's local gates | Source check passed | Average length change |
203
204
  |---|---:|---:|---:|---:|
@@ -213,16 +214,15 @@ releases rescore those frozen outputs rather than pretend to regenerate them.
213
214
 
214
215
  ![Method-hidden editorial preference on 18 drafts](assets/bench-incumbent-hidden.png)
215
216
 
216
- Cross-checks the tools didn't build: the AIStoryHub checker's clean
217
- rates, and a method-hidden quality ranking.
217
+ Two cross-checks: AIStoryHub clean rates and a method-hidden quality ranking.
218
218
 
219
219
  ![External checker clean rates per method](assets/bench-external-checker.png)
220
220
 
221
221
  ![Method-hidden quality ranking, lower is better](assets/bench-blind-quality.png)
222
222
 
223
- This is a small LLM-reviewed regression study. It measures neither field accuracy nor a
224
- universal ranking. Drafts, hashes, and limits are in [`bench/README.md`](bench/README.md). The separate method-hidden two-way replay used
225
- Zero Slop v2.6.0 and is preserved in
223
+ This small LLM-reviewed regression study measures neither field accuracy nor a
224
+ universal ranking. Drafts, hashes, and limits are in [`bench/README.md`](bench/README.md).
225
+ The separate two-way replay used Zero Slop v2.6.0 and is preserved in
226
226
  [`bench/incumbent-blind-replay/`](bench/incumbent-blind-replay/).
227
227
 
228
228
  For the 38-item editorial panel, the current scorer matched the prior 84.2% result.
package/SKILL.md CHANGED
@@ -2,7 +2,7 @@
2
2
  name: zero-slop
3
3
  license: MIT
4
4
  metadata:
5
- version: "2.8.7"
5
+ version: "2.8.8"
6
6
  author: manavmishra
7
7
  description: Turn drafts into sharp, natural prose or inspect them without rewriting. Zero Slop runs inside the user's existing AI assistant; Claude, GPT, or another compatible model reads and edits in context while local tools point to exact phrases and protect the source. Use when the user asks to humanize or de-slop writing, inspect AI-sounding patterns, fix text that reads like ChatGPT, polish outward-facing prose, draft social or LinkedIn content, or apply a final quality check to prose the agent generated. The workflow preserves facts, voice, and format and learns privately from repeated, reason-labelled human edits.
8
8
  ---
@@ -75,10 +75,12 @@ citations, and the ladder below orders the signals by measured strength.
75
75
 
76
76
  ## Eight roles, one pipeline
77
77
 
78
- Run the rewrite workflow as eight ordered roles. They are separate jobs, not eight
79
- models or services. The same Claude, GPT, or other compatible model in the user's AI
80
- assistant may perform every editorial role, but each must be a separate pass. Keep
81
- local and AI responsibilities distinct:
78
+ Run the rewrite workflow as eight ordered responsibilities. They are editorial jobs,
79
+ not eight models or services. In an installed assistant, use role-isolated passes when
80
+ the harness can do that without extra network calls. When a service has a one-request
81
+ budget, combine the AI responsibilities into one structured editorial response and
82
+ run the local checks before and after it. Name that consolidation honestly; one model
83
+ response is not independent review. Keep local and AI responsibilities distinct:
82
84
 
83
85
  1. **Scorer — local tools.** Point to exact phrases and problems with rhythm,
84
86
  readability, formatting, and register; explain the writing score.
@@ -90,26 +92,28 @@ local and AI responsibilities distinct:
90
92
  quotations, or links; among the rest, select the version that best clears the
91
93
  measured checks. This local check cannot certify reframed claims or invented
92
94
  interior meaning; the verifier handles those with contextual comparison.
93
- 5. **Copy desk — a fresh AI pass.** Correct grammar, spelling, punctuation, usage,
95
+ 5. **Copy desk — the AI assistant.** Correct grammar, spelling, punctuation, usage,
94
96
  diction, and consistency in the selected text.
95
- 6. **Read-aloud editor — a fresh AI pass.** Read the complete copy-edited text aloud
97
+ 6. **Read-aloud editor — the AI assistant.** Read the complete copy-edited text aloud
96
98
  and directly fix stumbles, repetition, weak transitions, and awkward flow.
97
99
  7. **Verifier — local tools plus the AI assistant.** Check the exact final text
98
100
  against the source for the writing score, facts, meaning, qualifiers, voice,
99
- format, and structure. A warning starts the repair loop and prevents an
100
- unqualified approval; it does not erase the edited draft. Any repair returns
101
- through roles 5 and 6 before role 7 runs again.
102
- 8. **Fresh-eyes finalizer — a new AI pass.** Read the verified text as a first-time
103
- reader, apply only safe final polish, and approve it without changes. A role 8
104
- edit restarts roles 5 through 8; the finalizer never bypasses verification.
101
+ format, and structure. A warning prevents an unqualified approval; it never erases
102
+ a source-safe edit or starts an open-ended loop. Apply at most one targeted repair,
103
+ then rerun the local checks on the exact changed text.
104
+ 8. **Fresh-eyes finalizer — the AI assistant.** Read the verified text as a first-time
105
+ reader and apply only safe final polish. If it changes the text, rerun the local
106
+ score and fact checks once. Deliver the safest edit with a plain warning if a
107
+ remaining concern would require another model request or a guess.
105
108
 
106
109
  This is an engineering separation of responsibilities, not a claim that research has
107
110
  proved eight to be the uniquely correct number. Studies support several different
108
111
  signal families and several different editorial failure classes; no single score or
109
112
  prompt can cover them all. The local roles provide repeatable measurements. The AI
110
- roles supply contextual judgment and editing. A generating role never certifies its
111
- own output. Role 7 verifies; role 8 confirms that the same verified text reads cleanly
112
- to someone seeing it for the first time.
113
+ roles supply contextual judgment and editing. A generating role does not certify its
114
+ own factual safety. Role 7 supplies the local release checks; role 8 confirms that the
115
+ result reads cleanly to someone seeing it for the first time. In a one-request service,
116
+ the model's self-check is editorial guidance, not independent verification.
113
117
 
114
118
  ## Detailed workflow
115
119
 
@@ -633,34 +637,29 @@ format, and non-prose structure. Apply these contextual checks too:
633
637
  read as prose. The whole document uses one coherent register, and every
634
638
  cross-reference resolves exactly.
635
639
 
636
- If verification requires any textual repair, send the repaired text through the copy
637
- desk and final read-aloud pass again, then repeat every final check. Continue until the
638
- same text clears the copy desk, final read-aloud pass, semantic and format review,
639
- scorer, and fidelity gate.
640
+ If verification finds a concrete textual defect, apply one targeted repair. Run the
641
+ local score, fact, format, and structure checks once more on that exact text. Do not
642
+ restart the complete editorial sequence. If the second check still finds a problem,
643
+ return the safest source-preserving edit and name the remaining issue plainly.
640
644
 
641
- If an AI editorial role returns no usable text, retry that role once with a fresh pass.
642
- Use another available model when the harness supports model choice; otherwise use fresh
643
- context in the current assistant. Carry the last source-preserving edit forward while a
644
- role recovers. Do not replay earlier roles unless the text changes: retry the failed role,
645
- then continue with the remaining checks. Keep every retry bounded and report any role
646
- that remained unavailable.
645
+ If an AI editorial role returns no usable text, record that it was unavailable and
646
+ continue from the last source-preserving text. Unavailability is an abstention, not a
647
+ reason to retry, switch models, or replay earlier roles. A caller with a one-request
648
+ budget must never make a second remote request. Report any role that did not complete.
647
649
 
648
650
  A required repair may raise the writing score from the previous draft as long as it
649
651
  stays below the release limit. Source meaning, stated emotion, and factual accuracy
650
652
  outrank a smaller number. Never discard a necessary semantic repair merely because an
651
653
  unsafe version scored lower; rerun every check on the repaired text instead.
652
- Limit this repair loop to three rounds. If a problem still cannot be resolved
653
- without guessing, return the safest source-preserving edit and state the unresolved
654
- issue, unavailable role, or missed target plainly. Never replace an explicit rewrite
655
- request with the unchanged source merely because a quality target was missed. A quality
656
- target controls the confidence label; it does not decide whether the writer receives
657
- the work. A fallback should complete both editorial passes whenever they are available,
658
- and it must never be described as fully verified when a check did not complete.
659
-
660
- Initial gate failure rewrite and recheck (max 3 passes). Final verification
661
- repair → copy desk, read-aloud pass, and every check again (max 3 rounds). If the
662
- initial gate still fails after three passes, keep the best version and flag it:
663
- "needs a real claim/detail, not better words."
654
+ There is at most one targeted repair. If a problem still cannot be resolved without
655
+ guessing, return the safest source-preserving edit and state the unresolved issue,
656
+ unavailable role, or missed target plainly. Never replace an explicit rewrite request
657
+ with the unchanged source merely because a quality target was missed. A quality target
658
+ controls the confidence label; it does not decide whether the writer receives the work.
659
+ A fallback must never be described as fully verified when a check did not complete.
660
+
661
+ Initial gate failure → keep the best safe edit and flag the missed target. Final
662
+ verification defectone targeted repair and one local recheck. Then deliver.
664
663
 
665
664
  ### 8. Fresh-eyes finalizer — approve the reader's copy
666
665
 
@@ -681,14 +680,12 @@ roles actually stayed separate, whether any role certified its own output, and
681
680
  whether the counts were reported. A generating role cannot answer those about
682
681
  itself, which is why they sit with the finalizer.
683
682
 
684
- The pass completes only when it returns the full text and explicitly says
685
- `approve without changes`. If it changes anything, apply that complete revision,
686
- then rerun the copy desk, read-aloud editor, verifier, and fresh-eyes finalizer in
687
- that order. A role 8 edit therefore restarts roles 5 through 8. Limit the loop to
688
- three rounds. The same exact text must clear roles 5, 6, and 7 and then receive a
689
- no-change approval from role 8. If safe approval is impossible without guessing,
690
- return the safest source-preserving edit, name the unresolved span or unavailable
691
- pass, and do not call it fully verified.
683
+ The pass returns the full text plus one status: `approve without changes`, `changed`,
684
+ or `unresolved needs the writer`. If it changes anything, apply the complete revision
685
+ and rerun the local score, fact, format, and structure checks once. Do not restart the
686
+ model pipeline. If safe approval is impossible without guessing, return the safest
687
+ source-preserving edit, name the unresolved span or unavailable pass, and do not call
688
+ it fully verified.
692
689
 
693
690
  ### 9. Report in plain language
694
691
 
@@ -961,8 +958,8 @@ the AI model already running in the assistant or rewrite this `SKILL.md`.
961
958
  the signs of human writing to preserve.
962
959
  - `references/readalong.md` — the mandatory, separate read-aloud pass that
963
960
  fixes flow, cohesion, and stumbles directly in the deliverable.
964
- - `references/fresh-eyes.md` — the separate first-time-reader finalizer that
965
- approves the verified text without changes or restarts every final pass.
961
+ - `references/fresh-eyes.md` — the first-time-reader finalizer and its bounded
962
+ one-recheck rule.
966
963
  - `references/copy-desk.md` — the grammar, spelling, and style pass that prepares
967
964
  the selected rewrite for read-aloud finalization.
968
965
  - `references/eval.md` — the pass/fail checklist for roles 7 and 8. It carries the
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zero-slop",
3
- "version": "2.8.7",
3
+ "version": "2.8.8",
4
4
  "description": "An Agent Skill that scores AI-sounding prose locally, guides the host AI through an editorial rewrite, and checks changed source details. The local tools run offline with zero dependencies.",
5
5
  "bin": {
6
6
  "zero-slop": "bin/zero-slop.mjs"
@@ -76,14 +76,11 @@ artifact returned by the read-aloud editor:
76
76
  2. Compare it directly with both the original and selected rewrite for preserved
77
77
  claims, qualifiers, intended voice, regional spelling, format, and non-prose
78
78
  structure. The script cannot detect every semantic or stylistic change.
79
- 3. If any check or comparison requires a repair, apply it, send the repaired
80
- text through the copy desk and read-aloud pass again, and repeat all
81
- final checks.
79
+ 3. If a check requires a repair, apply one targeted correction and rerun the
80
+ local score, fact, format, and structure checks once.
82
81
 
83
82
  After verification, send that exact text through the finalizer in
84
- `references/fresh-eyes.md`. Stop only when the same artifact clears the copy desk,
85
- read-aloud pass, semantic and format review, scorer, fidelity check, and receives a
86
- no-change fresh-eyes approval. Limit this repair loop to
87
- three rounds. If an issue still cannot be resolved without guessing, return the best
88
- source-preserving version that completed both editorial passes, flag the unresolved
89
- span and failed check plainly, and do not describe the fallback as fully verified.
83
+ `references/fresh-eyes.md`. Do not restart the model pipeline. If an issue still
84
+ cannot be resolved without guessing after the one local recheck, return the best
85
+ source-preserving version, flag the unresolved span and failed check plainly, and do
86
+ not describe the fallback as fully verified.
@@ -3,11 +3,11 @@
3
3
  Answer every check with pass or fail. Where a check asks for a count, write the
4
4
  number down; a count is evidence, and a missing count means the pass did not run.
5
5
 
6
- Any fail sends the text back through the copy desk and read-aloud pass, after which
7
- every check here runs again on the new text. Limit that loop to three rounds. A failed
8
- check starts repair and changes the confidence label; it never suppresses the edited
9
- text. After the bounded loop, return the safest source-preserving edit and name every
10
- unresolved check plainly.
6
+ Any fail permits one targeted textual repair followed by one local recheck. It does
7
+ not restart the copy desk, read-aloud pass, or model request. A failed check changes
8
+ the confidence label. It never suppresses the edited text when that edit preserves
9
+ the source. After the recheck,
10
+ return the safest source-preserving edit and name every unresolved check plainly.
11
11
 
12
12
  **This file exists because the meter cannot see most of what is on it.** The scorer
13
13
  reads the lexically anchored subset: listed phrases, sentence-length variance,
@@ -301,16 +301,18 @@ the report even when they are zero.
301
301
 
302
302
  ## F. Process integrity
303
303
 
304
- Role 8 answers this section. It is the check no single-agent eval can make.
304
+ Role 8 answers this section when it runs separately. In a one-request service, the
305
+ local verifier records the execution facts and the report names the consolidation.
305
306
 
306
- 73. **Roles stayed separate.** The copy desk, read-aloud pass, verification, and
307
- fresh-eyes review each ran as a distinct pass.
308
- 74. **No self-certification.** No role graded text it generated.
307
+ 73. **Execution described accurately.** Separate passes are named as separate; a
308
+ one-response consolidation is named as one response, never as independent review.
309
+ 74. **No self-certification of facts.** The local source gate checks the generated
310
+ text even when the model performs an editorial self-check inside one response.
309
311
  75. **Counts reported.** Every count in section A appears in the summary, including
310
312
  the zeros.
311
313
  76. **The exact final text cleared every check.** Not an earlier draft, not a version
312
314
  that was repaired afterward.
313
- 77. **Role 8 approved without changes.** If it changed anything, roles 5 through 8
314
- ran again on the revision.
315
- 78. **Fallbacks named honestly.** If the three-round limit was reached, the report
316
- says which check failed and does not describe the result as fully verified.
315
+ 77. **Finalizer edits were rechecked locally.** If role 8 changed anything, the score,
316
+ fact, format, and structure checks ran once on that exact revision.
317
+ 78. **Fallbacks named honestly.** The report names an unavailable role, local fallback,
318
+ missed target, or one-request constraint and does not call it fully verified.
@@ -48,17 +48,11 @@ and name the ambiguity.
48
48
  > followed by exactly one status: `approve without changes`, `changed — rerun final
49
49
  > checks`, or `unresolved — needs the writer`.
50
50
 
51
- ## Closed finalization loop
52
-
53
- Approval is valid only when the finalizer returns `approve without changes`. If it
54
- changes even one character, apply the complete revision and rerun, in order:
55
-
56
- 1. the copy desk;
57
- 2. the read-aloud editor;
58
- 3. the verifier, including local and contextual checks; and
59
- 4. this fresh-eyes finalizer.
60
-
61
- Repeat for at most three rounds. The same exact text must clear all four roles, with
62
- the fresh-eyes finalizer approving it unchanged. If the remaining issue cannot be
63
- fixed without guessing, return the safest source-preserving edit, identify the
64
- unresolved span or unavailable pass, and do not describe it as fully verified.
51
+ ## Bounded finalization
52
+
53
+ Return `approve without changes`, `changed`, or `unresolved needs the writer`. If
54
+ the finalizer changes the text, apply the complete revision and rerun the local score,
55
+ fact, format, and structure checks once. Do not restart the AI pipeline. If the local
56
+ recheck fails, return the safest source-preserving edit, identify the unresolved span,
57
+ and do not describe it as fully verified. An unavailable finalizer is an abstention;
58
+ it never starts another model request.
@@ -110,22 +110,19 @@ use this brief:
110
110
 
111
111
  Apply the returned artifact to the actual deliverable before verification.
112
112
 
113
- ## Finalization loop
113
+ ## Bounded finalization
114
114
 
115
115
  Verify the exact artifact returned by the read-aloud editor:
116
116
 
117
117
  1. Rerun the heuristic surface scorer and scripted fidelity check.
118
118
  2. Compare it directly with the original and selected rewrite for claims,
119
119
  qualifiers, intended voice, regional spelling, format, and non-prose structure.
120
- 3. If any check requires a textual repair, apply it, run the copy desk again, run
121
- this read-aloud pass again, and repeat every final check.
122
-
123
- Stop only when the same artifact has cleared the copy desk, final read-aloud pass,
124
- semantic and format review, scorer, fidelity check, and the separate fresh-eyes
125
- finalizer in `fresh-eyes.md`. Limit this repair loop to
126
- three rounds. If an issue still cannot be resolved without guessing, return the best
127
- source-preserving version that completed both editorial passes, state the unresolved
128
- span and failed check plainly, and do not describe the fallback as fully verified.
120
+ 3. If a check requires a textual repair, apply one targeted correction and rerun the
121
+ local score, fact, format, and structure checks once.
122
+
123
+ Do not restart the copy desk or read-aloud pass. If an issue still cannot be resolved
124
+ without guessing, return the best source-preserving version, state the unresolved span
125
+ and failed check plainly, and do not describe the fallback as fully verified.
129
126
 
130
127
  ## Why it is separate
131
128