feat(guard): כלל-קשירה ל-INV-AG3 — השער דיווח תקין על allow-list שאיש אינו אוכף #429

Merged
chaim merged 1 commits from worktree-binding-check into main 2026-08-05 08:56:59 +00:00
Owner

הבעיה

כללים 1–4 משווים קבצים לקבצים, וזה לא אומר דבר על אכיפה. רשימת tools: הופכת ל-allow-list רק כשה-runtime בוחר את הסוכן (--agent <name>); בלעדיו אותו קובץ בדיוק נמסר כ---append-system-prompt-file — פרוזה שהמודל רשאי לקיים או להתעלם ממנה — וכל 108 הכלים נשארים נגישים.

התגלה 2026-08-05 בפאנל-מומחים: legal-ceo נושא 41 הענקות בלי --agent. זו הרשימה הגדולה במערכת, והשער דיווח עליה OK — כי הוא מעולם לא הסתכל על הקשירה.

שער שמדווח "תקין" על רשימה בלתי-נאכפת גרוע מהיעדר שער: הוא מייצר ביטחון-שווא. אני בניתי את השער אתמול והצגתי אותו כסוגר את הפער — זה תיקון של אותה הצהרה.

כלל 5 — host-only, --check-bindings

מוודא ש-extraArgs מכיל ["--agent", <name>] התואם ל-instructionsEntryFile, בשתי החברות.

למה opt-in ולמה psql בתת-תהליך: הקשירה יושבת ב-DB של הפלטפורמה, שה-CI לא רואה. הוספת תלות-דרייבר הייתה שוברת את תכונת ה-stdlib-בלבד שמסלול ה-CI נשען עליה. DB בלתי-נגיש מחזיר []"לא נבדק", לא "אין הפרות" — וההבחנה מודפסת.

מדווח רק על סוכנים שבאמת מצהירים הענקות; סוכן בלי tools: אינו ממצא.

והשער הפסיק לרמוז על אכיפה

במסלול ה-CI הוא מדפיס עכשיו במפורש מה לא נבדק, במקום OK חשוף שמזמין את הקורא להסיק שהרשימות נאכפות.

אימות

מסלול CI:         OK (7 agents, 66 grants, 108 tools) + note על מה שלא נבדק
--check-bindings: 1 violation — legal-ceo, "extraArgs is empty"

