perf(citation-view): cache מבוסס-טביעה — 24.6 שנ׳ לטעינה חוזרת → 0.01 שנ׳ #464

Merged
chaim merged 1 commits from worktree-citation-view-cache into main 2026-08-05 13:36:12 +00:00
Owner

הרכבת התצוגה עולה 20+ שניות, והתוצאה משתנה רק כשמשתנים הקלטים.

למה טביעה ולא TTL: יו״ר שמאמת תקדים חייב לראות זאת בטעינה הבאה, לא כשיפוג טיימר. _inputs_fingerprint = שאילתה זולה אחת על טיעונים · שיוכי-פסיקה · גודל-קורפוס. הנכונות אינה תלויה בכך שמישהו יזכור לבטל (G1) — הבדיקה במקור-האמת.

מדידה (8124-09-24):

זמן
טעינה קרה 24.6 שנ׳ cached=false
טעינה חוזרת 0.01 שנ׳ cached=true — פי 2,074
5 מקבילות 0.02 שנ׳ כולן מה-cache
אחרי invalidate 24.8 שנ׳ cached=false

מנעול פר-תיק נגד היצף — שש טעינות מקבילות = הרכבה אחת. זה התרחיש שהפיל את המערכת. תצוגה חלקית נשמרת ל-90 שנ׳ בלבד כדי שההצעות החסרות לא ייתקעו לנצח.

invariants: G1 · §6

6 טסטים חדשים; 537 עוברים; 3 שערים ירוקים.

הרכבת התצוגה עולה 20+ שניות, והתוצאה משתנה רק כשמשתנים הקלטים. **למה טביעה ולא TTL:** יו״ר שמאמת תקדים חייב לראות זאת בטעינה הבאה, לא כשיפוג טיימר. `_inputs_fingerprint` = שאילתה זולה אחת על טיעונים · שיוכי-פסיקה · גודל-קורפוס. **הנכונות אינה תלויה בכך שמישהו יזכור לבטל** (G1) — הבדיקה במקור-האמת. **מדידה (8124-09-24):** | | זמן | | |---|---|---| | טעינה קרה | 24.6 שנ׳ | `cached=false` | | טעינה חוזרת | **0.01 שנ׳** | `cached=true` — פי 2,074 | | 5 מקבילות | 0.02 שנ׳ | כולן מה-cache | | אחרי invalidate | 24.8 שנ׳ | `cached=false` | **מנעול פר-תיק נגד היצף** — שש טעינות מקבילות = הרכבה אחת. זה התרחיש שהפיל את המערכת. תצוגה חלקית נשמרת ל-90 שנ׳ בלבד כדי שההצעות החסרות לא ייתקעו לנצח. **invariants:** G1 · §6 6 טסטים חדשים; 537 עוברים; 3 שערים ירוקים.
chaim added 1 commit 2026-08-05 13:35:58 +00:00
perf(citation-view): cache מבוסס-טביעה — 24.6 שנ' לטעינה חוזרת → 0.01 שנ'
All checks were successful
INV-AG3 Agent Tool Grants / agent-tool-grants (pull_request) Successful in 5s
G12 Leak-Guard / leak-guard (pull_request) Successful in 4s
Lint — undefined names / undefined-names (pull_request) Successful in 12s
6c870ac691
הרכבת תצוגת אימות-הפסיקה עולה 20+ שניות של embeds וחיפושים וקטוריים,
והתוצאה משתנה רק כשמשתנים הקלטים שלה. עד עכשיו כל פתיחת-דף שילמה את
המחיר המלא מחדש, וכל רענון תוך-כדי-טעינה הוסיף הרצה מקבילה — כך העומס
המקורי התגלגל ל-deadlocks ב-Postgres.

למה טביעה ולא TTL: יו"ר שמאמת תקדים חייב לראות זאת בטעינה **הבאה**, לא
כשיפוג טיימר. `_inputs_fingerprint` הוא שאילתה אחת זולה שמסכמת בדיוק את
מה שהתצוגה נגזרת ממנו — טיעונים · שיוכי-פסיקה · גודל-הקורפוס. השתנה
משהו → הטביעה זזה → נבנה מחדש. **הנכונות אינה תלויה בכך שמישהו יזכור
לבטל** (G1): הבדיקה יושבת במקור-האמת ולא בזיכרון של כל כותב. `invalidate()`
קיים לנוחות, לא לתקינות.

מה שונה
- cache פר-תיק, מפתח = טביעת-הקלטים. תצוגה שלמה אינה פגה בטיימר.
- **מנעול פר-תיק נגד היצף** — שש טעינות מקבילות מריצות הרכבה אחת. זה
  בדיוק התרחיש שהפיל את המערכת.
- תצוגה **חלקית** (תקציב-האחזור נגמר) נשמרת ל-90 שנ' בלבד: מספיק כדי
  לעצור סופת-רענונים, לא מספיק כדי שההצעות החסרות ייתקעו לנצח.
- `cached: true/false` בתשובה, ו-`use_cache=False` למי שצריך רענון כפוי.

מדידה מול הקורפוס החי (8124-09-24):
    טעינה קרה ........ 24.6 שנ'   cached=false
    טעינה חוזרת ...... 0.01 שנ'   cached=true      ← פי 2,074
    5 מקבילות ........ 0.02 שנ'   כולן מה-cache
    אחרי invalidate .. 24.8 שנ'   cached=false

invariants: G1 (השער במקור-האמת, לא בכל כותב) · §6 (חלקי מסומן ופג,
לא נשמר כשלם)

טסטים: 6 חדשים (tests/test_citation_view_cache.py) — כולל היצף-מקבילי,
פקיעת תצוגה חלקית, וביטול-אוטומטי בלי קריאה מפורשת ל-invalidate.
537 עוברים.
chaim merged commit 1f2ff4f1ec into main 2026-08-05 13:36:12 +00:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: ezer-mishpati/legal-ai#464