feat(storage): #106.5 — חיווט-קריאה serve_blob (presigned + dual disk-fallback) #198

Merged
chaim merged 1 commits from worktree-storage-read-wiring-presigned into main 2026-06-11 17:43:58 +00:00
Owner

מה

חיווט-קריאה של 4 endpoints מגישי-קבצים דרך helper יחיד serve_blob (INV-STG6), לפי אסטרטגיית-ה-cutover שהפאנל התלת-מודלי (Opus+DeepSeek+Gemini) אישר פה-אחד (2026-06-11):

backend התנהגות
filesystem (פעיל בייצור) FileResponse מדיסק — משמר-התנהגות, אפס שינוי
s3/dual + אובייקט ב-MinIO 302 ל-presigned-URL (bytes browser↔MinIO, לא דרך FastAPI)
dual + miss fallback-לדיסק — מכסה שקוף קבצים מחוץ לסט-ההגירה מתויג-ה-DB (analysis-and-research.md, DOCX דינמי, proofread). רשת-הביטחון שהפאנל דרש
s3 + miss + ללא-דיסק 404

כשל normalize_key/presign → fallback-לדיסק, לעולם לא 500 (logger.exception, לא בליעה שקטה).

גבול בלתי-הפיך

ה-cutover (#106.6 flip ל-s3) + WORM (#106.7) נשארים נעולים מאחורי אישור-אדם — הכרעת-הפאנל פה-אחד (proceed_autonomously=false, מערכת משפטית פונה-החוצה). PR זה הפיך: תחת filesystem (הפעיל) אין שינוי-התנהגות; ה-helper מוכן להפעלה כשתחליט flip מפוקח + curl-ירוק per-endpoint.

Invariants

  • INV-STG6 presigned serving · INV-STG1 storage-layer יחיד · G2 serve_blob יחיד (לא 4 העתקי-לוגיקה) · INV-G10 אפס שינוי-התנהגות בייצור.

בדיקות

4 חדשות web/tests/test_serve_blob.py (filesystem / dual-in-S3 / dual-fallback / s3-404) — עוברות. py_compile OK. (תשתית-טסטים ראשונה ל-web/.)

מקור: פאנל תלת-מודלי, תיעוד ב-TaskMaster #106.6.

🤖 Generated with Claude Code

## מה חיווט-קריאה של **4 endpoints** מגישי-קבצים דרך helper יחיד `serve_blob` (INV-STG6), לפי אסטרטגיית-ה-cutover ש**הפאנל התלת-מודלי (Opus+DeepSeek+Gemini) אישר פה-אחד** (2026-06-11): | backend | התנהגות | |---|---| | `filesystem` (פעיל בייצור) | `FileResponse` מדיסק — **משמר-התנהגות, אפס שינוי** | | `s3`/`dual` + אובייקט ב-MinIO | 302 ל-**presigned-URL** (bytes browser↔MinIO, לא דרך FastAPI) | | `dual` + miss | **fallback-לדיסק** — מכסה שקוף קבצים מחוץ לסט-ההגירה מתויג-ה-DB (analysis-and-research.md, DOCX דינמי, proofread). רשת-הביטחון שהפאנל דרש | | `s3` + miss + ללא-דיסק | 404 | כשל `normalize_key`/presign → fallback-לדיסק, לעולם לא 500 (`logger.exception`, לא בליעה שקטה). ## גבול בלתי-הפיך ה-**cutover (#106.6 flip ל-s3) + WORM (#106.7) נשארים נעולים מאחורי אישור-אדם** — הכרעת-הפאנל פה-אחד (`proceed_autonomously=false`, מערכת משפטית פונה-החוצה). PR זה **הפיך**: תחת `filesystem` (הפעיל) אין שינוי-התנהגות; ה-helper מוכן להפעלה כשתחליט flip מפוקח + curl-ירוק per-endpoint. ## Invariants - **INV-STG6** presigned serving · **INV-STG1** storage-layer יחיד · **G2** serve_blob יחיד (לא 4 העתקי-לוגיקה) · **INV-G10** אפס שינוי-התנהגות בייצור. ## בדיקות 4 חדשות `web/tests/test_serve_blob.py` (filesystem / dual-in-S3 / dual-fallback / s3-404) — עוברות. py_compile OK. (תשתית-טסטים ראשונה ל-web/.) מקור: פאנל תלת-מודלי, תיעוד ב-TaskMaster #106.6. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
chaim added 1 commit 2026-06-11 17:43:49 +00:00
feat(storage): #106.5 — read-wiring via serve_blob (presigned + dual disk-fallback)
All checks were successful
G12 Leak-Guard / leak-guard (pull_request) Successful in 6s
63784f1f91
חיווט-קריאה של 4 endpoints מגישי-קבצים (api_read_local_file · research/analysis
download · analysis export-docx · exports download) דרך helper serve_blob יחיד
(INV-STG6). מיישם את אסטרטגיית-ה-cutover שהפאנל התלת-מודלי (Opus+DeepSeek+Gemini)
אישר פה-אחד 2026-06-11:
- filesystem → FileResponse מדיסק (משמר-התנהגות; ה-backend הפעיל בייצור — אפס שינוי).
- s3/dual → 302 ל-presigned-URL כשהאובייקט ב-MinIO (bytes browser↔MinIO, לא דרך FastAPI).
- dual + miss → **fallback-לדיסק** — מכסה שקוף קבצים שמחוץ לסט-ההגירה מתויג-ה-DB
  (analysis-and-research.md, DOCX דינמי, proofread). זו רשת-הביטחון שהפאנל דרש.
- s3 + miss + ללא-דיסק → 404.
כשל normalize_key/presign → fallback-לדיסק, לעולם לא 500 (לא נשבר בשקט — logger.exception).

ה-cutover (#106.6 flip ל-s3) + WORM (#106.7) **נשארים נעולים מאחורי אישור-אדם** —
הכרעת-הפאנל פה-אחד (proceed_autonomously=false). PR זה הפיך: תחת filesystem אין שינוי-
התנהגות, וה-helper מוכן להפעלה כשיוחלט flip מפוקח + curl-ירוק per-endpoint.

invariants: INV-STG6 (presigned) · INV-STG1 (storage layer יחיד) · G2 (serve_blob יחיד,
לא 4 העתקי-לוגיקה) · INV-G10 (אפס שינוי-התנהגות בייצור filesystem).
tests: 4 חדשות (web/tests/test_serve_blob.py — filesystem/dual-S3/dual-fallback/s3-404), עוברות. py_compile OK.
מקור: פאנל תלת-מודלי (תיעוד ב-TaskMaster #106.6).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
chaim merged commit 2e2234ec27 into main 2026-06-11 17:43:58 +00:00
chaim deleted branch worktree-storage-read-wiring-presigned 2026-06-11 17:43:59 +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#198