feat(plans): הרשאות-סוכנים + dedup/merge/edit + API לתור-אישור תכניות (backend) #253

Merged
chaim merged 1 commits from worktree-plans-followups into main 2026-06-14 14:40:34 +00:00
Owner

מה ולמה

Follow-ups למרשם-התכניות (#252) — חלק ה-backend (ללא-UI). ממשיך את 3 הבקשות של חיים: (2) לאפשר לסוכנים לקרוא לכלי-התכניות, (3) פאנל-אישור + מניעת-כפילות. ה-UI עצמו (טאב ב-/precedents + מונה ב-/approvals) יורד ב-PR נפרד אחרי שער Claude Design (feedback_claude_design_gate).

פריט 1 (תיקון-נתונים) כבר בוצע ישירות ב-DB: הל/מח/250 ד' → פורסמה 7.1.2002, י"פ 5045; 152-0137067 נשאר ללא תאריך (טרם אושר — הוראת-יו"ר).

השינויים

  • סוכנים (.claude/agents/legal-ceo.md, legal-researcher.md): הוספת extract_plans/plan_get/plan_search/plan_list (+ plan_upsert לחוקר). plan_review נשאר אנושי בלבד — אישור דרך הפאנל, לא דרך סוכן (G10).
  • db.py: _plan_core_token + find_similar_plans (מציף כפילות-וריאנט לאישור ידני — בלי מיזוג-אוטומטי), update_plan (עריכה/תיקון + renumber, מסרב להתנגשות-מספר → מפנה ל-merge), merge_plans (איחוד aliases, מילוי-חוסר, סתירות→discrepancies, מחיקת המקור).
  • plans_extractor.py: צירוף possible_duplicates לפלט extract_plans (הצפה, לא מיזוג).
  • web/app.py: GET /api/plans (+/{id}, /{id}/duplicates) · POST /api/plans · PATCH /api/plans/{id} · POST /api/plans/{id}/review · POST /api/plans/merge; + קטגוריית "תכניות הממתינות לאישור" ב-GET /api/chair/pending (מרכז-האישורים).

הכרעות-יו"ר

פאנל = טאב ב-/precedents + מונה ב-/approvals (לא עמוד נפרד — שער-אחד) · מניעת-כפילות = הצפה ידנית (chair merges), בלי מיזוג-אוטומטי.

Invariants — הצהרה (חובה)

  • נוגע / מקיים:
    • G1 / INV-DM2update_plan מנרמל plan_number בעריכה ומרנדר ציטוט מחדש.
    • G2 — מסלול יחיד; ה-dedup לא יוצר מסלול מקביל.
    • G3 — upsert idempotent; update_plan מסרב התנגשות (לא יוצר כפילות שקטה).
    • G10 / INV-DM5plan_review אנושי בלבד (לא ניתן לסוכן); מיזוג יזום-יו"ר; LLM-extracted נשאר pending.
    • INV-AH — הציטוט מרונדר דטרמיניסטית גם אחרי edit/merge.
    • אין בליעה שקטה (§6) — סתירת-תוקף במיזוג נרשמת ב-discrepancies; כפילות-וריאנט מוצפת ולא נבלעת.
    • X9 — כלי-MCP בשמות+envelope; X6 — endpoints במתכונת halachot/missing-precedents.

צ'קליסט — פרוטוקול כתיבת-קוד

  • קראתי ספ (00 + 02 + X1) לפני הכתיבה
  • לא מסלול מקביל (G2) / לא תיקון-תסמין בקריאה (G1)
  • לא מגע-Paperclip מחוץ ל-Port (G12) — leak-guard PASS על db.py + plans_extractor.py
  • אין בליעה שקטה — discrepancies + הצפת-כפילות
  • אין FU/GAP ממופה
  • בדיקות עוברות (ראה אימות)

אימות

  • db (venv מול DB משותף): find_similar_plans מציף וריאנט ("62" מול "תכנית מתאר מקומית מס' 62") · update_plan (renumber+ציטוט) + guard התנגשות-מספר → מסרב · merge_plans (aliases מאוחדים, מקור נמחק, discrepancies) → PASS + ניקוי.
  • שערים: leak_guard (G12) PASS · pyflakes undefined-names NONE · py_compile (db/extractor/app.py) PASS.
  • api:types: נדחה ל-PR-B (נגזר מ-openapi הפרוס; PR-A מפרוס → אז npm run api:types).

הערה תפעולית: כלי-MCP אינם ב-sync_agents_across_companies.py (שמסנכרן adapter_config/skills) — רשימת-הכלים חיה ב-.claude/agents/*.md (הגדרה משותפת). סוכני-Paperclip ירימו את הכלים בריצה הבאה; אם נדרשת התאמת-config צד-Paperclip — לבצע בנפרד.

🤖 Generated with Claude Code

## מה ולמה Follow-ups למרשם-התכניות ([#252](../252)) — **חלק ה-backend (ללא-UI)**. ממשיך את 3 הבקשות של חיים: (2) לאפשר לסוכנים לקרוא לכלי-התכניות, (3) פאנל-אישור + מניעת-כפילות. ה-UI עצמו (טאב ב-/precedents + מונה ב-/approvals) יורד ב-PR נפרד **אחרי שער Claude Design** (feedback_claude_design_gate). **פריט 1 (תיקון-נתונים)** כבר בוצע ישירות ב-DB: `הל/מח/250 ד'` → פורסמה 7.1.2002, י"פ 5045; `152-0137067` נשאר ללא תאריך (טרם אושר — הוראת-יו"ר). ### השינויים - **סוכנים** (`.claude/agents/legal-ceo.md`, `legal-researcher.md`): הוספת `extract_plans`/`plan_get`/`plan_search`/`plan_list` (+ `plan_upsert` לחוקר). **`plan_review` נשאר אנושי בלבד** — אישור דרך הפאנל, לא דרך סוכן (G10). - **db.py**: `_plan_core_token` + `find_similar_plans` (מציף כפילות-וריאנט לאישור ידני — **בלי מיזוג-אוטומטי**), `update_plan` (עריכה/תיקון + renumber, מסרב להתנגשות-מספר → מפנה ל-merge), `merge_plans` (איחוד aliases, מילוי-חוסר, סתירות→`discrepancies`, מחיקת המקור). - **plans_extractor.py**: צירוף `possible_duplicates` לפלט `extract_plans` (הצפה, לא מיזוג). - **web/app.py**: `GET /api/plans` (+`/{id}`, `/{id}/duplicates`) · `POST /api/plans` · `PATCH /api/plans/{id}` · `POST /api/plans/{id}/review` · `POST /api/plans/merge`; + קטגוריית **"תכניות הממתינות לאישור"** ב-`GET /api/chair/pending` (מרכז-האישורים). ### הכרעות-יו"ר פאנל = טאב ב-/precedents + מונה ב-/approvals (לא עמוד נפרד — שער-אחד) · מניעת-כפילות = **הצפה ידנית** (chair merges), בלי מיזוג-אוטומטי. ## Invariants — הצהרה (חובה) - **נוגע / מקיים:** - **G1 / INV-DM2** — `update_plan` מנרמל plan_number בעריכה ומרנדר ציטוט מחדש. - **G2** — מסלול יחיד; ה-dedup לא יוצר מסלול מקביל. - **G3** — upsert idempotent; `update_plan` מסרב התנגשות (לא יוצר כפילות שקטה). - **G10 / INV-DM5** — `plan_review` אנושי בלבד (לא ניתן לסוכן); מיזוג יזום-יו"ר; LLM-extracted נשאר pending. - **INV-AH** — הציטוט מרונדר דטרמיניסטית גם אחרי edit/merge. - **אין בליעה שקטה (§6)** — סתירת-תוקף במיזוג נרשמת ב-`discrepancies`; כפילות-וריאנט מוצפת ולא נבלעת. - **X9** — כלי-MCP בשמות+envelope; **X6** — endpoints במתכונת halachot/missing-precedents. ## צ'קליסט — פרוטוקול כתיבת-קוד - [x] קראתי ספ (00 + 02 + X1) לפני הכתיבה - [x] לא מסלול מקביל (G2) / לא תיקון-תסמין בקריאה (G1) - [x] לא מגע-Paperclip מחוץ ל-Port (G12) — leak-guard PASS על db.py + plans_extractor.py - [x] אין בליעה שקטה — discrepancies + הצפת-כפילות - [x] אין FU/GAP ממופה - [x] בדיקות עוברות (ראה אימות) ## אימות - **db (venv מול DB משותף):** `find_similar_plans` מציף וריאנט ("62" מול "תכנית מתאר מקומית מס' 62") · `update_plan` (renumber+ציטוט) + **guard התנגשות-מספר → מסרב** · `merge_plans` (aliases מאוחדים, מקור נמחק, discrepancies) → **PASS** + ניקוי. - **שערים:** leak_guard (G12) PASS · pyflakes undefined-names NONE · py_compile (db/extractor/app.py) PASS. - **api:types**: נדחה ל-PR-B (נגזר מ-openapi הפרוס; PR-A מפרוס → אז `npm run api:types`). **הערה תפעולית:** כלי-MCP אינם ב-`sync_agents_across_companies.py` (שמסנכרן adapter_config/skills) — רשימת-הכלים חיה ב-`.claude/agents/*.md` (הגדרה משותפת). סוכני-Paperclip ירימו את הכלים בריצה הבאה; אם נדרשת התאמת-config צד-Paperclip — לבצע בנפרד. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
chaim added 1 commit 2026-06-14 14:40:27 +00:00
feat(plans): הרשאות-סוכנים + dedup/merge/edit + API לתור-אישור תכניות (backend)
All checks were successful
G12 Leak-Guard / leak-guard (pull_request) Successful in 3s
Lint — undefined names / undefined-names (pull_request) Successful in 10s
46bcaa8fa3
Follow-ups למרשם-התכניות (PR #252), חלק ה-backend (ללא-UI):
- סוכנים: הוספת extract_plans/plan_get/plan_search/plan_list ל-CEO ול-חוקר
  (+ plan_upsert לחוקר); plan_review נשאר אנושי בלבד (G10). .claude/agents/*.md.
- db: _plan_core_token + find_similar_plans (הצפת כפילות-וריאנט לאישור ידני, בלי
  מיזוג-אוטומטי), update_plan (עריכה+renumber, guard התנגשות→merge), merge_plans
  (איחוד aliases, מילוי-חוסר, סתירות→discrepancies, מחיקת מקור).
- plans_extractor: צירוף possible_duplicates לפלט החילוץ.
- web/app.py: GET /api/plans(+/{id},/{id}/duplicates) · POST /api/plans · PATCH
  /api/plans/{id} · POST /api/plans/{id}/review · POST /api/plans/merge; +קטגוריית
  "תכניות הממתינות לאישור" ב-/api/chair/pending.

תיקון-נתונים (DB, מחוץ ל-PR): הל/מח/250 ד' → 7.1.2002, י"פ 5045.
ה-UI (טאב /precedents + מונה /approvals) ב-PR נפרד אחרי שער Claude Design.

Invariants: G1 (נרמול בכתיבה/עריכה) · G2 · G3 · G10 (review_status + מיזוג ידני,
אישור אנושי) · INV-DM2/DM5 · INV-AH · X9 · אין בליעה שקטה (discrepancies).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
chaim merged commit 70ac888592 into main 2026-06-14 14:40:34 +00:00
chaim deleted branch worktree-plans-followups 2026-06-14 14:40:34 +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#253