← All resources

Agent skill

Revision Plan

Use when a referee + editor letter needs to be turned into an atomic, dependency-ordered revision plan — parse atomically (one task per reviewer ask, with verbatim quote and stable task ID), classify into five buckets (argumentative / empirical robustness / measurement / theory / presentation), order via DAG, execute, and quote back verbatim in the response letter. The inverse of paper-writing.


Revision Plan

The referee report has arrived. The temptation is to read it once, panic, and start re-running specifications at random. The empirical-econ revision pipeline is structured enough to resist that. This skill turns a referee+editor letter into an atomic, dependency-ordered revision plan that you can execute, and that the response letter can quote back to verbatim.

It is the inverse of paper-writing: paper-writing builds the paper from artifacts; the revision plan tears the paper apart against an external skeptic and rebuilds it. For revisions large enough that scheduling pays off (10+ tasks, or when the editor’s bar requires a defensible roadmap), this skill also runs a computational DAG validation via NetworkX — see the Advanced: computational DAG validation section at the end. The validator is adapted from Jukka Sihvonen’s strategic-revision Claude Code skill.


Movement 1 — Parse atomically

The unit of work is one reviewer ask. Not one paragraph, not one “concern” — one ask. A paragraph that says “the identification is unclear, the standard errors look small, and Table 3 has a typo” is three tasks, not one.

For each task, record:

Goldsmith-Pinkham’s rule from the talk: traceability or nothing. Every entry in the revision plan must trace back to a reviewer quote. Summaries are insufficient because you will be challenged on whether you addressed the comment, and the only defense is the quote.

A 26-task plan from a typical R&R is not unusual.


Movement 2 — Classify

Five buckets. Each routes to a different work stream and a different reviewer expectation.

Tag each task with exactly one bucket. If a task fits two, split it.


Movement 3 — Map dependencies

Tasks are not independent. The reviewer who asked for a re-framing in major-comment-1 has implicitly asked for every empirical table to be re-described against the new frame. The reviewer who asked for an alternative sample in major-comment-4 has implicitly asked for every robustness table to be re-run on that sample.

Build a directed acyclic graph (DAG):

Inter-reviewer conflicts are first-class nodes. R1 wants more structure; R2 wants less. R1 wants a longer intro; AE wants a shorter one. These are not bugs in the plan — they are decisions you must make explicit, with the editor letter as the venue. Mark conflict nodes and resolve them in Movement 5 before downstream work begins.

For large revisions, run the DAG through NetworkX to validate acyclicity, surface the critical path, and identify bottlenecks — see Advanced: computational DAG validation below.


Movement 4 — Group into execution blocks

A topological sort of the DAG gives an execution order; grouping by dependency level gives parallel blocks.

GO/NO-GO checkpoints between blocks. Before moving from Block 2 to Block 3: is the headline number robust to the reviewer’s preferred sample? If no, the contribution claim from Block 1 may need to weaken — return to Block 1. Do not push downstream work on an unstable headline.


Movement 5 — Comply, partial-comply, or push back

For every task, write one of three decisions, with a one-line justification. The skill cannot make this call — you do.

Push-backs are not always confrontational, but they are always explicit. The response-letter rule from McCloskey applies: never imply you complied when you didn’t, and never bury a non-compliance in a paragraph that reads like compliance. Reviewers re-read their own comments first, and they notice.

The most common failure mode is silent partial compliance — the author addresses the easy half and hopes the reviewer forgets the hard half. The reviewer does not forget. Mark every task with its decision before any drafting begins.


Movement 6 — Map plan into the response letter

Each task generates one paragraph in the response letter, in a fixed structure:

Reviewer comment. [Verbatim quote, italicized.]

Response. [What we did, or why we did not. One short paragraph.]

Where in the revised paper. [Section / page / table / line numbers in the revised manuscript.]

Three rules:

Group response-letter sections by reviewer (R1, R2, AE), and within each reviewer follow the order of their original letter. The reviewer reads top-to-bottom against their own letter; do not make them re-sequence.

Do not let Claude write these paragraphs without your decision per task. Comment-mode editing (see paper-writing’s critique guidance) applies — draft the paragraph yourself, then ask Claude for comments on clarity and tone, not for prose.


Cross-cutting rules


Handoff

What this skill produces, fed into the next stage:

The revised manuscript is then drafted against paper-writing; new tables and figures follow report and visualization.md; the response letter is the final artifact this skill owns.

If a referee report returns a task list that fails Movement 3 (the DAG has cycles after two passes) or Movement 5 (more than one task is “TBD” at execution start), the plan is not yet ready. Do not start re-running specifications. Stay in revision planning.


Advanced: computational DAG validation

For routine R&Rs (≤ ~10 tasks), the by-hand DAG in Movement 3 is sufficient. For larger revisions — or when the editor’s letter requires a defensible roadmap — validate the graph computationally with NetworkX. This catches cycles you missed and surfaces the critical path and bottlenecks that hand-drawing always undersells.

Adapted from Jukka Sihvonen’s strategic-revision Claude Code skill. The dag_validator.py script lives alongside this skill in ~/.claude/skills/revision/scripts/dag_validator.py.

When to use this

Step 1 — Serialize the tasks

Convert the Movement 1–3 tables into revision_tasks.json. One key per task, dependencies via depends_on:

{
  "R1_MC1": {
    "category": "ARGUMENTATIVE",
    "block": "1",
    "description": "Reframe contribution against literature X",
    "depends_on": [],
    "collateral_risks": [
      {"task_id": "R2_MC3", "risk": "Reframe may invalidate R2's robustness motivation"}
    ]
  },
  "R1_MC2": {
    "category": "EMPIRICAL",
    "block": "2",
    "description": "Re-estimate Table 3 on R1's preferred sample",
    "depends_on": ["R1_MC1"]
  }
}

Fields: category ∈ {ARGUMENTATIVE, EMPIRICAL, STRUCTURAL, CLARIFICATION, EDITORIAL} (Movement 2). block ∈ {1..6} (Movement 4). depends_on lists upstream task IDs (Movement 3). collateral_risks is informational only — it does not create structural edges. Use "block": "?" if Movement 4 is not yet done.

Step 2 — Validate acyclicity (fail-fast gate)

python dag_validator.py revision_tasks.json --validate-only

If the script reports a cycle, the task list is broken. Common causes:

Fix and re-run until the graph passes. Do not move to Step 3 with a broken graph.

Step 3 — Full analysis (after Movement 4 block assignments are in)

python dag_validator.py revision_tasks.json

Produces three artifacts that feed back into the revision plan:

If the computational batches show that tasks from different Movement-4 blocks can run in parallel, the computational result takes precedence for scheduling. The block logic still drives narrative coherence, but it should not impose serial constraints that the DAG does not require.

What this changes in the response letter

Nothing. The response letter still quotes verbatim and addresses one task per paragraph. The NetworkX analysis is a project-management artifact, not a reviewer-facing one. Do not mention dag_validator.py in the letter to the editor.