feat(curator): trigger Knowledge Curator from api_mark_final, drop CEO F2
All checks were successful
Build & Deploy / build-and-deploy (push) Successful in 8s

The previous F2 stage in legal-ceo.md fired after the first DOCX export
— too early, since the user often iterates with עריכה-* uploads after
the first export. The true "this is dafna's chosen final" signal is the
"סמן כסופי" button in the UI, which calls api_mark_final.

This commit moves the curator wakeup from CEO's instructions to a
direct hook in api_mark_final:

- web/paperclip_client.py: add CURATOR_AGENTS dict (CMP + CMPA UUIDs)
  and wake_curator_for_final() helper. Looks up main case issue,
  creates a child issue assigned to the curator, tags plugin_state for
  case visibility, and triggers wakeup via Paperclip API.
- web/app.py: api_mark_final now calls workflow_tools.ingest_final_version
  (so case_law table finally gets populated for search_decisions) and
  pc_wake_curator_for_final. Both are best-effort — failure does not
  block marking final.
- legal-ceo.md: remove F2 stage, leave only the agents-table reference
  noting the curator runs from api_mark_final.
- hermes-curator.md: update activation description to reflect the new
  flow.

Result: curator runs only when chaim deliberately clicks "סמן כסופי",
on the actual final file, with no risk of analyzing a draft that will
later change.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-05 14:47:03 +00:00
parent 77e5996497
commit 799b950961
4 changed files with 141 additions and 59 deletions

View File

@@ -19,9 +19,15 @@ profiles:
- **CMP** (תיקים 1xxx): רישוי ובניה. profile=`curator-cmp`. UUID `60dce831-...`
- **CMPA** (תיקים 8xxx + 9xxx): היטלי השבחה ופיצויים. profile=`curator-cmpa`. UUID `d6f7c55d-...`
ה-CEO (`עוזר משפטי`, `claude_local`) הוא ה-orchestrator הראשי בכל חברה.
אני סוכן-משנה שמופעל אחרי שלב F (ייצוא DOCX) של ה-CEO. אני לא מחליף
אף סוכן קיים — מוסיף שכבת ניתוח חדשה.
**איך אני מופעל:** דפנה לוחצת "סמן כסופי" בקובץ ב-UI של legal-ai →
`POST /api/cases/{case_number}/exports/{filename}/mark-final` רץ ב-`web/app.py`
הוא קורא ל-`pc_wake_curator_for_final()` ב-`web/paperclip_client.py` שיוצר
לי sub-issue ומעיר אותי. **לא דרך CEO** — חיבור ישיר מהאירוע ב-UI לסוכן.
זה מבטיח שאני מנתח את הגרסה האמיתית של דפנה, לא טיוטה אינטרמדיאטית.
ה-CEO (`עוזר משפטי`, `claude_local`) ממשיך להיות ה-orchestrator של כל
התהליך עד שלב F (ייצוא DOCX) ו-G (טיפול בעריכות). אני לא מחליף אותו —
מוסיף שכבת ניתוח אחרי שדפנה החליטה שהגרסה הסופית מוכנה.
## תפקיד

View File

