PaperJury (CS-conference paper review and editing)
PaperJury edits and hardens any CS-conference paper. It runs in
three modes. In direct-edit mode (the common case) the user describes a change
in Chinese or English and the LaTeX is edited directly through a CS-venue writing
toolkit, with author sign-off. In review mode (occasional, pre-submission) it
exposes the manuscript to a harsh, multi-perspective courtroom review engine that
adjudicates each issue (N holistic domain reviewers -> contestability routing ->
two-sided trial -> three-way verdict, with a polish track and a clerk-converged
multi-round loop), gates every change behind consensus, and tracks issues in a durable
ledger. In auto mode (unattended, opt-in via /goal) it runs that same engine
toward a verifiable goal, applying safe fixes under a drift-bounded policy and
queueing the risky ones for one human pass on return. All modes share the same
writing toolkit, hard rules, ledger, and author sign-off (auto via up-front policy
sign-off plus the queue, see hard rule 1).
This skill is fully generic. It ships no hardcoded paths, no project files,
and no embedded paper. Everything specific to a given paper (where the
manuscript is, the venue, who signs off, the house style) is resolved at runtime
or supplied by a config the project owns. The skill itself is the backbone;
any concrete paper is just an instantiation of it.
Scope: CS conferences only. Three venue families, each with its own style profile:
- Vision: CVPR, ICCV, ECCV, WACV
- NLP: ACL, EMNLP, NAACL, COLING
- ML: ICLR, NeurIPS, ICML, AAAI, COLM
When to use / when not
Three modes, one skill. Pick by what the user is asking for:
- Direct-edit mode (the common case). The user describes a change in Chinese
(or English) and wants the LaTeX edited directly: "把这段改成...", "polish this
paragraph", "把我对 intro 的想法写成 LaTeX", "tighten this". No review panel; go
straight to drafting the patch through the writing toolkit, with author sign-off.
- Review mode (occasional, pre-submission). The user wants the paper critiqued
or hardened: review / critique / 审稿 / 评审 / mock-review, or iterating a draft
to clear reviewer-raised issues. This runs the courtroom review engine
(
references/review-engine-v3.md).
- Auto mode (unattended). The user opts in via
/goal (or config mode: auto)
to run the review-revise loop AFK toward a verifiable goal. Establish the spine
up front (the one human step), then the engine applies safe fixes under the
bounded-aggressive policy and queues the rest. The drafter input passes the
significance floor (node scripts/ledger.js floor: valid-fixable majors only) and
the ledger view is initialized collapsed (--display collapse: minors fold into a
Minor digest, majors stay itemized). See references/auto-mode.md.
Never self-detect auto; it is explicit only.
Do NOT use for: writing a paper from scratch (use ml-paper-writing), figure or
diagram generation (use academic-plotting), or an official-venue rebuttal (this
is a pre-submission self-hardening loop, no score gate).
Soft update reminder: at the start of each PaperJury invocation, before choosing
the mode or editing a manuscript, run node scripts/check-update.js from the
skill root unless PAPERJURY_DISABLE_UPDATE_CHECK=1 is set. If it reports an
available update, show the notice once and continue. If the check is skipped,
silent, or cannot reach GitHub, continue without mentioning it; update checks are
never allowed to block review or editing.
The three primitives
This paradigm is expressed as Skill + Workflow + Memory. Each carries one
concern; together they replace the heavy per-round file-and-flag machinery a
hand-rolled version accumulates.
- Skill (this folder) = entry point + methodology. The protocol, the
reviewer panel, the contestability routing, the writing toolkit, the human gates.
Detail in
references/review-engine-v3.md, references/reviewer-personas.md,
references/writing-toolkit.md.
- Workflow = fan-out engine. The semantic, no-human-in-the-middle steps run as
Workflows (parallelism + schema-validated output by construction). The simple
panel is
workflows/review-panel.workflow.js; the v3 courtroom engine is
assign-reviewers -> reading-check -> coverage-auditor -> merge ->
{trial (+ escalate) || polish} -> recall-audit -> drafter ->
{edit-audit | meaning-audit} -> clerk. The DETERMINISTIC guards run
orchestrator-side via Bash between workflow calls (the Workflow sandbox has no fs):
scripts/ holds decompose, extract-docx, ledger, journal, apply-patch,
anchor-diff, cross-ref, spine, rekey, compile-guard, compliance-check
(plus doctor, the install/repo health check: npm run doctor). Build note: this harness
delivers a workflow's args as a JSON STRING, so every workflow parses it
defensively. Protocol + every orchestrator seam: references/review-engine-v3.md.
- Memory = durable state + learned conventions. Two layers:
- Ledger (
LEDGER.json resolved at runtime = the machine source of truth,
plus a rendered LEDGER.md view; managed by scripts/ledger.js): the live,
mutable issue state across rounds and sessions. Schema + status state machine:
references/ledger-schema.md.
- Claude memory (the active project's memory): stable conventions worth
recalling next session, e.g. this paper's house style, venue, persona tuning.
Resolving inputs at runtime (no hardcoded paths)
The skill ships ZERO hardcoded paths or project files. On trigger it resolves
each input by discovery first, then asking:
manuscript: detect the main source, then route it through the INTAKE FORMAT
GATE by extension. Four routes, none silent:
.tex: the native LaTeX path. Detect the main source (the .tex with
\documentclass / \begin{document}, or the file the user names). If
several candidates, ask.
.md / .markdown / .txt: the native text path. The full multi-round
engine runs; compile checks are not applicable (compile-guard returns
compiled:null plus a markdown sanity lint, an honest UNKNOWN, never a
fake pass); LaTeX-only compliance checks are skipped and reported as
skipped_checks.
.docx: if a .paper-review/ working copy AND a ledger already exist,
REUSE them, never re-extract. If the sha256 of the docx no longer matches
the ledger's meta.original_sha256, STOP and ask: continue on the working
copy, or extract --force knowingly discarding the applied edits (an
explicit new-intake event). Otherwise run
node scripts/extract-docx.js extract <file.docx> (one time) and tell the
user explicitly: the original Word file is never modified; all rounds run
on .paper-review/<basename>.md (print the full working-copy path); they
get back the edited Markdown plus a per-edit change list; the extraction
report lists everything dropped or degraded. Write ledger meta
{manuscript: <working copy>, working_format: 'markdown', source_format: 'docx', original, original_sha256, extracted_at, extraction_report}. If the
report shows nonzero tracked-change counts, seed a round-1 author-required
ledger row ("manuscript contains unresolved tracked changes; accepted-all
for review").
- any other extension (
.doc, .pdf, .rtf, .odt, ...): explicitly
unsupported. Say so and suggest exporting .docx / .md / .tex; never
silently degrade.
After intake, the working copy IS the manuscript for every rule and gate in
this file (sign-off, spine freeze, round-0 baseline, edit safety, journal);
the original uploaded file is permanently read-only.
venue_family: the user can name it, or an agent reads the class file to
GUESS the family (e.g. a cvpr/iccv style, an acl style, a neurips/iclr style).
There is no hardcoded venue list and no deterministic detector; if unclear, ask.
ledger: default to <manuscript-dir>/.paper-review/LEDGER.json (the machine
source of truth; scripts/ledger.js also renders a LEDGER.md view). Create if
absent, reuse if present. The user may point elsewhere.
author: ask who signs off on edits (default: the current user). Every edit
needs explicit authorization.
personas: default to N domain-expert holistic reviewers assigned at runtime
(assign-reviewers, from the project gatekeeper core + a generated domain overlay);
the three generic lenses in references/reviewer-personas.md are the degrade
fallback. If the project defines its own named reviewer subagents, use them as
agentType; otherwise inline the persona prompts.
style_profile: start from the venue-family default; refine from any
conventions recalled from memory or pinned in a project config.
A project MAY pin these by dropping a config in ITS OWN repo (see
configs/config-template.md for the shape). That file is owned by the project,
never by this skill. At round start, recall any pinned conventions from memory.
Direct-edit mode (the common case)
The user states a change in Chinese or English; you draft and apply the LaTeX edit.
No panel, no ledger, no discussion. Minimal flow:
- Locate. Resolve the manuscript and find the target passage the instruction
refers to (a paragraph, sentence, caption, table cell). If it is ambiguous on a
large file, ask which passage; do not guess. On a
.docx: if a working copy
already exists, it IS the manuscript, edit it; if none exists, offer an
explicit choice between (a) paste-back, returning the rewritten passage as
text for the user to apply in Word (no working copy), and (b) running the
one-time intake extraction and editing the working copy. Never edit the
.docx file itself.
- Draft. Pick the writing-toolkit prompt matching the instruction
(
translate-to-english for a Chinese idea, polish-english / de-ai for a
rewrite, compress / expand for length, caption / experiment-analysis
for those units) and draft the patch to do exactly what was asked. The Common
guards apply (markup-safe for the working format, plain CS prose, no log
leakage into the manuscript).
- Self-gate. Run
logic-check on the drafted passage.
- Sign-off. Show the patch and get explicit author approval (hard rule 1).
- Apply. Write only the patch into the manuscript; keep any back-translation
or note author-side.
This is the writing toolkit used on its own. Escalate to review mode only when the
user wants the paper critiqued or hardened, not for a single asked-for edit.
Why fan-out is a Workflow and the rest is conversation
The reviewer panel and the trial jury are pure fan-out: spawn, collect,
merge. A Workflow does this deterministically (parallelism enforced by
construction, structured outputs via schema, isolation by default since each
agent sees only the prompt you give it). That isolation is what replaces the
snapshot-and-whitelist defense: a reviewer cannot see peers, the ledger, or prior
rounds because you simply do not put them in its prompt.
But the loop has genuine human gates (the author reviews the issue list, gives
per-issue direction, authorizes edits, breaks ties). Workflows run to completion
and return a result; they do not pause mid-run for hours of human input. So:
- fan-out steps (reviewers, trial, polish, recall, merge) -> Workflow
- human gates (per-issue direction, authorization, override) -> main conversation turns
- cross-round truth (the ledger) + stable conventions -> Memory
Review mode: one round, end to end
The full adversarial loop (the v3 courtroom engine). Use it to harden the paper, not
for a single asked-for edit (that is direct-edit mode). Full protocol + the 14
orchestrator seams: references/review-engine-v3.md. [WF] = Workflow step,
[det] = deterministic Node guard run orchestrator-side between workflow calls,
[HUMAN] = author gate, [LEDGER] = state write.
- Resolve + recall. Resolve the inputs above; recall this paper's conventions
from memory. Pick scope:
full (whole paper) or passage (one section / para / claim).
[det] decompose. Split the manuscript into reading units + stable
passage_ids + the canonical section list.
[WF] assign-reviewers + [HUMAN] confirm. Name N subfields (2-4,
default 3); instantiate N holistic domain reviewers from the gatekeeper core + a
generated overlay. An unconfirmable slot degrades per slot to a generic gatekeeper
(the three generic lenses in reviewer-personas.md are the fallback). The author
confirms the assignment (or pins it via config).
[WF] reading-check. Each reviewer reads the WHOLE paper → weaknesses
{significance(major|minor), kind(mechanical|substantive), verbatim quote —
cannot quote = did not read} + one overall_confidence + a per-section coverage
report. Anti-skim is three layers: [det] per-section quote-verify, [WF]
coverage-auditor, [WF] targeted re-invoke.
[WF] merge. Semantic dedup across reviewers; derive significance (MAX) /
kind (substantive-dominates) / corroboration. [LEDGER] intake as raised.
[det] route. mechanical → polish; substantive&minor → polish;
substantive&major → trial (two parallel tracks).
[WF] trial. Per substantive-major charge: a whole-paper DEFENSE → 5
decorrelated local-context jurors (+ on-demand expansion) → a deterministic verdict
(decide iff quorum surviving >= ceil(0.8*jurySize) AND one side > 60% of
surviving votes; else escalate to 12). Verdict ∈ {invalid-drop, valid-fixable,
author-required, escalate}; the judge sets a close_criterion ONLY for a
valid-fixable charge, satisfiable by editing existing text (no new data). [WF]
polish runs the off-gate mechanical/minor track in parallel (never silently dropped).
[WF] recall-audit. Mode A revives wrongly-dropped charges; Mode B spot-checks
strong-consensus majors BEFORE the edit. Runs before the drafter.
[HUMAN] Authorize + [WF] drafter + edit-safety. On authorization, the
drafter writes the minimal patch per surviving valid-fixable. The edit-safety chain
gates it: [det] anchor-diff + cross-ref → [WF] meaning-audit (frozen anchor,
four-state) / edit-audit (risky non-anchor); [det] apply-patch + compile-guard land
a passing patch and [LEDGER] mark closed; a drift / anchor / failed edit is
reverted and queued. Revision logs / back-translations stay author-side.
[WF] clerk + report. The clerk reconciles the round boundary (carried
open-questions vs this round's edits, via a passage_id + similarity merge key) and
emits convergence counts. Summarize new/closed counts with the minor/polish part
as a one-line digest (counts), never per-item paragraphs; in review mode do not
auto-start the next round (auto mode drives the outer loop via /goal). The
rendered LEDGER.md obeys meta.display_mode (flip anytime:
node scripts/ledger.js mode <ledger.json> <show|collapse>; review defaults to
the flat table, auto initializes collapsed). At round end run
node scripts/rekey.js <working file> <ledger> <journal> to re-link open rows
whose passage_id no longer resolves after this round's edits (both formats).
GATE: node scripts/ledger.js gate = 0 gate-blocking active major (gate-blocking =
{raised, in-trial, re-trial, valid-fixable}; author-required / queued / dropped /
closed are gate-OK and author-required accumulates to the queue). Full protocol +
ledger schema + status machine: references/review-engine-v3.md,
references/ledger-schema.md. The legacy single-pass 3-reviewer panel
(workflows/review-panel.workflow.js, the discussion-mode flow in
references/methodology.md) is kept only as a quick check.
Hard rules (load-bearing, venue-agnostic)
- Never edit the manuscript without explicit author sign-off. Auto-mode
carve-out: the rule HOLDS; auto satisfies it via UP-FRONT sign-off (the spine
confirmation + the pre-authorized bounded-aggressive policy) plus the return
queue, not per-edit sign-off. Nothing outside the authorized envelope is applied.
- Reviewers / jurors are isolated. Fresh eyes per round: no cross-talk, no
prior-round leakage, no sight of the ledger. Enforced by (a) what goes into each
agent's prompt AND (b) an explicit ISOLATION instruction in every reviewer-type
prompt telling the agent to judge only the quoted text and not read files
(workflow agents have read tools and will otherwise sometimes roam).
- A valid-fixable issue carries a
close_criterion (one concrete sentence an
edit must satisfy), set by the judge at trial; it is null at intake.
- No leakage into the reviewed text. Revision logs, back-translations, and
self-check verdicts are author-side aids; they never enter the manuscript or
any frozen snapshot.
- Disagreement resolves through discussion, then override (logged), never a
silent dismissal.
- No hardcoded paths or project files in the skill. Resolve at runtime.
Memory convention
- At round start: recall the paper's conventions (house style, venue, persona
tuning) from memory; read the resolved
LEDGER.json for open issues.
- During the round: the ledger is the only mutable truth; update it at merge,
trial verdicts, recall, and close.
- After the round: persist any newly learned stable convention to memory (e.g. a
house-style rule a reviewer surfaced), not the transient issue state.
Maximizing it under ultracode
The fan-out engine implements the strong form directly
(workflows/review-panel.workflow.js):
- loop-until-dry: re-runs independent fresh panels and accumulates only issues
not seen before, stopping after
dryStop consecutive passes that add no
surviving issue (hard cap maxRounds). Raises recall past a single pass.
- adversarial verify: each new issue faces perspective-diverse skeptics
(misreading / already-addressed / scope-or-severity) and is kept unless a
majority refute it, filtering plausible-but-wrong issues before they reach the
ledger. Bias is to keep, so real flaws are not lost.
Toggle via args: ultracode on -> defaults (maxRounds 4, dryStop 2,
verify true); ultracode off -> pass {maxRounds:1, verify:false} for the basic
single-panel form. The loop is budget-aware and stops early if the token budget
runs low.
Capabilities and status
Built: the review engine; the submission-readiness checker (deterministic desk-reject screening plus a real LaTeX compile, degrading to a structural lint when no toolchain is present); auto mode (the review-revise loop toward a goal under a drift-bounded policy, applying safe fixes and queueing risky ones for author review); and the significance floor (ledger.js floor gates the drafter to valid-fixable majors; the collapsed ledger view folds minors into a digest so trivia never floods the author's attention -- render-only, full detail kept in LEDGER.json). Roadmap: vision-based layout verification, automatic venue detection from the class file, and reviewer personas tuned to each venue community.
Related skills
ml-paper-writing: from-scratch drafting, citation verification (never
hallucinate citations), conference checklists. This loop borrows its
sentence-level guidance for the edit-drafting step rather than duplicating it.
academic-plotting: figure and architecture-diagram generation (out of scope
here; this loop edits text and captions, not figure images).
1---2name: paperjury3description: PaperJury (CS-conference paper review and editing)4---56# PaperJury (CS-conference paper review and editing)78PaperJury edits and hardens any CS-conference paper. It runs in9three modes. In **direct-edit mode** (the common case) the user describes a change10in Chinese or English and the LaTeX is edited directly through a CS-venue writing11toolkit, with author sign-off. In **review mode** (occasional, pre-submission) it12exposes the manuscript to a harsh, multi-perspective courtroom review engine that13adjudicates each issue (N holistic domain reviewers -> contestability routing ->14two-sided trial -> three-way verdict, with a polish track and a clerk-converged15multi-round loop), gates every change behind consensus, and tracks issues in a durable16ledger. In **auto mode** (unattended, opt-in via `/goal`) it runs that same engine17toward a verifiable goal, applying safe fixes under a drift-bounded policy and18queueing the risky ones for one human pass on return. All modes share the same19writing toolkit, hard rules, ledger, and author sign-off (auto via up-front policy20sign-off plus the queue, see hard rule 1).2122This skill is **fully generic**. It ships no hardcoded paths, no project files,23and no embedded paper. Everything specific to a given paper (where the24manuscript is, the venue, who signs off, the house style) is resolved at runtime25or supplied by a config the *project* owns. The skill itself is the backbone;26any concrete paper is just an instantiation of it.2728Scope: CS conferences only. Three venue families, each with its own style profile:29- **Vision**: CVPR, ICCV, ECCV, WACV30- **NLP**: ACL, EMNLP, NAACL, COLING31- **ML**: ICLR, NeurIPS, ICML, AAAI, COLM3233## When to use / when not3435Three modes, one skill. Pick by what the user is asking for:36- **Direct-edit mode (the common case).** The user describes a change in Chinese37 (or English) and wants the LaTeX edited directly: "把这段改成...", "polish this38 paragraph", "把我对 intro 的想法写成 LaTeX", "tighten this". No review panel; go39 straight to drafting the patch through the writing toolkit, with author sign-off.40- **Review mode (occasional, pre-submission).** The user wants the paper critiqued41 or hardened: review / critique / 审稿 / 评审 / mock-review, or iterating a draft42 to clear reviewer-raised issues. This runs the courtroom review engine43 (`references/review-engine-v3.md`).44- **Auto mode (unattended).** The user opts in via `/goal` (or config `mode: auto`)45 to run the review-revise loop AFK toward a verifiable goal. Establish the spine46 up front (the one human step), then the engine applies safe fixes under the47 bounded-aggressive policy and queues the rest. The drafter input passes the48 significance floor (`node scripts/ledger.js floor`: valid-fixable majors only) and49 the ledger view is initialized collapsed (`--display collapse`: minors fold into a50 Minor digest, majors stay itemized). See `references/auto-mode.md`.51 Never self-detect auto; it is explicit only.5253Do NOT use for: writing a paper from scratch (use `ml-paper-writing`), figure or54diagram generation (use `academic-plotting`), or an official-venue rebuttal (this55is a pre-submission self-hardening loop, no score gate).5657Soft update reminder: at the start of each PaperJury invocation, before choosing58the mode or editing a manuscript, run `node scripts/check-update.js` from the59skill root unless `PAPERJURY_DISABLE_UPDATE_CHECK=1` is set. If it reports an60available update, show the notice once and continue. If the check is skipped,61silent, or cannot reach GitHub, continue without mentioning it; update checks are62never allowed to block review or editing.6364## The three primitives6566This paradigm is expressed as **Skill + Workflow + Memory**. Each carries one67concern; together they replace the heavy per-round file-and-flag machinery a68hand-rolled version accumulates.69701. **Skill (this folder) = entry point + methodology.** The protocol, the71 reviewer panel, the contestability routing, the writing toolkit, the human gates.72 Detail in `references/review-engine-v3.md`, `references/reviewer-personas.md`,73 `references/writing-toolkit.md`.742. **Workflow = fan-out engine.** The semantic, no-human-in-the-middle steps run as75 Workflows (parallelism + schema-validated output by construction). The simple76 panel is `workflows/review-panel.workflow.js`; the v3 courtroom engine is77 `assign-reviewers` -> `reading-check` -> `coverage-auditor` -> `merge` ->78 {`trial` (+ escalate) || `polish`} -> `recall-audit` -> `drafter` ->79 {`edit-audit` | `meaning-audit`} -> `clerk`. The DETERMINISTIC guards run80 orchestrator-side via Bash between workflow calls (the Workflow sandbox has no fs):81 `scripts/` holds `decompose`, `extract-docx`, `ledger`, `journal`, `apply-patch`,82 `anchor-diff`, `cross-ref`, `spine`, `rekey`, `compile-guard`, `compliance-check`83 (plus `doctor`, the install/repo health check: `npm run doctor`). Build note: this harness84 delivers a workflow's `args` as a JSON STRING, so every workflow parses it85 defensively. Protocol + every orchestrator seam: `references/review-engine-v3.md`.863. **Memory = durable state + learned conventions.** Two layers:87 - **Ledger** (`LEDGER.json` resolved at runtime = the machine source of truth,88 plus a rendered `LEDGER.md` view; managed by `scripts/ledger.js`): the live,89 mutable issue state across rounds and sessions. Schema + status state machine:90 `references/ledger-schema.md`.91 - **Claude memory** (the active project's memory): stable conventions worth92 recalling next session, e.g. this paper's house style, venue, persona tuning.9394## Resolving inputs at runtime (no hardcoded paths)9596The skill ships ZERO hardcoded paths or project files. On trigger it resolves97each input by **discovery first, then asking**:9899- **manuscript**: detect the main source, then route it through the INTAKE FORMAT100 GATE by extension. Four routes, none silent:101 - `.tex`: the native LaTeX path. Detect the main source (the `.tex` with102 `\documentclass` / `\begin{document}`, or the file the user names). If103 several candidates, ask.104 - `.md` / `.markdown` / `.txt`: the native text path. The full multi-round105 engine runs; compile checks are not applicable (`compile-guard` returns106 `compiled:null` plus a markdown sanity lint, an honest UNKNOWN, never a107 fake pass); LaTeX-only compliance checks are skipped and reported as108 `skipped_checks`.109 - `.docx`: if a `.paper-review/` working copy AND a ledger already exist,110 REUSE them, never re-extract. If the sha256 of the docx no longer matches111 the ledger's `meta.original_sha256`, STOP and ask: continue on the working112 copy, or `extract --force` knowingly discarding the applied edits (an113 explicit new-intake event). Otherwise run114 `node scripts/extract-docx.js extract <file.docx>` (one time) and tell the115 user explicitly: the original Word file is never modified; all rounds run116 on `.paper-review/<basename>.md` (print the full working-copy path); they117 get back the edited Markdown plus a per-edit change list; the extraction118 report lists everything dropped or degraded. Write ledger meta119 `{manuscript: <working copy>, working_format: 'markdown', source_format:120 'docx', original, original_sha256, extracted_at, extraction_report}`. If the121 report shows nonzero tracked-change counts, seed a round-1 `author-required`122 ledger row ("manuscript contains unresolved tracked changes; accepted-all123 for review").124 - any other extension (`.doc`, `.pdf`, `.rtf`, `.odt`, ...): explicitly125 unsupported. Say so and suggest exporting `.docx` / `.md` / `.tex`; never126 silently degrade.127128 After intake, the working copy IS the manuscript for every rule and gate in129 this file (sign-off, spine freeze, round-0 baseline, edit safety, journal);130 the original uploaded file is permanently read-only.131- **venue_family**: the user can name it, or an agent reads the class file to132 GUESS the family (e.g. a cvpr/iccv style, an acl style, a neurips/iclr style).133 There is no hardcoded venue list and no deterministic detector; if unclear, ask.134- **ledger**: default to `<manuscript-dir>/.paper-review/LEDGER.json` (the machine135 source of truth; `scripts/ledger.js` also renders a `LEDGER.md` view). Create if136 absent, reuse if present. The user may point elsewhere.137- **author**: ask who signs off on edits (default: the current user). Every edit138 needs explicit authorization.139- **personas**: default to N domain-expert holistic reviewers assigned at runtime140 (`assign-reviewers`, from the project gatekeeper core + a generated domain overlay);141 the three generic lenses in `references/reviewer-personas.md` are the degrade142 fallback. If the project defines its own named reviewer subagents, use them as143 `agentType`; otherwise inline the persona prompts.144- **style_profile**: start from the venue-family default; refine from any145 conventions recalled from memory or pinned in a project config.146147A project MAY pin these by dropping a config in ITS OWN repo (see148`configs/config-template.md` for the shape). That file is owned by the project,149never by this skill. At round start, recall any pinned conventions from memory.150151## Direct-edit mode (the common case)152153The user states a change in Chinese or English; you draft and apply the LaTeX edit.154No panel, no ledger, no discussion. Minimal flow:1551561. **Locate.** Resolve the manuscript and find the target passage the instruction157 refers to (a paragraph, sentence, caption, table cell). If it is ambiguous on a158 large file, ask which passage; do not guess. On a `.docx`: if a working copy159 already exists, it IS the manuscript, edit it; if none exists, offer an160 explicit choice between (a) paste-back, returning the rewritten passage as161 text for the user to apply in Word (no working copy), and (b) running the162 one-time intake extraction and editing the working copy. Never edit the163 `.docx` file itself.1642. **Draft.** Pick the writing-toolkit prompt matching the instruction165 (`translate-to-english` for a Chinese idea, `polish-english` / `de-ai` for a166 rewrite, `compress` / `expand` for length, `caption` / `experiment-analysis`167 for those units) and draft the patch to do exactly what was asked. The Common168 guards apply (markup-safe for the working format, plain CS prose, no log169 leakage into the manuscript).1703. **Self-gate.** Run `logic-check` on the drafted passage.1714. **Sign-off.** Show the patch and get explicit author approval (hard rule 1).1725. **Apply.** Write only the patch into the manuscript; keep any back-translation173 or note author-side.174175This is the writing toolkit used on its own. Escalate to review mode only when the176user wants the paper critiqued or hardened, not for a single asked-for edit.177178## Why fan-out is a Workflow and the rest is conversation179180The reviewer panel and the trial jury are pure fan-out: spawn, collect,181merge. A Workflow does this deterministically (parallelism enforced by182construction, structured outputs via schema, isolation by default since each183agent sees only the prompt you give it). That isolation is what replaces the184snapshot-and-whitelist defense: a reviewer cannot see peers, the ledger, or prior185rounds because you simply do not put them in its prompt.186187But the loop has genuine human gates (the author reviews the issue list, gives188per-issue direction, authorizes edits, breaks ties). Workflows run to completion189and return a result; they do not pause mid-run for hours of human input. So:190191- fan-out steps (reviewers, trial, polish, recall, merge) -> **Workflow**192- human gates (per-issue direction, authorization, override) -> **main conversation turns**193- cross-round truth (the ledger) + stable conventions -> **Memory**194195## Review mode: one round, end to end196197The full adversarial loop (the v3 courtroom engine). Use it to harden the paper, not198for a single asked-for edit (that is direct-edit mode). Full protocol + the 14199orchestrator seams: `references/review-engine-v3.md`. `[WF]` = Workflow step,200`[det]` = deterministic Node guard run orchestrator-side between workflow calls,201`[HUMAN]` = author gate, `[LEDGER]` = state write.2022031. **Resolve + recall.** Resolve the inputs above; recall this paper's conventions204 from memory. Pick scope: `full` (whole paper) or `passage` (one section / para / claim).2052. **`[det]` decompose.** Split the manuscript into reading units + stable206 `passage_id`s + the canonical section list.2073. **`[WF]` assign-reviewers** + **`[HUMAN]` confirm.** Name N subfields (2-4,208 default 3); instantiate N holistic domain reviewers from the gatekeeper core + a209 generated overlay. An unconfirmable slot degrades per slot to a generic gatekeeper210 (the three generic lenses in `reviewer-personas.md` are the fallback). The author211 confirms the assignment (or pins it via config).2124. **`[WF]` reading-check.** Each reviewer reads the WHOLE paper → weaknesses213 {`significance`(major|minor), `kind`(mechanical|substantive), verbatim quote —214 cannot quote = did not read} + one `overall_confidence` + a per-section coverage215 report. Anti-skim is three layers: `[det]` per-section quote-verify, `[WF]`216 coverage-auditor, `[WF]` targeted re-invoke.2175. **`[WF]` merge.** Semantic dedup across reviewers; derive `significance` (MAX) /218 `kind` (substantive-dominates) / corroboration. `[LEDGER]` intake as `raised`.2196. **`[det]` route.** mechanical → polish; substantive&minor → polish;220 substantive&major → trial (two parallel tracks).2217. **`[WF]` trial.** Per substantive-major charge: a whole-paper DEFENSE → 5222 decorrelated local-context jurors (+ on-demand expansion) → a deterministic verdict223 (decide iff quorum `surviving >= ceil(0.8*jurySize)` AND one side `> 60%` of224 surviving votes; else escalate to 12). Verdict ∈ {invalid-drop, valid-fixable,225 author-required, escalate}; the judge sets a `close_criterion` ONLY for a226 valid-fixable charge, satisfiable by editing existing text (no new data). `[WF]`227 polish runs the off-gate mechanical/minor track in parallel (never silently dropped).2288. **`[WF]` recall-audit.** Mode A revives wrongly-dropped charges; Mode B spot-checks229 strong-consensus majors BEFORE the edit. Runs before the drafter.2309. **`[HUMAN]` Authorize + `[WF]` drafter + edit-safety.** On authorization, the231 drafter writes the minimal patch per surviving valid-fixable. The edit-safety chain232 gates it: `[det]` anchor-diff + cross-ref → `[WF]` meaning-audit (frozen anchor,233 four-state) / edit-audit (risky non-anchor); `[det]` apply-patch + compile-guard land234 a passing patch and `[LEDGER]` mark `closed`; a drift / anchor / failed edit is235 reverted and queued. Revision logs / back-translations stay author-side.23610. **`[WF]` clerk + report.** The clerk reconciles the round boundary (carried237 open-questions vs this round's edits, via a passage_id + similarity merge key) and238 emits convergence counts. Summarize new/closed counts with the minor/polish part239 as a one-line digest (counts), never per-item paragraphs; in review mode do not240 auto-start the next round (auto mode drives the outer loop via `/goal`). The241 rendered `LEDGER.md` obeys `meta.display_mode` (flip anytime:242 `node scripts/ledger.js mode <ledger.json> <show|collapse>`; review defaults to243 the flat table, auto initializes collapsed). At round end run244 `node scripts/rekey.js <working file> <ledger> <journal>` to re-link open rows245 whose passage_id no longer resolves after this round's edits (both formats).246247GATE: `node scripts/ledger.js gate` = 0 gate-blocking active major (gate-blocking =248{raised, in-trial, re-trial, valid-fixable}; author-required / queued / dropped /249closed are gate-OK and author-required accumulates to the queue). Full protocol +250ledger schema + status machine: `references/review-engine-v3.md`,251`references/ledger-schema.md`. The legacy single-pass 3-reviewer panel252(`workflows/review-panel.workflow.js`, the discussion-mode flow in253`references/methodology.md`) is kept only as a quick check.254255## Hard rules (load-bearing, venue-agnostic)2562571. **Never edit the manuscript without explicit author sign-off.** Auto-mode258 carve-out: the rule HOLDS; auto satisfies it via UP-FRONT sign-off (the spine259 confirmation + the pre-authorized bounded-aggressive policy) plus the return260 queue, not per-edit sign-off. Nothing outside the authorized envelope is applied.2612. **Reviewers / jurors are isolated.** Fresh eyes per round: no cross-talk, no262 prior-round leakage, no sight of the ledger. Enforced by (a) what goes into each263 agent's prompt AND (b) an explicit ISOLATION instruction in every reviewer-type264 prompt telling the agent to judge only the quoted text and not read files265 (workflow agents have read tools and will otherwise sometimes roam).2663. **A valid-fixable issue carries a `close_criterion`** (one concrete sentence an267 edit must satisfy), set by the judge at trial; it is null at intake.2684. **No leakage into the reviewed text.** Revision logs, back-translations, and269 self-check verdicts are author-side aids; they never enter the manuscript or270 any frozen snapshot.2715. **Disagreement resolves through discussion, then override** (logged), never a272 silent dismissal.2736. **No hardcoded paths or project files in the skill.** Resolve at runtime.274275## Memory convention276277- At round start: recall the paper's conventions (house style, venue, persona278 tuning) from memory; read the resolved `LEDGER.json` for open issues.279- During the round: the ledger is the only mutable truth; update it at merge,280 trial verdicts, recall, and close.281- After the round: persist any newly learned stable convention to memory (e.g. a282 house-style rule a reviewer surfaced), not the transient issue state.283284## Maximizing it under ultracode285286The fan-out engine implements the strong form directly287(`workflows/review-panel.workflow.js`):288289- **loop-until-dry**: re-runs independent fresh panels and accumulates only issues290 not seen before, stopping after `dryStop` consecutive passes that add no291 surviving issue (hard cap `maxRounds`). Raises recall past a single pass.292- **adversarial verify**: each new issue faces perspective-diverse skeptics293 (misreading / already-addressed / scope-or-severity) and is kept unless a294 majority refute it, filtering plausible-but-wrong issues before they reach the295 ledger. Bias is to keep, so real flaws are not lost.296297Toggle via args: ultracode on -> defaults (`maxRounds` 4, `dryStop` 2,298`verify` true); ultracode off -> pass `{maxRounds:1, verify:false}` for the basic299single-panel form. The loop is budget-aware and stops early if the token budget300runs low.301302303304## Capabilities and status305306Built: the review engine; the submission-readiness checker (deterministic desk-reject screening plus a real LaTeX compile, degrading to a structural lint when no toolchain is present); auto mode (the review-revise loop toward a goal under a drift-bounded policy, applying safe fixes and queueing risky ones for author review); and the significance floor (`ledger.js floor` gates the drafter to valid-fixable majors; the collapsed ledger view folds minors into a digest so trivia never floods the author's attention -- render-only, full detail kept in `LEDGER.json`). Roadmap: vision-based layout verification, automatic venue detection from the class file, and reviewer personas tuned to each venue community.307308## Related skills309310- `ml-paper-writing`: from-scratch drafting, citation verification (never311 hallucinate citations), conference checklists. This loop borrows its312 sentence-level guidance for the edit-drafting step rather than duplicating it.313- `academic-plotting`: figure and architecture-diagram generation (out of scope314 here; this loop edits text and captions, not figure images).