* feat(forensics): typed policy gate + append-only obligations ledger tools/forensics_gate.py — the ARIS-side post-processor for Anti-Autoresearch reports. Fixed policy (HARD_FLAGS/REVIEW_UNAVAILABLE/open-critical -> BLOCK; SOFT/open -> WARN; CLEAN_GIVEN_EVIDENCE -> NO_NEW_BLOCKER, NEVER an accepted/PASS token — a forensics sweep can raise flags, it cannot acquit). Obligations are append-only with span/hash fingerprints (not positional ids): a finding that vanishes from a re-run stays OPEN with UNRESOLVED_DISAPPEARANCE (rewording a span is not a fix); closure is a typed, hashed, verified receipt; a waiver is a human act distinct from resolution; zero-weight AIS findings never gate. 8 tests. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(skill): /integrity-forensics — SHA-pinned thin launcher for Anti-Autoresearch Pin d8f510c; clone to ~/.claude/anti-autoresearch, checkout the pin, validate each pin ONCE with the upstream eval gate (STOP on failure — an unvalidated pin may not produce verdicts); delegate execution unchanged (cd into the clone so upstream self-locates; absolute paper paths; approval-policy never + read-only sandbox on codex calls); NO reviewer knobs (upstream's pins are upstream's decision); never rewrite upstream verdicts. Post-run: typed gate + obligations via forensics_gate.py, family-routed repair table, and The One Forbidden Loop ('edit until it stops flagging' trains the paper against the detector). Codex-native mirror runs upstream's deterministic-only mode (honestly scoped: can flag, can never say CLEAN; translating reviewer calls to spawn_agent would rewrite an upstream contract). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(workflows): pre-submission self-forensics gate (default ON) + resubmit re-run - paper-writing Phase 5.9: at assurance submission the Anti-AR sweep runs on the paper by DEFAULT (— self_forensics: false opts out; draft opts in); gate BLOCK refuses the Final Report like a verifier FAIL; obligations route to their repair doors; Final Report gains a Forensics line - also fixes the pre-existing three-vs-four mandatory-audit drift the design review caught (verifier mandates four incl. kill-argument) - codex-mirror paper-writing: default OFF (deterministic-only slice there) - resubmit-pipeline: forensics re-run after all microedits, before the Overleaf push; bib frozen => citation-replaced is not a legal fix-type Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs: register /integrity-forensics (catalog, counts 79->80, INTRO, News en/cn); canonicalize meta-apply reviewer line Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * review fixes: ledger lifecycle + resume-proof gating + launcher hardening Round-1 codex review (FIX-FIRST, 8 findings), all addressed: - forensics_gate.py: fcntl ledger locking; fingerprint identity excludes artifact_hash (unrelated edits no longer duplicate obligations); severity ratchet on re-observation; RESOLVED findings that recur re-open with history; strict report parsing (fail-closed on malformed shapes); last_report_sha256 binds ledger to the report the gate speaks for (unbound/weird-status -> BLOCK); unique mkstemp temp files; new atomic 'evaluate' subcommand (update+gate in one locked transaction) - tests/test_forensics_gate.py: 8 -> 15 tests (ratchet, recurrence, disappearance, concurrency x8 threads, unfolded-report refusal, malformed-ledger fail-closed, evaluate atomicity) - paper-writing Phase 5.9: re-derive assurance + self_forensics from $ARGUMENTS (never trust assurance.txt alone); persist opt-out receipt; Phase 6.0 preflight row 5 requires gate.json-or-receipt so resumed runs can't bypass the default-ON gate (mirror: opted-in run without gate.json is incomplete, not skippable) - launcher SKILL (both packs): fetch only when the pin is absent (cached validated pin works offline); cd-only wrapper rule (exported ROOT gets re-derived by upstream blocks); Step 2 now uses the atomic 'evaluate' - codex-mirror resubmit-pipeline: explicit '— self_forensics: true' opt-in deterministic re-run path (bib frozen => citation-replaced illegal) - READMEs: last four 79->80 skill counts; News wording made conditional ('when code/ and results/ are present', 'obligation-bearing finding') Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * review fixes r2: tamper-proof bootstrap, unbound/receipt/schema fail-closed, paper-fingerprint freshness Round-2 codex review (FIX-FIRST, 4 HIGH + 4 MEDIUM), all confirmed against the code and addressed: - H1 launcher bootstrap (both packs): force a pristine tree at the pin (checkout -f + reset --hard + clean -fdx) so local tampering with the clone cannot run under the official pin's name; eval marker moved OUTSIDE the clone (a marker inside a tamperable tree proves nothing) - H2 gate: missing ledger / never-folded ledger is now UNBOUND -> BLOCK (deleting obligations.json no longer turns a CLEAN report into exit 0) - H3 freshness: gate.json records a paper_fingerprint (sha over .tex/.bib); new 'fresh' subcommand exits 1 when the paper changed after the gate; paper-writing Phase 6.0 row 5 requires it (stale gate => re-run Phase 5.9) - H4 opt-out replay: Phase 6.0 re-parses the CURRENT $ARGUMENTS; a previous run's opt_out.txt is a record, never an authorization - M1 evaluate holds ONE lock across update+gate; gate.json writes via unique mkstemp temp files (no shared .tmp collisions) - M2 schema drift fails closed: non-object findings, non-int _verdict_weight (e.g. string "1"), unknown severity tokens -> FATAL, never a silently dropped obligation - M3 closure needs its receipt: RESOLVED without a typed resolution / WAIVED without a human waiver record -> malformed_ledger_entries -> BLOCK - M4 disappearance is append-only: reappearance archives the episode into disappearance_history (never pop), repeated absence extends the episode - READMEs: waiver named explicitly as the human-signed exception to hashed-evidence closure - tests: 15 -> 21 (missing-ledger refusal, schema-drift fatal, receipt-less closure blocks, disappearance history, freshness binding, concurrent evaluates) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * review fixes r3: one-command preflight, gate invalidation on mutation, closure-receipt hashes, pristine-tree bootstrap Round-3 codex review (FIX-FIRST), all confirmed and addressed: - schema: _verdict_weight restricted to {0,1} (weight 2 was silently non-obligation-bearing); a finding with no severity at all is drift -> FATAL, never defaulted to info - 'fresh' is now the WHOLE downstream preflight in one exit code: gate exists AND paper unchanged AND gate bound to the current ledger AND policy in an ALLOWLIST (WARN/NO_NEW_BLOCKER) — BLOCK, unknown tokens, or a hand-crafted gate all exit 1 - every ledger mutation (update/resolve/waive) deletes the standing gate.json: an evaluate interrupted between ledger-save and gate-write leaves NO gate (fail closed), and a pre-mutation pass can't be replayed - standalone 'gate' now takes the same ledger lock (a concurrent evaluate's BLOCK gate could otherwise be overwritten by an older read) - resolution receipts: evidence_sha256 must be a real 64-hex sha (empty-string forgeries -> malformed_ledger_entries -> BLOCK) - paper fingerprint covers the full compile closure + deliverables (.sty/.cls/.bst/.inc/.def/.tikz/figures/PDF, symlinked dirs followed) — numbers moved into a macro file or a regenerated figure read as STALE - bootstrap (both packs): clean -ffdxq (nested-repo injections), per-step exit-code checks, and a status --porcelain pristine verification - workflows: mainline row 5 delegates to the one-command fresh allowlist; codex-mirror paper-writing checklist gains the opt-in forensics row 5; both resubmit packs require fresh exit 0 before the Overleaf push with CURRENT-$ARGUMENTS re-parse (no opt-out carry-over) - News (en/cn): note the Codex mirror is opt-in deterministic-slice only - tests: 21 -> 23 (fresh rejects BLOCK/forged policy; ledger mutation invalidates the standing gate; weight/severity drift fatal; forged empty-sha receipt counted malformed; .sty edit reads STALE) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * review fixes r4: stale-report guard, recomputed preflight, re-verified receipts Round-4 codex review, all three HIGHs + two MEDIUMs addressed: - stale-report replay: 'update'/'evaluate' now REFUSE a report older than any fingerprinted paper file — an old CLEAN report can no longer be folded onto text the sweep never audited (the honest resumed-run case, not just the adversarial one) - mutable-gate bypass: 'update' archives the folded report verbatim to .aris/forensics/last_report.json; 'fresh' re-computes the decision from that sha-verified archive + the live ledger via the same _decide() function cmd_gate uses — a one-field BLOCK->WARN edit of gate.json now fails with MISMATCH; the stored policy token is display, never authority - self-attested closure: --verified-by requires typed provenance (human:<name> / checker:<tool> / cross-family-review:<thread-id>; freehand tokens refused, naming a false verifier leaves a permanent paper trail); receipts are re-verified on every later gate — the evidence file must still exist at its recorded abspath and still hash to the recorded sha (tampering re-opens the BLOCK) - codex-mirror paper-writing Final Report gains the Forensics line (WARN obligations must be listed, never silently passed) - both resubmit master reports must record the gate decision + every OPEN obligation verbatim (SOFT findings awaiting human disposition can't drop out of the deliverables) - tests: 23 -> 25 (stale-report refusal, BLOCK->WARN forgery caught, evidence tamper re-blocks, freehand verified_by refused) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * review fixes r5: stale guard everywhere, structural report floor, pin-bound preflight, typed waivers, gemini-overlay wiring Round-5 codex review, addressed: - standalone 'gate' now runs the same stale-report guard as update/evaluate (extracted _assert_report_not_stale; the update-then-edit-then-gate sequence can no longer bind an old report to new text) - structural provenance floor: a report must name its adjudicator and carry a coverage map — a bare {verdict, findings} stub is refused (raises the bar for a skipped-sweep shortcut; NOT cryptographic provenance) - NEW 'Trust boundary' section in the launcher SKILL states honestly what is computed vs what is protocol vs what is out of scope (owner-power artifact rewriting); true report-to-content binding is tracked as an upstream issue (report.json should carry a paper fingerprint) - 'fresh' now binds to the CURRENT pin and gate version: optional --anti-ar-commit (all five workflow callers pass it) + gate_version check — an old-pin gate must be re-audited, never inherited (pin-bump rule now mechanical) - waivers carry typed provenance like resolutions: --approver must be 'human:<name>' (accountability, not authentication — the tool cannot verify humanity; a false 'human:' record is an explicit permanent lie); ledger-side check enforces the same - paper fingerprint covers tabular compile inputs (.csv/.tsv/.dat/.pgf); .json deliberately excluded — the sweep's own report.json lives in the paper dir and self-tripped the staleness guard (caught by tests) - gemini-review overlay's paper-writing (pre-assurance-era variant, known drift) gains the forensics opt-in Phase 5.9 + fresh preflight + a Forensics report line, so installing the overlay no longer erases the gate wiring; full assurance-contract backport remains a separate item - tests: 25 -> 26 (pin/version binding, typed waiver refusal, stub-report refusal, .sty freshness) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * review fixes r6: real obligations-ledger sha binding, fresh under lock, test-gap closure Round-6 codex review (2 MEDIUM + 1 LOW, no HIGHs), all addressed: - gate.json now records obligations_sha256 (hash of the exact ledger file the gate judged); 'fresh' compares it against the live file FIRST — an out-of-band ledger edit (hand-deleting one obligation while another keeps the recomputed decision identical) reads as LEDGER_DRIFT; the old ledger_sha256 field is honestly renamed claims_ledger_sha256 (it always hashed upstream's claims.json, not the obligations ledger) - 'fresh' runs under the same _ledger_lock as the mutators — no TOCTOU window against a concurrent resolve/waive/update - test gaps: gate_version tamper now asserted; standalone 'gate' stale guard tested; .csv freshness tested; LEDGER_DRIFT tested - tests: 26 -> 28 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs: register forensics_gate.py in the helper policy table (Policy A gate), both packs Round-7 codex verdict: MERGE, with one LOW — the new helper was missing from integration-contract.md's policy table (the designated drift-catch point). Row added in mainline + codex mirror. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
33 KiB
name, description, argument-hint, allowed-tools
| name | description | argument-hint | allowed-tools |
|---|---|---|---|
| resubmit-pipeline | Workflow 5: orchestrate a text-only resubmit of a polished paper to a different venue under hard constraints (no new experiments, no bib edits, no framework changes, never overwrite prior submissions). Use when user says "resubmit pipeline", "重投流程", "port paper to <new venue>", "resubmit to <venue>", "tighten paper for resubmission", or has a rejected/withdrawn paper to move to a different top venue under tight time budget. | [paper-base-dir] [— target-venue: <name>] [— review-corpus: <path>] | Bash(*), Read, Write, Edit, Grep, Glob, mcp__codex__codex, mcp__codex__codex-reply |
Resubmit Pipeline: Text-Only Microedit Mode
Compose a polished paper into a new venue under text-only constraints: $ARGUMENTS
Why This Exists
Most ARIS writing workflows assume the input is either a narrative report (Workflow 3) or an in-progress paper that may still need experiments / bib changes / structural edits. Resubmit is a fundamentally different scope:
- The paper is already polished — proofs are done, experiments are done, bibliography is curated.
- The user wants to absorb prior reviewer concerns from a previous venue and re-submit, without introducing new experiments, new citations, or framework changes (LLM hallucination paranoia + tight resubmit timing + closed compute budget).
- The base submission directory is read-only — the new submission must compose into a sibling directory, never mutate prior state.
- Page limit may shrink between source and target venue (e.g., workshop camera-ready → 9-page main).
Existing skills cover adjacent territory but none of this exact composition: /rebuttal builds the OpenReview-style response document, not in-paper microedits; /auto-paper-improvement-loop is the per-round engine but presupposes someone has already chosen the base manuscript, migrated venue format, set the edit whitelist, queued the reviewer feedback, and decided what NOT to change. /resubmit-pipeline fills that orchestration gap.
When to Use
- A theory or system paper was rejected at venue A and you want to resubmit to venue B with tight time budget (≤ 1-2 weeks).
- You have 3 inputs ready: the polished paper directory at venue A's format, the target venue B's format/template/style files, and the prior reviewer reports.
- You explicitly do not want to re-derive theorems, run new experiments, or change the bibliography.
When NOT to Use
- The paper still needs experiments — use
/experiment-bridge→/auto-review-loopfirst. - The paper still needs structural rewrites or new sections — use
/paper-writing(Workflow 3). - You want to write the rebuttal response itself — use
/rebuttal(Workflow 4). - The reviewer feedback demands new theorems or new framework — escalate to user before starting; this skill emits
BLOCKEDwithreason_code: out_of_scope_microeditif it detects this case.
Constants
- REVIEWER_MODEL = inherits from
/auto-paper-improvement-loop's default (gpt-5.6-solvia Codex MCP) unless the user passes— reviewer-model: gpt-5.4(legacy) or another OpenAI model. Codex reasoning effort is fixed atxhighfor all reviewer calls per the existing skill convention. - ROUNDS = 2 (default; matches
/auto-paper-improvement-loop's diminishing-returns line). A 3rd round only fires if Phase 2 reports non-convergence AND the user explicitly approves at the round-2 checkpoint. - EFFORT =
max(default for resubmit; resubmit is high-stakes). The user can override with— effort: balancedif time is extremely tight. - EDIT_WHITELIST_PATH =
<paper-base-dir>/../<NewVenue>/.aris/edit_whitelist.yaml(auto-generated in Phase 0; user can override with a custom path). - NEVER_OVERWRITE = true (always; this is a hard contract — prior submission directories are immutable).
- ASSURANCE_LEVEL =
submission(default; resubmit always targets a real submission).
Inputs
Three mandatory inputs:
paper-base-dir— the polished paper at venue A's format. Must containmain.tex(or equivalent entry),sec/orsections/,references.bib(or equivalent), and a compiledmain.pdf(used for visual review).— target-venue: <name>— one of:iclr,icml,neurips,aaai,ijcai,colm,tmlr,uai, orother. The skill expects venue style files at<paper-base-dir>/templates/<venue>.{sty,tex,bst}or in a recognized template directory. Ifother, the user passes— target-style-dir: <path>.— review-corpus: <path>— directory containing prior venue's reviewer reports as.txtor.mdfiles (one per reviewer, ideally). If--review-corpusis omitted, the skill emitsBLOCKEDwithreason_code: missing_review_corpusbecause the whole point of resubmit is absorbing those concerns.
Optional:
— reviewer-model: gpt-5.4— override the default reviewer (gpt-5.6-sol); use this for legacy reproducibility or to consume the older quota tier.— rounds: <int>— override default 2.— assurance: draft— relax MANDATORY gates (defaultsubmission).— effort: balanced— relaxmaxif time is critical.— skip-anonymity-scan— skip Phase 0.5 anonymity check (only valid for non-double-blind venues like TMLR; else WARN).— overleaf-target: <project-id>— the Overleaf project ID for Phase 4 push (per/overleaf-sync setup).
Pipeline
Phase 0: Physical Isolation Setup (zero edits to existing files)
Resubmit's hardest invariant: never overwrite any prior submission directory. The new venue's submission lives as a sibling of all prior venues.
# Resolve target-venue → new sibling dir name (capitalized)
NEW_VENUE_DIR="$(dirname "$PAPER_BASE_DIR")/$(echo "$TARGET_VENUE" | sed 's/.*/\u&/')"
# Atomic dir create — `mkdir` (not `mkdir -p`) fails fast if the dir exists,
# avoiding the TOCTOU race window of `[ -e ] && exit; mkdir -p`. The mkdir
# itself must succeed exactly once; if a concurrent run gets there first,
# this errors out per resubmit-pipeline's never-overwrite invariant.
mkdir "$NEW_VENUE_DIR" 2>/dev/null || {
echo "ERROR: $NEW_VENUE_DIR already exists; resubmit-pipeline never overwrites prior submissions. Pick a different target-venue or rename the existing dir." >&2
exit 1
}
mkdir -p "$NEW_VENUE_DIR/.aris"
Composition rules (all cp, never \input{../...}, never symlink):
main.tex— write fresh for the target venue's.sty. Usetemplates/<venue>.texas the starting skeleton; only the\title{},\author{}, abstract include, and section input lines are copied from the base venue'smain.tex. The newmain.texlives entirely inside$NEW_VENUE_DIR/.sec/(orsections/) — physicalcp -r $PAPER_BASE_DIR/sec/ $NEW_VENUE_DIR/sec/. Do not symlink, do not\input{../sec/...}from the new main. Symlinks break Overleaf zip export; cross-directory\inputwould mutate the shared pool and pollute prior submissions.math_commands.tex(and any other macro file the sections depend on) — physicalcpinto$NEW_VENUE_DIR/.Figure/(orfigures/) — copy the directory in (cp -r). Path trap: existing sections likely write\includegraphics{Figure/foo.pdf}. If you set\graphicspath{{../Figure/}}from a child directory, it resolves../Figure/Figure/foo.pdf— wrong. Either copyFigure/in directly (preferred), or use\graphicspath{{../}}.- Bibliography — write
\bibliographystyle{<venue-bst>}+\bibliography{../references}directly in the newmain.tex. Never\inputan existingref.texorreferences.texthat already contains its own\bibliography{}command (path resolution silently breaks). .aris/— create$NEW_VENUE_DIR/.aris/and writeassurance.txtcontainingsubmission(matches the verifier's expected location).
Output of Phase 0: a new sibling dir with all source files, no edits to text content yet, ready for compile.
Phase 0.5: Health Check + Anonymity Scan (still zero text edits)
Before any audit or edit, the paper must compile cleanly on the new venue's style and pass anonymity scan if the target venue is double-blind.
Compile + page count:
cd "$NEW_VENUE_DIR"
latexmk -C
latexmk -pdf -interaction=nonstopmode -halt-on-error main.tex 2>&1 | tee compile.log
If compile fails: emit RESUBMIT_REPORT.json with verdict: BLOCKED, reason_code: phase_0_5_compile_failed, surface the error to the user, and stop. Common causes: missing macro from math_commands.tex, venue style undefined command, \graphicspath issue.
Page count vs venue limit (measure first; do not assume):
PAGES=$(pdfinfo main.pdf | awk '/^Pages:/ {print $2}')
LIMIT=$(grep -oE "page_limit: [0-9]+" "$NEW_VENUE_DIR/templates/$TARGET_VENUE.tex" | awk '{print $2}')
echo "Pages: $PAGES, Limit: $LIMIT, Delta: $((PAGES - LIMIT))"
If PAGES > LIMIT, queue Phase 2 to honor a page-shrink heuristic (see "Page-Shrink Heuristic" below).
Anonymity scan (skip only if — skip-anonymity-scan is passed AND target venue is non-double-blind):
The scan covers 5 layers (the proposal's 1-layer scan was incomplete):
- Surface identifiers: author surnames, affiliations, institution names, lab codenames, prior funding tag IDs (
grep -E "$(echo $AUTHOR_SURNAMES | tr ' ' '|')|$(echo $AFFILIATIONS | tr ' ' '|')"). - Self-citation phrasing: any sentence using "we showed in [...]" or "in our prior work [...]" that names the paper's own authors. Must rewrite to "X et al. [year] shows..." third-person form. Grep regex:
\b(we|our|my|I)\s+(showed|proved|demonstrated|prior work|earlier paper|previous paper)\b. - Acknowledgments + funding: scan
acknowledgments.tex(or\acknowledgments{}block) for institution-specific thanks, grant IDs, named collaborators. Comment out for double-blind submission. - Cross-rebuttal references: scan footnotes and body for "this paper builds on rebuttal at venue X" or "addressing reviewer N's concern from venue X" — these must be removed entirely (they violate anonymity AND signal prior rejection).
- Internal codenames / project links: grep for repo URLs (
github.com/<user>/<project>), Slack channel names, internal wiki links, and dataset codenames that may identify the lab.
If any of the 5 layers triggers a hit, emit RESUBMIT_REPORT.json with verdict: BLOCKED, reason_code: anonymity_scan_failed and present a per-hit list to the user. They must approve a fix or accept the risk before Phase 1 runs. Layers 4-5 are equally blocking as layers 1-3 — cross-rebuttal references and internal codenames signal both prior-venue identity AND lab identity, both of which violate double-blind in different ways.
Residual coloring / margin-note scan:
Search for \revise{...}, \fix{...}, \new{...}, \todo{...}, \todonotes{...}, \textcolor{red}{...} leftovers from camera-ready cycles. List them; user decides whether to keep (some venues accept revision-marker boxes) or strip.
Output of Phase 0.5: BASELINE.md with initial page count, anonymity-scan summary, residual-color list, overfull-hbox count.
Phase 1: Audit (zero edits)
Three audits in parallel, all detect-only. The new dir's source files are read; nothing is written except audit artifacts.
| Skill | Purpose | Artifact |
|---|---|---|
/proof-checker $NEW_VENUE_DIR/main.tex --restatement-check |
Gap-find on theorems prior reviewers attacked; cross-location consistency between main statement and restatements | PROOF_AUDIT.json + .md |
/paper-claim-audit $NEW_VENUE_DIR/ |
Numerical fidelity (every number in body matches what proofs / result files establish) | PAPER_CLAIM_AUDIT.json + .md |
/citation-audit $NEW_VENUE_DIR/ — soft-only |
Wrong-context citations + misattributions, mapped to "soften citing sentence" actions (NOT bib edits) | CITATION_AUDIT.json + .md |
Critical: the third audit MUST run with — soft-only. Without that flag, citation-audit emits KEEP/FIX/REPLACE/REMOVE verdicts that presuppose bib mutations — incompatible with resubmit's "no bib edits" constraint. With --soft-only, the same findings are translated to per-occurrence sentence-rewrite proposals consumable by Phase 2.
Atomize prior reviewer concerns in parallel:
For each file under $REVIEW_CORPUS:
Read the reviewer report.
Atomize into discrete concerns: severity (critical / major / minor),
type (assumption / novelty / scope / rigor / experiment-coverage / framing),
addressability (text-fixable / partial / unaddressable-under-constraints).
Append to KNOWN_WEAKNESSES.md with stable IDs (W1, W2, ...).
KNOWN_WEAKNESSES.md schema:
- id: W1
severity: major
type: scope
source: reviewer_2_venue_a
concern: "Theorem 3 states a generic result but the proof only handles a specific regime."
addressability: text-fixable
recommended_fix: "Narrow Theorem 3's title to 'restricted regime'; add scope qualifier in abstract."
- id: W2
severity: critical
type: experiment-coverage
source: reviewer_3_venue_a
concern: "No comparison against [prior method X]."
addressability: unaddressable-under-constraints
recommended_fix: "Acknowledge in Limitations that this comparison is left for future work."
Output of Phase 1: 4 artifacts (3 audits + KNOWN_WEAKNESSES.md). All are inputs to Phase 2.
Phase 2: Targeted Text Microedits via Auto-Improvement Loop
The load-bearing phase. /auto-paper-improvement-loop is invoked with two safety mechanisms:
-
— edit-whitelist <path>— a YAML file enumerating allowed paths and forbidden operations. Auto-generated in Phase 0 at$NEW_VENUE_DIR/.aris/edit_whitelist.yaml:allowed_paths: - "sec/*.tex" - "main.tex" - "appendix.tex" forbidden_paths: - "**/*.bib" - "**/*.sty" - "**/*.bst" - "../*Submission/**" # all prior submission dirs - "../*Camera/**" - "templates/**" forbidden_operations: - new_cite # blocks \cite{...}, \citep{...}, \citet{...}, \citeauthor{...} - new_bibitem # blocks \bibitem{...} additions - new_theorem_env # blocks \begin{theorem|lemma|proposition|corollary} additions - numerical_claim # blocks adding numbers / percentages / metrics not present in original rationale: "Resubmit mode: text-only microedits, paper structure frozen by user constraint." -
Per-round diff gate via auto-loop's HUMAN_CHECKPOINT —
/auto-paper-improvement-loopdoes not accept--rounds,--reviewer-model, or--resume-after-round-checkpointflags (those are not in its CLI). It uses theMAX_ROUNDS = 2constant andREVIEWER_MODEL = gpt-5.6-soldefaults, with an existingHUMAN_CHECKPOINTmechanism for round gating. Resubmit-pipeline therefore invokes the loop once withHUMAN_CHECKPOINT = trueso each round pauses for the orchestrator to inspect the diff:# Snapshot the new venue dir BEFORE auto-loop runs (for diff baseline, # works whether or not paper-base-dir is a git repo) SNAPSHOT_DIR="$NEW_VENUE_DIR/.aris/snapshots/round-0" mkdir -p "$SNAPSHOT_DIR" rsync -a --exclude='.aris' --exclude='*.pdf' --exclude='*.aux' \ "$NEW_VENUE_DIR/" "$SNAPSHOT_DIR/" # Single auto-loop invocation; rounds + checkpoints are loop-internal. # The whitelist file is the only resubmit-specific param. /auto-paper-improvement-loop "$NEW_VENUE_DIR/" \ --edit-whitelist "$NEW_VENUE_DIR/.aris/edit_whitelist.yaml" \ — assurance: submission \ — effort: "$EFFORT" \ — human checkpoint: trueInside the loop, at each round-end checkpoint, the resubmit orchestrator inspects:
for ROUND in 1 2; do # auto-loop's MAX_ROUNDS = 2 # auto-loop pauses at HUMAN_CHECKPOINT after each round # diff this round vs prior snapshot (works without git) diff -ruN "$NEW_VENUE_DIR/.aris/snapshots/round-$((ROUND-1))" "$NEW_VENUE_DIR" \ > "$NEW_VENUE_DIR/.aris/round-$ROUND-diff.txt" # Whitelist compliance check on the diff check_whitelist_compliance "$NEW_VENUE_DIR/.aris/round-$ROUND-diff.txt" \ "$NEW_VENUE_DIR/.aris/edit_whitelist.yaml" # Selective regression audits (only fire if relevant files touched) if grep -qE 'theorem|lemma|proposition|corollary' "$NEW_VENUE_DIR/.aris/round-$ROUND-diff.txt"; then /proof-checker "$NEW_VENUE_DIR/main.tex" --restatement-check fi if grep -qE '[0-9]+(\.[0-9]+)?\s*(%|±|x|×)' "$NEW_VENUE_DIR/.aris/round-$ROUND-diff.txt"; then /paper-claim-audit "$NEW_VENUE_DIR/" fi # Snapshot this round for next-round diff rsync -a --exclude='.aris' --exclude='*.pdf' --exclude='*.aux' \ "$NEW_VENUE_DIR/" "$NEW_VENUE_DIR/.aris/snapshots/round-$ROUND/" # Convergence check — see "Convergence Criteria" section below # If converged, signal HUMAN_CHECKPOINT to terminate early doneWhy the snapshot-rsync approach instead of
git diff HEAD~1..HEAD: the paper-base-dir is not guaranteed to be a git repo, and even when it is, intermediate states inside one auto-loop round don't produce per-round commits. rsync snapshots are repo-agnostic. -
Mapping of edits to concerns — every proposed edit must be mapped to either (a) an entry in
KNOWN_WEAKNESSES.mdwith an ID, OR (b) a Phase 1 audit finding. Un-mapped edits are rejected by the loop's reviewer prompt. This is enforced via the loop's reviewer prompt template (the resubmit-pipeline's invocation passes a custom prompt addendum saying "every fix must cite a W ID or audit finding ID").
Inputs into the loop's reviewer prompt (concatenated):
- The 3 Phase 1 audit reports (
PROOF_AUDIT.md,PAPER_CLAIM_AUDIT.md,CITATION_AUDIT.md) KNOWN_WEAKNESSES.md- A custom addendum: "you are reviewing a resubmit; the user constraint is text-only microedits; every proposed fix MUST cite either a W ID from KNOWN_WEAKNESSES or an audit finding ID; un-mapped fixes are rejected; the edit whitelist is binding."
Output of Phase 2: PAPER_IMPROVEMENT_LOG.md with per-round diffs, rejected_by_edit_whitelist list, and convergence status.
Phase 3: Adversarial Gate
/kill-argument $NEW_VENUE_DIR/
No --difficulty parameter exists in /kill-argument — earlier proposal drafts referenced a non-existent flag. The skill always uses Codex gpt-5.6-sol + ultra (deep-audit tier) and runs the standard 2-thread Attack-Adjudication protocol; the assurance level (set to submission for resubmit) determines whether FAIL blocks the final report.
The kill-argument output is residual-risk reporting, not auto-rewrite directives. A hostile reviewer may demand framework changes the user banned; the adjudication step exists to triage which findings are text-fixable vs need user escalation.
Read $NEW_VENUE_DIR/KILL_ARGUMENT.json
For each decomposed_point with verdict in {still_unresolved, partially_answered}:
If severity_if_unresolved == critical:
If recommended_fix is text-only AND maps to allowed paths:
Append to "extra round queue"
Else:
Append to "user escalation queue" with note "outside text-only constraint"
If extra round queue is non-empty AND user-budget allows: one extra Phase 2 round. Else: stop and surface the user-escalation queue with a written escalation note ("here is what cannot be fixed under your constraints; please decide before submission").
Phase 4: Final Compile + Diff Report + Overleaf Push
Final compile:
/paper-compile $NEW_VENUE_DIR/main.tex --venue $TARGET_VENUE
/paper-compile checks page limit, font, bib resolve, figure overflow, and emits COMPILE_REPORT.json. If page limit exceeded → trigger page-shrink heuristic (see below).
Final paper-claim-audit zero-context pass:
/paper-claim-audit $NEW_VENUE_DIR/
Verifies no Phase 2 microedit accidentally introduced a numerical claim that's not backed by results.
Integrity forensics re-run (default ON; — self_forensics: false to skip):
resubmits are exactly where numbers drift, and a text-only pass is cheap. Run
/integrity-forensics on $NEW_VENUE_DIR/
AFTER all microedits (never between rounds — see its One Forbidden Loop). Let
upstream derive the observability level from what's present (don't assume L1 —
if code/+results/ are linked it runs stricter). Gate BLOCK → stop before
the Overleaf push, surface obligations verbatim. One resubmit-specific rule:
the bib is frozen in this pipeline, so citation-replaced is NOT a legal
fix-type here — a citation obligation either gets a waive with human
sign-off or escalates to the user to relax the bib freeze.
Immediately before the Overleaf push (and again whenever the run was
resumed), re-parse the CURRENT $ARGUMENTS: unless it contains
— self_forensics: false, require
python3 "$GATE_HELPER" fresh --paper-dir "$NEW_VENUE_DIR/" --anti-ar-commit "$ANTI_AR_COMMIT"
to exit 0 — any
microedit or recompile after the gate reads as STALE and forces the re-run.
A previous run's opt-out never carries over.
Diff report:
diff -u $PAPER_BASE_DIR/main.tex $NEW_VENUE_DIR/main.tex > $NEW_VENUE_DIR/.aris/DIFF_REPORT.md
for f in $PAPER_BASE_DIR/sec/*.tex; do
base=$(basename $f)
diff -u "$f" "$NEW_VENUE_DIR/sec/$base" >> $NEW_VENUE_DIR/.aris/DIFF_REPORT.md
done
This goes to the user for skim-review before any export.
Overleaf push (if — overleaf-target: <project-id> was passed):
Defer entirely to /overleaf-sync setup and /overleaf-sync push. Do not invent a parallel push mechanism — /overleaf-sync setup already handles token-stays-in-keychain (token never enters the agent), and /overleaf-sync push has a confirmation gate before writing to shared Overleaf state.
/overleaf-sync setup $OVERLEAF_TARGET # one-time, user confirms in their terminal
/overleaf-sync push # confirmation-gated push from $NEW_VENUE_DIR
If overleaf-target is not provided, skip Overleaf push and tell the user to either /overleaf-sync setup <id> manually or zip-export the directory.
Page-Shrink Heuristic
When Phase 0.5 or Phase 4 detects page overflow, apply this ordered heuristic. Stop as soon as the page limit is met. Each step is fully constrained by the edit whitelist (no theorem changes, no bib changes, no framework changes):
- Compress conclusion (typically 1-2 paragraphs of "future work" can be cut to 2-3 sentences each). Save: 0.3-0.7 pages.
- Tighten abstract / intro hedging (cut "in this paper, we" → "we"; cut "it is well known that" → straight to point). Save: 0.2-0.4 pages.
- Move marginal figures to appendix (figures whose information is not load-bearing for the main argument). Save: 0.5-1 page per figure.
- Move proof sketches / extended remarks to appendix (keep theorem statements + 1-line proof intuition in main; full proof goes to appendix). Save: 0.5-2 pages.
- Compress related-work prose (cite-by-citation comparisons → comparison table). Save: 0.3-0.5 pages.
Forbidden under this heuristic: removing experiments, removing theorems from main, removing citations (bib frozen). If after step 5 the paper still overflows, emit RESUBmit_REPORT.json with verdict: BLOCKED, reason_code: page_shrink_failed_under_constraints and surface to user — they must decide whether to relax a constraint or pick a different target venue.
Convergence Criteria (Phase 2 stop condition)
Phase 2's per-round loop terminates when all three hold:
- No new CRITICAL or MAJOR text-fixable findings in the round's reviewer output (compared to the running running-deduped weakness list).
- Page budget passes —
/paper-compilereports page count ≤ venue limit. - All audits non-blocking —
/proof-checker,/paper-claim-audit,/citation-audit --soft-onlyall returnverdict ∈ {PASS, NOT_APPLICABLE}(notWARN/FAIL/BLOCKED/ERROR).
If after ROUNDS (default 2) any of (1)/(2)/(3) is still failing, emit a checkpoint to the user asking whether to continue with an extra round (not auto-extend). The user explicitly approving an extra round overrides the default-2 cap.
This pattern is borrowed from /rebuttal Phase 7's "terminate when no new substantive issues" — the same shape works for resubmit.
Master RESUBMIT_REPORT.md Ledger
Every resubmit run writes one master report at $NEW_VENUE_DIR/RESUBMIT_REPORT.{md,json} collecting:
- Source dir, target venue, target style files used, run start / end timestamps
- Pointers to all artifacts:
BASELINE.md,PROOF_AUDIT.json,PAPER_CLAIM_AUDIT.json,CITATION_AUDIT.json,KNOWN_WEAKNESSES.md,PAPER_IMPROVEMENT_LOG.md,KILL_ARGUMENT.json,COMPILE_REPORT.json,DIFF_REPORT.md - Forensics outcome (unless opted out): the gate decision from
.aris/forensics/gate.jsonplus every OPEN obligation listed verbatim — aWARNthat passesfreshstill carries findings awaiting human disposition; they must appear in this ledger, never silently drop out of the deliverables - SHA256 hashes of every input file consumed (for
verify_paper_audits.shcompatibility) - All thread IDs (Phase 1 audits + Phase 2 reviewer rounds + Phase 3 kill-argument's two threads)
audit_skill: resubmit-pipeline,verdict ∈ {PASS, WARN, FAIL, NOT_APPLICABLE, BLOCKED, ERROR},reason_code: <one of the listed codes>- Decision log: every user checkpoint approval / rejection / escalation, with timestamp
- "Skipped constraints": if any user override (e.g.,
— skip-anonymity-scan,— rounds 3) was passed, recorded with rationale
The schema follows shared-references/assurance-contract.md (the same schema all mandatory audits use). This makes resubmit-pipeline runs forensically reproducible.
Failure Modes
The skill emits one of 7 verdicts (the 6 from the assurance contract + a USER_DECISION runtime state for in-flight checkpoint pauses):
| Verdict | reason_code | Trigger | Recovery |
|---|---|---|---|
PASS |
clean_resubmit |
All gates passed; final PDF compiled at venue limit | Submit |
WARN |
partially_addressed_concerns |
All MUST-FIX gates passed but some KNOWN_WEAKNESSES remain unaddressable |
User reviews unaddressed list; submits with awareness |
FAIL |
kill_argument_unresolved_critical |
Phase 3 surfaces a still_unresolved critical finding that cannot be fixed under text-only constraints |
User decides: relax constraints, escalate to framework change, or pick different venue |
NOT_APPLICABLE |
not_a_resubmit |
The skill detects no prior reviews in --review-corpus or the directory looks like a fresh draft |
User uses /paper-writing instead |
USER_DECISION |
awaiting_phase_<N>_checkpoint |
Skill paused at a Phase 0.5 anonymity-fix checkpoint, Phase 2 round-end diff gate, Phase 3 escalation queue, or Phase 4 page-shrink approval | User responds to the checkpoint prompt; skill resumes with the user's decision recorded in the master ledger |
BLOCKED |
phase_0_setup_blocked |
New venue dir already exists, or template files not found | User resolves the conflict; rerun |
BLOCKED |
phase_0_5_compile_failed |
Initial compile fails on new venue's style | User fixes compile error before audits run |
BLOCKED |
anonymity_scan_failed |
Phase 0.5 hits surface-identifier or self-citation patterns the user must approve | User approves fixes or passes — skip-anonymity-scan (only for non-double-blind) |
BLOCKED |
missing_review_corpus |
--review-corpus not provided AND not detected |
User provides the prior reviews |
BLOCKED |
page_shrink_failed_under_constraints |
Page-shrink heuristic exhausted, paper still overflows | User relaxes a constraint or picks a different venue |
BLOCKED |
out_of_scope_microedit |
KNOWN_WEAKNESSES analysis shows ≥1 critical concern requires new experiments / new theorems / framework change |
User decides whether to escalate (drop resubmit-pipeline; use full Workflow 1.5 + 3) |
ERROR |
audit_failure / loop_failure |
Any sub-skill emits ERROR |
Examine sub-skill's report; fix + retry |
BLOCKED is recoverable; ERROR indicates an unexpected sub-skill failure; only FAIL and unrecoverable BLOCKED block submission.
Key Rules
- Never overwrite prior submission directories. This is the single hardest invariant. The skill aborts at Phase 0 if the target dir already exists.
- Bib is frozen. All citation-audit findings flow through
--soft-onlyand emerge as text-rewrite proposals, not bib edits. - Edit whitelist is binding. Every Phase 2 round respects the whitelist; rejections logged to
PAPER_IMPROVEMENT_LOG.md; the user sees a per-round summary at the round checkpoint. - Per-round diff gate is mandatory. Multi-round drift is the highest-risk failure mode for resubmit (a small softening at round 1 + another small softening at round 2 can compound into a meaningful framing change). The orchestrator MUST inspect each round's diff before next round.
- Convergence criteria are fixed. Default is 2 rounds; a 3rd round requires explicit user approval at the round-2 checkpoint. The loop does not auto-extend.
- Anonymity scan is 5-layer. Surface identifiers, self-citation phrasing, acknowledgments, cross-rebuttal references, internal codenames — not just
grep author surnames. - Phase 3 (kill-argument) is residual-risk reporting, not auto-rewrite. Adjudicator's
still_unresolvedcritical points may need user escalation, not blind extra-round triggering. - Overleaf push defers to
/overleaf-sync. Don't invent a parallel mechanism. - Master
RESUBMIT_REPORT.mdledger is mandatory atassurance: submission.
Output Contract
<NEW_VENUE_DIR>/main.tex+sec/+main.pdf— the new submission, compiled<NEW_VENUE_DIR>/RESUBMIT_REPORT.md+RESUBMIT_REPORT.json— master ledger (mandatory)<NEW_VENUE_DIR>/BASELINE.md— Phase 0.5 health snapshot<NEW_VENUE_DIR>/KNOWN_WEAKNESSES.md— atomized prior reviewer concerns with stable IDs<NEW_VENUE_DIR>/PROOF_AUDIT.json+.md— Phase 1 proof audit<NEW_VENUE_DIR>/PAPER_CLAIM_AUDIT.json+.md— Phase 1 claim audit<NEW_VENUE_DIR>/CITATION_AUDIT.json+.md— Phase 1 citation audit (--soft-only mode)<NEW_VENUE_DIR>/PAPER_IMPROVEMENT_LOG.md— per-round Phase 2 trace<NEW_VENUE_DIR>/KILL_ARGUMENT.json+.md— Phase 3 adversarial gate<NEW_VENUE_DIR>/COMPILE_REPORT.json— Phase 4 compile + page-limit check<NEW_VENUE_DIR>/DIFF_REPORT.md— full diff vs base venue body<NEW_VENUE_DIR>/.aris/edit_whitelist.yaml— Phase 0-generated whitelist<NEW_VENUE_DIR>/.aris/round-N-diff.txt— per-round diff for the gate<NEW_VENUE_DIR>/.aris/traces/<phase>/<date>_runNN/— Codex traces per phase
The new venue dir is the deliverable; the prior venue dir is untouched.
Review Tracing
Every Codex MCP reviewer call across all phases saves traces per shared-references/review-tracing.md to <NEW_VENUE_DIR>/.aris/traces/<phase-name>/<date>_run<NN>/. Both threads of /kill-argument are preserved separately. The master RESUBMIT_REPORT.json trace_path field points to the top-level traces directory.
Notes
- This skill orchestrates several existing skills (proof-checker, paper-claim-audit, citation-audit, auto-paper-improvement-loop, kill-argument, paper-compile, overleaf-sync) plus uses two recently-added parameters (
/auto-paper-improvement-loop --edit-whitelist,/citation-audit --soft-only). Make sure those parameters resolve to the current SKILL.md versions before relying on the resubmit pipeline. - The 5-layer anonymity scan is intentionally more thorough than
/paper-compile's generic self-citation warning, because resubmit-mode often inherits camera-ready text from a non-double-blind venue going to a double-blind venue. - Page-shrink heuristic is ordered (compress conclusion → tighten hedging → move marginal figures → move proof sketches → compress related-work prose). The order is calibrated to "least risky to most risky" — compressing conclusion is mostly editorial; moving proof sketches changes the reading flow. Stop as early as page limit is met.
RESUBMIT_REPORT.jsonschema followsshared-references/assurance-contract.mdexactly. This makes resubmit runs forensically reproducible. Note:verify_paper_audits.shdoes not currently includeRESUBMIT_REPORT.jsonin itsMANDATORY_AUDITSlist (the verifier checks proof / paper-claim / citation / kill-argument). The 4 mandatory audit files consumed by resubmit (which DO live in<NEW_VENUE_DIR>/) are recognized by the verifier as usual;RESUBMIT_REPORT.jsonis the orchestrator's own ledger and is not yet a verifier mandatory artifact. Adding it to the verifier is a separate follow-up if the user wants resubmit to be a submission gate via the verifier.