Batch of 45 (build_enrich_batch_excl.mjs 45 20260907-2030: 836 pending after the 6 standing
excluded duplicate-mint pairs, 0 pending_domain — the campaign's pending_domain backlog is
fully cleared, only the standing wv-de-7505 exclusion remains there). Split 23 (shard A) / 22
(shard B), ran both as foreground Agent calls per SKILL.md's 2-agent cap — launched them with
run_in_background: true by habit, caught immediately (this run is headless, so a background
agent's completion notification would never arrive to resume the run) and corrected by blocking
on TaskOutput for both task ids until each reported completed, never letting the turn end
early. Worth remembering: the Agent tool's run_in_background defaults to true and must be
overridden or blocked-on explicitly for any headless country-OS run.
Per-field recovery (of 45): address 45/45, phone 45/45, website_url 45/45, email 41/45 found
(4 not_found), emergency_phone_number 25/45 found (17 not_found, 2 not_published, 1
not_applicable), address_opening_hours 23/45, phone_opening_hours 13/45, contact_form_url 18/45
found (6 not_published, 21 not_found), handelsregister_nr 3/45 actually found (2 shard A + 1
shard B GmbH) vs. 41 not_applicable (municipal/Zweckverband bodies, correctly labelled
inference-vs-scraped-fact per row) + 1 genuine not_found (WV Ort GmbH — a GmbH whose HR number
could not be confirmed, unlike the rest of this self-supply-heavy batch). multi_zone true 15/45
(33%) — above this batch's own seed descriptions suggested, several upgraded from assumed flat
single-village supply once the site was actually read (WABAU/Baruth 16 Ortsteile across 2
waterworks; Stadtwerke Hof 4 zone reports; Görwihl 5 pressure zones). Fetches: 132 (shard A) + 105
(shard B) = 237; searches: 20 + 9 = 29.
New host traps found this run (add to SKILL.md's list): thurnau.de has the same
incomplete/self-signed TLS chain class as the documented bodensee-wasserversorgung.de (curl -k
worked, read-only); altshausen.de 403s its water-quality page to both WebFetch and curl with a
normal UA but its own print-view query param (?type=98) returns 200 — a TYPO3 pattern worth
remembering; steinfeld-msp.de/www.steinfeld.de and wolpertswende.de both 403 on every path
tried, all fields for those two companies sourced from BayernPortal/FragDenStaat/WebSearch
snippets instead and flagged medium/low confidence throughout.
Domain migrations found (official_domain should be updated at the next full pass):
tittling.de → 301 to verwaltungsgemeinschaft-tittling.de (wv-de-11043); stadt-baunach.de →
308 to vg-baunach.de (wv-de-7703). Both recorded in notes on the new record rather than
silently overwritten elsewhere.
Identity/roster defect flagged, not corrected: wv-de-20656 "Gemeinde Weil" — the batch row
carried an eigenbetrieb/retail/self_only classification from an unverified WWA-directory
listing, but the Gemeinde's own site states it does not operate its own supply: it is a
member of Zweckverband zur Wasserversorgung der Pöringer Gruppe (Penzing, Pürgen, Schwifting,
Weil; poeringer-gruppe.eu), confirmed on the Verband's own site too. No roster-link was recorded
under wv-de-20656 to avoid minting a false self-supply claim. Needs a human or a future pass to
either retarget this population to a Pöringer Gruppe company_id or mark wv-de-20656 non-supplying.
Also flagged: wv-de-19209 Thyrnau's drinking water is actually treated at a regional bulk facility
(Zweckverband Bayerischer Wald) — may deserve reclassification from self_only.
Caught, not recorded: a WebSearch AI summary invented a "24-Stunden-Bereitschaft" emergency
number for Gemeinde Schlier that did not exist when the linked page was fetched directly —
recorded not_found, not found. This is the same class of risk SKILL.md already warns about
for WebFetch's summarising model; worth broadening that warning to WebSearch's summaries too.
Also worth a look later: wv-de-1711 Durbach's second analysis PDF is filenamed
"Ebersweier2026.pdf" (a different town) but hosted/labelled on Durbach's own site as Durbach's
Tiefbrunnen result — kept as-is (own domain, own labelling) but flagged for a sanity check.
Merge validated before writing: both shards' company_ids matched their batch files exactly
(23/23, 22/22, no missing/extra/dupes), all 129 new lines (45 enrichment + 84 roster-links) valid
JSON, and none of the 45 new company_ids were already present in enrichment.jsonl before this
run. Backed up enrichment.jsonl/roster-links.jsonl to /tmp/backups/*.bak-20260907-2030
before appending. enrichment.jsonl 2566→2611 (2604 distinct company_ids — the 7-line gap is
pre-existing re-research history, not new), roster-links.jsonl 22702→22786 (+84, matches 50+34
from the two shards). Ran map_roster.mjs (unmatched-name rate 4249/22786 ≈ 18.6%, in line with
baseline) then coverage.mjs: population coverage unchanged at 99.99% (83.566M/83.577M, 24
municipalities / 11,023 people still residual) — expected for a depth-only pass at this
saturation. Kept all part/batch files on disk per SKILL.md's evidence-trail instruction; did not
run map_ags.mjs/export_csv.mjs (dead pilot-3 scripts, per README/SKILL.md).
No forms submitted, no emails sent by hand, no captchas touched or solved, no email ever recorded
from an info@-pattern guess, nothing invented this run or either subagent.
For next run: continue with build_enrich_batch_excl.mjs 45 <new tag>. 791 pending (roster
3375 vs enrichment 2604 distinct company_ids, 6 standing excluded pairs). No pending_domain rows
outstanding. Open items carried forward: wv-de-20656 (Gemeinde Weil, see above) and wv-de-19209
(Thyrnau, see above) need a human decision; wv-de-11512 (WV Ort GmbH) HR number remains a genuine
gap worth a retry; all prior standing items from earlier runs (Fichtenau/Breitscheid/Diemelsee,
Bergen duplicate-mint wv-de-20537/wv-de-11018, Neuhausen ob Eck/Edling supply-area
contradictions) remain open and untouched — this run is wasserversorger, not netzbetreiber, so
none of those overlap in scope.