- Chunked-parse storage helpers (`opencontractserver/pipeline/chunk_artifacts.py`) now return the *actual* key from `default_storage.save(...)` instead of the pre-computed key, so backends that rewrite the key on collision (S3 unique-key mode, `FileSystemStorage` name clashes) no longer hand downstream tasks a dangling key. The exists()-then-delete() pattern was also replaced with a TOCTOU-free `_delete_quietly` helper.
- `BaseChunkedParser.reassemble_and_finalize` (`opencontractserver/pipeline/base/chunked_parser.py`) now cleans up scratch artifacts in a `finally` block, so a failure inside `save_parsed_data` no longer orphans chunk files under `chunk_scratch/doc_{id}/`. Covered by a new regression test.
