feat(storage): X14 Phase 2a — route source-document writes through storage.py #152

Merged
chaim merged 1 commits from worktree-storage-minio-phase2 into main 2026-06-08 08:01:01 +00:00
Owner

מה זה

שלב 2a של הגירת-האחסון (X14, משימה 106.3): חיווט אתרי-הכתיבה של מסמכי-המקור דרך שכבת-האחסון (INV-STG1), במקום shutil.copy2 ישיר.

אתרים שחוברו

  • tools/documents.py — originals של תיק + העלאת קורפוס-אימון
  • services/ingest.py_stage_file (כעת async) — מכסה precedent-library, internal-decisions ו-digests (helper הקליטה הקנוני)
  • services/digest_library.py — קורא ל-_stage_file ב-await

כל כתיבה דרך storage.put_file(..., bucket=DOCUMENTS) עם מפתח יחסי ל-DATA_DIR; שם-הקובץ העברי כמטא-דאטה (INV-STG2), content-type נגזר מהסיומת. עמודות-הנתיב ב-DB ללא שינוי (object_key backfill = שלב 3).

אפס שינוי-התנהגות

תחת STORAGE_BACKEND=filesystem (ברירת-מחדל בייצור), put_file עושה shutil.copy2 ל-DATA_DIR/key → הבייטים נוחתים בדיוק במיקום הישן. import shutil הוסר היכן שמיותר.

בדיקות

  • +2 בדיקות-רגרסיה (הקובץ נוחת תחת DATA_DIR בנתיב הישן)
  • 20 storage + 22 ingest עוברות; 242 נאספות ללא שבירת-import
  • test_unified_ingest (שמפעיל _stage_file דרך ingest_document) ירוק → ה-async לא שבר את הזרימה

היקף + invariants

אתרי כתיבה נגזרים (thumbnails, extracted-text, DOCX exports) = שלב 2b. מקיים G2; מקדם INV-STG1. ספ: docs/spec/X14-storage-minio.md.

🤖 Generated with Claude Code

## מה זה שלב 2a של הגירת-האחסון (X14, משימה 106.3): חיווט אתרי-הכתיבה של **מסמכי-המקור** דרך שכבת-האחסון (INV-STG1), במקום `shutil.copy2` ישיר. ## אתרים שחוברו - `tools/documents.py` — originals של תיק + העלאת קורפוס-אימון - `services/ingest.py` — `_stage_file` (כעת **async**) — מכסה precedent-library, internal-decisions ו-digests (helper הקליטה הקנוני) - `services/digest_library.py` — קורא ל-`_stage_file` ב-await כל כתיבה דרך `storage.put_file(..., bucket=DOCUMENTS)` עם מפתח יחסי ל-DATA_DIR; שם-הקובץ העברי כמטא-דאטה (INV-STG2), content-type נגזר מהסיומת. **עמודות-הנתיב ב-DB ללא שינוי** (object_key backfill = שלב 3). ## אפס שינוי-התנהגות תחת `STORAGE_BACKEND=filesystem` (ברירת-מחדל בייצור), `put_file` עושה `shutil.copy2` ל-DATA_DIR/key → הבייטים נוחתים **בדיוק במיקום הישן**. `import shutil` הוסר היכן שמיותר. ## בדיקות - +2 בדיקות-רגרסיה (הקובץ נוחת תחת DATA_DIR בנתיב הישן) - 20 storage + 22 ingest עוברות; **242 נאספות ללא שבירת-import** - test_unified_ingest (שמפעיל `_stage_file` דרך `ingest_document`) ירוק → ה-async לא שבר את הזרימה ## היקף + invariants אתרי כתיבה נגזרים (thumbnails, extracted-text, DOCX exports) = **שלב 2b**. מקיים **G2**; מקדם **INV-STG1**. ספ: `docs/spec/X14-storage-minio.md`. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
chaim added 1 commit 2026-06-08 08:00:52 +00:00
Rewire the source-document staging writes onto the unified storage layer
(INV-STG1), replacing direct shutil.copy2 calls:
- tools/documents.py: case originals + training-corpus uploads
- services/ingest.py: _stage_file (now async) — covers precedent-library,
  internal-decisions, and digests (the canonical intake helper)
- services/digest_library.py: awaits the now-async _stage_file

Each write goes through storage.put_file(..., bucket=DOCUMENTS) with the
DATA_DIR-relative key; the Hebrew original filename rides as object metadata
(INV-STG2), content-type is guessed from the extension. DB path columns are
unchanged (still the absolute dest) — object_key backfill is Phase 3.

Under the default STORAGE_BACKEND=filesystem the bytes land at the exact
legacy on-disk location (put_file → shutil.copy2 to DATA_DIR/key), so this
is zero behaviour change in prod. shutil import dropped where now unused.

tests: +2 staging regression tests (file lands under DATA_DIR at the legacy
path); 20 storage + 22 ingest tests green; 242 collected with no import
breakage.

Derived/export write sites (thumbnails, extracted text, DOCX exports) are
Phase 2b. Keeps G2; advances INV-STG1. Spec: docs/spec/X14-storage-minio.md.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
chaim merged commit 39f8cb7c15 into main 2026-06-08 08:01:01 +00:00
chaim deleted branch worktree-storage-minio-phase2 2026-06-08 08:01:01 +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#152