conf.connect.publish_replica(): holds the primary's write lock,
CHECKPOINTs the WAL, copies to <name>.ro.duckdb, swaps atomically —
so the snapshot is always a consistent database and readers holding
the old file keep a valid handle. Both ingest scripts republish as
their final step, bounding staleness to ingest cadence.
conf.connect.duckdb(): read-only opens resolve to the replica when it
exists — notebook kernels never hold the primary's single-writer lock,
so ingests stop failing under open notebooks (the M2/option-C fix from
the concurrency spec). Opt-outs: replica=False param or
STACK_DUCKDB_REPLICA=0. Write opens always use the primary.
Validated live: replica published (3.1 GB), and the notebooks
container resolves conf.connect.duckdb() to /home/kert/data/
aco.ro.duckdb with the rulemaking-comments data visible. 82 conf
tests green (snapshot consistency, divergence, opt-outs, atomic
republish).