fix(ingest): קריאת קובץ‎-staging דרך storage.ensure_local — תיקון 500 בהעלאה תחת s3-only (INV-STG1) #228

Merged
chaim merged 1 commits from worktree-s3-ingest-readpath into main 2026-06-12 07:33:15 +00:00
Owner

הבעיה

העלאת פסיקה (/missing-precedents) והעלאת החלטת‎-ועדה (internal-decisions) נכשלו בייצור:

  • מסמך .doc מנבו → Converted file not found: /tmp/.../...docx
  • אחרי המרה ל‎-.docxPackage not found at '/data/internal-decisions/תל אביב/...docx' (500)

השורש

ingest._stage_file כותב את הקובץ דרך storage.put_file(...) ומחזיר נתיב‎-DATA_DIR. תחת backend s3-only (cutover 2026-06-11) ה‎-blob נכתב רק ל‎-MinIO ואין עותק בדיסק. אחר‎-כך הצינור קרא את אותו נתיב ישירות מהדיסק (extract_text) → אין קובץ → python-docx זרק PackageNotFoundError (ול‎-.doc, LibreOffice קיבל נתיב ריק → "Converted file not found").

מסלול תיקי‎-המקרה לא נפגע כי הוא שומר עותק‎-דיסק קנוני + mirror_file; רק מסלול _stage_file המשותף (precedent-library + internal-decisions + digests) קרא את ה‎-key כאילו הוא על הדיסק.

התיקון (G1 נרמול‎-במקור · INV-STG1 קריאה דרך שכבת‎-האחסון)

  • _stage_file מחזיר עכשיו את ה‎-KEY (נתיב יחסי‎-DATA_DIR), לא Path.
  • ingest_document ו‎-digest_library מאתרים נתיב‎-קריאה מקומי דרך storage.ensure_local:
    • filesystem/dual → עותק‎-הדיסק הקיים (ללא העתקה).
    • s3-only → הורדה ל‎-temp שאנו מנקים ב‎-finally (בלי דליפה ל‎-/tmp).
  • מולטימודל (PDF) קורא את אותו נתיב‎-מקומי מאומת.

בדיקות

  • test_unified_ingest::test_ingest_reads_via_ensure_local_when_no_disk_copy — backend in-memory ללא עותק‎-דיסק (מדמה s3-only); מוודא שהצינור משלים ושה‎-temp נוקה. נכשל מול הקוד הישן, עובר מול החדש.
  • test_storage_staging עודכן לחוזה‎-ה‎-KEY החדש.
  • 55 בדיקות ingest/storage/digest/precedent עוברות.

Invariants

  • INV-STG1 — כל קריאה/כתיבה דרך שכבת‎-האחסון; הצינור לא מניח שה‎-key על הדיסק.
  • G1 — נרמול‎-במקור (תיקון הצינור), לא תיקון‎-בקריאה.
  • G2 — אין מסלול מקביל; תיקון הצינור הקנוני היחיד.

🤖 Generated with Claude Code

