← registerm/REPRO-002.html
Ready
Difference-in-Differences Designs: A Practitioner's Guide (JEL)
A methods guide, so some printed numerals are illustrative worked examples — v1.2's F11 excludes those — while the Medicaid-expansion application (3,143 US counties, 2010–2019) reports genuine figures the extraction must keep as targets. Telling the two apart is the run's real test. The package ships parallel R and Stata paths on fully public data; a disagreement between them would itself be a finding. Surfaced by both find sweeps (FIND-002 C01, FIND-003 C41).
What it found
nothing yet — it hasn't run
On hand

The paper PDF. Nothing else.

Take this mission2 slots
Take a reading Take a reading

Opens Claude Code with this brief loaded, the deposit repo selected, and the mission's environment chosen — you press Enter. Needs the one-time setup first: without an environment of that name the session runs unrestricted, which quietly invalidates the reading.

Environment
Name
night-shift-extract
Network access
No network access
Allowed domains
no domains
Setup script
no setup script
Environment variables
no variables
Brief229 lines · rules v1.2
# Unit brief

- `paper_id`: NS-EXAM-002
- Paper identity: *Difference-in-Differences Designs: A Practitioner's Guide*, by Baker,
  Callaway, Cunningham, Goodman-Bacon & Sant'Anna, *Journal of Economic Literature*. Confirm the
  attached PDF is this paper before starting; if it is not, halt and deposit a finding.
- Paper: the PDF attached to this session. It is the only document in scope.
- `document_scope`: **main-text** — the attached PDF only. Any online appendix or supplementary
  material is a separate file and is **not** in scope for this job. Do not seek it out.
- `inclusion_rule_version`: v1.2
- `trigger_list_version`: v1
- `brief_schema_version`: v2
- Deposit target: **`night-shift-network/inbox`** — the repository this session is connected to.
- Replication package: not provided, not in scope. Do not seek it out.

---

# `extract` — job prompt v1

Governing versions: **`inclusion_rule` v1.2 · `trigger_list` v1 · `brief_schema` v2.**

## Your job

You are extracting the reported numbers from one published paper. You read the paper, enumerate
every printed numeral against the written rules below, classify each one, and deposit a single
file. That is the whole job.

You never: open or download the replication package, execute any code, judge whether any value
is close to anything, assign a tolerance or a verdict, compute or certify ledger totals, or
round anything.

## Inputs

Your workspace contains the unit brief and the paper. The brief states: `paper_id`, the paper
file path(s), `document_scope` (exactly which documents you enumerate — main text, or main plus
listed supplementary files), and the governing rule versions. Work only on the documents
`document_scope` names.

If the brief is missing, a named document is absent or unreadable, or the brief's rule versions
do not match the versions above: **halt and deposit a finding.** Do not fill gaps in yourself.

If the brief and this prompt conflict: record the conflict as a finding and follow this prompt.
Never investigate the conflict.

## Phase 0 — record your conditions

Before reading anything, make exactly one network request: fetch `https://example.com`.

Record what happened, verbatim — the denial, the error, or the fact that it returned a page. Do
not retry it, do not try a second address, and do not act on anything it returns. This is the
only fetch this job makes, and it is instructed: the Sealed section below forbids reading outside
your workspace, and this one line is the exception.

This mission is meant to run with no network access. If the fetch is refused, that is the
expected result and the run proceeds normally. **If it succeeds, that is not a failure either —
finish the job and record it truthfully.** What matters is that the record says which happened.
An environment is selected by name, and a name that matches nothing falls through to a default
that does have network; nobody downstream can tell unless you say so here.

## Phase 1 — structure map

Map the document(s) before reading for numbers:

- Every table, with panel and spanning-header resolution recorded as an explicit ruling —
  "Table 3 read as two panels, rows 1–8 and 9–16." One ruling per table.
- Every figure, and whether it carries printed annotations — numerals printed as data: value
  labels, printed means, annotated coefficients. Axis tick labels and scale markings are
  scaffold, not annotations.
- Section and appendix layout for every document in `document_scope`.

