name: critic-apply
description: >-
Rule-based application of a converged critic sheet: accept every
convergent target (2+ critics), skip split panels, decline
constitution-protected spans with cause, prefer the omission when
remedies conflict, and count reverse-outline cheap ranks as
convergence for single-critic deletions. Rewrites route through the
rewrite transport with a narrow one-sentence instruction and a
mechanical gate (numbers, citations, em-dash/colon budgets, size
band); deletions apply directly; rst markers round-trip. Reports
applied/kept/declined-by-rule for the generation: block. Triggers:
critic apply, apply the critic sheet, apply the panel, apply
suggestions by rule, converged sheet application.
argument-hint: '--article <draft.md> --sheet .critic-sheet.md'
Critic Apply (rule-based sheet application)
critic-panel produces the sheet and never applies anything; the author
used to pick by hand, and the auto-application policy (operator,
2026-09-01) ran twice as throwaway scratchpad scripts. This skill is
that policy as versioned code: the author never reads drivel because the
rules decide, and the rules are arguable because they are deterministic.
The rules
| rule |
effect |
| convergent target (2+ distinct critics on one passage) |
accepted |
| split panel (a proposal beside a KEEP/NO CHANGE dissent) |
skipped — proposal + dissent is not convergence |
constitution-protected span (--protected verbatim spans) |
declined with cause, however many critics want it — the constitution outranks the panel |
| remedy conflict inside a convergence, one remedy a CUT |
the omission wins — a deletion authors no prose |
single-critic CUT on a paragraph reverse-outline ranked cheap (--cheap-paragraphs) |
accepted — cross-instrument agreement counts as convergence for deletions |
| any other single-critic finding |
skipped; the author picks those by hand |
The mechanics (learned the hard way)
- rst markers are stripped before the model call and reattached
after — their digits fail the number gate (measured on the first
automated run). A deleted paragraph takes its marker line with it.
- One narrow instruction per rewrite target, built from the
critics' why, sent through the rewrite transport
(
CRITIC_APPLY_MODEL, default cohere:command-a-03-2025) — persona
prose is never spliced; it is guidance at most.
- The gate: number multiset (citations masked first), citation
multiset (
[@key] and [n]), em-dash and colon counts capped at the
original's, candidate length within 0.5–1.35× of the original. A
gated rejection keeps the original, recorded with its reason.
- Deletions apply directly with mechanical punctuation
normalization; omission is not authorship.
Usage
python3 <skill>/scripts/critic_apply.py \
--article draft.md --sheet draft.critic-sheet.md \
[--protected constitution-spans.txt] \
[--cheap-paragraphs 3,7] \
[--dry-run]
Output: <stem>.applied.md plus <out>.critic-apply.json — per-target
records and the applied/kept/declined-by-rule summary the generation:
block wants. --dry-run decides and reports with no model calls and no
writes. Offline tests: scripts/test_critic_apply.py.
Position
Caller's review phase (GH-208), directly after critic-panel's merge:
sheet → critic-apply → the applied text re-enters the humanize chain as
a new cycle (applied targets are unlaundered rewrite-transport prose).
cold-review and voice-critic read the result; this skill never runs
after the terminal stage of the same cycle.
1---2name: critic-apply3description: <!-- Copyright (c) 2026 Petar Djukic. All rights reserved. SPDX-License-Identifier: MIT -->4---5<!-- Copyright (c) 2026 Petar Djukic. All rights reserved. SPDX-License-Identifier: MIT -->6---7name: critic-apply8description: >-9 Rule-based application of a converged critic sheet: accept every10 convergent target (2+ critics), skip split panels, decline11 constitution-protected spans with cause, prefer the omission when12 remedies conflict, and count reverse-outline cheap ranks as13 convergence for single-critic deletions. Rewrites route through the14 rewrite transport with a narrow one-sentence instruction and a15 mechanical gate (numbers, citations, em-dash/colon budgets, size16 band); deletions apply directly; rst markers round-trip. Reports17 applied/kept/declined-by-rule for the generation: block. Triggers:18 critic apply, apply the critic sheet, apply the panel, apply19 suggestions by rule, converged sheet application.20argument-hint: '--article <draft.md> --sheet <stem>.critic-sheet.md'21---2223# Critic Apply (rule-based sheet application)2425critic-panel produces the sheet and never applies anything; the author26used to pick by hand, and the auto-application policy (operator,272026-09-01) ran twice as throwaway scratchpad scripts. This skill is28that policy as versioned code: the author never reads drivel because the29rules decide, and the rules are arguable because they are deterministic.3031## The rules3233| rule | effect |34|---|---|35| convergent target (2+ distinct critics on one passage) | accepted |36| split panel (a proposal beside a KEEP/NO CHANGE dissent) | skipped — proposal + dissent is not convergence |37| constitution-protected span (`--protected` verbatim spans) | declined with cause, however many critics want it — the constitution outranks the panel |38| remedy conflict inside a convergence, one remedy a CUT | the omission wins — a deletion authors no prose |39| single-critic CUT on a paragraph reverse-outline ranked cheap (`--cheap-paragraphs`) | accepted — cross-instrument agreement counts as convergence for deletions |40| any other single-critic finding | skipped; the author picks those by hand |4142## The mechanics (learned the hard way)4344- **rst markers are stripped before the model call and reattached45 after** — their digits fail the number gate (measured on the first46 automated run). A deleted paragraph takes its marker line with it.47- **One narrow instruction per rewrite target**, built from the48 critics' *why*, sent through the rewrite transport49 (`CRITIC_APPLY_MODEL`, default `cohere:command-a-03-2025`) — persona50 prose is never spliced; it is guidance at most.51- **The gate**: number multiset (citations masked first), citation52 multiset (`[@key]` and `[n]`), em-dash and colon counts capped at the53 original's, candidate length within 0.5–1.35× of the original. A54 gated rejection keeps the original, recorded with its reason.55- **Deletions apply directly** with mechanical punctuation56 normalization; omission is not authorship.5758## Usage5960```bash61python3 <skill>/scripts/critic_apply.py \62 --article draft.md --sheet draft.critic-sheet.md \63 [--protected constitution-spans.txt] \64 [--cheap-paragraphs 3,7] \65 [--dry-run]66```6768Output: `<stem>.applied.md` plus `<out>.critic-apply.json` — per-target69records and the applied/kept/declined-by-rule summary the `generation:`70block wants. `--dry-run` decides and reports with no model calls and no71writes. Offline tests: `scripts/test_critic_apply.py`.7273## Position7475Caller's review phase (GH-208), directly after critic-panel's merge:76sheet → critic-apply → the applied text re-enters the humanize chain as77a new cycle (applied targets are unlaundered rewrite-transport prose).78cold-review and voice-critic read the result; this skill never runs79after the terminal stage of the same cycle.