1# 16. A capture a reader cannot answer for is passed over, not refused23- **Date:** 2026-08-024- **Status:** accepted5- **Where it is written down:** `internal/generate/sources` (`ErrNotReady`),6 `internal/generate/sources/arcgishub`; [generate.md](../generate.md)78## Context910The pipeline walks a whole archive: every volume, every source, in one run. Two11different things can go wrong with one entry, and the reference implementation12did not distinguish them — a malformed capture and a capture that is simply not13this reader's business both stopped the run.1415The second case is real rather than theoretical. The city source is driven by a16curation table that pins each city's window; an operator may have crawled17**their own city** into the same archive, and the repository's privacy rule18keeps that city's name out of the public table. A hard refusal there takes19every other volume in the archive down with it.2021## Decision2223Two outcomes, kept distinct:2425- **Refused** — the capture is wrong. Another source's kind; a world slug that26 is not a capture day; no basemap pyramid, no window, no datasets; a dataset27 captured twice; a point dataset whose rows are all untitled or mostly outside28 the declared window. A reader states its preconditions and refuses what does29 not meet them rather than guessing.30- **Passed over** — the capture is present but this reader cannot answer for31 it: an uncurated city, a half-finished crawl, a world with no capture. The32 reader wraps `ErrNotReady`, and the caller skips the volume with an `info`33 line naming the source and the reason.3435`sources.ErrNotReady` aliases the archive's own signal, so a caller has one36thing to test with `errors.Is`.3738## Consequences3940- One unreadable volume never fails the other thirty. `atlas translate`,41 `tiles`, `compose` and `enrich` all skip on the same signal, so the behaviour42 is the pipeline's rather than one command's.43- The uncurated city is passed over rather than guessed at, because an44 unverified window would hang every pin on the wrong pixel — silence over45 plausibility, the same ethic the enrichers are held to.46- The public curation table can stay public. A private city lives in a47 gitignored table and the archive holding it still processes cleanly against48 the committed one.49- `ErrNotReady` is a *skip*, never a success: nothing downstream sees a partial50 volume, and the run's log says what it declined to read.