Second and third rounds on the dossier pipeline, reviewed locally before commit.
Retrieval
- wayback_pass.py: retries every BLOCKED/DEAD/THIN/ERROR linked source through
the Wayback Machine; blocks carry the snapshot date, archive URL and the live
verdict. 143 slots retried: 93 fetched, 37 no snapshot, 12 script shells, 1 PDF.
- fetch_sources.py: fetch_wayback() helper.
- add_extra_sources.py: files staged extra_* finds (web search, not on the DB
record) into the store with a provenance note.
- Cases re-sourced by web search: 248 (Oslo: Document.no, Avisa Oslo, NRK; the
linked Le Parisien piece is case 242 and is marked OFF-CASE), 258 Kharkiv,
260 Singapore, 358 Bangkok, 365 Las Vegas, 388 Verneuil-sur-Seine, 390 Zoersel,
430 Homestead. 341 of 364 cases now hold a fetched article; 11, 66 and 399
have no public text source (podcast, police video, direct victim report).
Trimming
- auto_trim.py: case-anchored furniture cut for UNTRIMMED blocks. Finds the body
run that mentions the case, merges across subheadings and short furniture
gaps, drops teasers, share bars, date/URL/caption lines and subscription
pitches; refuses pages with no record term or almost no body. 302 blocks
trimmed; 16 left on auto-trim-review.md (7 OFF-CASE suspects). Every cut is
labelled AUTO-TRIMMED, UNREVIEWED in the dossier; the full extract stays in
staging/. Decisions with anchors in trim-decisions-auto.json.
- build_cases.py / verify_all.py: banners for auto-trimmed and archived blocks,
staged-file check extended to Wayback blocks, flag legend under the record.
Detention rule
- README "Definitions": the DB field `kidnappings` is the DETENTION violence
type (victim, guard, staff or relative held to force submission or execute
the theft), distinct from the Kidnapping scenario (taken away and held).
- detention-flag-review.md / detention-flag-corrections.json: 40 records
reviewed with evidence; 30 set-to-1 proposals accepted by the owner on
2026-09-06 (listed in corrections-approved.md), 10 still open.
- apply_detention_wording.py: "Violence Used" in the 70 reviewed summaries now
names detention explicitly (62 of 70 labelled), supported by the summary's
own text; idempotent; supersedes the batch scripts' wording.
Worklist and docs
- sofia-worklist.md: 248 decisions, detention rule item replacing the old
"no abduction" item, fresh-search section for the textless cases.
- README-START-HERE.md: progress notes, run commands, next steps.
- Bug fixed in passing: Wayback blocks stored in-memory text with carriage
returns; now stored as read back from disk.
verify_all.py PASSES (2321 checks).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GZZENdTLzNGsbNy4DyF1yt
Until now only cases 357+ (plus a few older ones) had their linked URLs
fetched; the other 252 dossiers held just the text pasted into the
spreadsheet, often only the lede. This pass fetches every linked URL for
those cases so the full text is on file before link rot takes it.
- stage_all.py: new --include-sheet-cases flag that lifts the skip on
cases holding spreadsheet articles. Resumable as before.
- staging/: raw extracts and index.json for the 252 cases.
- sourced-articles.json, case-files-manifest.json: 188 new UNTRIMMED
blocks. 179 cases gained at least one fetched article; 73 got none
(49 BLOCKED, 18 THIN, 9 DEAD, 4 video/social, 3 ERROR).
- sources/*.txt: rebuilt with build_cases.py --all. Sheet pastes are
kept; fetched blocks sit beside them under the NOT YET TRIMMED banner.
Files previously committed with CRLF are now LF.
- wayback-availability.json: Wayback snapshots exist for 73 of the 98
failed URL slots; input for an archive-fetch pass.
- README-START-HERE.md: progress note and next step.
verify_all.py PASSES (1836 checks).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GZZENdTLzNGsbNy4DyF1yt