השער מציע את שתי החלופות (להוסיף --agent, או למחוק tools: ולתעד כבלתי-מוגבל) ובמפורש לא שתיהן — כי זו הפרת G2. ההכרעה עצמה נדחית עד שיהיו נתונים על שימוש בפועל (אחרי #231.5).

ניקוי

נמחק .claude/agents/.generated/legal-ceo.nofm.md — עותק מ-13.6 מול קנוני מ-4.8, 7 שבועות דריפט. אומת לפני המחיקה: gitignored, מעולם לא תויק, ואף סוכן ב-DB לא מצביע עליו.

Invariants

  • INV-AG3 — מרחיב מבדיקת-קבצים לאימות זמן-ריצה.
  • G2 — מקיים: אין מפת-הרשאות שנייה, רק אימות שהמפה הקיימת נאכפת.
## הבעיה כללים 1–4 משווים **קבצים לקבצים**, וזה לא אומר דבר על **אכיפה**. רשימת `tools:` הופכת ל-allow-list רק כשה-runtime בוחר את הסוכן (`--agent <name>`); בלעדיו אותו קובץ בדיוק נמסר כ-`--append-system-prompt-file` — פרוזה שהמודל רשאי לקיים או להתעלם ממנה — וכל 108 הכלים נשארים נגישים. **התגלה 2026-08-05 בפאנל-מומחים:** `legal-ceo` נושא **41 הענקות בלי `--agent`**. זו הרשימה הגדולה במערכת, **והשער דיווח עליה `OK`** — כי הוא מעולם לא הסתכל על הקשירה. שער שמדווח "תקין" על רשימה בלתי-נאכפת **גרוע מהיעדר שער**: הוא מייצר ביטחון-שווא. אני בניתי את השער אתמול והצגתי אותו כסוגר את הפער — זה תיקון של אותה הצהרה. ## כלל 5 — host-only, `--check-bindings` מוודא ש-`extraArgs` מכיל `["--agent", <name>]` התואם ל-`instructionsEntryFile`, בשתי החברות. **למה opt-in ולמה psql בתת-תהליך:** הקשירה יושבת ב-DB של הפלטפורמה, שה-CI לא רואה. הוספת תלות-דרייבר הייתה שוברת את תכונת ה-**stdlib-בלבד** שמסלול ה-CI נשען עליה. DB בלתי-נגיש מחזיר `[]` — **"לא נבדק", לא "אין הפרות"** — וההבחנה מודפסת. מדווח רק על סוכנים שבאמת מצהירים הענקות; סוכן בלי `tools:` אינו ממצא. ## והשער הפסיק לרמוז על אכיפה במסלול ה-CI הוא מדפיס עכשיו במפורש מה **לא** נבדק, במקום `OK` חשוף שמזמין את הקורא להסיק שהרשימות נאכפות. ## אימות ``` מסלול CI: OK (7 agents, 66 grants, 108 tools) + note על מה שלא נבדק --check-bindings: 1 violation — legal-ceo, "extraArgs is empty" ``` השער מציע את שתי החלופות (להוסיף `--agent`, או למחוק `tools:` ולתעד כבלתי-מוגבל) ו**במפורש לא שתיהן** — כי זו הפרת G2. ההכרעה עצמה נדחית עד שיהיו נתונים על שימוש בפועל (אחרי #231.5). ## ניקוי נמחק `.claude/agents/.generated/legal-ceo.nofm.md` — עותק מ-13.6 מול קנוני מ-4.8, **7 שבועות דריפט**. אומת לפני המחיקה: gitignored, מעולם לא תויק, ואף סוכן ב-DB לא מצביע עליו. ## Invariants - **INV-AG3** — מרחיב מבדיקת-קבצים לאימות זמן-ריצה. - **G2** — מקיים: אין מפת-הרשאות שנייה, רק אימות שהמפה הקיימת נאכפת.
chaim added 1 commit 2026-08-05 08:56:18 +00:00
feat(guard): כלל-קשירה ל-INV-AG3 — השער דיווח "תקין" על allow-list שאיש אינו אוכף
All checks were successful
Lint — undefined names / undefined-names (pull_request) Successful in 12s
INV-AG3 Agent Tool Grants / agent-tool-grants (pull_request) Successful in 5s
G12 Leak-Guard / leak-guard (pull_request) Successful in 4s
5f5b13c6a4
כללים 1–4 משווים קבצים לקבצים, וזה לא אומר דבר על **אכיפה**. רשימת
tools: הופכת ל-allow-list רק כשה-runtime בוחר את הסוכן (--agent <name>);
בלעדיו אותו קובץ בדיוק נמסר כ---append-system-prompt-file — פרוזה שהמודל
רשאי לקיים או להתעלם ממנה — וכל 108 הכלים נשארים נגישים.

התגלה 2026-08-05: סוכן אחד נושא 41 הענקות **בלי** --agent. זו הרשימה
הגדולה במערכת, והשער דיווח עליה OK — כי הוא מעולם לא הסתכל על הקשירה.
שער שמדווח "תקין" על רשימה בלתי-נאכפת גרוע מהיעדר שער: הוא מייצר
ביטחון-שווא.

כלל 5 (host-only, --check-bindings): מוודא ש-extraArgs מכיל
["--agent", <name>] התואם ל-instructionsEntryFile. הקשירה יושבת ב-DB של
הפלטפורמה, שה-CI לא רואה, ולכן הבדיקה היא opt-in ומריצה psql בתת-תהליך
במקום להוסיף תלות-דרייבר שהייתה שוברת את תכונת ה-stdlib-בלבד שמסלול
ה-CI נשען עליה. DB בלתי-נגיש מחזיר [] — "לא נבדק", לא "אין הפרות".

ובמסלול ה-CI, השער אומר עכשיו במפורש מה **לא** נבדק, במקום להדפיס OK
חשוף שמזמין את הקורא להסיק שהרשימות נאכפות.

מדווח רק על סוכנים שבאמת מצהירים הענקות — סוכן בלי tools: אינו ממצא.

אומת: מסלול-CI ירוק; --check-bindings תופס את legal-ceo עם הנימוק
"extraArgs is empty" ומציע את שתי החלופות (להוסיף --agent, או למחוק
tools: ולתעד כבלתי-מוגבל) — במפורש לא שתיהן, כי זו הפרת G2.

invariants: INV-AG3 — מרחיב מקובץ לזמן-ריצה. G2 — מקיים; אין מפת-הרשאות
שנייה, רק אימות שהמפה הקיימת נאכפת.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
chaim merged commit d8bb2c7c0c into main 2026-08-05 08:56:59 +00:00
chaim deleted branch worktree-binding-check 2026-08-05 08:56:59 +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#429