Files
legal-ai/docs/spec/X17-information-architecture.md
Chaim 6e69c1dc38
All checks were successful
G12 Leak-Guard / leak-guard (pull_request) Successful in 9s
feat(ia): IA גל-2 — איחוד-משטחים: ערוץ-למידה אחד · /operations⊇/diagnostics · MET-2/3 (#131, X17)
גל-2 מבקלוג #127 — איחוד-משטחים לפי משטח-היעד של X17. מקיים INV-IA1/IA3/IA4 +
דלתות-הספ (X6 INV-UI7/8, 07-learning §0.4, 00-constitution G2). שומר G10/INV-LRN1
(לא הוסר שום שער-אנושי — רק שער/דגל כפול).

א) תיבת-אישור אחת (INV-IA1): כרטיסי "אישור הלכות"+"פסיקה חסרה" ב-/operations
   מצביעים ל-/approvals (לתיבת-האישורים ←) — /operations מנטר, /approvals מחליט.

ב) ערוץ-למידה אחד (INV-IA3): הוסר applied_to_skill end-to-end —
   - UI: כפתור "סמן כ'אומץ'" + badge "אומץ" ב-lessons-tab; badge ב-curator-portrait.
   - API: LessonPatch, _lesson_to_json, patch call, curator recent_findings (→review_status).
   - db.py: list/add/update_decision_lesson לא בוחרים/כותבים applied_to_skill;
     הפרמטר הוסר. העמודה+אינדקס נשמרים (back-compat, ללא migration), מסומנים DEPRECATED.
   - types: DecisionLesson/LessonPatch/CuratorFinding.
   review_status='approved' = הסטטוס היחיד "זורם-לכותב" (INV-LRN1, #126).

ג) MET-2/3 lost-update (INV-IA3): _append_methodology_override רץ עכשיו בטרנזקציה
   אחת עם SELECT ... FOR UPDATE — אין read-modify-write מתפצל מול עורך-המתודולוגיה
   או promote מקביל. /methodology = העורך-הקנוני; promote מבטל את ה-cache (גל-1 MET-1).

ד) /operations⊇/diagnostics (INV-IA4): גוף /diagnostics חולץ ל-<SystemHealthSection/>
   ומורנדר ב-/operations תחת "בריאות-מערכת". /diagnostics → redirect ל-/operations.
   /diagnostics הוסר מהניווט. משטח-ניטור יחיד.

