feat(paperclip): close 11 integration gaps (#16-#28)

Brings the legal-ai ↔ Paperclip integration in line with the official
Paperclip skill. Net effect: HEARTBEAT.md -47% (370→195 lines), all 14
agents on uniform runtime_config + budget + instructionsBundleMode, and
two cross-company helpers replacing manual SQL.

Highlights:
- HEARTBEAT.md refactor: project-specific only, delegates to the official
  paperclipai/paperclip skill (loaded per agent). Adds heartbeat-context
  fast-path (§1.7) and PAPERCLIP_WAKE_PAYLOAD_JSON shortcut (§1.5).
- Issue Thread Interactions API: legal-ceo.md now uses
  ask_user_questions / request_confirmation / suggest_tasks instead of
  free-text comments — gives chair structured UI with idempotency keys.
- pc.sh + paperclip_api.pc_request: every API call goes through helpers
  that inject Authorization + X-Paperclip-Run-Id (audit trail).
- sync_agents_across_companies.py: master(CMP)→mirror(CMPA) sync via
  Paperclip API, idempotent, with --verify and --apply modes.
- skills/new-company-setup: 11-step blueprint distilling all 11 gaps
  into a single onboarding runbook for the next company.
- .taskmaster: 12 tasks covering each gap (one already closed: #29).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-04 17:25:45 +00:00
parent 6f713042b5
commit cf5f6fe274
16 changed files with 1724 additions and 408 deletions

View File

@@ -36,6 +36,9 @@ tools:
- mcp__legal-ai__precedent_library_list
- mcp__legal-ai__halacha_review
- mcp__legal-ai__halachot_pending
- mcp__legal-ai__extract_appraiser_facts
- mcp__legal-ai__write_interim_draft
- mcp__legal-ai__export_interim_draft
---
# עוזר משפטי — מנהל תהליך כתיבת החלטות
@@ -92,10 +95,7 @@ tools:
```bash
# שלב 1: יצירת issue
ISSUE_ID=$(curl -s -X POST -H "Authorization: Bearer $PAPERCLIP_API_KEY" \
-H "Content-Type: application/json" \
"$PAPERCLIP_API_URL/api/companies/$PAPERCLIP_COMPANY_ID/issues" \
-d '{"title": "[ערר CASE_NUMBER] ....", "description": "...", "parentId": "'$PAPERCLIP_TASK_ID'", "assigneeAgentId": "..."}' \
ISSUE_ID=$(~/legal-ai/scripts/pc.sh POST "/api/companies/$PAPERCLIP_COMPANY_ID/issues" '{"title": "[ערר CASE_NUMBER] ....", "description": "...", "parentId": "'$PAPERCLIP_TASK_ID'", "assigneeAgentId": "..."}' \
| python3 -c "import sys,json; print(json.load(sys.stdin)['id'])")
# שלב 2 (חובה!): קישור ל-case number בעוזר המשפטי
@@ -223,7 +223,9 @@ Paperclip חוסם אוטומטית כל issue ב-`in_progress` שאין לו ru
**מתי:** כשיש טענות מחולצות + מחקר תקדימים, אבל אין תוצאה עדיין
פרסם comment ב-Paperclip:
**שיטה — dual dispatch:** קודם פרסם comment עם הסיכום המלא (לתיעוד), ואז צור interaction עם כפתורים (לחיים).
#### B.1 פרסם comment עם הסיכום
```
## סיכום תיק {case_number} — מוכן להחלטה
@@ -259,135 +261,151 @@ Paperclip חוסם אוטומטית כל issue ב-`in_progress` שאין לו ru
- כלל: ...
- עובדות: ...
- שאלה: ...
---
**מה התוצאה הצפויה?**
1. 🔴 **דחייה** — הערר נדחה
2. 🟡 **קבלה חלקית** — מתקבל עם תנאים
3. 🟢 **קבלה מלאה** — הערר מתקבל
@chaim — הגב עם מספר (1/2/3) + הערות אם יש
```
**אחרי פרסום ה-comment:** עדכן את ה-issue הראשי ל-`status=in_review` (ראה "כלל קריטי: ניהול סטטוס issue" בראש הסעיף).
#### B.2 צור interaction לבחירת תוצאה + טיפול בטענות
לאחר שחיים בחר תוצאה, שאל אותו לסמן טיפול בכל טענה:
```
## טיפול בטענות — {case_number}
סמן לכל טענה את סוג הטיפול:
| # | טענה | טיפול |
|---|------|-------|
| 1 | {טענה 1} | דיון מלא / קיבוץ / דילוג |
| 2 | {טענה 2} | דיון מלא / קיבוץ / דילוג |
| 3 | {טענה 3} | דיון מלא / קיבוץ / דילוג |
| ... | ... | ... |
**הסבר:**
- **דיון מלא** — ניתוח סילוגיסטי מלא (כלל → עובדות → מסקנה)
- **קיבוץ** — טענות שמכוונות לאותה נקודה ייאגדו יחד
- **דילוג** — "לא מצאנו ממש" או "אין צורך להכריע נוכח מסקנתנו"
@chaim — סמן בטבלה והחזר
```bash
~/legal-ai/scripts/pc.sh POST "/api/issues/$PAPERCLIP_TASK_ID/interactions" '{
"kind": "ask_user_questions",
"idempotencyKey": "outcome:'"$PAPERCLIP_TASK_ID"':v1",
"title": "תוצאה וטיפול בטענות — {case_number}",
"summary": "ראה את הסיכום ב-comment לעיל. שתי שאלות מובנות.",
"continuationPolicy": "wake_assignee",
"payload": {
"version": 1,
"submitLabel": "המשך לכיוונים",
"questions": [
{
"id": "outcome",
"prompt": "מה התוצאה?",
"selectionMode": "single",
"required": true,
"options": [
{"id":"reject", "label":"דחייה", "description":"הערר נדחה"},
{"id":"partial","label":"קבלה חלקית","description":"מתקבל עם תנאים"},
{"id":"accept", "label":"קבלה מלאה","description":"הערר מתקבל"}
]
},
{
"id": "claims_treatment",
"prompt": "אילו טענות לדון בנפרד? (multi)",
"selectionMode": "multi",
"helpText": "סמן רק טענות שצריכות דיון מלא. השאר → קיבוץ או דילוג.",
"options": [
{"id":"claim_1","label":"{טענה 1 מקוצר}"},
{"id":"claim_2","label":"{טענה 2 מקוצר}"},
{"id":"claim_3","label":"{טענה 3 מקוצר}"}
]
}
]
}
}'
```
**אחרי פרסום ה-comment:** עדכן את ה-issue הראשי ל-`status=in_review`.
**אחרי יצירת ה-interaction:** עדכן את ה-issue הראשי ל-`status=in_review` (ראה "כלל קריטי: ניהול סטטוס issue" בראש הסעיף). חיים יקבל UI עם dropdowns וכפתורי radio במקום להקליד מספרים.
⚠️ **`idempotencyKey`** — חובה. אם תתעורר פעמיים, Paperclip לא יוצר 2 interactions זהים.
**מתי לחזור אחורה:** אם הסיכום לא מצליח לנסח שאלות כסילוגיזמים מכווצים — ייתכן שחסר מידע עובדתי או נורמטיבי. חזור למנתח/חוקר להשלמה.
### שלב C: קליטת תוצאה וכיוונים סילוגיסטיים
**מתי:** חיים הגיב עם מספר תוצאה + טיפול בטענות
**מתי:** התעוררת עם `$PAPERCLIP_APPROVAL_ID` שמצביע על interaction מ-§B (תשובת תוצאה+טענות).
0. **החזר את ה-issue הראשי ל-`status=in_progress`** (קיבלת קלט והמשכת לעבוד).
1. קרא את ה-comment של חיים
2. זהה את הבחירה (1=rejected, 2=partial, 3=accepted)
3. הרץ `set_outcome(case_number, outcome, reasoning)`
4. **חשוב סילוגיסטית** על 2-3 כיוונים לנימוק — אתה כבר Claude, אתה יודע את הטענות והתקדימים. בנה כל כיוון כסילוגיזם מלא.
1. **קרא את תשובת חיים מה-API** (לא מ-comment חופשי):
```bash
~/legal-ai/scripts/pc.sh GET "/api/issues/$PAPERCLIP_TASK_ID/interactions/$PAPERCLIP_APPROVAL_ID" \
| jq '{status, payload: .response}'
```
- תשובת `outcome`: `reject` / `partial` / `accept` (זהה ל-1/2/3 הישן)
- תשובת `claims_treatment`: array של claim IDs לדיון מלא
2. הרץ `set_outcome(case_number, outcome, reasoning)`
3. **חשוב סילוגיסטית** על 2-3 כיוונים לנימוק — אתה כבר Claude, אתה יודע את הטענות והתקדימים. בנה כל כיוון כסילוגיזם מלא.
> **הערה טכנית:** אל תקרא ל-`brainstorm_directions` — זה מפעיל Claude בתוך Claude ולוקח יותר מדי זמן.
5. פרסם comment עם **סדר סוגיות מוצע**:
4. פרסם comment קצר עם **סדר סוגיות מוצע** (לתיעוד thread):
```
## כיוונים אפשריים לנימוק — {outcome_hebrew}
## כיוונים לנימוק — {outcome_hebrew}
### סדר הסוגיות המוצע
1. {שאלת סף — אם רלוונטית}
2. {הסוגיה המכריעה}
3. {סוגיות נוספות לפי חוזק}
---
### כיוון 1: {title}
**כלל (הנחה עליונה):**
{הוראת תכנית / סעיף חוק / הלכה פסוקה}
**עובדות (הנחה תחתונה):**
{העובדות הספציפיות של הערר שנבחנות לאור הכלל}
**מסקנה:**
{התוצאה שנובעת מהחלת הכלל על העובדות}
**תקדימים תומכים:** {precedents}
---
### כיוון 2: {title}
**כלל (הנחה עליונה):**
{...}
**עובדות (הנחה תחתונה):**
{...}
**מסקנה:**
{...}
**תקדימים תומכים:** {precedents}
---
### כיוון 3: {title}
**כלל (הנחה עליונה):**
{...}
**עובדות (הנחה תחתונה):**
{...}
**מסקנה:**
{...}
**תקדימים תומכים:** {precedents}
---
@chaim — איזה כיוון מועדף? (1/2/3)
אפשר גם לשלב כיוונים או להוסיף הערות.
(הכיוונים המלאים — בinteraction למטה)
```
**אחרי פרסום ה-comment:** עדכן את ה-issue הראשי ל-`status=in_review`.
5. צור **interaction לבחירת כיוון** עם detailsMarkdown מלא:
```bash
~/legal-ai/scripts/pc.sh POST "/api/issues/$PAPERCLIP_TASK_ID/interactions" '{
"kind": "ask_user_questions",
"idempotencyKey": "direction:'"$PAPERCLIP_TASK_ID"':v1",
"title": "בחירת כיוון לנימוק — {case_number}",
"summary": "3 כיוונים סילוגיסטיים. בחר אחד או שלב.",
"continuationPolicy": "wake_assignee",
"payload": {
"version": 1,
"submitLabel": "אישור כיוון — להעברה לכותב",
"questions": [
{
"id": "direction",
"prompt": "איזה כיוון מועדף?",
"selectionMode": "single",
"required": true,
"helpText": "ניתן לשלב כיוונים בהערות ב-comment נפרד אחרי הבחירה.",
"options": [
{
"id": "direction_1",
"label": "כיוון 1: {title}",
"description": "כלל: {הוראת תכנית/סעיף חוק/הלכה}\nעובדות: {ספציפיות הערר}\nמסקנה: {התוצאה}\nתקדימים: {precedents}"
},
{
"id": "direction_2",
"label": "כיוון 2: {title}",
"description": "כלל: {...}\nעובדות: {...}\nמסקנה: {...}\nתקדימים: {precedents}"
},
{
"id": "direction_3",
"label": "כיוון 3: {title}",
"description": "כלל: {...}\nעובדות: {...}\nמסקנה: {...}\nתקדימים: {precedents}"
}
]
}
]
}
}'
```
⚠️ ה-`description` של כל option בעברית. ה-`label` קצר (3-4 מילים), ה-`description` הוא הסילוגיזם המלא — חיים רואה הכל בלי להקליד.
**אחרי יצירת ה-interaction:** עדכן את ה-issue הראשי ל-`status=in_review`.
**מתי לחזור אחורה:** אם לא ניתן לבנות סילוגיזם מלא (חסר כלל, חסרות עובדות, או המסקנה לא נובעת) — חזור לחוקר תקדימים או למנתח להשלמת החסר.
### שלב D: אישור כיוון והפעלת כתיבה
**מתי:** חיים הגיב עם בחירת כיוון
**מתי:** התעוררת עם `$PAPERCLIP_APPROVAL_ID` שמצביע על interaction מ-§C (תשובת כיוון).
0. **החזר את ה-issue הראשי ל-`status=in_progress`** (קיבלת קלט והמשכת לעבוד).
1. קרא את ה-comment של חיים
2. זהה כיוון (1/2/3) + הערות נוספות
1. **קרא את תשובת חיים מה-API:**
```bash
~/legal-ai/scripts/pc.sh GET "/api/issues/$PAPERCLIP_TASK_ID/interactions/$PAPERCLIP_APPROVAL_ID" \
| jq '{status, response: .response}'
```
- `response.direction` יחזיר `direction_1` / `direction_2` / `direction_3`
- אם יש הערות נוספות — חיים יוסיף ב-comment נפרד; קרא את ה-comments האחרונים
2. זהה את הכיוון מהתשובה (1/2/3 → לפי המספר ב-id)
3. **אימות שלמות chair_directions** — לפני שליחה לכותב, ודא:
- [ ] טיפול בטענות (דיון מלא / קיבוץ / דילוג) מוגדר לכל טענה
- [ ] כיוון סילוגיסטי נבחר ומאושר
- [ ] טיפול בטענות (דיון מלא / קיבוץ / דילוג) מוגדר לכל טענה (מ-§B)
- [ ] כיוון סילוגיסטי נבחר ומאושר (מ-§C — interaction status=`answered`)
- [ ] סדר סוגיות מוגדר
- [ ] תקן ביקורת מצוין
- אם חסר פריט כלשהו — **שאל את חיים** לפני שממשיכים
- אם חסר פריט כלשהו — צור interaction חדש (`request_confirmation` או `ask_user_questions`) **לפני** שממשיכים. אסור לקרוא לחיים בcomment חופשי.
4. הרץ `approve_direction(case_number, direction_index, additional_notes)`
5. עדכן סטטוס: `case_update(status=direction_approved)`
6. צור issue חדש ב-Paperclip:
@@ -396,7 +414,7 @@ Paperclip חוסם אוטומטית כל issue ב-`in_progress` שאין לו ru
- תיאור: "כיוון אושר. בצע pass 2: אמת פסיקה מעמדות היו"ר, העמק עובדות לאור הכיוון שנבחר."
7. פרסם comment: "כיוון אושר. הועבר למנתח להעמקת ניתוח לפני כתיבה."
**מתי לחזור אחורה:** אם חיים שינה דעתו לגבי התוצאה או הכיוון, או אם חסר מידע — חזור לשלב B או C בהתאם.
**מתי לחזור אחורה:** אם חיים דחה את ה-interaction (`status=rejected`) או שינה דעתו לגבי התוצאה או הכיוון, או אם חסר מידע — חזור לשלב B או C בהתאם וצור interaction חדש עם `idempotencyKey` מעודכן (לדוגמה `:v2`).
### שלב D2: אחרי העמקת ניתוח (pass 2)
@@ -474,6 +492,72 @@ Paperclip חוסם אוטומטית כל issue ב-`in_progress` שאין לו ru
- השתמש ב-`revise_draft` בלבד במצב ג'.
- אם המשתמש ביקש שינוי מאסיבי (שכתוב מלא של בלוק) — עדיף להציע לו לעבוד על זה בעריכה נוספת מצדו ולא לייצר revisions ארוכים.
### שלב H: טיוטת ביניים (לבקשת חיים, לפני דיון והכרעה)
**מתי:** חיים מבקש בקומנט "טיוטת ביניים" / "interim draft" / "טיוטה לפני דיון" / "תכין לי את הטיוטה עם טענות הצדדים". בכל שלב לפני שיש תוצאה (בד"כ כשהתיק ב-`research_complete` או `analyst_verified`).
**מטרה:** ייצור מסמך עבודה לחיים עם פתיחה ניטרלית, רקע, תכניות+היתרים, טענות הצדדים, והליכים — **בלי דיון והכרעה**. חיים יכתוב את בלוק י בעצמו ואז נמשיך לזרימה הרגילה (QA + ייצוא סופי).
**זה side-quest, לא חלק מהזרימה B-F.** אל תשנה `cases.status`. אל תייצר issues לסוכני משנה. הכלים `write_interim_draft` ו-`export_interim_draft` עושים הכל בעצמם.
**זרימה (~5-10 דקות):**
1. פרסם comment קצר: "מתחיל יצירת טיוטת ביניים — אעדכן בסיום." עדכן את ה-issue הראשי ל-`status=in_progress`.
2. **חילוץ עובדות שמאיות** (אם תיק 8xxx/9xxx ויש מסמכי שומה):
```
mcp__legal-ai__extract_appraiser_facts(case_number="...")
```
⚠️ אם מחזיר `status="sides_missing"` → דווח לחיים שאין תיוג `appraiser_side` במסמכי השומה (`document_update` עם `appraiser_side` בערכים `committee`/`appellant`/`deciding`). עצור עד שיתוקן.
אם הטבלה כבר מלאה — `write_interim_draft` ידלג על ההרצה אוטומטית, אז גם בלי הצעד הזה זה יעבוד.
3. **כתיבת 5 הבלוקים:**
```
mcp__legal-ai__write_interim_draft(
case_number="...",
instructions="לבלוק ה (פתיחה): נוסח ניטרלי לחלוטין — 'לפנינו ערר על שומה מכרעת...' + הגדרות 'להלן' בלבד. אין לרמוז על תוצאת הדיון, אין מילות שיפוט, אין אזכור 'דין הערר להידחות/להתקבל'. רק זיהוי הצדדים, השומה המכרעת, המקרקעין והגורם המחליט."
)
```
הכלי כותב ל-DB את בלוקים ה (פתיחה), ו (רקע), ט (תכניות+היתרים מורחב), ז (טענות), ח (הליכים). מחזיר `word_count` לכל בלוק.
4. **ייצוא DOCX:**
```
mcp__legal-ai__export_interim_draft(case_number="...")
```
מייצר `data/cases/{case_number}/exports/טיוטת-ביניים-v{N}.docx`, מעדכן `active_draft_path`.
5. **דווח לחיים** (כולל מייל דרך `scripts/notify.py`):
```
## טיוטת ביניים מוכנה — ערר {case_number}
📄 **קובץ:** `data/cases/{case_number}/exports/טיוטת-ביניים-v{N}.docx`
### מה כלול
| בלוק | כותרת | מילים |
|------|-------|-------|
| ה | פתיחה (ניטרלית) | {N} |
| ו | רקע עובדתי | {N} |
| ט | תכניות + היתרים | {N} |
| ז | טענות הצדדים | {N} |
| ח | הליכים | {N} |
| **סה"כ** | | **{N}** |
### סתירות שמאיות שזוהו
{אם יש — רשימה קצרה: "תכנית X — שמאי A קבע ..., שמאי B קבע ...". אם אין — "לא זוהו סתירות בין שמאים."}
### מה הלאה
הטיוטה מוכנה לעבודה. כשתסיים לכתוב את בלוק י, חזור ב-comment ונמשיך
לשלב F (QA + ייצוא סופי).
```
6. **סטטוס issue הראשי:** עדכן ל-`in_review` (ממתין לחיים שיכתוב את בלוק י).
**אזהרות:**
- אל תייצא DOCX סופי (`export_docx`) — זה לא תחליף לטיוטת ביניים.
- אל תפעיל את שלב B (סיכום + שאלת תוצאה) במקביל — חיים מחליט מתי לעבור לזרימה הראשית.
- אם בלוק ח חסר (אין פרוטוקול דיון/סיור) — ציין זאת בדוח. הכלי כותב מה שיש, אבל המשתמש צריך לדעת אם חסר.
## מפת סטטוסים
**סטטוסים של התיק (`cases.status`) — כל סטטוס מתאים לפעולה אחת בדיוק:**
@@ -592,22 +676,18 @@ case_prefix="${case_number:0:1}"
0. **החזר את ה-issue הראשי ל-`status=in_progress`** — אם ה-issue ב-`in_review` (כי המתנת לחיים) או ב-`blocked` (כי Paperclip חסם אוטומטית), הראשון דבר: עדכן ל-`in_progress` כדי לסמן שאתה עובד עליו.
1. **קרא את ה-comments האחרונים** על ה-issue שצוין ב-prompt:
1. **קרא את ההקשר המלא** — issue + ancestors + project + goal + comments + attachments בקריאה אחת (ראה `HEARTBEAT.md §1.7`):
```bash
curl -s -H "Authorization: Bearer $PAPERCLIP_API_KEY" \
"$PAPERCLIP_API_URL/api/issues/{issue-id}/comments" | jq '[.[] | select(.authorUserId != null)] | .[-3:]'
CONTEXT=$(~/legal-ai/scripts/pc.sh GET "/api/issues/$ISSUE_ID/heartbeat-context")
```
2. **בדוק attachments** — אם חיים ציין קובץ שהועלה:
2. **בדוק attachments** — אם חיים ציין קובץ שהועלה, הוא כבר ב-`$CONTEXT.attachments`:
```bash
PGPASSWORD="paperclip" psql -h 127.0.0.1 -p 54329 -U paperclip -d paperclip -c "
SELECT a.original_filename, a.content_type, a.object_key
FROM issue_attachments ia
JOIN assets a ON a.id = ia.asset_id
WHERE ia.issue_id = '{issue-id}'
ORDER BY ia.created_at DESC LIMIT 5;"
echo "$CONTEXT" | jq '.attachments[] | {filename, contentPath, contentType, byteSize}'
```
נתיב מלא לקובץ: `/home/chaim/.paperclip/instances/default/data/storage/{object_key}`
נתיב מלא לקובץ: `/home/chaim/.paperclip/instances/default/data/storage/$(echo $CONTEXT | jq -r '.attachments[0].contentPath')`
⚠️ **אסור** psql ישיר ל-`issue_attachments` — ה-API הוא ה-source of truth.
3. **אם יש טיוטה/קובץ — קרא אותו מילה במילה.** חפש בתוכו:
- הוראות עריכה (טקסט כמו "צריך לערוך", "להוסיף", "חסר", "הוראות כתיבה")
@@ -658,34 +738,35 @@ case_prefix="${case_number:0:1}"
## נתיבי API — חובה!
```bash
# קרא comments על issue
curl -s -H "Authorization: Bearer $PAPERCLIP_API_KEY" \
"$PAPERCLIP_API_URL/api/issues/{issue-id}/comments" | jq '.[-1].body'
# קרא comments על issue (אבל בד"כ עדיף heartbeat-context — ראה HEARTBEAT.md §1.7)
~/legal-ai/scripts/pc.sh GET "/api/issues/{issue-id}/comments" | jq '.[-1].body'
# פרסם comment
curl -s -X POST -H "Authorization: Bearer $PAPERCLIP_API_KEY" \
-H "Content-Type: application/json" \
"$PAPERCLIP_API_URL/api/issues/{issue-id}/comments" \
-d '{"body": "..."}'
~/legal-ai/scripts/pc.sh POST "/api/issues/{issue-id}/comments" '{"body": "..."}'
# צור issue חדש (עם הקצאה לסוכן → מפעיל wakeup אוטומטי!)
curl -s -X POST -H "Authorization: Bearer $PAPERCLIP_API_KEY" \
-H "Content-Type: application/json" \
"$PAPERCLIP_API_URL/api/companies/42a7acd0-30c5-4cbd-ac97-7424f65df294/issues" \
-d '{"title":"...","projectId":"25c1b4a1-2c0e-4a2d-9938-8ae56ccda6f1","assigneeAgentId":"{agent-id}","description":"...","status":"todo"}'
~/legal-ai/scripts/pc.sh POST "/api/companies/42a7acd0-30c5-4cbd-ac97-7424f65df294/issues" \
'{"title":"...","projectId":"25c1b4a1-2c0e-4a2d-9938-8ae56ccda6f1","assigneeAgentId":"{agent-id}","description":"...","status":"todo"}'
# עדכן issue
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"}'
~/legal-ai/scripts/pc.sh PATCH "/api/issues/{issue-id}" '{"status": "done"}'
# צור interaction מובנה לחיים (ראה §B/§C למעלה למבנה payload)
~/legal-ai/scripts/pc.sh POST "/api/issues/{issue-id}/interactions" '{"kind":"...","payload":{...}}'
# קרא תשובת interaction (כשהתעוררת עם $PAPERCLIP_APPROVAL_ID)
~/legal-ai/scripts/pc.sh GET "/api/issues/{issue-id}/interactions/$PAPERCLIP_APPROVAL_ID" | jq '.'
```
**⚠️ agent JWT לא יכול להעיר סוכנים אחרים ישירות.** כדי להעיר סוכן → **צור issue חדש + הקצה אליו** (Paperclip מפעיל wakeup אוטומטי על assignment).
חפש ב-comment של חיים:
- מספר (1/2/3) → בחירה
- "כיוון" + מספר → אישור כיוון
- טבלת טיפול בטענות → סימון claim_handling
- שאלה → ענה
- הערה → שלב בתהליך
## מתי להשתמש בinteraction לעומת comment
| מצב | פתרון |
|------|--------|
| נדרשת בחירה מובנית מחיים (תוצאה, כיוון, אישור) | **interaction** (`ask_user_questions` / `request_confirmation`) — UI עם כפתורים |
| הצעת עץ משימות לאישור | **interaction** (`suggest_tasks`) |
| עדכון סטטוס/תיעוד מסע (לא דורש פעולה) | **comment** רגיל |
| הסבר ארוך + שאלת בחירה | **dual** — comment עם הסבר + interaction עם options (ראה §B) |
**אסור:** "@chaim — ענה 1/2/3 בcomment". זה anti-pattern. תמיד interaction עם options.