The old architecture.md was out of date (mentioned n8n which isn't used,
wrong embedding dimensions, missing multi-tenancy, no edit loop).
The rewrite documents the full process end-to-end:
1. Document upload + OCR + embedding
2. Analysis (proofreader, researcher)
3. Outcome + direction decision (CEO + human)
4. Deep analysis (pass 2)
5. Drafting (writer writes 12 blocks)
6. QA
7. Initial DOCX export (with bookmarks for future revisions)
8. Edit loop with Track Changes — the new architecture:
a. User downloads + edits in Word + uploads עריכה-v{N}.docx
b. Backend auto-retrofits bookmarks + registers as active_draft
c. User asks CEO for specific change in Paperclip comment
d. CEO stage G: calls writer in revision mode → builds revisions JSON
e. docx_reviser applies <w:ins>/<w:del> preserving user's template
f. User Accept/Reject from Word Review tab
g. Repeat until marked final
Plus MCP tool reference, API endpoints, DB schema, multi-tenancy,
technology stack.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
16 KiB
System Architecture — Legal Decision Assistant
עודכן: 2026-04-16 — הוספת ארכיטקטורת Track Changes לעריכת טיוטות
רכיבי המערכת
┌───────────────────────────────────────────────────────────────┐
│ Nautilus Server │
│ 158.178.131.193 │
│ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ legal-ai container (Coolify UUID: gyjo0mtw2c42ej3...) │ │
│ │ ┌────────────┐ ┌──────────────────────────┐ │ │
│ │ │ Next.js UI │ │ FastAPI backend │ │ │
│ │ │ :3000 │◄──►│ :8000 (internal) │ │ │
│ │ └────────────┘ │ + MCP server │ │ │
│ │ └──────────────────────────┘ │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────┐ ┌──────────────────────────┐ │
│ │ PostgreSQL + │ │ Redis │ │
│ │ pgvector (1024D) │ │ (task queue) │ │
│ │ legal-ai-postgres│ │ legal-ai-redis │ │
│ └──────────────────┘ └──────────────────────────┘ │
│ │
│ ┌──────────────┐ ┌──────────────────────────┐ │
│ │ Gitea │ │ Traefik (SSL + routing) │ │
│ │ (code + cases)│ │ (*.nautilus.marcusgroup) │ │
│ └──────────────┘ └──────────────────────────┘ │
└───────────────────────────────────────────────────────────────┘
Local (developer machine, pm2):
┌──────────────────────────────────────────────────────────────┐
│ Paperclip — agent orchestrator │
│ localhost:3100, DB localhost:54329 │
│ Runs Claude Code agents: legal-ceo, legal-writer, │
│ legal-exporter, legal-researcher, legal-qa, legal-proofreader│
└──────────────────────────────────────────────────────────────┘
External:
← Claude API (Opus 4.7 for agents)
← Voyage AI (voyage-3-large, 1024-dim embeddings)
← Infisical (secret management)
← Gmail SMTP (agent notifications)
הזרימה המלאה — מהעלאת מסמכים ועד טיוטה סופית
שלב 1 — יצירת תיק + העלאת מסמכי מקור
מה קורה:
- חיים יוצר תיק דרך UI (
/cases/new) — מקבלcase_number(1xxx = CMP, 8xxx/9xxx = CMPA) - מעלה PDFs/DOCX: כתב ערר, תשובה, פרוטוקול, תכניות, היתר, פסיקה
- ה-backend:
- שומר קובץ ב-
data/cases/{case_number}/documents/originals/ - מפעיל OCR (Google Vision) אם PDF ללא טקסט
- מריץ proofreader להסרת artifacts מ-Nevo
- מחלץ טקסט ל-
documents.extracted_text - מפצל ל-chunks של ~500 מילים, מחשב embeddings (voyage-3-large, 1024D), שומר ב-
document_chunks
- שומר קובץ ב-
- סטטוס תיק:
new→proofread
שלב 2 — ניתוח משפטי (legal-researcher + analyst)
מי רץ: סוכני Paperclip (מתוזמרים ע"י legal-ceo).
- legal-proofreader — מנקה את המסמכים אחרי OCR
- legal-researcher — מפה תכניות, תקדימים, חקיקה רלוונטית. שומר
research_md - analyst (legal-researcher pass 1) — מחלץ טענות (
extract_claims), ממפה סוגיות, בודק שלמות
סטטוס: proofread → documents_ready → analyst_verified
שלב 3 — החלטת תוצאה + כיוונים (CEO + חיים)
- legal-ceo מציג סיכום לחיים: סיווג, טענות, פסיקה רלוונטית, שאלות מפתח
- חיים בוחר תוצאה (דחייה/קבלה חלקית/קבלה מלאה)
- CEO מציג 2-3 כיוונים סילוגיסטיים לנימוק
- חיים מאשר כיוון
סטטוס: analyst_verified → outcome_set → direction_approved
שלב 4 — ניתוח מעמיק (analyst pass 2)
legal-researcher (תפקיד analyst) מעמיק בפסיקה ובחקיקה על בסיס הכיוון שאושר, מאמת ציטוטים מדויקים.
סטטוס: direction_approved → analysis_enriched
שלב 5 — כתיבת טיוטה (legal-writer)
- CEO יוצר issue לכותב עם כל ההקשר: תוצאה, סוגיות, מבנה סילוגיסטי, מסמכי מקור, תקדימים
- legal-writer כותב בלוק-אחרי-בלוק (12 בלוקים: א-יב) בסגנון דפנה
- כל בלוק נשמר ב-DB (
decision_blocks.content)
סטטוס: ready_for_writing → drafted
שלב 6 — QA
legal-qa מריץ 6 בדיקות איכות:
- שלמות (כל 12 הבלוקים מלאים)
- ניטרליות (בלוק ו אין ציטוטים מצדדים)
- אין כפילות (בלוק י מפנה, לא חוזר)
- מספור רציף
- פסיקה מצוטטת במדויק
- תואם
chair_directionsשל דפנה
אם עובר → qa_passed. אם נכשל → qa_failed + issue תיקון לכותב.
שלב 7 — ייצוא טיוטה ראשונית (legal-exporter)
מה עשה עד עכשיו: בונה DOCX מאפס מבלוקים ב-DB.
מה חדש (2026-04): הייצוא מזריק bookmarks בתחילת וסיום כל בלוק — אנקורים לעריכות עתידיות:
<w:bookmarkStart w:name="block-alef">...<w:bookmarkEnd>- כך עד
block-yod-bet
הקובץ: data/cases/{case_number}/exports/טיוטה-v1.docx (גופן David, RTL, גודל ~43KB)
חשוב: הטיוטה הזו נרשמת ב-cases.active_draft_path = המקור הרשמי של התיק.
סטטוס: qa_passed → exported
שלב 8 — לולאת עריכה מול דפנה (החלק החדש)
זה הלב של ארכיטקטורת Track Changes שנוספה ב-2026-04.
8א. חיים מוריד + עורך + מעלה
- חיים מוריד
טיוטה-v1.docxמה-UI - פותח ב-Word (שולחן עבודה או Word Online)
- עורך ידנית: תיקוני ניסוח, עיצוב, תוספות של תוכן שהמערכת לא ידעה עליו
- שומר מחדש בשם שמתחיל ב-
עריכה- - מעלה חזרה דרך ה-UI (
/cases/{case}→ "העלה גרסה מתוקנת")
8ב. Backend קולט — אוטומטית
ה-endpoint POST /api/cases/{case}/exports/upload (web/app.py:1991) עושה שלושה דברים:
- שומר את הקובץ כ-
עריכה-v{N}.docx(כאשר N = הגרסה הבאה) - מריץ retrofit דרך
apply_user_editב-MCP:- פותח את ה-DOCX, מזהה גבולות בלוקים לפי heuristic דו-שכבתי:
- א) מרקרים עבריים בתחילת פסקה:
א.,ב., ...,יב. - ב) כותרות סגנון דפנה: "רקע", "תמצית טענות", "דיון והכרעה", "סוף דבר", וכו'
- א) מרקרים עבריים בתחילת פסקה:
- מזריק
<w:bookmarkStart>/<w:bookmarkEnd>חסרים
- פותח את ה-DOCX, מזהה גבולות בלוקים לפי heuristic דו-שכבתי:
- מעדכן את DB:
cases.active_draft_path = '/data/cases/{case}/exports/עריכה-v{N}.docx'
התגובה ל-UI כוללת bookmarks_added, missing_blocks, apply_status — ה-UI מציג toast:
- ✓ "הועלה: עריכה-v2.docx — זוהו N בלוקים"
- ⚠ "M בלוקים לא זוהו — ייתכנו בעיות בתיקונים עתידיים"
8ג. חיים מבקש תיקון ספציפי מ-CEO
חיים כותב ב-Paperclip comment ל-CEO של החברה:
"העליתי טיוטה ערוכה. בבקשה הוסף פסק הלכה של בג"ץ 1234/21 בבלוק י' (דיון), ותקן את הניסוח של סוף דבר."
8ד. CEO מתזמר — שלב G
.claude/agents/legal-ceo.md — שלב G מפעיל:
list_bookmarks(case_number)— מקבל את רשימת האנקורים הזמינים- אם הבקשה דורשת ניסוח חדש → מפעיל legal-writer במצב revision
- writer מקבל
block_id+bookmark_anchor+ הוראת ניסוח - מחזיר טקסט נקי בסגנון דפנה
- לא שומר ב-DB (ה-revision חי בקובץ)
- writer מקבל
- בונה JSON array של revisions:
[{ "id": "r1", "type": "insert_after", "anchor_bookmark": "block-yod", "content": "<הטקסט שהכותב ניסח>", "style": "body", "reason": "הוספת פסק הלכה לפי בקשת חיים" }] - קורא ל-
revise_draft(case_number, revisions)
8ה. docx_reviser מבצע XML surgery
mcp-server/src/legal_mcp/services/docx_reviser.py:
- פותח את
עריכה-v{N}.docxכ-ZIP + טועןword/document.xmlעם lxml - מוסיף
<w:trackRevisions/>ב-word/settings.xml(אם חסר) - לכל revision:
- מאתר את ה-bookmark בעץ
- בונה פסקה חדשה עם RTL + David + המילה "מערכת AI" כמחבר
- עוטף את ה-runs החדשים ב-
<w:ins w:id w:author w:date> - שומר IDs ייחודיים (סורק max קיים)
- שומר כ-
טיוטה-v{N+1}.docx— הקובץ החדש שומר על כל העיצוב המקורי של המשתמש (הטמפלט, הפונטים, הטבלאות, הכל) - מעדכן
cases.active_draft_pathלקובץ החדש
8ו. חיים מקבל + מאשר/דוחה
- UI מציג: "טיוטה v{N+1} (מתוקנת) מוכנה לעיון"
- חיים מוריד, פותח ב-Word
- ה-Track Changes מופעל — השינויים מסומנים בצבע, סרגל Review פעיל
- חיים לוחץ Accept על כל שינוי שהוא מסכים איתו, Reject על מה שלא
- אם יש עוד שינויים שהוא רוצה לבקש — חוזר לשלב 8א (שומר, מעלה
עריכה-v{N+2}.docx, מבקש עוד שינוי)
8ז. סיום — final
כשחיים מרוצה, הוא מסמן בייוויי "סמן כסופי" ב-UI → הקובץ מועתק ל-סופי-{case}.docx + ל-data/training/ ללמידה עתידית של דפוסי סגנון.
סטטוס: exported → final
סכמת DB — 4 שכבות
Layer 1: Core
cases, documents, document_chunks
חדש (2026-04): cases.active_draft_path TEXT — הנתיב המלא ל-DOCX שהוא מקור האמת הנוכחי של התיק. null עד לייצוא הראשון.
Layer 2: Decision
decisions, decision_blocks, decision_paragraphs, claims
Layer 3: Legal Knowledge
case_law, statutory_provisions, transition_phrases, lessons_learned, style_corpus, style_patterns
Layer 4: Semantic Search (RAG)
document_embeddings, paragraph_embeddings, case_law_embeddings (pgvector 1024-dim, voyage-3-large)
Layer 5 — Multi-tenancy
companies, tag_company_mappings (appeal_subtype → company_id)
רב-חברתיות (CMP + CMPA)
חברות:
- CMP (
42a7acd0-30c5-4cbd-ac97-7424f65df294) — תיקי 1xxx (רישוי ובניה) - CMPA (
8639e837-4c9d-47fa-a76b-95788d651896) — תיקי 8xxx/9xxx (היטלי השבחה, פיצויים ס' 197)
מה משותף לשתי החברות:
- DB יחיד, backend יחיד, frontend יחיד
- כל הקוד + agents — פועלים לפי
$PAPERCLIP_COMPANY_IDבזמן ריצה - ארכיטקטורת Track Changes (docx_reviser, docx_retrofit, apply_user_edit, revise_draft)
מה כפול לכל חברה:
- Paperclip skills (
/home/chaim/.paperclip/instances/default/skills/{company_uuid}/) - ניתוח סגנון נפרד (
style_patternsfiltered by appeal_subtype) - CEO agent משלה (CMP:
752cebdd..., CMPA:cdbfa8bc...)
סקריפט סנכרון: scripts/deploy-track-changes.sh — מעתיק skills מ-CMP ל-CMPA.
MCP Tools (חלקי — הרלוונטיים לטיוטות)
| Tool | מה עושה |
|---|---|
export_docx(case) |
ייצוא טיוטה ראשונית מה-DB, עם bookmarks. מעדכן active_draft_path. |
apply_user_edit(case, filename) |
רישום עריכה-*.docx כ-active_draft + הזרקת bookmarks. |
list_bookmarks(case) |
רשימת אנקורים זמינים ב-active_draft. |
revise_draft(case, revisions_json) |
החלת Track Changes על active_draft → יוצר טיוטה-v{N+1}.docx. |
write_block, save_block_content |
כתיבה/שמירה של בלוקים ב-DB (לשלב הכתיבה הראשוני). |
validate_decision |
6 בדיקות QA. |
API Endpoints (הרלוונטיים לטיוטות)
| Endpoint | שימוש |
|---|---|
POST /api/cases/{case}/export-docx |
ייצוא טיוטה מה-DB |
GET /api/cases/{case}/exports |
רשימת טיוטות + עריכות קיימות |
GET /api/cases/{case}/exports/{filename}/download |
הורדת קובץ |
POST /api/cases/{case}/exports/upload |
העלאת עריכה → auto-retrofit + register כ-active_draft |
DELETE /api/cases/{case}/exports/{filename} |
מחיקה |
POST /api/cases/{case}/exports/{filename}/mark-final |
סימון כסופי |
POST /api/cases/{case}/exports/revise |
החלת revisions (Track Changes) |
GET /api/cases/{case}/exports/bookmarks |
רשימת bookmarks ב-active_draft |
POST /api/cases/{case}/exports/{filename}/retrofit |
ריצת retrofit ידנית (לקבצים ישנים) |
GET /api/cases/{case}/active-draft |
סטטוס active_draft (path + exists) |
טכנולוגיות עיקריות
- Database: PostgreSQL 15 + pgvector 0.8.1
- Embeddings: Voyage AI (
voyage-3-large, 1024-dim) - Agents: Claude Opus 4.7 (via Paperclip pm2)
- DOCX manipulation:
python-docx1.2+ ו-lxml5.2+ (XML surgery) - Frontend: Next.js + TanStack Query + Tailwind
- Backend: FastAPI + asyncpg
- Deployment: Coolify + Docker + Traefik (SSL ב-Let's Encrypt)
- Code repo: Gitea (
gitea.nautilus.marcusgroup.org/ezer-mishpati/legal-ai) - Secret management: Infisical
מסמכים קשורים
block-schema.md— מבנה 12 הבלוקים, content model, constraintsdecision-methodology.md— מתודולוגיה אנליטיתlegal-decision-lessons.md— לקחים מ-3 החלטותnew-company-setup-guide.md— הקמת חברה חדשה (CMPA)product-specification.md— איפיון מוצר מלא (persona, תהליכים עסקיים)../CLAUDE.md— הנחיות לסוכני AI שעובדים על הקוד../scripts/SCRIPTS.md— כל הסקריפטים והשימוש בהם