@@ -87,7 +87,7 @@ tools:
| כותב החלטה | 7ed8686f-24bc-49a3-bc02-67ca15b895a9 | כתיבת בלוקים ה-יב (Opus) |
| בודק איכות | 1a5b229e-9220-4b13-940c-f8eb7285fc29 | QA לפני ייצוא |
| מייצא טיוטה | d0dc703b-ca83-4883-bca7-c9449e8713cd | בדיקה סופית + ייצוא DOCX מגורסת |
| מנהל ידע (Hermes) | CMP: 60dce831-5c5b-4bae-bda9-5282d506f0dc · CMPA: d6f7c55d-570a-46b8-8d72-1286d07da0d8 | סקירת החלטות סופיות, הצעות לעדכון style guide / lessons (POC — Hermes Agent). |
| מנהל ידע (Hermes) | CMP: 60dce831-5c5b-4bae-bda9-5282d506f0dc · CMPA: d6f7c55d-570a-46b8-8d72-1286d07da0d8 | סקירת החלטות סופיות, הצעות לעדכון style guide / lessons. **לא קורא ישירות מ-CEO** — מופעל אוטומטית מ-`web/app.py:api_mark_final` כשדפנה לוחצת "סמן כסופי" ב-UI. |
## כלל: כל issue חדש = תת-משימה
@@ -452,61 +452,6 @@ Paperclip חוסם אוטומטית כל issue ב-`in_progress` שאין לו ru
**מתי לחזור אחורה:** אם דוח QA מצביע על בעיה מתודולוגית (סילוגיזם חסר, כיוון לא תואם chair_directions) — חזור לשלב C/D ולא רק לכותב.
### שלב F2: סקירת ידע (Knowledge Curator)
**מתי:** רק אחרי ש-F הושלם בהצלחה (ייצוא הצליח, comment "החלטה מוכנה לביקורת" פורסם).
**מטרה:** להפעיל את **מנהל הידע** (Hermes) שיסקור את ההחלטה הסופית ויציע
עדכוני style guide / lessons. read-only על תוכן, write רק על comments.
בלאסט-רדיוס אפס — אם נכשל לא משנה את זרימת F.
**זמין בשתי החברות (CMP + CMPA)** — כל אחת עם profile והחלטות-מקור משלה.
ה-lookup לפי שם מוצא את ה-curator הנכון בחברה הנוכחית.
**תהליך:**
```bash
# 1. בדוק אם קיים curator בחברה שלך
CURATOR_ID=$(PGPASSWORD=paperclip psql -h localhost -p 54329 -U paperclip -d paperclip -tA -c \
"SELECT id FROM agents WHERE name='מנהל ידע' AND company_id='$PAPERCLIP_COMPANY_ID' LIMIT 1;")
if [ -z "$CURATOR_ID" ]; then
echo "[F2] No Knowledge Curator in company — skipping"
else
# 2. מצא את ה-issue הראשי של התיק
MAIN_ISSUE_ID=$(curl -s -H "Authorization: Bearer $PAPERCLIP_API_KEY" \
"$PAPERCLIP_API_URL/issues/$PAPERCLIP_TASK_ID" \
| python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('parentId') or d['id'])")
# 3. צור sub-issue ל-curator (ללא המתנה לתשובה!)
SUB_ISSUE_ID=$(~/legal-ai/scripts/pc.sh POST "/api/issues/$MAIN_ISSUE_ID/children" "$(cat <<JSON
{
"title": "[ערר $CASE_NUMBER] סקירת ידע — Knowledge Curator",
"description": "סקור את ההחלטה הסופית שיוצאה כעת. חפש 3-5 דפוסי סגנון/דיון שלא תועדו ב-skills/decision/SKILL.md או ב-docs/legal-decision-lessons.md. כתוב comment עם הממצאים בעברית, ניטרלי. אל תעדכן קבצים — רק הצע.",
"status": "in_progress",
"priority": "low",
"assigneeAgentId": "$CURATOR_ID"
}
JSON
)" | python3 -c "import sys,json; print(json.load(sys.stdin)['id'])")
# 4. תייג plugin_state (חובה לפי כלל ברזל בראש הקובץ)
PGPASSWORD=paperclip psql -h localhost -p 54329 -U paperclip -d paperclip -c \
"INSERT INTO plugin_state (plugin_id, scope_kind, scope_id, namespace, state_key, value_json)
VALUES ('53461b5a-7f58-411a-9952-72f9c8d4a328', 'issue', '$SUB_ISSUE_ID', 'default', 'legal-case-number', '\"$CASE_NUMBER\"')
ON CONFLICT DO NOTHING;"
# 5. דווח בקומנט הראשי (לא ממתין לתוצאה)
~/legal-ai/scripts/pc.sh POST "/api/issues/$PAPERCLIP_TASK_ID/comments" \
"$(printf '{"body":"F2 ✓ — מנהל הידע (Hermes) מנתח את ההחלטה אסינכרונית. הממצאים יופיעו ב-CMP-XX (sub-issue %s)."}' "$SUB_ISSUE_ID")"
fi
```
**חשוב:**
- **אל תמתין** לתשובת ה-curator — F הסתיים, לא חוסם את זרימה.
- **אל תעצור** את F בגלל F2. אם יצירת sub-issue נכשלה — log warning ועבור הלאה.
- ה-curator הוא Hermes (לא Claude Code) — POC. אם אתה רואה התנהגות מוזרה ב-sub-issues שלו, זה צפוי כרגע.
- ה-curator לא סוגר את ה-issue אוטומטית עדיין — צפוי. תיקון בעתיד (followup).
### שלב G: טיפול בעריכה מהמשתמש (אחרי ייצוא)
**מתי:** המשתמש העלה `עריכה-v*.docx` (אחרי שייצאנו `טיוטה-v*.docx` קודמת) וכתב תגובה בקומנט.