ה) דלתות-ספ (≥3 מקורות ב-X17, אושר ע"י חיים /goal):
   - X6: INV-UI7 (aggregate=SSoT, mutation מבטל queryKey) + INV-UI8 (render-or-remove, חלקיות).
   - 07-learning §0.4: שער-אחד + טרנזקציה-אחת + applied_to_skill מוסר.
   - 00-constitution G2: תאום-המתודולוגיה כהפרה-ידועה-ממותנת.
   - X17 דלתות-ספ סומנו  קודדו.

בדיקות: py_compile app.py + db.py ✓ · tsc --noEmit ✓ · eslint ✓ (לבד מ-learning-panel:109
קיים-מראש). next build נכשל ב-worktree רק בגלל symlink (Turbopack) — Docker/CI תקין.
api:types יתרענן בדפלוי (curator/lessons אינם response-modeled; הטיפוסים יד-כתובים עודכנו).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-11 21:04:57 +00:00

9.8 KiB
Raw Blame History

X17 — ארכיטקטורת-המידע ומשטח-ההפעלה (Information Architecture)

מה זה. ספ-היעד לאיך משטח-ההפעלה (דפים/טאבים/תורים/ניווט/cache) צריך להיות מאורגן — שכבה מעל X6 (חוזה UI↔API). X6 קובע שטיפוס נכון (OpenAPI=SSoT, provenance); X17 קובע שמשטח נכון (מקור-אמת יחיד לכל datum, שער אחד לכל החלטה, ניווט מבוסס-משימה).

למה. חיים (2026-06-11): "המערכת מסובכת מדי לתפעול." האבחון (../ia-audit-redesign.md, #127) אימת 37 ממצאים שכולם ביטוי-UI של G2 מופר שלא הורחב לשכבת-ה-UI. X17 מרים את G2 (מקור-אמת יחיד) ו-G10 (שערים-אנושיים) לשכבת-המשטח, ומקודד את feedback_operational_simplicity (שער/מקום/ערוץ אחד) כ-invariants אכיפים.

גבול קשיח (G10): X17 מסיר משטחים/ערוצים כפולים, לעולם לא שער. כל שער-אנושי (אישור-הלכה, פתרון-הערה, אישור-לקח, בחירת-תוצאה) נשאר חובה ומפורש. "שער אחד" = מקום-אחד-להחליט, לא אפס-החלטה.


INV-IA1 — בעלים-משטח-יחיד לכל datum/מונה (G2 בשכבת-UI)

ל-aggregate/מונה נגזר-שרת יש משטח-בעלים יחיד שמריץ את השאילתה; משטחים אחרים מצביעים אליו (deep-link/pointer), ולעולם לא מריצים מונה-מתחרה client-side. (אכיפה: מונה-הגייטים חי רק ב-/approvals+['chair','pending']; /operations מצביע. תופס APR-2/3, ADM-2/3.)

INV-IA2 — mutation מבטל כל קורא (no stale cross-surface state)

כל mutation שמשנה ערך הנקרא במשטח אחר חייב לבטל כל queryKey שקורא אותו — כולל aggregators חוצי-namespace. אסור שמשטח יציג ערך תקוע אחרי שינוי במשטח אחר. (תופס את 16 פערי-הסנכרון: CAS-1/2, APR-1/4/5/6, LRN-6/8/10, MET-1/8, ADM-2/3/5.)

INV-IA3 — שער-אחד / ערוץ-אחד לכל החלטה (G10/INV-LRN1 נשמרים)

לכל החלטה-אנושית משטח-יחיד ומסלול-כתיבה-יחיד. אסור משטח-אישור שני או כותב-מקביל לאותה שורה. הלמידה מנותבת דרך העורך הקנוני, לא כותבת-במקביל. (תופס LRN-1/2/3, MET-2/3 — "שני השערים" של חיים, ומירוץ ה-lost-update.)

INV-IA4 — ניווט מבוסס-משימה, לא מבוסס-פורמט

משטחים מאורגנים לפי מה המשתמש עושה (לאשר / לנטר / להגדיר / לחבר), לא לפי מקור-הנתונים הטכני (pm2 מול DB מול תורים). דלת-כניסה אחת לכל משימה. (אכיפה: /operations/diagnostics — אותו intent-ניטור; הורדת /feedback מהראשי. תופס D5, ADM.)

INV-IA5 — סטטוס-אמיתי מגובה-צרכן

כל מספר מוצג ממופה לצרכן אמיתי ומקור שלם. אסור KPI שסופר דגל-ללא-צרכן; אסור aggregate מדויק כש-partial-failure השמיט תורם (להציג חלקיות); שדה ב-response — לרנדר או להסיר. (תופס LRN-1/4/5, ADM-1/6, APR-3.)

INV-IA6 — שפת-מפעיל מובנת-מאליה (no jargon; precedence in-context)

קופי פונה-למפעיל מתאר את האפקט המשמעותי, לא מזהי-משימות פנימיים (T7/T15). התנהגות-תחולה/קדימות (universal מוקדם; checklist→appeal_type) מוצגת בהקשר דרך progressive disclosure, לא במסמך נפרד. (תופס MET-4/5/6/7.)


משטח-היעד (Target IA)

שלושה משטחי-intent ברמת-העל

משטח intent בעלים כלל
/approvals לאשר (החלטה-אנושית) תיבת-הגייטים הקנונית המקום היחיד שפועלים על שער. כרטיס לכל סוג (הלכות/פסיקה-חסרה/הערות/QA) עם מונה+קישור.
/operations לנטר (קריאה-בלבד) משטח-המכונה בולע את /diagnostics. שירותים+תורים+סוכנים+בריאות+halacha_backlog. אפס שער נפעל כאן; מצביע ל-/approvals.
/settings להגדיר משטח-התצורה Paperclip/סוכנים/env/כלים/בלוקים. עריכת-env משלימה-את-עצמה (staleness+redeploy באותה שורה).

משטחי-תחום (בעלים-יחיד לכל ישות)

תחום יעד
תיק workspace-החלטה אחד — block-editing + DOCX-פעיל, מחוון-מקור-אמת אחד בבעלות-המערכת, cache-slice משותף. אזור "השלמה והעברה" אחד לשערי-הסיום.
למידה תיבת-אישור אחת (לפי זוג draft↔final) · ערוץ-כותב אחד + סטטוס "זורם-לכותב" אחד (review_status='approved') · applied_to_skill מוסר · כל artifact תלוי-בזוג (progressive disclosure).
מתודולוגיה /methodology = העורך הקנוני היחיד (PUT אחד; תג-מקור "ידני/מאומץ-מלמידה"); הלמידה מנותבת-דרכו ומבטלת שני-caches; explainer-תחולה inline.
פסיקה 3 קורפוסים נפרדים (גבול אמיתי, G2/INV-DIG1) אך מתפעלים אחיד — שם-חיפוש עקבי, תבנית-"ממתין" אחת, authority בכל-מקום.

דלתות-ספ (deltas — קודדו בגל-2 #131)

כל שינוי-ספ דורש ≥3 מקורות (לעיל) + אישור-יו"ר. אושר ע"י חיים (2026-06-11, /goal "בצע את כל הגלים").

  1. X6: נוספו INV-UI7 (aggregate-נגזר=SSoT; mutation מבטל queryKey; אין מונה-מתחרה — מקדד INV-IA1/IA2) · INV-UI8 (שדה-response מרונדר-או-מוסר; חלקיות מוצגת — INV-IA5).
  2. 07-learning §0.4: שער-אישור אחד (review_status='approved'), טרנזקציית-כותב אחת (FOR UPDATE), applied_to_skill הוסר (מקדד INV-IA3; מיישב את "שני-השערים" של feedback_operational_simplicity).
  3. 00-constitution §G2 "הפרות ידועות": נוסף תאום-המתודולוגיה (discussion_rules['universal'] נכתב ע"י PUT וגם promote — MET-2/3) + המיתון (append אטומי FOR UPDATE + invalidation).

הפניות-אחיות

  • ../ia-audit-redesign.md — מצב-קיים: 34 משטחים, 37 ממצאים (file:line), כיוון-יעד פר-אשכול.
  • X6-ui-api-contract.md (UI1UI6 — X17 מעליו) · ui-audit.md (ממצאי-קוד פר-רכיב — שכבה מתחת).
  • 00-constitution.mdG2 (מקור-אמת יחיד) · G10 (שערים-אנושיים) — X17 מרים אותם לשכבת-המשטח.