## הבעיה העלאת פסיקה (`/missing-precedents`) והעלאת החלטת‎-ועדה (internal-decisions) נכשלו בייצור: - מסמך `.doc` מנבו → `Converted file not found: /tmp/.../...docx` - אחרי המרה ל‎-`.docx` → `Package not found at '/data/internal-decisions/תל אביב/...docx'` (500) ## השורש `ingest._stage_file` כותב את הקובץ דרך `storage.put_file(...)` ומחזיר **נתיב‎-DATA_DIR**. תחת backend `s3`-only (cutover 2026-06-11) ה‎-blob נכתב **רק ל‎-MinIO ואין עותק בדיסק**. אחר‎-כך הצינור קרא את אותו נתיב **ישירות מהדיסק** (`extract_text`) → אין קובץ → python-docx זרק `PackageNotFoundError` (ול‎-`.doc`, LibreOffice קיבל נתיב ריק → "Converted file not found"). מסלול תיקי‎-המקרה לא נפגע כי הוא שומר עותק‎-דיסק קנוני + `mirror_file`; רק מסלול `_stage_file` המשותף (precedent-library + internal-decisions + digests) קרא את ה‎-key כאילו הוא על הדיסק. ## התיקון (G1 נרמול‎-במקור · INV-STG1 קריאה דרך שכבת‎-האחסון) - `_stage_file` מחזיר עכשיו את ה‎-**KEY** (נתיב יחסי‎-DATA_DIR), לא `Path`. - `ingest_document` ו‎-`digest_library` מאתרים נתיב‎-קריאה מקומי דרך `storage.ensure_local`: - `filesystem`/`dual` → עותק‎-הדיסק הקיים (ללא העתקה). - `s3`-only → הורדה ל‎-temp שאנו מנקים ב‎-`finally` (בלי דליפה ל‎-`/tmp`). - מולטימודל (PDF) קורא את אותו נתיב‎-מקומי מאומת. ## בדיקות - `test_unified_ingest::test_ingest_reads_via_ensure_local_when_no_disk_copy` — backend in-memory ללא עותק‎-דיסק (מדמה s3-only); מוודא שהצינור משלים ושה‎-temp נוקה. נכשל מול הקוד הישן, עובר מול החדש. - `test_storage_staging` עודכן לחוזה‎-ה‎-KEY החדש. - 55 בדיקות ingest/storage/digest/precedent עוברות. ## Invariants - **INV-STG1** — כל קריאה/כתיבה דרך שכבת‎-האחסון; הצינור לא מניח שה‎-key על הדיסק. - **G1** — נרמול‎-במקור (תיקון הצינור), לא תיקון‎-בקריאה. - **G2** — אין מסלול מקביל; תיקון הצינור הקנוני היחיד. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
chaim added 1 commit 2026-06-12 07:32:45 +00:00
fix(ingest): read staged file via storage.ensure_local — s3-only upload 500 (INV-STG1)
All checks were successful
G12 Leak-Guard / leak-guard (pull_request) Successful in 5s
4f7c3733e2
תיקון: העלאת פסיקה/החלטת-ועדה (precedent-library + internal-decisions) נכשלה
תחת backend s3-only עם "Package not found at '/data/...docx'" / "Converted file
not found". השורש: ‎`ingest._stage_file` כותב את הקובץ דרך ‎`storage.put_file`
ומחזיר נתיב‎-DATA_DIR, אבל תחת s3-only ה‎-blob נכתב רק ל‎-MinIO ואין עותק בדיסק —
ואז הצינור קרא את הנתיב ישירות מהדיסק (extract_text) → קובץ לא קיים. מסלול
תיקי‎-המקרה לא נפגע כי הוא שומר עותק‎-דיסק + mirror_file; רק מסלול ‎_stage_file
המשותף קרא את ה‎-key כאילו הוא על הדיסק.

התיקון (נרמול‎-במקור, G1; קריאה דרך שכבת‎-האחסון, INV-STG1):
- ‎`_stage_file` מחזיר עכשיו את ה‎-KEY (נתיב יחסי‎-DATA_DIR), לא Path.
- ‎`ingest_document` ו‎-‎`digest_library` מאתרים נתיב‎-קריאה מקומי דרך
  ‎`storage.ensure_local` (עותק‎-דיסק תחת filesystem/dual; הורדה ל‎-temp תחת
  s3-only) ומנקים את ה‎-temp ב‎-finally — בלי דליפה ל‎-/tmp.
- מולטימודל (PDF) קורא את אותו נתיב מקומי מאומת.

בדיקות: test_unified_ingest::test_ingest_reads_via_ensure_local_when_no_disk_copy
מדמה backend ללא עותק‎-דיסק ומוודא שהצינור משלים (נכשל מול הקוד הישן). 55 עוברות.

Invariants: מקיים INV-STG1 (קריאה/כתיבה רק דרך שכבת‎-האחסון), G1 (נרמול‎-במקור,
לא תיקון‎-בקריאה), G2 (אין מסלול מקביל — תיקון הצינור הקנוני).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
chaim merged commit 5272ded4f7 into main 2026-06-12 07:33:15 +00:00
chaim deleted branch worktree-s3-ingest-readpath 2026-06-12 07:33:15 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: ezer-mishpati/legal-ai#228