US07-03: Harden Media and Metadata Edge Cases (#85)
This commit was merged in pull request #85.
This commit is contained in:
24
README.md
24
README.md
@@ -228,6 +228,30 @@ work_item/scripts/python -m pytest -m phase_f -q
|
||||
|
||||
Phases A–E remain green in the full run above.
|
||||
|
||||
## Media and metadata hardening (US07-03)
|
||||
|
||||
Every pixel the application reads goes through `photo_pipeline/imaging.py`: the
|
||||
declared dimensions are checked before anything is decoded, Pillow's
|
||||
decompression-bomb warning is treated as a refusal, JPEG decodes near the requested
|
||||
size, and each decoder failure becomes one of two typed errors. A damaged file is a
|
||||
per-item error with a persisted code, never a failed scan or a dead worker.
|
||||
|
||||
Every metadata stage ends with an EXIF checkpoint (`services/exif_checkpoint.py`):
|
||||
snapshot, write the owned keywords, read back, prove the owned fields landed and that
|
||||
nothing else moved, refresh the file hash. A field the stage does not own that
|
||||
changed anyway makes the checkpoint `divergent` — recorded in `exif_projections`,
|
||||
shown in the review queue, never repaired behind the user's back, and not counted as
|
||||
verified, so upload stays blocked.
|
||||
|
||||
The golden corpus that proves all of it is generated, not committed:
|
||||
`tests/fixtures/media_corpus.py` declares every format, orientation, profile,
|
||||
damage, and metadata case with its expected outcome, and the suite regenerates it
|
||||
twice to prove it does not drift.
|
||||
|
||||
```bash
|
||||
work_item/scripts/python -m pytest tests/integration/test_media_hardening.py tests/integration/test_exif_checkpoints.py -q
|
||||
```
|
||||
|
||||
## Legacy CLI archive
|
||||
|
||||
The command-line tools this application was extracted from are frozen in
|
||||
|
||||
Reference in New Issue
Block a user