Simulate Reviewers
Run a paper through a simulated, venue-calibrated review panel before
submission. A NeurIPS main-track reviewer and a SIGSPATIAL demo-track judge
reject for different reasons at different thresholds — this skill reproduces
that difference: persona-driven weakness hunting, rubric scoring on the
venue's own scale, and a deterministic decision-risk readout that tells the
authors what to fix while there is still time.
When to use
- "What would reviewers say about this paper?" / "simulate a review"
- "Review this like a harsh NeurIPS reviewer" / "what will Reviewer 2 hate?"
- "Is this good enough for KDD, or should I aim for the short track?"
- "Find the weaknesses before the reviewers do" / "red-team my submission"
- After
preflight-check passes (format is clean) but before submitting —
this skill judges content, preflight judges compliance.
Inputs
- The paper: a
.tex source tree, a PDF, or a draft in any readable form.
Process it transiently — never copy paper text into the repo.
- A venue profile:
venues/conferences/<venue>-<year>.yml (schema in
venues/schema.yml). No profile? Create one with parse-cfp first, or
run against the nearest family default and say so.
- The target track (page limits and reviewer expectations differ — ask).
Process
Build the calibrated review packet. Run:
python3 scripts/review_form.py venues/conferences/<venue>-<year>.yml \
--track "<track>"
This is deterministic and offline. It merges the family profile and emits
the panel (personas + harshness), the venue score scale with its
borderline threshold, the rubric, the per-reviewer form skeleton, and a
scores.json template. Add --json for machine-readable output. Exit
codes: 0 ok, 2 missing/unparsable profile or unknown track.
Re-verify against the live CFP — mandatory. Profiles and the script's
scale anchors are historical norms, never ground truth. Fetch the
profile's cfp_url (and reviewer-guidelines page if linked) and confirm:
review scale and form, blind level, rebuttal format, track expectations.
If anything differs, update the profile YAML, note the discrepancy in the
report, and prefer the live facts. Label every venue fact you state with a
confidence tag and a clickable source:
verified-live / corroborated / inferred-from-family /
needs-verification. A scale number quoted to the user with no source is a
bug, not a convenience.
Read the whole paper and build a claim inventory. List every claim of
novelty ("first", "state-of-the-art", "outperforms"), every empirical
claim, and where its supporting evidence lives. This inventory is what
the personas attack. Method in
references/weakness-hunting.md.
Write each review independently, in persona. One pass per reviewer
from the packet, in order, without referring to the other reviews while
writing (real reviews are independent; convergent complaints found
independently are the strongest signal). Persona behavior, harshness
calibration, and track modifiers are specified in
references/reviewer-personas.md.
Grounding rules — non-negotiable:
- Each review opens with genuine Strengths, then Weaknesses — like a
real review form. State 2–4 specific strengths (what the paper does well:
novelty, a strong experiment, clarity, a useful artifact), each grounded
in a section/figure the same way weaknesses are. A review that is all
cons is not a real review and misleads the author about what to protect
while fixing. Do not invent strengths to pad — if the paper is weak, say
so, but find what genuinely works.
- Every weakness cites a section/figure/line or quotes ≤1 sentence.
- Never invent prior work. If a persona suspects missing related work,
find real candidates with
find-papers and verify them with
verify-citations — or phrase the concern conditionally
("if prior work on X exists, R4 will find it") with no fake reference.
- Misreadings are allowed only for the skimmer persona, and must be
misreadings the actual text permits.
Score with the rubric, then the venue scale. Score the four core
dimensions (novelty, soundness, reproducibility, clarity) 1–5 per
reviewer using the anchors in references/rubrics.md,
then map to the venue's overall scale + confidence from the packet.
Harshness calibration: at harshness 5, an unaddressed soundness weakness
caps the overall at borderline-reject; at harshness 2 (demo track), it
becomes a question, not a cap.
Aggregate deterministically. Fill the scores.json template from
step 1 and run:
python3 scripts/aggregate_scores.py scores.json
It computes the confidence-weighted mean, disagreement/champion/detractor
flags, drag dimensions, and the decision-risk band
(likely-reject / borderline-reject / borderline-accept / likely-accept) —
including the "borderline without a champion resolves downward" rule.
--example prints a valid input; --json for machine output; exit 2 on
invalid input.
Write the meta-review and the fix list. As the AC/1AC/AE persona:
synthesize the reviews, name the biggest shared concern, state whether a
champion exists. Then convert every weakness into a prioritized fix list,
each item tagged:
fix-now — addressable before submission (add ablation, soften claim,
add reproducibility statement);
rebuttal-defensible — survivable in this venue's rebuttal format
(check review.rebuttal_format / limits in the profile);
structural — cannot be fixed this cycle; consider a different
venue/track (hand off to select-venue).
Borderline-reject predictors to check explicitly are listed in
references/weakness-hunting.md.
Output
A simulated review packet, presented in chat (written to a file only if the
user asks):
- N independent reviews in the venue's form format, each opening with a
Strengths section, then Weaknesses, then questions and subscores.
- The meta-review, naming the biggest strength to preserve and the biggest
shared risk to fix, and stating whether a champion exists.
- The score table plus the
aggregate_scores.py decision-risk readout.
- The prioritized fix list, every item tagged
fix-now /
rebuttal-defensible / structural.
Every output carries the disclaimer: this is a simulation to improve the
paper, not a prediction of the real outcome.
Worked mini-example
A 9-page submission to NeurIPS main track. After python3 scripts/review_form.py venues/conferences/neurips-2026.yml --track Main and a
live-CFP check (scale and rebuttal format confirmed, tagged verified-live),
the four personas are written independently. Convergence emerges: R2 (the
empirical skeptic) and R4 (the adjacent-field expert) both, without seeing
each other, land on the same gap.
R2, Weaknesses. "Table 2 reports a single run (§5.1). With ±std over 5
seeds, does the +1.3% gap over the baseline survive? No tuning-budget parity
is stated for the baseline." — soundness 2, confidence 5.
R4, Weaknesses. "The §1 claim 'first to combine X with Y' needs the
2023 work on X-under-Y. If that line exists, the novelty claim narrows to an
engineering delta." (Conditional — routed to find-papers; no fake citation
stated.) — novelty 2, confidence 4.
Filling and aggregating scores.json (R1 5/4, R2 4/5, R3 6/2, R4 5/4) yields:
conf-weighted mean: 4.8 delta vs threshold: -0.133 (normalized)
DECISION RISK: BORDERLINE-REJECT
drag dimensions: soundness 2.5, reproducibility 2.75
flags: strong detractor present (R2) — objection must be rebuttal-proof
The fix list leads with the convergent finding: fix-now — add 5-seed
±std and tuning-budget parity to Table 2 (cheapest path off the soundness
floor); fix-now — verify the X-under-Y prior work and soften the "first"
claim accordingly. The meta-review notes the only above-threshold score came
from the low-confidence skimmer (no real champion), so at borderline this
resolves downward unless the soundness objection is closed before submission.
Adapt to your discipline
Panels and scales are keyed on the venue family: field. For other fields,
fork and add a calibration entry (personas + scale) for your community in
scripts/review_form.py and a venue YAML — e.g. an APA-journal panel with
action-editor + 2 reviewers and accept/minor/major/reject.
Guardrails
- Never present the simulation as a prediction ("your paper will get a 5 at
NeurIPS"). Say: "the simulated panel scored it X; real panels vary widely."
- Never fabricate citations, reviewer identities, or quotes — personas are
archetypes, never named real researchers; missing-related-work claims go
through
find-papers + verify-citations or stay conditional.
- Re-verify review-process facts against the live
cfp_url (step 2 is not
optional); flag any profile staleness in the report.
- Process the paper transiently; quote at most one sentence per finding;
never store paper text in this repo.
- Never submit to, or post on, any review system on the user's behalf.
- Format/compliance problems found along the way are out of scope — route
them to
preflight-check.
Memory
This skill uses the shared .paper-memory/ convention in the user's paper
directory, following paper-memory-convention.md.
- At start: read
.paper-memory/profile.yml (vertical, risk appetite,
venue tier) to calibrate the panel and how hard the personas press novelty
claims, and read lessons.md to recall which weaknesses were already raised
and which recurring ones this author repeats (e.g. "weak ablations" or
"overclaimed contributions") so the meta-review leads with them.
- At end: append the durable weaknesses in the shared format
- [YYYY-MM-DD] (simulate-reviewers | <scope>) weakness -> recommendation (via
reflect-and-improve's reflect_log.py append, which dedupes and dates). A
structural habit seen across drafts is recurring; a draft-specific gap is
this-paper. Do not log per-reviewer score noise.
- Create
.paper-memory/ on demand if absent and offer to add it to the
project .gitignore. It is local-only; never upload it or copy it into this
repo.
1---2name: simulate-reviewers3description: Venue-calibrated peer-review simulation. Use when a researcher says "simulate reviewers", "mock review", "review my paper like a NeurIPS reviewer", "what would Reviewer 2 say", "red-team my paper", "find weaknesses before I submit", "peer review my paper", "strengths and weaknesses / pros and cons of my paper", "what to focus on", or wants a rubric score / borderline-reject risk estimate for a conference or journal (NeurIPS, ICML, ICLR, CVPR, KDD, SIGMOD, CHI, VLDB, LNCS, TKDE, TODS...). Builds a reviewer panel calibrated to the venue family and track (harsh NeurIPS main-track skeptics vs lenient demo-track judges), scores novelty/soundness/reproducibility/clarity on the venue's scale, hunts weaknesses grounded in quoted paper text, aggregates scores into a decision-risk band with borderline-reject flags, and outputs a prioritized fix list. Advisory only; improves the paper, never predicts the outcome, re-verifies facts against the live CFP, fabricates no citations or reviewers, and submits nothing.4---56# Simulate Reviewers78Run a paper through a simulated, venue-calibrated review panel *before*9submission. A NeurIPS main-track reviewer and a SIGSPATIAL demo-track judge10reject for different reasons at different thresholds — this skill reproduces11that difference: persona-driven weakness hunting, rubric scoring on the12venue's own scale, and a deterministic decision-risk readout that tells the13authors what to fix while there is still time.1415## When to use1617- "What would reviewers say about this paper?" / "simulate a review"18- "Review this like a harsh NeurIPS reviewer" / "what will Reviewer 2 hate?"19- "Is this good enough for KDD, or should I aim for the short track?"20- "Find the weaknesses before the reviewers do" / "red-team my submission"21- After `preflight-check` passes (format is clean) but before submitting —22 this skill judges *content*, preflight judges *compliance*.2324## Inputs25261. The paper: a `.tex` source tree, a PDF, or a draft in any readable form.27 Process it transiently — never copy paper text into the repo.282. A venue profile: `venues/conferences/<venue>-<year>.yml` (schema in29 `venues/schema.yml`). No profile? Create one with `parse-cfp` first, or30 run against the nearest family default and say so.313. The target track (page limits and reviewer expectations differ — ask).3233## Process34351. **Build the calibrated review packet.** Run:3637 ```38 python3 scripts/review_form.py venues/conferences/<venue>-<year>.yml \39 --track "<track>"40 ```4142 This is deterministic and offline. It merges the family profile and emits43 the panel (personas + harshness), the venue score scale with its44 borderline threshold, the rubric, the per-reviewer form skeleton, and a45 `scores.json` template. Add `--json` for machine-readable output. Exit46 codes: 0 ok, 2 missing/unparsable profile or unknown track.47482. **Re-verify against the live CFP — mandatory.** Profiles and the script's49 scale anchors are historical norms, never ground truth. Fetch the50 profile's `cfp_url` (and reviewer-guidelines page if linked) and confirm:51 review scale and form, blind level, rebuttal format, track expectations.52 If anything differs, update the profile YAML, note the discrepancy in the53 report, and prefer the live facts. Label every venue fact you state with a54 confidence tag and a clickable source:55 `verified-live` / `corroborated` / `inferred-from-family` /56 `needs-verification`. A scale number quoted to the user with no source is a57 bug, not a convenience.58593. **Read the whole paper and build a claim inventory.** List every claim of60 novelty ("first", "state-of-the-art", "outperforms"), every empirical61 claim, and where its supporting evidence lives. This inventory is what62 the personas attack. Method in63 [references/weakness-hunting.md](references/weakness-hunting.md).64654. **Write each review independently, in persona.** One pass per reviewer66 from the packet, in order, *without* referring to the other reviews while67 writing (real reviews are independent; convergent complaints found68 independently are the strongest signal). Persona behavior, harshness69 calibration, and track modifiers are specified in70 [references/reviewer-personas.md](references/reviewer-personas.md).71 Grounding rules — non-negotiable:72 - **Each review opens with genuine Strengths**, then Weaknesses — like a73 real review form. State 2–4 specific strengths (what the paper does well:74 novelty, a strong experiment, clarity, a useful artifact), each grounded75 in a section/figure the same way weaknesses are. A review that is all76 cons is not a real review and misleads the author about what to protect77 while fixing. Do not invent strengths to pad — if the paper is weak, say78 so, but find what genuinely works.79 - Every weakness cites a section/figure/line or quotes ≤1 sentence.80 - Never invent prior work. If a persona suspects missing related work,81 find real candidates with `find-papers` and verify them with82 `verify-citations` — or phrase the concern conditionally83 ("if prior work on X exists, R4 will find it") with no fake reference.84 - Misreadings are allowed *only* for the skimmer persona, and must be85 misreadings the actual text permits.86875. **Score with the rubric, then the venue scale.** Score the four core88 dimensions (novelty, soundness, reproducibility, clarity) 1–5 per89 reviewer using the anchors in [references/rubrics.md](references/rubrics.md),90 then map to the venue's overall scale + confidence from the packet.91 Harshness calibration: at harshness 5, an unaddressed soundness weakness92 caps the overall at borderline-reject; at harshness 2 (demo track), it93 becomes a question, not a cap.94956. **Aggregate deterministically.** Fill the `scores.json` template from96 step 1 and run:9798 ```99 python3 scripts/aggregate_scores.py scores.json100 ```101102 It computes the confidence-weighted mean, disagreement/champion/detractor103 flags, drag dimensions, and the decision-risk band104 (likely-reject / borderline-reject / borderline-accept / likely-accept) —105 including the "borderline without a champion resolves downward" rule.106 `--example` prints a valid input; `--json` for machine output; exit 2 on107 invalid input.1081097. **Write the meta-review and the fix list.** As the AC/1AC/AE persona:110 synthesize the reviews, name the biggest shared concern, state whether a111 champion exists. Then convert every weakness into a prioritized fix list,112 each item tagged:113 - `fix-now` — addressable before submission (add ablation, soften claim,114 add reproducibility statement);115 - `rebuttal-defensible` — survivable in this venue's rebuttal format116 (check `review.rebuttal_format` / limits in the profile);117 - `structural` — cannot be fixed this cycle; consider a different118 venue/track (hand off to `select-venue`).119 Borderline-reject predictors to check explicitly are listed in120 [references/weakness-hunting.md](references/weakness-hunting.md).121122## Output123124A simulated review packet, presented in chat (written to a file only if the125user asks):126127- **N independent reviews** in the venue's form format, each opening with a128 **Strengths** section, then **Weaknesses**, then questions and subscores.129- **The meta-review**, naming the biggest strength to preserve and the biggest130 shared risk to fix, and stating whether a champion exists.131- **The score table** plus the `aggregate_scores.py` decision-risk readout.132- **The prioritized fix list**, every item tagged `fix-now` /133 `rebuttal-defensible` / `structural`.134135Every output carries the disclaimer: this is a simulation to improve the136paper, **not** a prediction of the real outcome.137138## Worked mini-example139140A 9-page submission to NeurIPS main track. After `python3141scripts/review_form.py venues/conferences/neurips-2026.yml --track Main` and a142live-CFP check (scale and rebuttal format confirmed, tagged `verified-live`),143the four personas are written independently. Convergence emerges: **R2** (the144empirical skeptic) and **R4** (the adjacent-field expert) both, without seeing145each other, land on the same gap.146147> **R2, Weaknesses.** "Table 2 reports a single run (§5.1). With ±std over 5148> seeds, does the +1.3% gap over the baseline survive? No tuning-budget parity149> is stated for the baseline." — soundness 2, confidence 5.150151> **R4, Weaknesses.** "The §1 claim 'first to combine X with Y' needs the152> 2023 work on X-under-Y. If that line exists, the novelty claim narrows to an153> engineering delta." (Conditional — routed to `find-papers`; no fake citation154> stated.) — novelty 2, confidence 4.155156Filling and aggregating `scores.json` (R1 5/4, R2 4/5, R3 6/2, R4 5/4) yields:157158```159conf-weighted mean: 4.8 delta vs threshold: -0.133 (normalized)160DECISION RISK: BORDERLINE-REJECT161drag dimensions: soundness 2.5, reproducibility 2.75162flags: strong detractor present (R2) — objection must be rebuttal-proof163```164165The fix list leads with the convergent finding: **`fix-now`** — add 5-seed166±std and tuning-budget parity to Table 2 (cheapest path off the soundness167floor); **`fix-now`** — verify the X-under-Y prior work and soften the "first"168claim accordingly. The meta-review notes the only above-threshold score came169from the low-confidence skimmer (no real champion), so at borderline this170resolves downward unless the soundness objection is closed before submission.171172## Adapt to your discipline173174Panels and scales are keyed on the venue `family:` field. For other fields,175fork and add a calibration entry (personas + scale) for your community in176`scripts/review_form.py` and a venue YAML — e.g. an APA-journal panel with177action-editor + 2 reviewers and accept/minor/major/reject.178179## Guardrails180181- Never present the simulation as a prediction ("your paper will get a 5 at182 NeurIPS"). Say: "the simulated panel scored it X; real panels vary widely."183- Never fabricate citations, reviewer identities, or quotes — personas are184 archetypes, never named real researchers; missing-related-work claims go185 through `find-papers` + `verify-citations` or stay conditional.186- Re-verify review-process facts against the live `cfp_url` (step 2 is not187 optional); flag any profile staleness in the report.188- Process the paper transiently; quote at most one sentence per finding;189 never store paper text in this repo.190- Never submit to, or post on, any review system on the user's behalf.191- Format/compliance problems found along the way are out of scope — route192 them to `preflight-check`.193194## Memory195196This skill uses the shared `.paper-memory/` convention in the user's paper197directory, following [`paper-memory-convention.md`](../paper-profile/references/paper-memory-convention.md).198199- **At start:** read `.paper-memory/profile.yml` (vertical, risk appetite,200 venue tier) to calibrate the panel and how hard the personas press novelty201 claims, and read `lessons.md` to recall which weaknesses were already raised202 and which `recurring` ones this author repeats (e.g. "weak ablations" or203 "overclaimed contributions") so the meta-review leads with them.204- **At end:** append the durable weaknesses in the shared format `- [YYYY-MM-DD]205 (simulate-reviewers | <scope>) weakness -> recommendation` (via206 `reflect-and-improve`'s `reflect_log.py append`, which dedupes and dates). A207 structural habit seen across drafts is `recurring`; a draft-specific gap is208 `this-paper`. Do not log per-reviewer score noise.209- Create `.paper-memory/` on demand if absent and offer to add it to the210 project `.gitignore`. It is local-only; never upload it or copy it into this211 repo.