From 47127f1e858644bd5aa3b4c4a4c8c697f1bfd897 Mon Sep 17 00:00:00 2001 From: Chaim Date: Thu, 30 Apr 2026 17:35:44 +0000 Subject: [PATCH] agents: close-own-issue PATCH for every agent (kill the retry loop) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The retry loop bug we fixed in legal-analyst yesterday existed in every single sub-agent skill. They all post a comment + wake the CEO + exit, leaving their own issue in `in_progress`. Paperclip's "in_progress with no live execution" watchdog then re-wakes them, repeating until something external transitions the issue. Watched it happen on CMPA-17 (researcher) today — 4 iterations + manual SIGTERM + manual PATCH. Same fix applied to all 5 remaining agents: • legal-researcher.md • legal-writer.md • legal-qa.md • legal-exporter.md • legal-proofreader.md (file was incomplete — also added the missing שלב 5: דיווח and wake-CEO sections to bring it to parity with the other agents) Each gets a "סגור את ה-issue של עצמך — חובה!" section with two PATCH templates: one for `done` after a successful run, one for `blocked` if checks fail or output is incomplete. The section sits before the wake-CEO block, with an explicit reference to the CMPA-17 incident so the rule has a concrete anchor. Result: every agent now has the same close-issue contract. No more zombie in_progress issues, no more 4× wakeup loops. Co-Authored-By: Claude Opus 4.7 (1M context) --- .claude/agents/legal-analyst.md | 37 ++++++++++--------- .claude/agents/legal-exporter.md | 34 ++++++++++++++++-- .claude/agents/legal-proofreader.md | 55 ++++++++++++++++++++++++++++- .claude/agents/legal-qa.md | 34 ++++++++++++++++-- .claude/agents/legal-researcher.md | 34 ++++++++++++++++-- .claude/agents/legal-writer.md | 34 ++++++++++++++++-- 6 files changed, 198 insertions(+), 30 deletions(-) diff --git a/.claude/agents/legal-analyst.md b/.claude/agents/legal-analyst.md index 794a265..33f42e2 100644 --- a/.claude/agents/legal-analyst.md +++ b/.claude/agents/legal-analyst.md @@ -243,13 +243,20 @@ FROM documents d WHERE d.case_id = '{case_id}' AND d.doc_type IN ('appeal', 'res ### העֵר את העוזר המשפטי (CEO) — חובה! ```bash +# CEO לפי חברה — אסור לקבע UUID, חברות שונות = CEO שונה +if [ "$PAPERCLIP_COMPANY_ID" = "8639e837-4c9d-47fa-a76b-95788d651896" ]; then + CEO_ID="cdbfa8bc-3d61-41a4-a2e7-677ec7d34562" # CMPA — היטלי השבחה +else + CEO_ID="752cebdd-6748-4a04-aacd-c7ab0294ef33" # CMP — רישוי ובניה +fi + curl -s -X POST -H "Authorization: Bearer $PAPERCLIP_API_KEY" \ -H "Content-Type: application/json" \ - "$PAPERCLIP_API_URL/api/agents/752cebdd-6748-4a04-aacd-c7ab0294ef33/wakeup" \ - -d '{"reason": "מנתח משפטי סיים משימה [issue-id] בסטטוס [done/blocked]"}' + "$PAPERCLIP_API_URL/api/agents/$CEO_ID/wakeup" \ + -d '{"source":"automation","triggerDetail":"system","reason":"מנתח משפטי סיים משימה [issue-id] בסטטוס [done/blocked]","payload":{"issueId":"[issue-id]","mutation":"agent_completion"}}' ``` -אם ה-API לא עובד: **⚠️ אסור להשתמש ב-INSERT INTO agent_wakeup_requests ישירות!** הכנסה ישירה ל-DB יוצרת רק את הבקשה בלי heartbeat_run — והסוכן לא יתעורר לעולם. **תמיד להשתמש ב-API בלבד.** +**⚠️ אסור לקבע UUID של CEO** — UUID שונה לכל חברה. תמיד דרך `$PAPERCLIP_COMPANY_ID`. wakeup לחברה אחרת נדחה: `Agent key cannot access another company`. ## מבנה הפלט המלא — analysis-and-research.md @@ -400,23 +407,19 @@ X שאלות עומדות להכרעה: ``` 6. **העֵר את ה-CEO — חובה!** ```bash + # CEO לפי חברה — אסור לקבע UUID, חברות שונות = CEO שונה + if [ "$PAPERCLIP_COMPANY_ID" = "8639e837-4c9d-47fa-a76b-95788d651896" ]; then + CEO_ID="cdbfa8bc-3d61-41a4-a2e7-677ec7d34562" # CMPA — היטלי השבחה + else + CEO_ID="752cebdd-6748-4a04-aacd-c7ab0294ef33" # CMP — רישוי ובניה + fi + curl -s -X POST -H "Authorization: Bearer $PAPERCLIP_API_KEY" \ -H "Content-Type: application/json" \ - "$PAPERCLIP_API_URL/api/agents/752cebdd-6748-4a04-aacd-c7ab0294ef33/wakeup" \ - -d '{"reason": "מנתח משפטי סיים העמקת ניתוח (pass 2) [issue-id] בסטטוס [done/blocked]"}' - ``` - אם ה-API לא עובד: - ```bash - PGPASSWORD="paperclip" psql -h 127.0.0.1 -p 54329 -U paperclip -d paperclip -c " - INSERT INTO agent_wakeup_requests (company_id, agent_id, source, reason, status, requested_by_actor_type) - VALUES ( - (SELECT company_id FROM agents WHERE id = '\$PAPERCLIP_AGENT_ID'), - '752cebdd-6748-4a04-aacd-c7ab0294ef33', - 'agent_completion', - 'מנתח משפטי סיים העמקת ניתוח (pass 2) — נדרשת בדיקה', - 'queued', 'agent' - );" + "$PAPERCLIP_API_URL/api/agents/$CEO_ID/wakeup" \ + -d '{"source":"automation","triggerDetail":"system","reason":"מנתח משפטי סיים העמקת ניתוח (pass 2) [issue-id] בסטטוס [done/blocked]","payload":{"issueId":"[issue-id]","mutation":"agent_completion"}}' ``` + **⚠️ אם ה-API מחזיר שגיאה — אל תיגע ב-DB.** `INSERT INTO agent_wakeup_requests` לא יוצר `heartbeat_run` והסוכן לא יתעורר לעולם. בדוק `$PAPERCLIP_COMPANY_ID` ו-`$PAPERCLIP_API_KEY`, ודאי שאתה לא קורא ל-CEO של חברה אחרת (`Agent key cannot access another company`). ## כללים קריטיים diff --git a/.claude/agents/legal-exporter.md b/.claude/agents/legal-exporter.md index 23666bb..9f8d3bb 100644 --- a/.claude/agents/legal-exporter.md +++ b/.claude/agents/legal-exporter.md @@ -116,15 +116,43 @@ tools: - ממצאי הבדיקה הסופית (אם היו הערות) - גודל הקובץ +### סגור את ה-issue של עצמך — חובה! + +בלי זה Paperclip יזהה "issue in_progress + אין execution חיה" ויפעיל auto-retry בלולאה (נצפה בפועל ב-CMPA-17 ב-30/04/26 — 4 איטרציות מיותרות עד הריגה ידנית). + +**אם הכל עבר בהצלחה (כל בדיקות השלב הקודם עברו, אין כשל בפלט):** +```bash +curl -s -X PATCH -H "Authorization: Bearer $PAPERCLIP_API_KEY" \ + -H "Content-Type: application/json" \ + "$PAPERCLIP_API_URL/api/issues/{issue-id}" \ + -d '{"status": "done"}' +``` + +**אם בדיקות נכשלו, חסר פלט, או חסר מידע קריטי:** +```bash +curl -s -X PATCH -H "Authorization: Bearer $PAPERCLIP_API_KEY" \ + -H "Content-Type: application/json" \ + "$PAPERCLIP_API_URL/api/issues/{issue-id}" \ + -d '{"status": "blocked"}' +``` +**אסור** לסיים `done` עם פלט חסר — אם משהו נכשל, סטטוס = `blocked` + comment עם פירוט. + ### העֵר את העוזר המשפטי (CEO) — חובה! ```bash +# CEO לפי חברה — אסור לקבע UUID, חברות שונות = CEO שונה +if [ "$PAPERCLIP_COMPANY_ID" = "8639e837-4c9d-47fa-a76b-95788d651896" ]; then + CEO_ID="cdbfa8bc-3d61-41a4-a2e7-677ec7d34562" # CMPA — היטלי השבחה +else + CEO_ID="752cebdd-6748-4a04-aacd-c7ab0294ef33" # CMP — רישוי ובניה +fi + curl -s -X POST -H "Authorization: Bearer $PAPERCLIP_API_KEY" \ -H "Content-Type: application/json" \ - "$PAPERCLIP_API_URL/api/agents/752cebdd-6748-4a04-aacd-c7ab0294ef33/wakeup" \ - -d '{"reason": "מייצא טיוטה סיים משימה [issue-id] בסטטוס [done/blocked]"}' + "$PAPERCLIP_API_URL/api/agents/$CEO_ID/wakeup" \ + -d '{"source":"automation","triggerDetail":"system","reason":"מייצא טיוטה סיים משימה [issue-id] בסטטוס [done/blocked]","payload":{"issueId":"[issue-id]","mutation":"agent_completion"}}' ``` -אם ה-API לא עובד: **⚠️ אסור להשתמש ב-INSERT INTO agent_wakeup_requests ישירות!** הכנסה ישירה ל-DB יוצרת רק את הבקשה בלי heartbeat_run — והסוכן לא יתעורר לעולם. **תמיד להשתמש ב-API בלבד.** +**⚠️ אסור לקבע UUID של CEO** — UUID שונה לכל חברה. תמיד דרך `$PAPERCLIP_COMPANY_ID`. wakeup לחברה אחרת נדחה: `Agent key cannot access another company`. ## כללים קריטיים diff --git a/.claude/agents/legal-proofreader.md b/.claude/agents/legal-proofreader.md index 1d39143..1c4a263 100644 --- a/.claude/agents/legal-proofreader.md +++ b/.claude/agents/legal-proofreader.md @@ -69,5 +69,58 @@ tools: ### שלב 4: שמירה 1. **גיבוי**: העתק את הקובץ המקורי מ-`extracted/` לתיקיית `documents/backup/` עם סיומת `.pre-proofread.txt` 2. **כתוב** את הגרסה המתוקנת לתיקיית `documents/proofread/` (עם אותו שם קובץ כמו ב-`extracted/`) -3. עדכן את מסד הנתונים — שנה `extraction_status` ל-`proofread`: +3. עדכן את מסד הנתונים — שנה `extraction_status` ל-`proofread` + +### שלב 5: דיווח — חובה! + +1. **פרסם comment ב-issue** עם סיכום: + - כמה מסמכים הוגהו + - כמה החלפות אוטומטיות בוצעו (לפי מילון ראשי תיבות) + - כמה תיקונים ידניים בוצעו + - אם נמצאו בעיות שלא ניתן היה לתקן — פרט (`[?]` markers) + +2. **שלח מייל**: + ```bash + python3 /home/chaim/legal-ai/scripts/notify.py \ + "הגהה הושלמה — ערר {case_number}" \ + "סיכום: X מסמכים הוגהו, Y החלפות, Z תיקונים. נדרשת ביקורתך." + ``` + +### סגור את ה-issue של עצמך — חובה! + +בלי זה Paperclip יזהה "issue in_progress + אין execution חיה" ויפעיל auto-retry בלולאה (נצפה בפועל ב-CMPA-17 ב-30/04/26 — 4 איטרציות מיותרות עד הריגה ידנית). + +**אם הכל עבר בהצלחה:** +```bash +curl -s -X PATCH -H "Authorization: Bearer $PAPERCLIP_API_KEY" \ + -H "Content-Type: application/json" \ + "$PAPERCLIP_API_URL/api/issues/{issue-id}" \ + -d '{"status": "done"}' +``` + +**אם נכשלו תיקונים קריטיים או יש markers `[?]` רבים:** +```bash +curl -s -X PATCH -H "Authorization: Bearer $PAPERCLIP_API_KEY" \ + -H "Content-Type: application/json" \ + "$PAPERCLIP_API_URL/api/issues/{issue-id}" \ + -d '{"status": "blocked"}' +``` +**אסור** לסיים `done` עם פלט חסר — אם נכשל, סטטוס = `blocked` + comment עם פירוט. + +### העֵר את העוזר המשפטי (CEO) — חובה! + +```bash +# CEO לפי חברה — אסור לקבע UUID, חברות שונות = CEO שונה +if [ "$PAPERCLIP_COMPANY_ID" = "8639e837-4c9d-47fa-a76b-95788d651896" ]; then + CEO_ID="cdbfa8bc-3d61-41a4-a2e7-677ec7d34562" # CMPA — היטלי השבחה +else + CEO_ID="752cebdd-6748-4a04-aacd-c7ab0294ef33" # CMP — רישוי ובניה +fi + +curl -s -X POST -H "Authorization: Bearer $PAPERCLIP_API_KEY" \ + -H "Content-Type: application/json" \ + "$PAPERCLIP_API_URL/api/agents/$CEO_ID/wakeup" \ + -d '{"source":"automation","triggerDetail":"system","reason":"מגיה סיים משימה [issue-id] בסטטוס [done/blocked]","payload":{"issueId":"[issue-id]","mutation":"agent_completion"}}' +``` **⚠️ אסור להשתמש ב-INSERT INTO agent_wakeup_requests ישירות!** הכנסה ישירה ל-DB יוצרת רק את הבקשה בלי heartbeat_run — והסוכן לא יתעורר לעולם. **תמיד להשתמש ב-API בלבד.** +**⚠️ אסור לקבע UUID של CEO** — UUID שונה לכל חברה. תמיד דרך `$PAPERCLIP_COMPANY_ID`. wakeup לחברה אחרת נדחה: `Agent key cannot access another company`. diff --git a/.claude/agents/legal-qa.md b/.claude/agents/legal-qa.md index 073f285..9b74ba1 100644 --- a/.claude/agents/legal-qa.md +++ b/.claude/agents/legal-qa.md @@ -163,12 +163,40 @@ tools: - האם מותר לייצא (כל הקריטיים pass?) - עדכן סטטוס ל-qa_review (אם נכשל) או drafted (אם עבר) +### סגור את ה-issue של עצמך — חובה! + +בלי זה Paperclip יזהה "issue in_progress + אין execution חיה" ויפעיל auto-retry בלולאה (נצפה בפועל ב-CMPA-17 ב-30/04/26 — 4 איטרציות מיותרות עד הריגה ידנית). + +**אם הכל עבר בהצלחה (כל בדיקות השלב הקודם עברו, אין כשל בפלט):** +```bash +curl -s -X PATCH -H "Authorization: Bearer $PAPERCLIP_API_KEY" \ + -H "Content-Type: application/json" \ + "$PAPERCLIP_API_URL/api/issues/{issue-id}" \ + -d '{"status": "done"}' +``` + +**אם בדיקות נכשלו, חסר פלט, או חסר מידע קריטי:** +```bash +curl -s -X PATCH -H "Authorization: Bearer $PAPERCLIP_API_KEY" \ + -H "Content-Type: application/json" \ + "$PAPERCLIP_API_URL/api/issues/{issue-id}" \ + -d '{"status": "blocked"}' +``` +**אסור** לסיים `done` עם פלט חסר — אם משהו נכשל, סטטוס = `blocked` + comment עם פירוט. + ### העֵר את העוזר המשפטי (CEO) — חובה! ```bash +# CEO לפי חברה — אסור לקבע UUID, חברות שונות = CEO שונה +if [ "$PAPERCLIP_COMPANY_ID" = "8639e837-4c9d-47fa-a76b-95788d651896" ]; then + CEO_ID="cdbfa8bc-3d61-41a4-a2e7-677ec7d34562" # CMPA — היטלי השבחה +else + CEO_ID="752cebdd-6748-4a04-aacd-c7ab0294ef33" # CMP — רישוי ובניה +fi + curl -s -X POST -H "Authorization: Bearer $PAPERCLIP_API_KEY" \ -H "Content-Type: application/json" \ - "$PAPERCLIP_API_URL/api/agents/752cebdd-6748-4a04-aacd-c7ab0294ef33/wakeup" \ - -d '{"reason": "בודק איכות סיים משימה [issue-id] בסטטוס [done/blocked]"}' + "$PAPERCLIP_API_URL/api/agents/$CEO_ID/wakeup" \ + -d '{"source":"automation","triggerDetail":"system","reason":"בודק איכות סיים משימה [issue-id] בסטטוס [done/blocked]","payload":{"issueId":"[issue-id]","mutation":"agent_completion"}}' ``` -אם ה-API לא עובד: **⚠️ אסור להשתמש ב-INSERT INTO agent_wakeup_requests ישירות!** הכנסה ישירה ל-DB יוצרת רק את הבקשה בלי heartbeat_run — והסוכן לא יתעורר לעולם. **תמיד להשתמש ב-API בלבד.** +**⚠️ אסור לקבע UUID של CEO** — UUID שונה לכל חברה. תמיד דרך `$PAPERCLIP_COMPANY_ID`. wakeup לחברה אחרת נדחה: `Agent key cannot access another company`. diff --git a/.claude/agents/legal-researcher.md b/.claude/agents/legal-researcher.md index dde101b..207e9fe 100644 --- a/.claude/agents/legal-researcher.md +++ b/.claude/agents/legal-researcher.md @@ -115,15 +115,43 @@ python3 /home/chaim/legal-ai/scripts/notify.py \ - **תקדים**: אילו פסקי דין הכי חזקים (עם ציון היררכיה ומעמד — הלכה/אגב) - **מדיניות**: אילו שיקולים תכנוניים עולים מהחומר +### סגור את ה-issue של עצמך — חובה! + +בלי זה Paperclip יזהה "issue in_progress + אין execution חיה" ויפעיל auto-retry בלולאה (נצפה בפועל ב-CMPA-17 ב-30/04/26 — 4 איטרציות מיותרות עד הריגה ידנית). + +**אם הכל עבר בהצלחה (כל בדיקות השלב הקודם עברו, אין כשל בפלט):** +```bash +curl -s -X PATCH -H "Authorization: Bearer $PAPERCLIP_API_KEY" \ + -H "Content-Type: application/json" \ + "$PAPERCLIP_API_URL/api/issues/{issue-id}" \ + -d '{"status": "done"}' +``` + +**אם בדיקות נכשלו, חסר פלט, או חסר מידע קריטי:** +```bash +curl -s -X PATCH -H "Authorization: Bearer $PAPERCLIP_API_KEY" \ + -H "Content-Type: application/json" \ + "$PAPERCLIP_API_URL/api/issues/{issue-id}" \ + -d '{"status": "blocked"}' +``` +**אסור** לסיים `done` עם פלט חסר — אם משהו נכשל, סטטוס = `blocked` + comment עם פירוט. + ### העֵר את העוזר המשפטי (CEO) — חובה! ```bash +# CEO לפי חברה — אסור לקבע UUID, חברות שונות = CEO שונה +if [ "$PAPERCLIP_COMPANY_ID" = "8639e837-4c9d-47fa-a76b-95788d651896" ]; then + CEO_ID="cdbfa8bc-3d61-41a4-a2e7-677ec7d34562" # CMPA — היטלי השבחה +else + CEO_ID="752cebdd-6748-4a04-aacd-c7ab0294ef33" # CMP — רישוי ובניה +fi + curl -s -X POST -H "Authorization: Bearer $PAPERCLIP_API_KEY" \ -H "Content-Type: application/json" \ - "$PAPERCLIP_API_URL/api/agents/752cebdd-6748-4a04-aacd-c7ab0294ef33/wakeup" \ - -d '{"reason": "חוקר תקדימים סיים משימה [issue-id] בסטטוס [done/blocked]"}' + "$PAPERCLIP_API_URL/api/agents/$CEO_ID/wakeup" \ + -d '{"source":"automation","triggerDetail":"system","reason":"חוקר תקדימים סיים משימה [issue-id] בסטטוס [done/blocked]","payload":{"issueId":"[issue-id]","mutation":"agent_completion"}}' ``` -אם ה-API לא עובד: **⚠️ אסור להשתמש ב-INSERT INTO agent_wakeup_requests ישירות!** הכנסה ישירה ל-DB יוצרת רק את הבקשה בלי heartbeat_run — והסוכן לא יתעורר לעולם. **תמיד להשתמש ב-API בלבד.** +**⚠️ אסור לקבע UUID של CEO** — UUID שונה לכל חברה. תמיד דרך `$PAPERCLIP_COMPANY_ID`. wakeup לחברה אחרת נדחה: `Agent key cannot access another company`. ## כללים - **דיוק** — ציין מספרי סעיפים, תאריכים, שמות שופטים diff --git a/.claude/agents/legal-writer.md b/.claude/agents/legal-writer.md index 229b6b3..621976b 100644 --- a/.claude/agents/legal-writer.md +++ b/.claude/agents/legal-writer.md @@ -200,15 +200,43 @@ case_update(case_number, status="drafted") - ספירת מילים לכל בלוק - יחסי משקל (% מהמסמך) +### סגור את ה-issue של עצמך — חובה! + +בלי זה Paperclip יזהה "issue in_progress + אין execution חיה" ויפעיל auto-retry בלולאה (נצפה בפועל ב-CMPA-17 ב-30/04/26 — 4 איטרציות מיותרות עד הריגה ידנית). + +**אם הכל עבר בהצלחה (כל בדיקות השלב הקודם עברו, אין כשל בפלט):** +```bash +curl -s -X PATCH -H "Authorization: Bearer $PAPERCLIP_API_KEY" \ + -H "Content-Type: application/json" \ + "$PAPERCLIP_API_URL/api/issues/{issue-id}" \ + -d '{"status": "done"}' +``` + +**אם בדיקות נכשלו, חסר פלט, או חסר מידע קריטי:** +```bash +curl -s -X PATCH -H "Authorization: Bearer $PAPERCLIP_API_KEY" \ + -H "Content-Type: application/json" \ + "$PAPERCLIP_API_URL/api/issues/{issue-id}" \ + -d '{"status": "blocked"}' +``` +**אסור** לסיים `done` עם פלט חסר — אם משהו נכשל, סטטוס = `blocked` + comment עם פירוט. + ### העֵר את העוזר המשפטי (CEO) — חובה! ```bash +# CEO לפי חברה — אסור לקבע UUID, חברות שונות = CEO שונה +if [ "$PAPERCLIP_COMPANY_ID" = "8639e837-4c9d-47fa-a76b-95788d651896" ]; then + CEO_ID="cdbfa8bc-3d61-41a4-a2e7-677ec7d34562" # CMPA — היטלי השבחה +else + CEO_ID="752cebdd-6748-4a04-aacd-c7ab0294ef33" # CMP — רישוי ובניה +fi + curl -s -X POST -H "Authorization: Bearer $PAPERCLIP_API_KEY" \ -H "Content-Type: application/json" \ - "$PAPERCLIP_API_URL/api/agents/752cebdd-6748-4a04-aacd-c7ab0294ef33/wakeup" \ - -d '{"reason": "כותב החלטה סיים משימה [issue-id] בסטטוס [done/blocked]"}' + "$PAPERCLIP_API_URL/api/agents/$CEO_ID/wakeup" \ + -d '{"source":"automation","triggerDetail":"system","reason":"כותב החלטה סיים משימה [issue-id] בסטטוס [done/blocked]","payload":{"issueId":"[issue-id]","mutation":"agent_completion"}}' ``` -אם ה-API לא עובד: **⚠️ אסור להשתמש ב-INSERT INTO agent_wakeup_requests ישירות!** הכנסה ישירה ל-DB יוצרת רק את הבקשה בלי heartbeat_run — והסוכן לא יתעורר לעולם. **תמיד להשתמש ב-API בלבד.** +**⚠️ אסור לקבע UUID של CEO** — UUID שונה לכל חברה. תמיד דרך `$PAPERCLIP_COMPANY_ID`. wakeup לחברה אחרת נדחה: `Agent key cannot access another company`. **אם לא תעדכן סטטוס ל-drafted — בודק האיכות לא יוכל לרוץ!**