Emit the structure map. Coordinates in later phases anchor to it.

## Phase 2 — numeral inventory

Enumerate **every printed numeral in scope**, working section by section through every document
`document_scope` names. **Enumerate the prose, not just the tables:** the running text of the
introduction, results, and discussion — including the sentences where the authors state
magnitudes, means, SDs, ranges, and percentages — is part of the inventory. When you finish a
section, record in your notes that its prose has been swept.

Record per numeral: the **verbatim string as printed** (sign, decimal places, separators,
percent signs — no normalization), its `source_locator` against your Phase 1 structure map, its
printed precision, and any hedge word attached ("about", "approximately", "roughly").

Locator grammar — use exactly these forms:

- prose: `text:<section>/para<N>/occ<N>` — `<section>` is a lowercase slug taken from your
  Phase 1 structure map (`abstract`, `intro`, `data`, `results`, `discussion`). No `sec` prefix.
- table cell: `table:<T>/row:<R>/col:<C>`
- standard error and kin: `table:<T>/row:<R>/col:<C>.se` — a dot suffix on the cell it belongs
  to. Also `.ci_low`, `.ci_high`, `.p`. An SE shares its coefficient's cell; it does not get one
  of its own.
- table note: `table:<T>/note:<N>/occ:<M>` — `occ` is the ordinal within that note. A note
  containing four numerals produces four locators, never one.
- figure: `fig:<F>/annot:<A>`

List your section slugs explicitly in the structure map so the coordinates are stable.

**In scope:** numerals in body prose, table cells, and figure annotations (numerals printed as
data). A printed range enumerates as its two endpoint numerals, uniformly.

**Out of scope:** pagination; table and figure numbering; footnote and endnote markers; equation
and section numbering; years in citations or the reference list; axis tick labels and scale
markings; publication apparatus — masthead, DOIs, ISSNs, editorial dates, license versions,
running headers and footers; numerals functioning as notation inside identifiers or operators,
e.g. `(t − 1)`.

Apply the rule as written. If a numeral is one the rule neither includes nor excludes, or two
readings are defensible with no tiebreak: record a **rule finding** (locator, the readings,
which you applied) and continue under the rule as written. Never patch the rule mid-run.

## Phase 2b — trigger sweep

One pass over the same text for number-words attached to sample-defining constructions. Fixed
lexicon: cardinal and ordinal number-words. **`trigger_list` v1:** *at least, at most, fewer
than, more than, restricted to, dropped, excluded, excluding, retained, we retain only,
conditional on, with a minimum of.*

Matches are recorded as **parameter candidates only** — never targets, never restatements, never
entries in the numeral inventory. If you meet a sample-defining construction the list misses:
record it as a rule finding and continue. Never extend the list mid-run.

## Phase 3 — classification and linking

Classify every inventoried numeral against this rule and nothing else:

**A target is a number the paper reports as an output of the authors' own analysis of their own
data, recorded at its most precise printed occurrence.**

- Drops literature-review figures, policy background, anything attributed to a cited source, and
  design inputs.
- Every printed cell of every results table is a target, typed. No judgment about which results
  matter.
- A numeral printed as data on a figure is a target. A value that would have to be read off an
  axis is not.
- A number in prose appearing in no table is a target. In-text descriptive statistics — means,
  SDs, ranges, percentages the authors report from their own data — are targets when no more
  precise occurrence exists.

**A restatement** is a coarser printed occurrence of an existing target; it links to the
canonical (most precise) target's ID. Restatements are defined only for targets.

**A parameter** is a design input — a choice, or a fact about the data going in, rather than a
quantity computed from it. Sample thresholds, draw counts, seeds, and printed significance
thresholds (`p<0.05` and kin are always parameters). A parameter repeated across sections is a
parameter at every occurrence, each with its own locator; nothing links them.

