V2-CH2-003 — קישור ראיות (Evidence Linkage)
כרך 2 · פרק 2 · משימה 003 · AnalysisOutput.candidate_id כמקור אמת, ייחודיות, Idempotency
v1.0 Approved · 11.8.2026
מטרת המסמך
הגדרה פורמלית של קישור הראיות בין AnalysisOutput ל-Candidate: מקור האמת (candidate_id ב-AnalysisOutput), ייחודיות על (candidate_id, agent_id), Idempotency של כתיבה חוזרת, והכלל "אין דריסה לאחר Quorum". סגירת קריטריון C3 מ-V2-CH2-001.
גבול כרך 1: AnalysisOutput.candidate_id כבר נוסף ב-V2-CH2-001 (Shadow). מסמך זה מתעד את החוזה — אינו מוסיף שדות.
כללי קישור ראיות
| מזהה | חומרה | כלל |
|---|---|---|
| L1 | P0 | AnalysisOutput.candidate_id הוא מקור האמת לקישור פלט-ל-Candidate. אין לסמוך על מערך candidate.analysis_outputs[] אלא לקריאה בלבד. |
| L2 | P0 | ייחודיות על (candidate_id, agent_id): פלט תקף אחד בלבד לכל סוכן לכל Candidate. ניסיון ליצור פלט שני לאותו סוכן — No-Op (מחזיר את הקיים). |
| L3 | P0 | כתיבה חוזרת Idempotent: אם סוכן מגיש פלט עם אותו (candidate_id, agent_id) והפלט הקיים status=VALID — הקריאה היא No-Op. אין "האחרון דורס". |
| L4 | P1 | לאחר השגת Quorum — פלטים חדשים מתקבלים אך אינם משנים את ה-Decision שכבר נוצר (או עומד להיווצר). הם נשמרים עם status=STALE. |
| L5 | P0 | candidate.analysis_outputs[] הוא נגזרת לקריאה בלבד — מחושב מ-AnalysisOutput.candidate_id. אין לכתוב אליו ישירות. |
| L6 | P1 | Candidate.decision_id (מתמלא בקידום) מקשר ל-Decision שנוצר. Decision.candidate_id (אופציונלי, V2-CH2-001) מקשר בחזרה. קישור דו-כיווני. |
דיאגרמת קישור
Candidate← decision_id →Decision
↕ candidate_id
AnalysisOutput[1..N]
ייחודיות: (candidate_id, agent_id) · Idempotent · אין דריסה לאחר Quorum
קריטריוני קבלה
| מזהה | קריטריון | תוצאה |
|---|---|---|
| L1 | AnalysisOutput.candidate_id קיים כשדה אופציונלי — מקור האמת לקישור. | PASS |
| L2 | ייחודיות על (candidate_id, agent_id) מאומתת — פלט תקף אחד לכל סוכן. | PASS |
| L3 | כתיבה חוזרת Idempotent — אין דריסה. קריאה חוזרת עם אותו (candidate_id, agent_id) היא No-Op. | PASS |
| L4 | לאחר Quorum — פלטים חדשים נשמרים כ-STALE ואינם משנים Decision. | PASS |
| L5 | candidate.analysis_outputs[] נגזר בלבד — אין כתיבה ישירה. | PASS |
| L6 | קישור דו-כיווני: Candidate.decision_id ↔ Decision.candidate_id. | PASS |
| L7 | פלט ללא candidate_id (סוכן שרץ מחוץ צינור Candidate) — תקין ב-shadow, אינו נדחה. | PASS |
מפרט · v1.0 Approved · 11.8.2026 · נעול
חזרה ל-V2-CH2-002