Method

The rulebook, rendered from the repository's METHOD.md. Short on purpose; it changes only with a journal entry saying why.

METHOD — the kit

The rules of this project. Short on purpose. Changed only with a journal entry saying why. Last changed: 2026-09-20.

1. What a record is

One file per thing, in records/: a source (one document), a person (one identity hypothesis), a family (one couple and the filiation of their children), a question (a conflict or an unknown), a prior (something believed before a document said so). Sources live in records/sources/, people in records/people/, families in records/families/, questions in records/questions/, priors in records/priors/. Dated journal entries in journal/. Templates in docs/templates/.

IDs — S-0001, P-0001, F-0001, Q-0001, PK-0001 — are assigned once, in sequence, and never reused or renumbered. F-0001 is the starting marriage. A merged-away person keeps its file, marked merged_into:, so every old citation still resolves.

Filiation is written in one place only: the family file’s children:. A person file never states its parents. (E013: a child of two families; E014: a child of their own family)

YAML traps. Quote any value that contains a comma or a colon — places especially: place: "St-Cyprien, Napierville", never bare (unquoted, the part after the comma becomes a stray key; W004). Never use bare on/off/yes/no as a key or a value — YAML reads them as booleans. Dates are YYYY-MM-DD. sighted is null or { by: Who, date: YYYY-MM-DD }. Lists are [a, b] or indented - rows, never a bare scalar (mentions: P-0001 is wrong; mentions: [P-0001] is right).

2. Grades

Proven · Probable-Strong · Probable · Possible · Unproven · Disproven

Sources are classified original (first recording, in original form), derivative (a copy, extract or transcription), or authored (a compiled work); their information is primary (recorded at or near the event by someone who knew) or secondary. A source is sighted when it has been read directly — the act image, the répertoire page.

The Drouin two-part test. Au greffe is not “a later copy”: from 1679 every parish kept two registers, both written by the priest, one deposited annually with the court. A greffe volume is a duplicate original. What detects a transcription is the hand: uniform copperplate, machine-ruled paper, sequential pagination, one hand across many years → grade derivative. Several priests’ hands in one opening, strike-corrections certified in the act, marginal headwords in the entry hand → contemporaneous, grade original. Record what you saw in hand:.

3. Rules

  1. Identity is a claim. The same name in two documents is two person files until a document or a stated argument links them. Look for the relational qualifier — père, fils, a stated filiation, an age — never the name. Merging and splitting are logged events with reasons. To merge: the loser gets status: merged and merged_into: <survivor>, with the reason in its body; the survivor gets a same-person-as claim citing the evidence; and every source whose mentions: names the loser also adds the survivor — otherwise the survivor’s claims citing those sources fail E008. merged_into points at the survivor, never at itself or at another merged-away file. (E009, E010)
  2. Mine both sides of every act. A marriage act names at least six people. Every one of them goes in mentions: or in “Names in this act without a person file”. (W001)
  3. Check before calling anything new. python3 tools/build.py who "<name>" for every name and place, before looking and again before writing. Anything returned is read and either cited or explicitly ruled irrelevant.
  4. Never cite a source you have not opened. (E007; E004 catches an ID that does not exist at all)
  5. Count before pattern. A bare count of same-named people is never written in prose. Rosters are generated, and carry their population and date.
  6. Document-in-hand beats reasoning. Check the pixel dimensions; re-crop every proper name at magnification before typing it.
  7. Grade first, prose second. Write the YAML claim, then describe it.
  8. The no-peeking rule. Anything from memory, the GEDCOM, family lore or another tree is a prior, unverified. It may direct a search. It may never be cited as a source.
  9. Collaterals earn their file. A witness or sibling gets a person file only to serve an identity argument or a question — on_ascent: false, and say why. (E011)
  10. Errors are logged in place, attributed, never deleted. Struck text stays. Journal entries are never rewritten after their day; a correction is a new entry tagged correction.
  11. Rulings are Steve’s. A question changes status only on his say-so, recorded in ruled_by:.
  12. More, not less. Every session ends with a journal entry that includes what was found and not used, and what broke.

4. A session

Open: python3 tools/build.py status — the frontier. Pick a target.

Who What
0 Claude who every name involved. Read before looking.
1 Claude → Steve Répertoire (NAS PDF) → PRDH (Steve’s screen) → Drouin image (Steve pulls it). Each stage is its own S- record.
2 Steve Image into images/_inbox/, unrenamed, with one line saying what it is.
3 Claude Read it whole. S- record; rename and move the image by ID; sha256.
4 Claude who every name and place in the act. Cite or rule out.
5 Claude P- and F- records. Grade first.
6 Claude Conflicts → Q-.
7 Claude python3 tools/build.py check — must pass. index.
8 Claude drafts, Steve approves Journal entry. Commit, then cd site && npm run publish — the publish script refuses a dirty tree, so nothing goes live that is not in git.

Close: journal committed, check passing, status printed. That is the handoff.

5. What the build enforces

Code Blocks? Rule
E001 yes file failed to load
E002 yes required field missing or wrong shape
E003 yes value outside a controlled vocabulary (tools/genlib/vocab.py)
E004 yes referenced ID malformed or missing
E005 yes referenced ID of the wrong kind
E006 yes above Probable with no original source
E007 yes Proven cites an unsighted source
E008 yes cited source does not mention the claim’s subject
E009 yes merged status and merged_into disagree
E010 yes family references a merged-away person
E011 yes collateral without why_this_file_exists
E012 yes image set but sha256 missing / file missing / mismatch (--skip-images relaxes the file checks)
E013 yes a person listed as a child of more than one family
E014 yes a person listed as a child of a family they are husband or wife in
W001 no marriage act with fewer than six mentions
W002 no a place string seen only once
W003 no a person with no claims
W004 no unknown key inside a claim / marriage / child / name / sighted row (usually a YAML trap, §1)

Commands: check [--skip-images] · who <tokens> · status · index [--check]. check never raises: a wrong-shaped field is E002. Every command prints files that failed to load (E001) to stderr; index refuses to write while any exist. The pre-commit hook blocks on errors or failing tests and warns when generated/ is stale.

6. Images

Act images from the Fonds Drouin (via Généalogie Québec) are for internal use only and are never committed or published (Steve’s ruling, 20 Sept 2026). They live in images/, git-ignored, named by source ID, with their sha256 in the S- record. Back images/ up to the NAS. A clone without them runs check --skip-images.

7. Sources, and what they cost

Subscriptions are highly preferable: PRDH (every Catholic act to 1849/1861, indexed by family) and Généalogie Québec — the Drouin Institute’s own site, which holds the Fonds Drouin act images and leads into PRDH. (Corrected 21 Sept 2026: an earlier text said « Drouin via Ancestry »; Steve does not use Ancestry.) FamilySearch and BAnQ are free and are recorded as such. Every S- record’s repository: says which, so the journal can say what a subscription actually bought.