fix(arguments): route "חשב טיעונים" through the legal-analyst agent #326

Merged
chaim merged 1 commits from worktree-fix-aggregate-btn into main 2026-06-20 18:20:48 +00:00
Owner

הבעיה

הכפתור "חשב טיעונים" (/api/cases/{case}/aggregate-arguments) הריץ BackgroundTask בתוך קונטיינר ה-FastAPI שקרא ל-claude_session (ה-claude CLI המקומי). אין claude CLI בקונטיינר — אז:

  • הכפתור החזיר "התחיל, רענן בעוד דקה" אבל כלום לא נוצר (אומת חי על 1043-02-26: total נשאר 0; command -v claude בקונטיינר → NO_CLAUDE_CLI).
  • ב-force הקוד מוחק את הטיעונים הקיימים לפני קריאת ה-LLM הנדונה-לכישלון → אובדן-נתונים שקט.

זו הפרת claude_session_local_only / G12 — חישוב-LLM נותב למקום הלא-נכון.

התיקון

מאמץ את דפוס-ההאצלה הקיים של "חלץ עובדות שמאיות" (extract-appraiser-facts):

  1. פרה-צ'ק זול בקונטיינר (DB בלבד, ללא LLM) — no_claims (אין טענות) / exists (כבר חושב, בלי force) — חוסך הקמת-סוכן לחינם.
  2. wakeup לאנליטיקאי של החברה הנכונה (לפי prefix מספר-התיק) דרך issue-ילד ב-Paperclip; הסוכן מריץ mcp__legal-ai__aggregate_claims_to_arguments מקומית (שם ה-CLI קיים) ומדווח ב-comment.
  3. force רץ עכשיו מקומית — מחיקה+חישוב אטומיים על המארח, בלי כשל הרסני.

Frontend: AggregateArgumentsResult → discriminated union (queued | no_claims | exists | skipped); toast מדויק-לפי-סטטוס במקום ההודעה הקבועה המטעה.

Invariants

  • G12 — מגע-Paperclip מוגבל ל-paperclip_client מאחורי agent_platform_port (אין סמל-Paperclip חדש מחוץ לשער).
  • G2 — מחליף את המסלול השבור, לא יוצר מסלול מקביל.
  • הנדסה §6 — סטטוסים מפורשים, אין בליעת-שגיאות שקטה.

שער-עיצוב

שינוי-ה-UI הוא לוגיקה/toast בלבד (אין שינוי-layout ויזואלי) — בגדר חריג תיקון-הבאג של שער-Claude-Design. פאנלי-סטטוס inline עשירים (כמו בעורך-השומות) נדחו לשער.

בדיקות

  • py_compile על web/app.py, paperclip_client.py, agent_platform_port.py — OK
  • tsc --noEmit — OK · eslint על 2 הקבצים — נקי

🤖 Generated with Claude Code

## הבעיה הכפתור **"חשב טיעונים"** (`/api/cases/{case}/aggregate-arguments`) הריץ `BackgroundTask` **בתוך קונטיינר ה-FastAPI** שקרא ל-`claude_session` (ה-`claude` CLI המקומי). אין `claude` CLI בקונטיינר — אז: - הכפתור החזיר "התחיל, רענן בעוד דקה" אבל **כלום לא נוצר** (אומת חי על 1043-02-26: total נשאר 0; `command -v claude` בקונטיינר → `NO_CLAUDE_CLI`). - ב-`force` הקוד **מוחק** את הטיעונים הקיימים *לפני* קריאת ה-LLM הנדונה-לכישלון → אובדן-נתונים שקט. זו הפרת `claude_session_local_only` / G12 — חישוב-LLM נותב למקום הלא-נכון. ## התיקון מאמץ את דפוס-ההאצלה הקיים של **"חלץ עובדות שמאיות"** (`extract-appraiser-facts`): 1. **פרה-צ'ק זול בקונטיינר** (DB בלבד, ללא LLM) — `no_claims` (אין טענות) / `exists` (כבר חושב, בלי `force`) — חוסך הקמת-סוכן לחינם. 2. **wakeup לאנליטיקאי** של החברה הנכונה (לפי prefix מספר-התיק) דרך issue-ילד ב-Paperclip; הסוכן מריץ `mcp__legal-ai__aggregate_claims_to_arguments` מקומית (שם ה-CLI קיים) ומדווח ב-comment. 3. **`force` רץ עכשיו מקומית** — מחיקה+חישוב אטומיים על המארח, בלי כשל הרסני. **Frontend:** `AggregateArgumentsResult` → discriminated union (`queued | no_claims | exists | skipped`); toast מדויק-לפי-סטטוס במקום ההודעה הקבועה המטעה. ## Invariants - **G12** — מגע-Paperclip מוגבל ל-`paperclip_client` מאחורי `agent_platform_port` (אין סמל-Paperclip חדש מחוץ לשער). - **G2** — מחליף את המסלול השבור, לא יוצר מסלול מקביל. - **הנדסה §6** — סטטוסים מפורשים, אין בליעת-שגיאות שקטה. ## שער-עיצוב שינוי-ה-UI הוא לוגיקה/toast בלבד (אין שינוי-layout ויזואלי) — בגדר **חריג תיקון-הבאג** של שער-Claude-Design. פאנלי-סטטוס inline עשירים (כמו בעורך-השומות) **נדחו לשער**. ## בדיקות - `py_compile` על web/app.py, paperclip_client.py, agent_platform_port.py — OK - `tsc --noEmit` — OK · `eslint` על 2 הקבצים — נקי 🤖 Generated with [Claude Code](https://claude.com/claude-code)
chaim added 1 commit 2026-06-20 18:20:38 +00:00
fix(arguments): route "חשב טיעונים" through the legal-analyst agent
All checks were successful
G12 Leak-Guard / leak-guard (pull_request) Successful in 4s
Lint — undefined names / undefined-names (pull_request) Successful in 10s
a3df05e067
The /aggregate-arguments endpoint ran an in-container BackgroundTask that
called claude_session (the local `claude` CLI) — which does not exist in the
FastAPI container. The button silently produced nothing, and on `force` it
destructively DELETEd existing arguments *before* the doomed LLM call.

Replace the inline task with the established delegation pattern used by
"חלץ עובדות שמאיות" (extract-appraiser-facts): a cheap in-container DB
pre-check (no_claims / exists), then a Paperclip wakeup of the company's
legal-analyst, which runs mcp__legal-ai__aggregate_claims_to_arguments
locally (where the CLI lives) and reports back. `force` now runs locally too,
so delete+recompute are atomic on the host — no more destructive failure.

Frontend: AggregateArgumentsResult becomes a discriminated union
(queued | no_claims | exists | skipped) and the toast is status-accurate
instead of the misleading fixed "refresh in a minute".

Invariants: G12 (Paperclip touch confined to paperclip_client behind the
agent_platform_port), G2 (replaces the broken path, no parallel capability),
engineering §6 (explicit statuses, no silent swallow).

UI change is logic/toast only (no visual-layout change) — within the
Claude-Design-gate bug-fix exemption. Richer inline status panels deferred
to the gate.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
chaim merged commit a0b158b2c8 into main 2026-06-20 18:20:48 +00:00
chaim deleted branch worktree-fix-aggregate-btn 2026-06-20 18:20:48 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: ezer-mishpati/legal-ai#326