A Watch-Along Claude Code Mini-Course
Emory University
April 2026
A few facts about my last months:
Something had to give. I started experimenting with Claude Code.
I’m still figuring it out.
Today is me sharing where I am.
Think of agentic AI as a super-RA:
Faster, better, more reliable. With practice.
Experimentation. Try small things first. See what breaks.
On-the-job practice. Use it on a paper you’re already writing.
Digging in. Read other people’s setups. Steal what works.
Expanding the frontier. Once it works for X, ask whether it can also do Y.
The first time, you’ll find errors. You’ll be picking on the wrong stuff — that’s normal, that’s the practice.
Over time you build know-how. The agents get better at the things you care about.
I’ll show you how I’ve been using it. Three live demos drawn from my actual workflow:
A manuscript section I’m trying to improve
A replication check on numbers in a paper draft
A simulated peer review on a working paper
You’re welcome to clone the repo.
You’re welcome to skip it.
Mainly: I’d love to hear what works for you afterward.
| Part | Topic | |
|---|---|---|
| 1 | Agentic AI + the CLAUDE.md control center | |
| 2 | End-to-end demo: improve a manuscript section | |
| 3 | Building reusable skills (paper exercise) | |
| 4 | Orchestration + multi-agent systems | |
| 5 | Research + replication (live demo) | |
| 6 | Refereeing + review simulation (live demo) | |
| 7 | Closing + cross-tool strategies |
CLAUDE.md.These don’t make this stuff necessary. They just make the upside of having a workflow bigger.
I’ll be honest: not all of what I show today is going to be relevant to all of you. Take what fits.
Claude-Mini) and the parent template (claude-code-my-workflow):
As agents get better at generating, the binding constraint quietly shifts to evaluating what they just produced.
The workflow is built around that shift.
By April 2026, the agentic primitives have converged.
| Claude Code | Codex CLI (OpenAI) | Gemini CLI (Google) | |
|---|---|---|---|
| Best for | Repo-context coding; deepest skills + agents ecosystem | Repo-context coding; sandboxed batch ops; can run as an MCP server | 1M context standard; free tier; strongest multimodal input |
| Agentic primitives | Subagents, hooks (~26 events), MCP, plan mode — all first-class | All first-class (subagents default-on; hooks stable Apr 2026, v0.124) | All first-class (subagents Apr 15; hooks Apr 23, 2026, v0.39) |
| Skills / plugin ecosystem | Largest community library (awesome-claude-code) |
Plugin marketplace (remote browsing in 0.122) | Smaller; subagent-scoped tools |
| Multimodal input | Images + PDFs via vision | Screenshots, design specs | PDFs, images, sketches; experimental visual agent |
| Pricing entry | Bundled with Claude Pro $20/mo | Free OSS + API key, or ChatGPT Plus $20 | Free tier (Flash only as of Apr 1, 2026); AI Pro $19.99/mo |
| My experience | Daily driver | Cross-tool audits / second opinion | Occasional, multimodal-only |
We’ll be in Claude Code for everything live. Two reasons:
If you’re already in another tool, most concepts port.
Nothing here is Claude-exclusive in concept.
“Edit the abstract to mention the panel-data dimension.”
“Here’s a revision: [text]”
You: copy → paste → save → check the bib → repeat.
“Edit the abstract to mention the panel-data dimension.”
Opens the file → reads the abstract → edit it → saves → runs the bib check → opens the result → reports back.
You: read the diff. Approve.
The difference isn’t intelligence. It’s the ability to act — and to verify it acted correctly.
Read files, run commands, edit on disk, call APIs.
The agent acts, not just talks.
Break a task into reviewable steps before acting.
A safety boundary you control.
Focused workers (proofreader, code reviewer, fact-checker) in parallel.
Different agents, different blind spots.
Deterministic enforcement at lifecycle events.
When “Claude is supposed to” must become “this thing actually happens.”
The next four parts walk through these. Today’s talk in one sentence: a workflow is the pattern that connects them.
Claude’s training corpus is dense in markdown — documentation, GitHub, Stack Overflow, technical blogs. Claude reads headers, code blocks, lists, and tables natively.
What this means in practice:
Rule of thumb: PDF → markdown saves 50–70% of tokens. Same content, less noise.
| Tool | Strength | Use when |
|---|---|---|
microsoft/markitdown |
Swiss-army knife: PDF, DOCX, XLSX, PPTX, HTML, EPUB. One-line CLI. | First choice — covers ~90% of cases. |
opendataloader-pdf |
PDF specialist. XY-cut++ reading order, bounding boxes, 0.907 benchmark accuracy. | Multi-column papers, dense tables, math-heavy PDFs. |
Workflow: convert PDFs as soon as they enter the project. Feed Claude the .md; let the original sit in master_supporting_docs/. There’s a /pdf-to-md skill in this repo that wraps both tools.
CLAUDE.md lives at your project root.
It loads automatically at the start of every Claude session.
It tells the agent what your project is, what the rules are, and what good looks like — before the agent does anything.
It’s ~150 lines. It changes everything downstream.
# CLAUDE.MD — Causal Panel Data Course
## Core Principles
- Plan first; verify after.
- Quality gates: nothing ships below 80/100.
## Folder Structure
- Slides/ — Beamer .tex
- scripts/R/ — analysis pipeline
## Commands
TEXINPUTS=../Preambles:$TEXINPUTS \
xelatex -interaction=nonstopmode file.tex
quarto render file.qmdI’ll open the actual file in a moment.
quarto render over pandocCLAUDE.mdIn live demo: opens
CLAUDE.md,Claude-paper-DR_weak_overlap.mdin editor. Walks line by line.
Audience sees that the file is short, specific, and prescriptive about what Claude can’t guess.
Test: if removing the line caused Claude to make a mistake, keep it. If not, cut it.
I often ask Claude to help me better improve: “review my CLAUDE.md following Anthropic best practices.
Let me know how to improve it, and why. Explain to me before you edit the file.”
| ✅ Include | ❌ Exclude |
|---|---|
| Bash commands Claude can’t guess | Standard language conventions |
| Code-style rules that differ from defaults | Detailed API docs (link to source) |
| Testing instructions + preferred runners | Self-evident practices (“write good code”) |
| Repository etiquette (branch naming, PR conventions) | File-by-file descriptions |
| Architectural decisions specific to your project | Information that changes frequently |
| Developer-environment quirks (env vars, paths) | A summary of files Claude can already read |
| Common gotchas / non-obvious behaviors | Long explanations or tutorials |
❌ “Use good R code style.”
✅ “Use fixest::feols, not lm. Cluster SE at firm level. set.seed(20260427) once at top of 00_run_all.R.”
❌ “Be careful with citations.”
✅ “Citations: \citep{key} for parenthetical, \citet{key} for narrative. All keys must exist in Bibliography_base.bib before commit.”
❌ “Write clean Python.”
✅ “Use pandas for data, pyarrow for serialization. Type hints required for public functions. Black formatter.
pytest -xvs is the test runner.”
❌ “The folder structure is intuitive.”
✅ “data/raw/ — never modified after download. data/clean/ — outputs of 02_clean.R only.
results/ — read-only, regenerated by 00_run_all.R.”
# CLAUDE.MD — DiD on Medicaid Expansion
## Core Principles
- Default journal: AER.
- Replication policy: AEA Data and Code Availability Policy.
- Identification: staggered DiD with never-treated comparison.
- Estimator: Callaway-Sant'Anna (2021) ATT(g,t) — primary; TWFE robustness.
- Standard errors: clustered at state level (treatment unit).
## Data Sources
- ASEC monthly CPS, 2008-2022
- State Medicaid expansion dates from KFF
- Sample restrictions: 18-64, non-disabled, household head.
## Commands
- Cleaning: Rscript scripts/02_clean.R
- Estimation: Rscript scripts/03_main_did.R
- Pre-trends test: Rscript scripts/04_pretrends.R (Roth 2022, Rambachan-Roth 2023)
- Replication audit: /audit-reproducibility paper.tex scripts/That’s enough. Stop there.
# CLAUDE.MD — QJE R&R Round 2
## Core Principles
- Target: QJE R&R round 2.
- Referee 1: alternative parallel-trends tests (Roth 2022 + Rambachan-Roth 2023 sensitivity).
- Referee 2: placebo tests using never-treated states only.
- Referee 3: treatment-effect heterogeneity by state-level covariates.
## Data
- State-year panel, 2000-2022
- Treatment dates: KFF + manual cross-check
- Outcomes: small-business formation (Census BFS), labor-force participation (CPS)
## Workflow
- New analyses go to scripts/r2_response/ (NOT main scripts/).
- Each analysis: ONE script that writes ONE table to tables/r2/.
- Update response-letter.tex with mapping: analysis script -> referee point.
- /respond-to-referees on this round's editor letter when ready.We’ll get to rule files in 5 minutes.
There’s evidence behind this. Gloaguen et al. (2026, ETH Zurich + INSAIT)
138-instance benchmark across 12 Python repos:
AGENTS.md / CLAUDE.md files reduce task success ~3%; inflate steps + cost 20%+.CLAUDE.md (~5 min)Mine is 1,056 lines — 3.5× over the ceiling I just told you about. Exactly the failure mode the evidence flags.
Live demo (~5 min)
Switching to VS Code on the Econ 730 course repo. We’ll prune CLAUDE.MD in real time:
.claude/rules/*.md files (most of it is already there, twice).Abort trigger: if VS Code or the repo doesn’t open within 30 seconds, walk through the before/after diff in demos/02-skill-walkthrough/expected-claude-md-prune.md.
The fix: path-scoped rule files under .claude/rules/.
.claude/rules/r-code-conventions.md with paths: "*.R" → loads only when an .R file is in play.# .claude/rules/replication-protocol.md
---
paths: ["scripts/**/*.R", "scripts/**/*.do", "scripts/**/*.py"]
---
# Replication-First R Code
When asked to extend an analysis:
1. FIRST: replicate the original numbers in the manuscript.
2. THEN: extend.
3. NEVER: ship a script that produces numbers that don't match the paper.
If the original numbers don't replicate, STOP and assess whether you are doing something wrong. If you cannot reproduce the results, report what differs.This rule auto-loads when Claude opens any .R / .do / .py file.
Outside that scope, the rule isn’t in context — staying lean.
CLAUDE.md and rules are advisory — Claude reads them and (usually) follows them.
Hooks are scripts that fire deterministically at lifecycle events. They don’t ask Claude — they enforce.
PreToolUse — before any tool runs (block dangerous patterns)PostToolUse — after tool completes (sanity check, log, notify)Stop — when Claude is about to stop responding (verify, remind)PreCompact — before context auto-compaction (save plan to disk)This isn’t AI judgment — it’s a Python script. Deterministic. Runs every Stop, no exceptions.
Take a 30-second stretch. We’re going to a live demo.
The next 25 minutes is infrastructure, not prose.
| Step | What happens | Time mark |
|---|---|---|
| 1 | I paste the prompt. Claude enters plan mode. | T+0 |
| 2 | Plan appears. I narrate. | T+3 |
| 3 | I approve. Implementation begins. | T+5 |
| 4 | Agent reads, edits, self-verifies. | T+6 |
| 5 | Multi-agent review fans out (proofreader + domain-reviewer + claim-verifier). | T+12 |
| 6 | Review reports surface. | T+18 |
| 7 | Fixes applied. | T+21 |
| 8 | Quality score, summary, done. | T+25 |
Live demo
Switching to the IDE + terminal. Watch the screen, not the slides.
What you just saw — in one sentence:
A 3-paragraph edit task became a 7-step structured workflow that produced an audit trail.
saved to quality_reports/plans/
MUST / SHOULD / MAY annotated; quality_reports/specs/
The actual manuscript-section changes
3 reports (one per agent), quality_reports/
numerical, reproducible (quality_score.py)
who did what, when — for collaborators
Six artifacts from one prompt. None of them existed when I typed it.
Honesty matters here.
The point isn’t replacement. It’s leverage on the boring 70%.
We just saw the full lifecycle.
.claude/skills/<name>/SKILL.md./<name>.A skill is just a written instruction — but a triggerable, version-controlled, reusable one.
---
name: my-skill-name
description: What it does + trigger phrases. "Use when user says X, Y, Z."
allowed-tools: ["Read", "Write", "Bash"]
---
# My Skill Name
## Workflow
### Phase 1 — Read inputs (refuse if invalid)
### Phase 2 — Generate (annotate MUST / SHOULD / MAY)
### Phase 3 — Verify (cross-check domain rules)
### Phase 4 — Output (write to disk; report)That’s a real skill template. Frontmatter ≤ 4 fields. Body = numbered phases. Other fields (argument-hint, disable-model-invocation) are optional polish — not required.
git diff your skill the way you git diff your code/preregister calls /verify-claims)/preregister/preregister drafts a registry-ready preregistration document in your choice of style:
It refuses to draft if your description contains results — preregistration is forward-looking by definition.
[Opens
~/Documents/GitHub/claude-code-my-workflow/.claude/skills/preregister/SKILL.md. Walks the frontmatter (description, argument-hint, allowed-tools), then the 6 phases. Then INVOKES it on a fake study description. Audience sees: input → output, end to end, ~3 minutes.]
Demo prompt (verbatim)
I’m planning a 2x2 between-subjects survey experiment on N=800 US adults via Prolific. Manipulating message-source partisanship × policy framing on attitudes toward climate policy.
Primary DV is a 4-item attitude index. Hypothesis: in-party + gain framing produces highest support. Pre-registered analysis: two-way ANOVA.
Run
/preregister --style aspredictedon this.
disable-model-invocation: true — this skill writes a commitment document; it must be user-intent.A skill triggers when its description matches the user’s prompt. So the description must contain the words your future self / your co-author would actually use.
description: A preregistration tool. — too generic; never triggersdescription: Pre-registers a study. — singular, formal; misses real usagedescription: Draft a preregistration document (OSF, AsPredicted, AEA RCT Registry style). Use when user says "preregister", "draft a preregistration", "OSF preregistration", "AsPredicted", "AEA RCT registry", "PAP", "preanalysis plan".A common question: “How is a skill different from an MCP?”
.md file.Different layer of the stack. Skills tell Claude how to think; MCPs give Claude more things to talk to.
| Scenario | Use a skill | Use an MCP |
|---|---|---|
| “Format my regression tables in AER style” | ✅ | — |
| “Pull our latest WRDS query into the analysis” | — | ✅ |
| “Draft a preregistration document” | ✅ | — |
| “Update my Notion ‘papers under review’ page” | — | ✅ |
| “Audit reproducibility against the R script” | ✅ | — |
| “Query our shared Postgres database of working-paper revisions” | — | ✅ |
ai-mba.io/tutorials/skills-vs-mcps.CLAUDE.md, skills, MCPs, plugins. People mix them up. Here’s the map:
| Piece | Where it lives | What it is | When it loads |
|---|---|---|---|
CLAUDE.md |
Repo root (also ~/.claude/CLAUDE.md for global) |
Always-on rules + conventions | Every session, automatically |
| Skills | .claude/skills/<name>/ (repo) or ~/.claude/skills/ (global) |
Workflows triggered by phrases you’d type | When you hint at the trigger |
| MCPs | External process + config entry | Access to systems Claude can’t otherwise reach | On invocation / auto-discovered tools |
| Plugins | ~/.claude/plugins/ (after /plugin install) |
Someone else’s bundle of the above (skills, MCPs, agents, hooks) | Behaves like its components, once installed |
Beyond claude-code-my-workflow’s 30 skills, two community skills are highly relevant for this audience:
jusi-aalto/crossref — validates bibliographic references against the Crossref REST API.
/verify-claims.jusi-aalto/strategic-revision — peer-review response planning for empirical accounting + finance R&R rounds.
Most failures: trying to cram too much into skill #1. Aim small.
Rscript scripts/02_main.R and read the output of Sys.time()” → yes.The best skills don’t just do — they check.
/preregister refuses to mark MUST sections complete if hypothesis isn’t directional./audit-reproducibility compares numerical claims to script outputs with tolerance thresholds./checkpoint reads git status to verify state before writing the snapshot.A skill without a verification step is a fancy macro. A skill with one is a workflow.
A model alone is impressive. A model in a loop is useful.
You saw this shape in Part 2’s demo. Now we generalize.
1. IMPLEMENT — agent does the work
2. VERIFY — does it compile / render / parse?
3. REVIEW — what does a focused critic think?
4. FIX — apply review findings
5. RE-VERIFY — did fixes break anything?
6. SCORE — numerical quality threshold
│
├── Score ≥ threshold → ship
└── Score < threshold → loop back to step 3 (max 5 rounds)
The point isn’t the specific 6 steps. It’s that steps 2 and 5 have to be deterministic — and that the loop runs automatically until quality clears.
/commit, /qa-quarto, /review-paper --adversarial, /slide-excellence, /create-lecture, /data-analysis, /review-paper --peer.Honesty matters: this is a contract that skills implement, not a magic background service.
When it works: the tasks are genuinely independent. When it breaks: the tasks need to share context (then it’s serial, not parallel).
Why two agents and not one: the agent that wrote the fix shouldn’t be the one judging it. Role separation = honest review.
Why this matters in practice:
| Pattern | Best for | Failure mode |
|---|---|---|
| Parallel | Genuinely independent tasks | Tasks need to share context — coordination chaos |
| Critic-fixer | Surface-level + structural review | Critic and fixer are the same agent — “self-confirmation” |
| Fresh-context CoVe | Factual claims (citations, numerical facts) | Forgetting to fork the verifier’s context — verifier confirms what it just generated |
Rule: multi-agent is for tasks where the decomposition is clear. If you can’t write the decomposition in 2 sentences, don’t fan out.
Heuristic: add a second agent only when you can articulate exactly what that agent sees that the first one couldn’t.
| Mechanism | What it does | Determinism |
|---|---|---|
CLAUDE.md |
Tells Claude what your project is | Advisory (Claude reads + usually follows) |
.claude/rules/*.md |
Tells Claude what’s required for specific files | Advisory + path-scoped |
.claude/hooks/*.py |
Runs a Python script at lifecycle events | Deterministic — runs every time, no exceptions |
Hooks are how you turn “Claude is supposed to…” into “this thing actually happens.”
.claude/hooks/log-reminder.py — fires on every Stop event.
quality_reports/session_logs/ hasn’t been touched in N response cycles, prints a stderr reminder./commit Step 0b runs scripts/check-surface-sync.sh + check-skill-integrity.py BEFORE writing the commit.
This isn’t AI judgment. It’s a Python script. The same gate runs whether I’m tired or rested.
Live demo (~3 min)
Run /qa-quarto on a Quarto slide with a known content drift from its Beamer counterpart (a typo in a formula). Audience watches:
Then run a git commit with no message; watch check-skill-integrity.py block.
Choreography: demos/03-orchestration/README.md.
/deep-audit/deep-audit — multi-agent orchestration on my own workWhen I finish a non-trivial chunk of work — a new lecture, a paper revision, even this deck — I run /deep-audit. Here’s what it does:
I ran this on the deck you’re looking at right now, last week.
/deep-audit found in this deck (last week)Independence. Each audit agent runs in a fresh context — it never saw me write the deck. So it can’t unconsciously confirm my framing.
Specialization. Four narrow lenses each beat one broad reviewer. The link-health agent doesn’t get distracted by pedagogy.
Lived experience. I’ve used this dozens of times now. Most runs find at least one thing I’d not want to ship.
Cheap. ~10 min per pass. Worth the trade for the catches.
It’s not a magic trick — just an orchestration pattern applied to my own work on a quick cadence.
The pattern is reusable. Build your own audit skill with the lenses you care about.
Both demos use Pattern 1 (parallel) + Pattern 2 (critic-fixer) + Pattern 3 (fresh-context). Same primitives, bigger scope.
A few months back, I had a manuscript bounce because a the simulations numbers in the table did not match the R scripts because I did’t verify them at the time of compilation. Took me a long evening to find it.
I now run this kind of check on every paper before submission. Doesn’t always catch everything, but it catches more than I would on a re-read. Let me show you what it looks like.
This is no longer “good practice.” It’s increasingly a real desk-reject and post-acceptance-revision hazard.
You don’t want to discover the discrepancy after the editor’s email.
The repo’s .claude/rules/replication-protocol.md says:
When asked to extend an analysis: FIRST replicate the original numbers. THEN extend. NEVER ship a script that produces numbers that don’t match the paper.
This rule auto-loads on *.R, *.do, *.py. Claude reads it at the start of every analysis session.
It’s a rule, not a hook — Claude can override with reason. But the default is replication-first.
manuscript.tex ──cites──> Table 2
Table 2 ──from──> scripts/R/_outputs/results.rds
results.rds ──by──> scripts/R/03_analyze.R
03_analyze.R ──reads──> data/clean.rds
clean.rds ──by──> scripts/R/02_clean.R
02_clean.R ──reads──> data/raw/
A bug in 02_clean.R invalidates Table 2. Reviewing the manuscript without touching the code misses this class of error.
/review-paper does about it\input{scripts/...}, %% source: scripts/..., table names matching script outputs)./review-r on each referenced script (code-quality review)./audit-reproducibility on the paper ↔︎ outputs pair (numeric verification).This isn’t a feature you trigger. It’s the default for /review-paper when scripts are detected.
## Cross-Artifact Findings
**Scripts reviewed:** 3
**Reproducibility:** FAIL — 1 of 4 numeric claims diverges from script output
**Code quality:** 0 critical, 2 major, 5 minor
### Critical cross-artifact issues
- Paper: Table 2, N = 14,562
Code: scripts/R/03_analyze.R:18 → N = 14,489
Issue: silent `year < 2020` filter drops 73 obsThis block goes at the top of the review report. The paper-side findings come after — because if the numbers don’t reproduce, paper-side polish is moot.
replication-package/
├── README.md # data sources, software versions, runtime estimate
├── 00_run_all.R # ONE entry point that produces all outputs
├── data/
│ ├── raw/ # downloaded, never modified
│ └── clean/ # outputs of cleaning step
├── scripts/
│ ├── 01_load.R
│ ├── 02_clean.R
│ ├── 03_analyze.R
│ └── 04_figures.R
├── outputs/
│ ├── tables/ # match Table N in manuscript
│ └── figures/ # match Figure N in manuscript
└── sessionInfo.txt # captured at the end of 00_run_all.R
/data-analysis scaffolds this structure on a new project.01_*, 02_*, etc.) — implicit dependency order; AEA Data Editor encourages it.00_run_all.R is the entry point — a Data Editor runs it once, no flags, expects matching outputs.sessionInfo.txt captured automatically = R version + package versions reproducible.You don’t have to remember any of this. The skill enforces the structure.
.claude/rules/r-code-conventions.md (v1.6.x) Section 8 — Numerical Discipline:
== comparisoneps <- 1e-12)1L, not 1)set.seed(YYYYMMDD) once at the top)na.rm (no defaults)T/F shorthandsThese are the bugs that produce “the script ran but the numbers are slightly off” — exactly what AEA Data Editors catch.
subset(df, year >= 2010) in the cleaning script.& year < 2020 to drop COVID-era observations for a robustness check.manuscript-claims.md with 4 numerical claims (sanitized — looks like a real paper draft).analyze.R script that allegedly produced them./audit-reproducibility manuscript-claims.md analyze.R.This works most of the time. Sometimes the agent reports false positives or misses things. It’s a check, not a guarantee.
| Step | What happens | Time mark |
|---|---|---|
| 1 | I show the claims file | T+0 |
| 2 | I show the R script | T+1 |
| 3 | Run /audit-reproducibility ... |
T+2 |
| 4 | Agent reads both files | T+3 |
| 5 | Agent runs the R script (~3 min for actual estimation) | T+5 |
| 6 | Agent compares outputs to claims | T+9 |
| 7 | Discrepancy surfaced | T+10 |
| 8 | Generate report | T+12 |
| 9 | Wrap | T+15 |
Live demo handoff
Switch to terminal. Run the audit.
The planted bug is filter(year < 2020) at line 18 of analyze.R; manuscript says N = 14,562, script produces N = 14,489.
Choreography: demos/04-replication/README.md.
What you saw:
manuscript-claims.md — extracted the 4 numerical claims into a checklist.analyze.R — captured all output./audit-reproducibility on the manuscript + replication code.Part 6 — refereeing + review simulation.
Twenty minutes. Useful as a rehearsal — not a substitute for real referees.
Use it as a dress rehearsal, not a substitute for real referees.
One prompt → three agents → one revision plan.
┌──────────────────┐
│ /review-paper │
│ --peer AER │
└────────┬─────────┘
┌────────▼─────────┐
│ EDITOR AGENT │ desk + novelty
└────────┬─────────┘
picks two referees
◄──── ▼ ────►
┌──────────────────┐ ┌──────────────────┐
│ REFEREE 1 │ │ REFEREE 2 │
│ (CREDIBILITY) │ │ (POLICY) │
└────────┬─────────┘ └─────────┬────────┘
▼ non-overlapping ▼
┌──────────────────┐
│ EDITOR DECISION │ → FATAL /
│ │ ADDRESSABLE /
└──────────────────┘ TASTE
Every applied-empirics referee has a type. We model them explicitly.
| Disposition | Reads it asking… |
|---|---|
| STRUCTURAL | “Is the model specification right?” |
| CREDIBILITY | “Is identification airtight?” |
| MEASUREMENT | “Are the variables the right things?” |
| POLICY | “Does this matter outside of academia?” |
| THEORY | “Where’s the mechanism?” |
| SKEPTIC | “What’s the strongest case against this?” |
Two referees with deliberately different dispositions stress-tests the paper from non-overlapping angles.
The editor reads .claude/references/journal-profiles.md and adjusts:
A simulated AER review should feel different from a simulated AJPS review. The journal is the prior.
In claude-code-my-workflow/.claude/references/journal-profiles.md (v1.8.0):
Each profile is ~40 lines. Adding your home journal: 30 minutes once.
Every MAJOR concern in a referee report from this pipeline must include:
What would change my mind: [specific test, estimator, robustness check, or evidence that would resolve this concern]
/review-paper --peer/review-paper --peer AER.Sometimes the simulated review surfaces something I hadn’t thought of. Sometimes it’s noise. It’s a useful first pass.
| Step | What happens | Time mark |
|---|---|---|
| 1 | Show the manuscript snippet | T+0 |
| 2 | Run /review-paper --peer AER |
T+1 |
| 3 | Editor: desk review + novelty probe | T+2 |
| 4 | Editor: referee selection (2 dispositions) | T+5 |
| 5 | Two referees fan out (parallel) | T+6 |
| 6 | Domain referee report visible | T+11 |
| 7 | Methods referee report visible | T+13 |
| 8 | Editorial synthesis | T+15 |
| 9 | Editorial decision | T+18 |
| 10 | Wrap | T+20 |
Live demo handoff
Run /review-paper --peer AER.
This is the demo. The editorial decision moment is what we’re aiming for.
Choreography: demos/05-peer-review/README.md.
I just got an editorial decision on a paper I haven’t published yet. From a simulated AER editor. With two referee reports. In ~20 minutes.
That’s the demo. The next demo is what you do next — turning that editorial decision into a structured revision plan.
Let’s go.
You just saw a simulated peer review. The other half of the workflow:
Now I have a real referee report I disagree with. How do I respond?
/respond-to-referees parses a referee report and maps each concern to a specific revision in the manuscript.
Top journal editors want to see all four categories used appropriately. Avoiding “Disagreement” looks evasive.
A referee writes:
“The first-stage F-statistic of 9 is well below the conventional weak-instrument threshold (Stock & Yogo 2005). The IV results should not be interpreted causally.”
A real concern. The kind of concern that, on a bad day, you spend three hours drafting a response to.
/respond-to-referees producesClassification: Addressed.
Where: Manuscript p. 14, footnote 22; Online Appendix B.3.
Drafted response: “We thank the referee for raising the weak-instrument concern.
We now report Anderson-Rubin confidence intervals (Online Appendix B.3) which are robust to weak instruments; the result is qualitatively similar with much wider intervals.
We have added a footnote on p. 14 noting the limitation explicitly.”
Three hours → ten seconds. You still review and edit. But the scaffolding is done.
strategic-revision (jusi-aalto)A community Claude skill from outside our template. Different approach than ours.
/respond-to-referees drafts concern-by-concern responses, jusi-aalto/strategic-revision treats reviewer requests as a directed acyclic graph.Different tool for different sub-task: /respond-to-referees for the prose; strategic-revision for the project plan.
Live demo handoff (~8 min)
Take the editor agent’s output from the previous demo (still on screen).
Run:
/respond-to-referees \
demos/05-peer-review/editor-output.md \
demos/05-peer-review/manuscript-snippet.tex
Audience watches the agent map each editorial concern to a revision plan with classification + drafted response.
Choreography: demos/05-peer-review/README.md.
In 45 minutes:
The cost: ~30 min of wall-clock time and one prompt.
It’s a first pass. The substance of peer review is still human.
Final stretch.
| Layer | What it is | Seen in |
|---|---|---|
CLAUDE.md |
The control center — universal project instructions | Part 1 |
.claude/rules/ |
Path-scoped, auto-loading domain knowledge | Parts 1, 5 |
.claude/skills/ |
Triggerable, version-controlled workflows | Parts 2, 3, 5, 6 |
.claude/agents/ |
Specialized review personas (proofreader, referees) | Parts 2, 6 |
.claude/hooks/ |
Deterministic lifecycle enforcement | Part 4 |
Five layers. None of them are AI-magical. All of them are written instructions.
┌─────────────────────────┐
│ CLAUDE.md │ always loaded
└────────────┬────────────┘
┌───────────────────────┼───────────────────────┐
path-scoped triggered lifecycle
┌────▼────┐ ┌─────▼─────┐ ┌─────▼─────┐
│ rules │ │ skills │ │ hooks │
└─────────┘ └─────┬─────┘ └───────────┘
│
┌────▼────┐
│ agents │
└─────────┘
The diagram is the whole talk in one picture.
If even one of these stuck, I’ll consider the four hours well spent.
The orchestration story extends: multi-agent across tools, not just within Claude.
1. Codex generates a 200-line refactor.
2. Claude reads the diff in a fresh context (not the prompt that generated it).
3. Claude flags issues from a different angle than Codex would.
4. You see both views before deciding.
The Codex plugin for Claude Code (openai/codex-plugin-cc, shipped by OpenAI) is exactly this. A different tool reviewing the first tool’s work.
Heuristic: cross-tool for one in ten tasks — the high-stakes ones. Not as a default.
In any Claude Code session inside VS Code:
If /codex:setup says you need to authenticate: !codex login opens a browser for OAuth.
Canonical source: openai/codex-plugin-cc · Walkthrough: handouts/codex-setup.md.
| Command | What it does | When I reach for it |
|---|---|---|
/codex:review |
Read-only review of your diff | Sanity pass on a substantive change |
/codex:adversarial-review |
Pressure-tests the approach — assumptions, tradeoffs | Before shipping a design choice I’m unsure about |
/codex:rescue |
Hands a task to Codex (investigate / fix / continue) | When Claude’s stuck and I want a different angle |
All three: --wait (foreground) or --background. Track background runs with /codex:status and /codex:result.
The /codex:adversarial-review flow specifically — the cross-tool review I run most:
1. I finish a non-trivial change in Claude Code.
2. I invoke /codex:adversarial-review on the diff.
3. Codex reads the diff in a fresh context (it never saw my prompts).
4. Codex returns: things it would push back on, things it'd want me to verify.
5. I read both views and decide.
No tool gets the last word. The cross-tool review is information, not authority.
I asked Claude to do a substantial refactor — about 200 lines across a couple of files.
I read the diff. It looked fine to me.
I ran /codex:adversarial-review on it before pushing.
Codex flagged three things Claude had quietly changed that I hadn’t noticed in my read — one was actually a regression I would have shipped.
Took an extra 90 seconds. Saved me a follow-up commit.
This isn’t every commit — I do it on the changes I care about most.
The discipline: knowing when to spend the extra 90 seconds, and when not to.
Optional demo (~3 min)
Run /codex:adversarial-review on a small refactor.
Audience watches: 1. Codex generates the refactor (already done, in the demo bundle) 2. Claude opens the diff fresh, reviews, surfaces 2-3 issues 3. Pedro narrates: “I’d have shipped this. Codex’s tool agreed with itself.”
Choreography: demos/06-cross-tool/README.md.
Two complements I’d point you at first:
Six more high-quality projects (clo-author, strategic-revision, crossref, claudeblattman, MixtapeTools, autoresearch, AI MBA) are in handouts/resources.md — won’t fit on a slide; will fit on your reference card.
Built into Claude Code itself, no fork needed:
/team-onboarding (Week 15 digest) — package your local setup into a replayable guide for collaborators.
/autofix-pr — runs Claude Code on a GitHub PR, applying CI-style fixes/powerup — interactive lessons (Anthropic’s tutorial system)/loop self-pacing — recurring or self-paced background tasks/less-permission-prompts — diagnose permission-prompt fatigueCanonical: github.com/openai/codex-plugin-cc (OpenAI) · Announcement: OpenAI Developer Community.
/codex:review (standard), /codex:adversarial-review (challenge the approach), /codex:rescue (delegate a task to Codex when Claude’s stuck)./codex:adversarial-review in the optional Part 7 demo. Setup walkthrough in handouts/codex-setup.md.Open the directory of a paper you’re working on. Try writing a
CLAUDE.md. ~30 minutes.
That’s the smallest experiment I’d recommend. Once it exists, everything else in this stack has somewhere to anchor.
(If you want the slides and demos: clone Claude-Mini. Full template: fork claude-code-my-workflow. But neither of those changes a paper by itself.)
.claude/ is a starter kitThis repo ships a curated set: 16 skills, 10 agents, 10 rules, 2 hooks — adapted for general academic use.
All of it is imported from claude-code-my-workflow, which is the maintained reference template.
Claude-Mini is a snapshot, not a mirror. Bug fixes and new skills land in the parent first. Don’t expect this repo to track them in real time.
Practical advice: clone Claude-Mini to learn the patterns; fork claude-code-my-workflow once you’re ready to use this seriously.
When the CLAUDE.md habit is in place — these are next, in priority order:
/audit-reproducibility on your most recent submitted paper. Find the issue. Fix it before someone else does./review-paper --peer AER (or your target journal) on a current draft. Treat the simulated review as a dress rehearsal.These are menu, not assignments. Pick one when it’s the right week.
Anthropic canon (read first if pressed for time):
claude-code-my-workflow guide: psantanna.com — full walkthroughclo-author: github.com/hugosantanna — paper-authoring-focused forkhandouts/resources.md — every link from this talk in one fileThanks for spending your day with me. I’d genuinely love to hear what works for you.
Materials: github.com/pedrohcgs/Claude-Mini
Reach me: pedro.santanna@emory.edu · psantanna.com · @pedrohcgs

Claude-Mini · Pedro H. C. Sant’Anna