Scope: apply ONLY the approved change-set from the dispatch (Goodspeed/Wooding line extension). Source: 2026-07-22-frontier-round5-partG.md + partH.md, tree doc 2026-07-20-wilson-tree-v0.md.
What changed
index.html (ANC object)
353Elizabeth Goodspead:b:null,eb:1733→b:1731;ed:1795kept as-is (not recomputed off the new real birth — see judgment call #1 below); addedprob:true; rewroteebasis,story,conf.- Added
706Stephen Goodspeed —b:1706,d:1763,prob:true. - Added
707Bethiah Wooding —b:1711,ed:1773,prob:true. - Added
1412Nathaniel Goodspeed —eb:1680(noprob, CONFIRMED-existence tier). - Added
1413Sarah King —eb:1684(noprob, CONFIRMED-existence tier). - Added
1414Peter Wooding —eb:1671,d:1717(noprob, CONFIRMED tier, real death date). - Added
1415Elizabeth Mallot —eb:1675,ed:1737(noprob, CONFIRMED tier). - New block inserted after the existing
11277entry, before the closing};, with a dated comment header. Insertion position doesn't affect ordering — the file's own comment convention says integer keys auto-sort.
build-people.mjs
- Added
706, 707, 1412, 1413, 1414, 1415toLINE_BY_AHN, all mapped to'Olney & Lambert'. This wasn't explicitly in the change-set text but is a mechanical necessity: without it,build-people.mjswould emit an "unassigned line" console warning for all six and they'd be missing from the groupedpeople/index.htmllisting (their individual pages would still be written regardless — the write loop iterates all persons unconditionally — but they'd be orphaned from the family-line index). Judgment call #2, logged below.
people-bios.json
- Rewrote
elizabeth-goodspead(existing entry) to reflect the new real birth + newly named parents. - Added 6 new entries:
stephen-goodspeed,bethiah-wooding,nathaniel-goodspeed,sarah-king,peter-wooding,elizabeth-mallot. Matched the existing schema (bio: [paragraphs],facts: [{text, source_label, source_url, confidence}]) and the file's own typographic conventions (curly’apostrophes, curly“ ”quotes for quoted primary-source language,—for em dashes) rather than straight ASCII punctuation. - Entry count: 110 → 116 (105 pre-existing untouched + 1 rewritten + 6 new — net +6 as expected).
Tree doc (2026-07-20-wilson-tree-v0.md)
- Appended
## 2026-07-22 frontier round 5section: headlines, the 6-ancestor Goodspeed/Wooding extension, the 3 reconciled contradictions (Stephen Goodspeed d.1763 ruling, GW Gibby stays 1909/no site change, Alice Pemberton baptism year unresolved), the Oakford doc-only date pins, the Pemberton-upstream doc-only/quarantined notes, and top open keys carried forward. - Did NOT touch the existing 2026-07-21 "Estimation methodology" table's
353 Elizabeth Goodspead · ~1733–~1795row — that table is a dated historical snapshot of what was estimated that day; editing it retroactively would misrepresent the record. The new round-5 section documents the retirement of that estimate instead. Flagging this as a possible follow-up if the founder wants that table kept current rather than historical.
Judgment calls (things a fresh reader should know)
- Elizabeth Goodspead's death estimate (
ed:1795) was kept as-is, not recomputed from the new real birth. Strict E3 arithmetic off the new real birth (1731+62) would give 1793, not 1795. The dispatch explicitly said "keep the estimated death (ed:1795)," and the methodology's E4 rule ("a real documented date always overrides its estimated half") doesn't mandate recomputing the other half just because one side went real — so this isn't a methodology violation, just an instruction I followed literally rather than silently "improving." Flagging in case the founder wants ed recomputed to 1793 for arithmetic consistency; leaving it at 1795 per the explicit instruction. LINE_BY_AHNmap extension inbuild-people.mjs(see above) — a plumbing change, not a content/genealogy judgment call, needed so the six new pages surface correctly in the grouped people index rather than silently orphaning.- Node numbering required no judgment at all — 706/707/1412/1413/1414/1415 are the exact ahnentafel positions relative to Elizabeth Goodspead (353): father=2n, mother=2n+1, recursively. Verified programmatically (
floor(706/2)==353,floor(1412/2)==706, etc. — all true) before writing. - Held to the HOLD list exactly: did not add Oakford, Pemberton-upstream, or any Gibby-node changes to index.html or people-bios.json. Those are recorded doc-only in the tree doc's new section, per instruction.
- Did not add
SOURCESorFRONTIER_HINTSentries in build-people.mjs for the 6 new slugs — out of the approved scope; the generator's existing fallback behavior (a muted "no direct web links captured yet" note under Sources, and a generic "not yet found — research frontier" stub for their own unlisted parents) handles their absence gracefully and correctly.
Verification results
- ANC/GROUPS/REGIONS block parse: extracted all three via the same balanced-delimiter
new Functionapproachbuild-people.mjsuses, in a standalone Node check. All three parse cleanly.ANChas 124 keys (118 + 6 new). Checked everyb/d/eb/edfield across all 124 entries is eithernullor a real (non-NaN) number — zero bad fields. Checked every non-unknownentry'sregionresolves inREGIONS— zero mismatches. - Ahnentafel consistency: confirmed programmatically that 706/707 are children of 353, and 1412/1413/1414/1415 are children of 706/707 respectively (all
floor(n/2)checks true). node build-people.mjsexit status: 0. Output: "people/: wrote 122 person pages + index.html + slugs.js + style.css" / "persons total: 122" (116 prior + 6 new) / "slug-map keys: 250" / pre-existing slug collisions unchanged (william-olney ×3, john-herman-wilson ×2) — no new collisions introduced. No "WARN: unassigned line" printed, confirming theLINE_BY_AHNfix worked.- Generated pages spot-checked: all 6 new person pages + the updated
elizabeth-goodspead.htmlrender with correct year ranges, correct badge (probable vs plain, matching theprobflag choices above), correct bio text pulled frompeople-bios.json, and fully-linked Immediate family sections (father/mother/spouse/children all resolve to the right pages — e.g. Stephen Goodspeed's page correctly links up to Nathaniel Goodspeed + Sarah King and down to Elizabeth Goodspead). - grep for literal
null/NaN/undefinedacross all files inpeople/*.html: zero matches (excluding the JSON source's own"source_url": nullkeys, which aren't in the generated HTML — confirmed separately that no such matches appear in HTML output at all). - people/index.html grouping: confirmed all 6 new people appear under the "Olney & Lambert"
<h2>section, correctly year-sorted alongside existing members. - Did not deploy — left for the founder per instruction.
2026-07-22 ~07:10 ET — Timeline width consolidation (founder ask, separate from round 5)
Founder (iMessage + screenshot): the timeline gave every person their own vertical lane → very wide with dead whitespace. Ask: pack non-overlapping lifespans into shared columns; child-between-parents rule can be relaxed; hard constraint = never stack two people alive at the same time. Example he gave: Danny Wilson + Jeremiah Lambert (non-overlapping) can share a column.
Implementation (index.html renderTimeline):
- Sort FLAT by birth year (was: by
_fgenealogical fraction), tiebreak_f→ same-year births still order paternal→maternal. - Greedy interval-partitioning:
laneBottom[]tracks each column's last death-pixel; each person takes the leftmost column whose last occupant died before this birth (+LANE_BUF=12px), else opens a new column. This is optimal (min columns) for interval graphs when processed in start order. x = GUT+6 + lane*(BW+GAP)(was per-personx+=BW+GAP).- Canvas min-width set dynamically to
GUT+6+laneCount*(BW+GAP)+30(overrides the CSS#canvas{min-width:3010px}floor which was sized for one-col-per-person). - Hint caption rewritten (was "columns run genealogically, child between parents" — now describes packing; points to Fan view for exact structure).
- Descent brackets + marriage connectors unchanged (still keyed off per-person x via colX/COLK/_x) — they now span packed columns; no visible clutter in render.
Verified via Playwright (localhost:8743, cache-busted): 118 bars → 56 columns (was 118); canvas 3010px → 1538px (49% narrower); 0 same-column time-overlaps (bug check passed); 0 console errors. 56 is the true floor = peak simultaneously-alive count, which the founder's constraint forbids collapsing further. Full-page screenshot eyeballed: clean staircase, chips readable, region colors intact.