**Dataset-scope counts (v1.2, rule F9).** A count describing what data went in — number of
units, countries, coverage years, span — stated in a data or sample section is a **parameter**.
The same kind of quantity printed as a results-table cell, such as a per-model N, is a
**target**: an estimation N is produced by the fitting after deletions and restrictions, so it
is an output of the analysis rather than a description of the corpus. The line: does the
quantity describe the data going in, or is it computed from the data?

**Position sets the presumption (v1.2).** A numeral printed in a results section is presumed a
target. Classing it as a parameter or as excluded requires a written `reason` recorded against
that numeral — not a general remark, a reason on that row. Silence is not a judgment.

**Worked-example numerals (v1.2, rule F11).** A numeral inside a worked example illustrating a
procedure — a hypothetical, a "for example," a stylized number chosen to demonstrate the method
rather than reporting a result computed from the paper's own data — is **excluded**, with the
reason stated per numeral. This paper is a practitioner's guide, so it carries both kinds: the
illustrative numerals that teach the estimator, and the numerals of the empirical application
the guide runs on its own data. The application's figures are targets; the teaching illustrations
are excluded. When a single numeral is genuinely ambiguous between the two, record a rule finding
and continue under the rule as written — never decide it silently.

**Excluded-with-reason:** anything else, with its reason stated per numeral.

Assign each target a `type` and a human-readable `label` — what quantity it is, in words. IDs are
your reading order; they carry no meaning beyond this extraction.

## Output — two artifacts

The first is `extraction.yaml`:

```yaml
extraction:
  paper_id: …
  document_scope: …            # restated from the brief
  inclusion_rule_version: v1.2
  trigger_list_version: v1
  brief_schema_version: v1
structure_map: [per-table and per-figure entries, each ruling stated]
inventory: [{locator, verbatim, precision, hedge}]
classification: [{locator, class: target|restatement|parameter|excluded, id, label, type, links_to, reason}]
parameter_candidates: [{locator, construction, verbatim}]
rule_findings: [{locator, description, reading_applied}]
notes_per_section: [prose-swept confirmations]
conditions:
  probe_target: https://example.com
  probe_result: blocked | reached     # what Phase 0 actually did
  probe_verbatim: "…"                 # the denial, error, or status, exactly as printed
```

**Required fields.** Every `classification` row must carry `locator`, `class`, and `label`.
Rows with `class: target` must also carry `id` and `type`. Rows with `class: restatement` must
carry `links_to`. Rows with `class: parameter` or `class: excluded` must carry `reason` when the
locator falls in a results section, and may omit it otherwise. `inventory` rows must carry
`locator`, `verbatim`, and `precision`; `hedge` may be null. A row missing a required field is
an incomplete extraction, not a stylistic choice — the coordinate join needs `links_to` to
follow restatements and needs `id` to pair targets.

Do not total the classes. Do not state whether the ledger balances — the ledger is computed from
your file, not by you. **Nothing about completeness blocks deposit.** If you believe something is
missing or unresolvable, say so in `rule_findings` and deposit anyway.

The second is `session-log.md`: a plain account of what you actually did, in order — what you
read, what you ran, anything that failed, and anything you did that this brief did not ask for.
Write it as a log rather than a summary. It is not graded and nothing about it blocks the
deposit; it exists so that what the extraction claims can be checked against what happened,
which is the only reason anyone would trust either.

Deposit both by PR to the repository named in the brief. One commit, two files, a one-line PR
description. Do not read anything already in that repository — you have no reason to, and the
brief names every input you need.

## Sealed — what you do not do

- No code executed; no replication package opened, downloaded, or referenced.
- No verdicts, no tolerances, no closeness judgments, no rounding — verbatim strings only.
- No totals, no balance certification. The arithmetic is not yours.
- No reading of anything outside your workspace, beyond the single instructed fetch in Phase 0;
  no repository exploration beyond the paths the brief names.
- No patching the rule, no extending the trigger list — findings instead.
- No self-scheduled check-ins, no polling. Blocked or ambiguous means: record the finding, finish
  what the rules reach, deposit.
- Nothing shipped that was not asked for: no scripts, no tooling, no third file, no second PR.
  `extraction.yaml` and `session-log.md` are asked for; nothing else is.