feat(storage): אטימת מסלול-הכתיבה INV-STG1 — 15 seals + CI leak-guard + tripwire #205
Reference in New Issue
Block a user
Delete Branch "worktree-seal-storage-write-path"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
למה
אחרי ה-cutover ל-s3-only, אודיט מקיף מצא 15 אתרי-כתיבת-בלוב שעוקפים את
storage.py(uploads / finalize / exports / training / research-backup / precedents / bulletins / draft). תחת s3-only, קובץ כזה נוחת בתיקיות-הישנות אך לא מגיע ל-MinIO → יאבד בניקוי-דיסק, לא מוגש (presigned), לא מגובה. זה בדיוק החשש שחיים העלה ("איך מוודאים שלא יכנסו קבצים לתיקיות הישנות").הגישה — dual-write seal (בטוח)
ה-pipeline (ingest/extract) עדיין קורא קבצים לפי
file_pathמהדיסק, אז ביטול-מוחלט של כתיבה-לדיסק דורש read-wiring מלא של ה-pipeline = Phase 2 (משימה נפרדת, מסוכנת). התיקון הבטוח עכשיו: לשמור את כתיבת-הדיסק (ל-pipeline) וגם למרר ל-S3 (עמידות+הגשה).storage.mirror/mirror_file(+sync) — best-effort persist ל-S3 כשה-backend הוא s3/dual; no-op ב-filesystem; כשל-S3 נרשם ולא שובר request (פילוסופיית DualBackend).web/app.py— helpers_seal_blob/_seal_blob_file+ 14 אתרים אטומים (storage.mirrorאחרי כתיבת-הדיסק). block_writer.py — draft אטום.אכיפה — 2 שכבות
test_storage_write_leak_guard): נכשל ה-build על כל כתיבת-בלוב-לדיסק (write_bytes/write_text/shutil.copy*/open(wb)) ב-web/+services ללא מרקר# noqa: STG1. כל ה-benign (storage-fallbacks / tmp / staging / git-metadata / flag / state) מסומנים עם נימוק;storage.pyמוחרג (הוא המימוש). → רגרסיה עתידית נחסמת.scripts/storage_leak_tripwire.py): ניטור-ריצה — בלובים בדיסק שלא ב-MinIO (json-key match, סיווג bucket per-file). אומת חי: 0 דליפות.Invariants
בדיקות
4 mirror (no-op-filesystem / persist-dual / best-effort-never-raises / pure-s3) + 1 leak-guard + 6 serve_blob + 18 storage קיימות = 27 עוברות. py_compile OK. tripwire חי = 0 דליפות.
Follow-up (Phase 2)
read-wire את ה-pipeline (ingest/extract →
storage.ensure_local) → להפיל את עותק-הדיסק לגמרי → תנאי-קדם לניקוי-דיסק (#128). research_md in-place-edit staleness מטופל שם.🤖 Generated with Claude Code