Files
legal-ai/CLAUDE.md
Chaim cf5f6fe274 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>
2026-05-04 17:25:45 +00:00

15 KiB
Raw Blame History

עוזר משפטי — Legal Decision Assistant

רקע הפרויקט

מערכת AI לסיוע בכתיבת החלטות של ועדת ערר לתכנון ובניה, מחוז ירושלים, בראשות עו"ד דפנה תמיר.

מה עושה ועדת ערר?

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

שלושה סוגי עררים

סוג מספרי תיקים טון מאפיין
רישוי ובנייה 1xxx חם יחסית הקשר תכנוני רחב, אלמנטים אנושיים
היטל השבחה 8xxx קר ומקצועי יבש, ללא רגשות
פיצויים (ס' 197) 9xxx קר ומקצועי דומה להיטל השבחה

מטרת המערכת

לבנות כלי עבודה שמסייע ליו"ר הוועדה לנסח החלטות:

  1. ניהול תיקים — ייבוא חומרי מקור, סיווג מסמכים, מעקב סטטוס
  2. בסיס ידע — פסיקה, ביטויי מעבר, לקחים מהחלטות קודמות, חקיקה
  3. חיפוש סמנטי (RAG) — מציאת תקדימים רלוונטיים ופסקאות דומות
  4. סיוע בכתיבה — ייצור טיוטות לפי ארכיטקטורת 12 בלוקים בסגנון דפנה
  5. ייצוא DOCX — מסמך מעוצב מוכן להגשה

מה היה קודם (Legacy)

המערכת הקודמת היתה Obsidian vault עם Claude Code skills על שרת אחר. פותחו:

  • ניתוח סגנון של 3 החלטות (הכט — דחייה, בית הכרם — קבלה חלקית, אריאלי — השוואה)
  • ארכיטקטורת 12 בלוקים מבוססת CREAC / DITA / Akoma Ntoso / Federal Judicial Center
  • כללי כתיבה (רקע ניטרלי, ללא כפילות, טענות מקוריות בלבד)
  • לקחים מהשוואת טיוטות לגרסאות סופיות
  • סקריפט ייצוא DOCX

הידע שהופק מה-vault הוטמע במערכת הנוכחית — מסמכי ייחוס (docs/), קורפוס אימון (data/training/), ומבנה 12 בלוקים. ה-vault המקורי נמחק; הפרויקט הנוכחי עובד עם PostgreSQL + pgvector.


מסמכי ייחוס

מסמך תוכן מתי לקרוא
docs/architecture.md ארכיטקטורת המערכת, תרשים רכיבים, זרימת נתונים, 4 שכבות DB לפני עבודה על תשתית
docs/block-schema.md הגדרת 12 בלוקים — content model, constraints, processing params לפני כל כתיבת החלטה
docs/migration-plan.md תוכנית מעבר vault → DB — טבלאות, עדיפויות, כמויות לפני ייבוא נתונים
docs/legal-decision-lessons.md לקחים מ-3 החלטות — מה עבד, מה השתנה, ביטויי מעבר חדשים לפני כל כתיבת החלטה
docs/decision-methodology.md מתודולוגיה אנליטית — איך לחשוב על החלטה מעין-שיפוטית לפני כל כתיבת החלטה
docs/garner-methodology-extraction.md חומר מקור: מיצוי מספרי Garner על כתיבה משפטית רק לבדיקת מקור
docs/fjc-principles-extraction.md חומר מקור: מיצוי מ-Judicial Writing Manual (FJC) רק לבדיקת מקור
docs/corpus-analysis.md ניתוח שיטתי של 24 החלטות — מפת תוכן, דפוסי דיון תכנוני, פערים לפני כל כתיבת החלטה
docs/product-specification.md איפיון מוצר מלא — personas, תהליכים עסקיים, דרישות להתמצאות עסקית/מוצרית
docs/new-company-setup-guide.md מדריך הקמת חברה חדשה (CMPA) — skills, corpus, style analysis לפני הוספת חברה/סוג ערר חדש
skills/new-company-setup/SKILL.md Blueprint טכני מלא להוספת חברה — 11 שלבים מסודרים (companies, agents, runtime/adapter, skills, instructions, code, mappings) + checklist 10 מלכודות מ-Gap analysis #16-#28 חובה לפני הוספת חברה (יותר actionable מ-doc)
docs/audit-report.md דוח audit של המערכת רקע כללי
docs/case-migration-tracker.md מעקב מיגרציה של תיקים קיימים לצורך מעקב
docs/case-deletion-runbook.md runbook מלא למחיקת תיק — legal-ai DB + disk + Paperclip + Gitea, FK ordering, fallback ל-SQL ישיר לפני reset שלם של תיק (מבחן, מחיקה בטעות)
docs/paperclip-quirks.md מלכודות ידועות ב-Paperclip — issue.released ש-flips done→todo, bash backtick trap, CEO auto-block, wakeup דרך DB לפני שמייחסים באג בסוכן ל-skill — לבדוק קודם אם זה Paperclip-side
docs/decision-block-mapping.md מיפוי בלוקים להחלטות — איך 12 הבלוקים משתקפים ב-DOCX להתמצאות במבנה
docs/memory.md הקשר כללי — skills, פרויקטים שהושלמו, מבנה vault להתמצאות כללית
skills/decision/SKILL.md מדריך סגנון מלא של דפנה — טון, מבנה, ביטויים, מתודולוגיה לפני כל כתיבת החלטה

שרת Nautilus (158.178.131.193)

שירות תפקיד כתובת
Coolify ניהול containers http://158.178.131.193:8000
PostgreSQL + pgvector בסיס נתונים ראשי legal-ai-postgres
Redis תור משימות legal-ai-redis
n8n אוטומציית workflows להגדרה
Gitea מאגר קוד gitea.nautilus.marcusgroup.org/ezer-mishpati
ezer-mishpati-web ממשק העלאת מסמכים (Docker/Coolify) legal-ai.nautilus.marcusgroup.org
Paperclip סוכן AI — מריץ Claude Code agents (pm2, מקומי) localhost:3100
Infisical ניהול סודות secret.dev.marcus-law.co.il

⚠️ ארכיטקטורת Deploy — חובה לקרוא

עוזר משפטי (Legal-AI) — רץ כ-Docker container דרך Coolify:

  • UUID: gyjo0mtw2c42ej3xxvbz8zio
  • שינוי קוד ב-web/ או web-ui/ לא נכנס לתוקף עד ש:
    1. עושים git commit + git push origin main
    2. מריצים deploy דרך Coolify (mcp__coolify__deploy)
    3. ממתינים ~2-4 דקות לבנייה
  • אסור לנסות להריץ uvicorn מקומית — אין סביבת Python על המכונה
  • ה-container מריץ Next.js (:3000, חשוף) + FastAPI (:8000, פנימי)
  • בדיקה: curl https://legal-ai.nautilus.marcusgroup.org/api/...

Paperclip — רץ מקומית דרך pm2:

  • פורט: localhost:3100, DB: localhost:54329
  • שינויי קוד נכנסים לתוקף אחרי pm2 restart paperclip
  • אין צורך ב-Docker או Coolify

מבנה תיקיות

/home/chaim/legal-ai/
├── CLAUDE.md                          ← הקובץ הזה
├── Dockerfile                         ← Docker build
├── docs/                              ← תיעוד + לקחים
│   ├── architecture.md                   ארכיטקטורה
│   ├── block-schema.md                   12 בלוקים (המסמך החשוב ביותר)
│   ├── migration-plan.md                 תוכנית מעבר vault → DB
│   ├── legal-decision-lessons.md         לקחים מ-3 החלטות
│   └── memory.md                         הקשר כללי — skills, פרויקטים
├── skills/                            ← כלי עבודה ומדריכים
│   ├── decision/                         מדריך סגנון + references + 12 בלוקים
│   ├── assistant/                        קטלוג מסמכים
│   └── docx/                             עיצוב DOCX
├── data/
│   ├── training/                      ← 4 החלטות לאימון (DOCX)
│   ├── exports/                       ← טיוטות DOCX מיוצאות
│   └── cases/{case-number}/           ← תיקי עררים (מבנה שטוח, סטטוס ב-DB)
├── web/                               ← FastAPI backend (Python): 75 API endpoints
│   ├── app.py                            ← API ראשי
│   ├── paperclip_client.py               ← אינטגרציית Paperclip
│   └── gitea_client.py                   ← אינטגרציית Gitea
├── web-ui/                            ← Next.js frontend (TypeScript/React): ממשק המשתמש
│   └── next.config.ts                    ← proxy: /api/* → FastAPI :8000
├── mcp-server/                        ← MCP server + services + tools
└── scripts/                           ← סקריפטים וכלי עזר (ראה scripts/SCRIPTS.md)
    └── .archive/                      ← סקריפטים שהושלמו (לא להריץ)

כלל: עדכון scripts/SCRIPTS.md

בכל פעם שנוצר, נמחק, או משתנה סקריפט בתיקיית scripts/חובה לעדכן את scripts/SCRIPTS.md בהתאם. הקובץ מתעד את התפקיד, הסטטוס, וההחלפה (אם יש) של כל סקריפט.


ניהול משימות — TaskMaster AI

הפרויקט משתמש ב-TaskMaster AI (MCP server) לניהול משימות מובנה:

  • תמיד להשתמש ב-TaskMaster לפירוק, מעקב וניהול משימות — לא ב-TASKS.md ידני
  • קובץ המשימות: tasks/tasks.json
  • פקודות עיקריות: get_tasks, next_task, add_task, update_task, expand_task
  • לפני התחלת עבודה → next_task כדי לדעת מה הבא לפי תלויות
  • אחרי סיום משימה → update_task עם status=done
  • משימה מורכבת → expand_task לפירוק לתתי-משימות

Paperclip — כללי אינטגרציה קריטיים

Wakeup API — תמיד דרך API, לעולם לא דרך DB

  • הנתיב הנכון: POST /api/agents/{agent-id}/wakeup (לא /wake!)
  • ⚠️ אסור: INSERT INTO agent_wakeup_requests ישירות — זה יוצר רק רשומה בלי heartbeat_run, והסוכן לא יתעורר לעולם
  • ⚠️ חובה לשלוח payload עם issueId — בלי זה הסוכן מתעורר בלי הקשר (בלי תיק, בלי issue, בלי cwd נכון)
  • דוגמה נכונה:
    {"source": "automation", "triggerDetail": "system", "reason": "...",
     "payload": {"issueId": "...", "mutation": "comment", "commentId": "..."}}
    
  • Board API Key: שמור ב-DB (board_api_keys), auth: Authorization: Bearer pbk_...

ניתוב comments דרך CEO

  • כשמשתמש כותב תגובה על issue ב-Paperclip, הפלאגין (plugin-legal-ai) מעיר את ה-CEO דרך ctx.agents.invoke()
  • ה-CEO קורא את ה-comment, מחליט על ניתוב, ויוצר issue לסוכן המתאים
  • כל הסוכנים חייבים לקרוא comments אחרונים לפני שהם מתחילים לעבוד (HEARTBEAT שלבים 2b-2c)

קריאות API — תמיד דרך helper, לעולם לא curl ישיר

  • bash (סוכנים): ~/legal-ai/scripts/pc.sh <METHOD> <PATH> [BODY_JSON] — מוסיף Authorization, X-Paperclip-Run-Id, Content-Type, base URL. ראה HEARTBEAT.md §0.
  • Python (FastAPI): from web.paperclip_api import pc_request; await pc_request("POST", "/api/...", json={...}) — שימוש ב-board API key.
  • אסור curl ... $PAPERCLIP_API_URL ישיר ב-bash; אסור httpx.AsyncClient ישיר ל-Paperclip ב-Python.
  • למה: ה-skill הרשמי דורש X-Paperclip-Run-Id בכל קריאה משנה issue. אצלנו ה-audit trail עבד ממילא דרך JWT claims (runId: runIdHeader || claims.run_id), אבל ה-helper מבטיח עקביות + תאימות ל-board API keys (long-lived) שלא נושאות JWT claims.

Cross-company agent sync — אחרי כל שינוי הגדרות

  • יש 14 סוכנים = 7 × 2 חברות (CMP=1xxx, CMPA=8xxx). Paperclip מחייב agents.company_id NOT NULL — אין shared agents.
  • Master = CMP (1xxx), Mirror = CMPA (8xxx).
  • אחרי כל שינוי ב-adapter_config, runtime_config, budget_monthly_cents, או skills של סוכן ב-master (UI, SQL, או API), חובה להריץ:
    PAPERCLIP_BOARD_API_KEY=$(...infisical...) \
      python ~/legal-ai/scripts/sync_agents_across_companies.py --verify  # לבדיקה
    PAPERCLIP_BOARD_API_KEY=$(...) \
      python ~/legal-ai/scripts/sync_agents_across_companies.py --apply   # לסנכרן
    
  • הסקריפט מסנן local skills שלא קיימים ב-CMPA (מציג אזהרה), משתמש ב-API (לא DB ישיר), יוצר revisions, idempotent.
  • שאלות ה-skill הרשמי של Paperclip — paperclip skill תחת paperclipai/paperclip.

עקרונות כתיבה קריטיים

  1. "מבחן השופט" — כל החלטה חייבת להיות קריאה לשופט שלא מכיר את התיק
  2. "רקע ניטרלי" — בלוק ו = עובדות בלבד. אין ציטוטים מצדדים, אין מילות שיפוט
  3. "ללא כפילות" — בלוק י (דיון) מפנה לבלוקים קודמים, לא חוזר עליהם
  4. "טענות מקוריות בלבד" — בלוק ז = מכתבי טענות מקוריים בלבד. השלמות → בלוק ח
  5. ארכיטקטורת 12 בלוקים — ראה docs/block-schema.md
  6. צ'קליסט תוכן — בלוק י מקבל צ'קליסט תוכן אוטומטי לפי סוג הערר (ראה lessons.py: CONTENT_CHECKLISTS)

הערות יו"ר (Chair Feedback)

מנגנון לתיעוד הערות דפנה על טיוטות:

  • DB: טבלת chair_feedback (case_id, block_id, feedback_text, category, lesson_extracted)
  • API: GET/POST /api/feedback, PATCH /api/feedback/{id}/resolve
  • MCP tools: record_chair_feedback, list_chair_feedback
  • UI: דף ניהול ב-/feedback (ב-Next.js)
  • קטגוריות: missing_content, wrong_tone, wrong_structure, factual_error, style, other

יו"ר: עו"ד דפנה תמיר

  • מדריך סגנון מלא: skills/decision/SKILL.md