Files
legal-ai/docs/spec/X15-agent-platform-port.md
Chaim 2b6e95c484 docs(spec): register G12 (Platform Port) in constitution + PR template + CLAUDE (R0b, #109)
- 00-constitution.md §5א: INV-G12 (שער-הפלטפורמה) — Paperclip מאחורי Port יחיד;
  מקורות Cockburn Ports&Adapters + Martin Dependency Rule + Evans ACL, verified.
  עדכון תיאור-הבמה ל-"G1–G10, G12 הנדסיים"; אינדקס §7 השלים X14/X15/X16 + G1–G12.
- PULL_REQUEST_TEMPLATE.md: שורת-צ'קליסט G12 + דוגמה בהצהרת-invariants.
- CLAUDE.md: מצביע ל-X15 ב-§Paperclip ו-§פרוטוקול-כתיבת-קוד; G1–G12.
- X15 §2: סומן ש-R0b הושלם (G12 רשום בחוקה).

תיעוד בלבד. Invariants: G12 (מוגדר/נרשם), G2 (מיישם).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 09:13:48 +00:00

12 KiB
Raw Blame History

X15 — שער-הפלטפורמה (Agent Platform Port)

כפוף ל-00-constitution.md. מיישם ומחזק את INV-G2 (מקור-אמת יחיד — אין מסלולים מקבילים) ברובד הקַשירה (coupling) בין שכבת-האינטליגנציה לפלטפורמת-הסוכנים.

0. למה המסמך הזה קיים

פלטפורמת-הסוכנים שלנו היום היא Paperclip. היא אינה ליבת-המערכת — היא המעטפת (לוח-issues, סוכנים מתמידים, human-in-the-loop דרך comments, wakeup/heartbeat, תזמון, תקציבים per-agent, adapters). ליבת-האינטליגנציה — mcp-server/src, ה-skills של ההחלטה/הסגנון, ולוגיקת-ההחלטה — היא הנכס שאינו תלוי-פלטפורמה.

כשל-השורש שהמסמך מייבש: מגע עם Paperclip שדולף לתוך שכבת-האינטליגנציה הופך את המעטפת מ"רכיב ניתן-להחלפה מאחורי חוזה" ל"תלות-רוחב ארוגה בכל הקוד". ככל שהדליפה גדלה, "החלפת המעטפת" (או אפילו שדרוג גרסה — ראו ההצמדה ל-opus-4-8) הופכת מהחלפת-רכיב לכתיבה-מחדש. זוהי הופעה נוספת של כשל-השורש שכל הספ בא לייבש: מסלולים מקבילים שמתפצלים (drift), הפעם בציר התלות בין שכבות.

הבסיס התאורטי: Ports & Adapters / Hexagonal Architecture (Alistair Cockburn), The Dependency Rule / Clean Architecture (Robert C. Martin), Anti-Corruption Layer (Eric Evans, DDD). כולם אומרים את אותו הדבר: התלות זורמת פנימה בלבד; הליבה אינה יודעת על העולם החיצון; כל מגע עם מערכת-חוץ עובר דרך שכבת-תרגום אחת (port/adapter).


1. השכבות והתפר

┌────────────────────────────────────────────────────────────────────┐
│  INTELLIGENCE  (תלוי-פלטפורמה = אסור)                                │
│  mcp-server/src · skills/decision · skills/style · decision logic    │
│  · style-acquisition                                                 │
│  ── חייב להכיל אפס סמלים ספציפיים-Paperclip ──                       │
└───────────────────────────────┬────────────────────────────────────┘
                                 │   ה-PORT (שכבת-התרגום היחידה)
                                 │   • web/agent_platform_port.py  (Python)
                                 │   • .claude/agents/HEARTBEAT.md (פרומפטים)
┌───────────────────────────────┴────────────────────────────────────┐
│  SHELL  (Paperclip-specific — מותר ומוצהר)                           │
│  web/paperclip_client.py · web/paperclip_api.py · plugin-legal-ai    │
│  · adapters/* · web-ui settings/paperclip-tab · skills/new-company   │
└───────────────────────────────┬────────────────────────────────────┘
                                 │
                           ┌─────┴─────┐
                           │ Paperclip │  ← הפלטפורמה. ניתנת-להחלפה.
                           └───────────┘

הגדרת-ה-Port: קבוצת-הקבצים היחידה שמורשית לדבר Paperclip:

Port surface תפקיד מורשה לייבא/להזכיר Paperclip
web/agent_platform_port.py (לבנייה — R2) תרגום אירועי-דומיין → קריאות-פלטפורמה כן — המודול היחיד שמייבא paperclip_client/paperclip_api
web/paperclip_client.py, web/paperclip_api.py מימוש-הלקוח (מאחורי ה-Port) כן (זו המעטפת המתוכננת)
.claude/agents/HEARTBEAT.md מקור-אמת יחיד לפרוטוקול-הריצה של הסוכנים כן
plugin-legal-ai/*, adapters/* הגשר מצד-Paperclip כן
web-ui settings/paperclip-tab, agents-tab UI לניהול-Paperclip עצמו כן (מוצהר)
skills/new-company-setup/SKILL.md blueprint-הקמה (חייב לדבר Paperclip) כן — חריג מוצהר

כל קובץ אחר — בפרט תחת mcp-server/src, skills/decision, skills/style, ופרומפטי-הסוכנים פרט ל-HEARTBEAT — אסור שיכיל סמל ספציפי-Paperclip.


2. ה-invariant

INV-PORT1 (גלובלי: G12) — שער-הפלטפורמה

כלל: פלטפורמת-הסוכנים (Paperclip) נגישה אך-ורק דרך ה-Platform Port (web/agent_platform_port.py + HEARTBEAT.md לפרומפטים). שכבת-האינטליגנציה — mcp-server/src, וה-skills של ההחלטה/הסגנון — מכילה אפס סמלים ספציפיים-לפלטפורמה (שמות-מוצר, wakeup/heartbeat, pc.sh/pc_request, X-Paperclip-Run-Id, enums של הפלטפורמה). פרומפטי-הסוכנים אינם משכפלים את פרוטוקול-הריצה — הם מצביעים ל-HEARTBEAT.md בלבד. כל מגע חדש עם הפלטפורמה עובר דרך ה-Port. מקורות: Alistair Cockburn, Hexagonal Architecture (Ports & Adapters) · Robert C. Martin, Clean Architecture (The Dependency Rule) · Eric Evans, Domain-Driven Design (Anti-Corruption Layer) | סטטוס: verified אכיפה: (א) ביקורת-ארכיטקטורה + רשימת-ה-Port (§1); (ב) leak-guard אוטומטי — הרחבת scripts/spec-guard.sh שמשווה מול baseline-הדליפה (§4) ומזהיר על דליפה חדשה ב-Edit/Write; (ג) fitness-test ב-CI שנכשל על מונח-Paperclip קשיח חדש תחת mcp-server/src; (ד) הצהרת-G12 בתבנית-ה-PR. הפרה ידועה: ראו מצאי-הדליפה ב-§3 — web/app.py קורא ל-pc_* inline בלוגיקת מחזור-חיים של תיקים; 10 פרומפטי-סוכנים משכפלים את פרוטוקול-הריצה במקום להצביע ל-HEARTBEAT.

סיווג: invariant הנדסי (≥3 מקורות חיצוניים, verified). מורחב מ-G1G10 בתור G12, ורשום ברשימת-הגלובליים ובאינדקס של 00-constitution.md §5א (R0b הושלם).


3. מצאי-הדליפה (baseline — נמדד 2026-06-09)

מבחן-נטישה: כמה השכבות חוצות את התפר. הספירה היא בסיס-ההשוואה ל-leak-guard.

Layer Paperclip hits סיווג מחיר-ניתוק
mcp-server/src (כלים) 5 — הערות בלבד נקי (זה הנכס) ~0
skills/ (decision/style) 36 — רק new-company-setup נקי (חריג מוצהר) נמוך
web/paperclip_client.py 116 מעטפת מתוכננת
web/paperclip_api.py 33 מעטפת מתוכננת
web/app.py ~33 קריאות pc_* + PAPERCLIP_COMPANIES×72 ⚠️ דליפה מבנית (מחזור-חיים) בינוני
.claude/agents/*.md 288 — פרוטוקול משוכפל ב-10 פרומפטים ⚠️⚠️ דליפה מכנית גבוה (בנפח)
web-ui (types.ts×41, cases.ts, sse.ts, ...) ~60 ⚠️ מושגי-פלטפורמה בחוזי-פרונט בינוני

הממצא המרכזי: שכבת-האינטליגנציה (mcp-server/src + skills של ההחלטה/הסגנון) כבר נקייה כמעט-לחלוטין — 5 ההיטים ב-mcp-server הם הערות בלבד (מקור company_id). מחיר-הגירושין בינוני, מרוכז בשלוש שכבות-נושקות-למעטפת.


4. מפת-התיקון (R-tasks)

R תחום תיאור סיכון
R0 ספ המסמך הזה — מגדיר את ה-Port, ה-invariant, ו-baseline-הדליפה 0
R0b ספ רישום G12 ב-00-constitution.md (רשימת-גלובליים + אינדקס) + שורת G12 בתבנית-ה-PR + מצביע ב-CLAUDE.md 0
R1 פרומפטים כל פרוטוקול-הריצה עובר ל-HEARTBEAT.md (מקור יחיד); 10 הפרומפטים מצביעים אליו בלבד. 288→~20 היטים נמוך
R2 web יצירת web/agent_platform_port.py — המודול היחיד שמייבא paperclip_client/paperclip_api. app.py פולט אירוע-דומיין (case_archived/created/...) שה-Port מתרגם. PAPERCLIP_COMPANIEScompany_map מאחורי ה-Port בינוני
R3 web-ui types.ts → namespace paperclip.* נפרד; חוזי case/api כלליים נשארים נקיים. טאבי-ניהול-Paperclip נשארים (מעטפת מוצהרת) נמוך-בינוני
R4 אכיפה הרחבת spec-guard.sh ל-leak-guard מול ה-baseline + fitness-test ב-CI על mcp-server/src 0

עיקרון-מנחה (G2): R1+R2 הם G2 בלבוש חדש — מאחדים פרוטוקול/מסלול משוכפל למקור אחד. הם אינם יוצרים מסלול מקביל; הם מסירים אחד.


5. מנגנון נגד דליפה-עתידית

תיקון חד-פעמי חסר-ערך אם הדליפה תחזור בפיצ'ר הבא. שלוש שכבות-אכיפה, כולן מתחברות למנגנונים קיימים (ולא ממציאות מסלול חדש):

  1. invariant (G12) — מוגדר כאן, נרשם בחוקה (R0b). first-class, לא הערת-שוליים.
  2. אכיפה-אוטומטיתspec-guard.sh כבר מיירט כל Edit/Write בנתיב-קוד; ה-leak-guard (R4) משווה מול baseline §3 ומזהיר על דליפה חדשה בזמן-אמת, לפני ה-review.
  3. חוזה-תיעוד — תבנית-ה-PR כבר דורשת הצהרת-invariants; נוסיף שורת-G12 לצ'קליסט ("□ לא הוספתי מגע-Paperclip מחוץ ל-Platform Port"). CLAUDE.md §Paperclip + §פרוטוקול כתיבת-קוד מצביעים לכאן.

כלל-זהב לכל פיתוח עתידי: פיצ'ר חדש שנוגע בפלטפורמה — מוסיף/משנה רק קוד תחת רשימת-ה-Port (§1). אם נדרש מגע-פלטפורמה משכבת-האינטליגנציה — זו אינדיקציה לתכנון שגוי: הוסיפו במקום זאת אירוע-דומיין שה-Port יתרגם.


6. ראו גם