fix(metadata): לא להתיישב 'completed' בכשל-חילוץ-Gemini חולף (#138) #261

Merged
chaim merged 1 commits from worktree-metadata-no-settle-on-fail into main 2026-06-15 03:35:47 +00:00
Owner

רקע (#138)

המחלץ קרא רק GEMINI_API_KEY בעוד בסביבה קיים GOOGLE_GEMINI_API_KEYתוקן כבר ב-PR #255 (fallback, נמצא ב-main). PR זה סוגר את הבאג המשני שגרם לאובדן-בשקט.

הבאג המשני

במסלול-הדריינר process_pending_extractions, כש-extract_and_apply החזיר no_metadata (כשל-Gemini חולף), הקוד התיישב ל-metadata_status='completed' ללא-תנאי — הרשומה ננטשה בשקט עם מטא ריק והדריינר לא חזר אליה.
נצפה: da2d9ccb (4491-02-21), 5fabdac5 (14306-09-23) — completed אך court/date/summary ריקים.

התיקון (G1 — אבחנת-מקור)

  1. extract_and_apply מבדיל תוצאה-ריקה: יש full_textextraction_failed (חולף, בר-retry); אין full_textno_metadata (אין מה לחלץ).
  2. process_pending_extractions (metadata): על extraction_failed → חוזר ל-pending (משמר חותם-התור) במקום completed. ה-retry-loop הקיים מנסה שוב; אחרי-מיצוי הרשומה נשארת בתור. מסלול reextract_metadata כבר עקבי.

תיקון-נתון (בוצע)

דרך כלי-MCP precedent_extract_metadata (רץ מקומית): da2d9ccb + 5fabdac5 חולצו-מחדש בהצלחה — court/date/summary/headnote/subject_tags מלאים. 0 נותרו external completed-but-empty.

הערה: Coolify

מפתח-Gemini אינו נדרש ב-Coolify — המחלץ רץ רק מקומית (precedent_library → extract_and_apply, host ~/.env עם GOOGLE_GEMINI_API_KEY). app.py (קונטיינר) מייבא רק את הקבוע PLACEHOLDER_PENDING_EXTRACTION, לא את פונקציית-החילוץ. אומת ע"י הצלחת ה-re-extract המקומי.

בדיקות

  • test_metadata_extract_failure_status (חדש) — transient (יש טקסט) / permanent (אין טקסט) / record חסר.
  • כל 335 בדיקות mcp עוברות. undefined-names + leak-guard נקיים.

Invariants

  • G1 — אבחנת-מקור (לא התיישבות-בקריאה)
  • INV-G3 / X16 — עמידות-פייפליין (כשל חולף בר-retry, לא אובדן-בשקט)
  • G12 — leak-guard נקי

🤖 Generated with Claude Code

## רקע (#138) המחלץ קרא רק `GEMINI_API_KEY` בעוד בסביבה קיים `GOOGLE_GEMINI_API_KEY` — **תוקן כבר ב-PR #255** (fallback, נמצא ב-main). PR זה סוגר את **הבאג המשני** שגרם לאובדן-בשקט. ## הבאג המשני במסלול-הדריינר `process_pending_extractions`, כש-`extract_and_apply` החזיר `no_metadata` (כשל-Gemini חולף), הקוד התיישב ל-`metadata_status='completed'` **ללא-תנאי** — הרשומה ננטשה בשקט עם מטא ריק והדריינר לא חזר אליה. נצפה: `da2d9ccb` (`4491-02-21`), `5fabdac5` (`14306-09-23`) — `completed` אך `court/date/summary` ריקים. ## התיקון (G1 — אבחנת-מקור) 1. **`extract_and_apply`** מבדיל תוצאה-ריקה: יש `full_text` → **`extraction_failed`** (חולף, בר-retry); אין `full_text` → **`no_metadata`** (אין מה לחלץ). 2. **`process_pending_extractions`** (metadata): על `extraction_failed` → חוזר ל-**`pending`** (משמר חותם-התור) במקום `completed`. ה-retry-loop הקיים מנסה שוב; אחרי-מיצוי הרשומה נשארת בתור. מסלול `reextract_metadata` כבר עקבי. ## תיקון-נתון (בוצע) דרך כלי-MCP `precedent_extract_metadata` (רץ מקומית): `da2d9ccb` + `5fabdac5` חולצו-מחדש בהצלחה — `court/date/summary/headnote/subject_tags` מלאים. **0** נותרו external `completed-but-empty`. ## הערה: Coolify מפתח-Gemini **אינו נדרש ב-Coolify** — המחלץ רץ רק מקומית (`precedent_library → extract_and_apply`, host `~/.env` עם `GOOGLE_GEMINI_API_KEY`). `app.py` (קונטיינר) מייבא רק את הקבוע `PLACEHOLDER_PENDING_EXTRACTION`, לא את פונקציית-החילוץ. אומת ע"י הצלחת ה-re-extract המקומי. ## בדיקות - `test_metadata_extract_failure_status` (חדש) — transient (יש טקסט) / permanent (אין טקסט) / record חסר. - כל **335** בדיקות mcp עוברות. `undefined-names` + `leak-guard` נקיים. ## Invariants - ✅ **G1** — אבחנת-מקור (לא התיישבות-בקריאה) - ✅ **INV-G3 / X16** — עמידות-פייפליין (כשל חולף בר-retry, לא אובדן-בשקט) - ✅ **G12** — leak-guard נקי 🤖 Generated with [Claude Code](https://claude.com/claude-code)
chaim added 1 commit 2026-06-15 03:35:07 +00:00
fix(metadata): לא להתיישב 'completed' בכשל-חילוץ-Gemini חולף (#138)
All checks were successful
G12 Leak-Guard / leak-guard (pull_request) Successful in 7s
Lint — undefined names / undefined-names (pull_request) Successful in 17s
77817a46ad
צד-המטא-דאטה (precedent_metadata_extractor) קרא רק GEMINI_API_KEY בעוד בסביבה
קיים GOOGLE_GEMINI_API_KEY — תוקן ב-PR #255 (fallback). הבאג המשני שנותר: כש-
extract_and_apply החזיר 'no_metadata' (כשל-Gemini), מסלול-הדריינר
process_pending_extractions התיישב ל-metadata_status='completed' ללא-תנאי, כך
שהרשומה ננטשה בשקט עם מטא ריק והדריינר לא חזר אליה (נצפה: da2d9ccb '4491-02-21',
5fabdac5 '14306-09-23' — completed אך court/date/summary ריקים).

תיקון (G1 — אבחנת-מקור):
- extract_and_apply מבדיל תוצאה-ריקה: יש full_text → 'extraction_failed' (חולף,
  בר-retry); אין full_text → 'no_metadata' (אין מה לחלץ).
- process_pending_extractions (metadata): 'extraction_failed' → חוזר ל-'pending'
  (משמר את חותם-התור) במקום להתיישב 'completed'. retry-loop הקיים מנסה שוב,
  ואחרי-מיצוי הרשומה נשארת בתור. מסלול reextract_metadata כבר עקבי (חוזר pending
  על כל מה שאינו completed/no_changes).

תיקון-נתון (בוצע ידנית דרך כלי-MCP precedent_extract_metadata): da2d9ccb +
5fabdac5 חולצו-מחדש בהצלחה (court/date/summary/headnote/tags מלאים). 0 נותרו
external 'completed-but-empty'.

הערה: מפתח-Gemini אינו נדרש ב-Coolify — המחלץ רץ רק מקומית (precedent_library →
extract_and_apply, host ~/.env עם GOOGLE_GEMINI_API_KEY); app.py מייבא רק את
הקבוע PLACEHOLDER_PENDING_EXTRACTION, לא את פונקציית-החילוץ.

בדיקות: test_metadata_extract_failure_status (transient/permanent/missing). כל
335 בדיקות mcp עוברות. guards נקיים.

Invariants: G1 (אבחנת-מקור, לא התיישבות-בקריאה), INV-G3/X16 (עמידות — בר-retry),
G12 (leak-guard נקי).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
chaim merged commit 33b07eebcf into main 2026-06-15 03:35:47 +00:00
chaim deleted branch worktree-metadata-no-settle-on-fail 2026-06-15 03:35:48 +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#261