Model/orchestration
Khalim Conn-Kowlessar 9ec7987e97 PR review: best-effort read path, true per-member streaming, race-safe 409, local email 🟩
Addresses PR #1498 review:
- A per-file read failure (missing/deleted object, or a bucket the role can't
  reach) is now a SkippedDocument(reason=unreadable), not a whole-run abort;
  an all-unreadable selection still fails (no empty package). Best-effort on
  the read path (ADR-0060).
- Each ZIP member is streamed to a temp file (S3DocumentDownloader.download,
  boto download_file) and added from disk, so a single multi-GB member never
  hits the heap — the 'never held whole in memory' claim is now true.
- The 409 double-submit guard is DB-arbitrated: the sub_task insert is
  conditional on the task having none, so a race creates only one.
- Local env gets a placeholder recipient email so the route is exercisable.
- PackageEntry carries landlord_property_id so a read failure can be reported.
- TODO noting the UploadedFile.s3_upload_timestamp typing fix.
Two new tests: per-file read failure skips-and-reports; address fallback flows
to the folder name.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 11:08:46 +00:00
..
__init__.py added postcode splitter rewrite to ddd 2026-05-19 16:35:09 +00:00
abri_orchestrator.py Amending an appointment needs only the deal's changed date and time 🟪 2026-07-07 10:07:23 +00:00
ara_first_run_pipeline.py feat(modelling): ModellingOrchestrator persists a Plan end-to-end (#1157) 2026-06-03 12:08:32 +00:00
audit_generator_orchestrator.py populate_sheet writes to new Sero template column layout 🟩 2026-06-10 13:21:50 +00:00
audit_generator_unit_of_work.py Audit generator populates XLSX, uploads to S3, and records UploadedFile row 🟥 2026-06-09 11:59:09 +00:00
bulk_document_download_orchestrator.py PR review: best-effort read path, true per-member streaming, race-safe 409, local email 🟩 2026-07-08 11:08:46 +00:00
bulk_upload_finaliser_orchestrator.py Group landlord property-override enums under domain/epc/property_overrides 🟪 2026-06-19 14:49:58 +00:00
classifiable_column.py moved classifier data transformation to an easy one 2026-06-01 14:53:34 +00:00
ingestion_orchestrator.py An expired historic cert conditions ingestion's prediction and labels it 🟩 2026-07-06 08:38:07 +00:00
landlord_description_overrides_orchestrator.py tests wrong environemnt 2026-05-29 16:17:06 +00:00
magic_plan_orchestrator.py UploadedFile, FileTypeEnum, FileSourceEnum importable from infrastructure.postgres.uploaded_file_table 🟩 2026-06-09 11:50:51 +00:00
modelling_orchestrator.py ASHP sizing targets the Appendix-N efficiency peak (realistic installed pump) 🟩 2026-07-03 11:02:13 +00:00
postcode_splitter_orchestrator.py standardist Address 2026-05-22 10:13:32 +00:00
property_baseline_orchestrator.py Persist no Lodged Performance for a predicted Property 🟩 2026-06-30 22:10:57 +00:00
sharepoint_renamer_orchestrator.py UPRN-prefixed property folders rename to a single-UPRN filename 🟩 2026-07-03 12:09:32 +00:00
task_orchestrator.py Completing a re-run failed batch un-fails the task 🟩 2026-07-07 11:11:52 +00:00