# age-injector (AZ-407) Clones a `tile-cache-fixture` tree and mutates ONLY the manifest's `capture_date` field (and the per-tile sidecar JSON's matching field) to age every entry by a target number of months. ## Output volumes | Volume | Age shift | Triggers | |--------|-----------|----------| | `synth-age-7mo` | now - 7 mo | > AC-8.2 active-conflict threshold (6 mo) — FT-N-05 | | `synth-age-13mo` | now - 13 mo | > AC-8.2 rear threshold (12 mo) — FT-N-06 | ## Reproducibility * Tile JPEG bodies are copied bit-identical (`shutil.copytree`). * Manifest CSV row order is preserved from the source manifest (the builder already sorts rows by `(zoom, x, y)`). * The shifted date is `now - age_months × 30.44 days`, rounded — the AC-3 tolerance is `± 1 day`, well within the 30.44-day floor. * The descriptors.index (if present in the source) is copied bit-identical. ## Provenance The injector itself is fully synthetic. The aged volumes are derivative works of `tile-cache-fixture` (same license — see `e2e/fixtures/tile-cache-builder/README.md` § Provenance). ## Usage ```bash # Production (Docker volumes): e2e/fixtures/age-injector/inject.sh # Local mode (used by AZ-407 unit test): e2e/fixtures/age-injector/inject.sh --local /tmp/src /tmp/out-7mo /tmp/out-13mo ``` The unit test `e2e/_unit_tests/fixtures/test_age_injector.py` verifies AC-3 by: 1. Building a small tile-cache fixture from a synthetic 4-still input 2. Running the injector with `--age-months=7` and `--age-months=13` 3. Asserting the manifest `capture_date` shifts ±1 day from `now - N*30.44 days` 4. Asserting every tile JPEG body byte-equals the source ## Owned by AZ-407 (this task).