feat(plans): מרשם-תכניות קנוני (V38) + נוסח-ציטוט אחיד דטרמיניסטי לבלוק ט #252

Merged
chaim merged 1 commits from worktree-plans-registry into main 2026-06-14 13:47:50 +00:00
Owner

מה ולמה

פרק התכניות בהחלטה = בלוק ט (תכניות חלות / block-tet). עד היום מידע על תכניות הגיע לבלוק ט משני מקורות חלשים — documents.metadata.references.plans (regex רדוד, ללא תוקף) ו-appraiser_facts (תצלום עובדתי פר-שמאי-פר-תיק). לא היתה ישות קנונית לתכנית-כעצם-עולמי, ולכן אותן תכניות (מי/200, מי/820, 5166, תמ"א 38…) חזרו שוב ושוב והתוקף שלהן נגזר מחדש בכל תיק מתוך השומות — מקור-טעות וחוסר-עקביות; ונוסח-הציטוט בבלוק ט לא הוגדר ונסחף.

ה-PR מוסיף:

  1. מרשם-תכניות קנוני (טבלת plans, V38) — רשומה אחת לכל תכנית, שימוש חוזר בין תיקים: זהות + תוקף (פרסום למתן תוקף ברשומות + מס' ילקוט-הפרסומים) + משפט-ייעוד.
  2. משפט-ציטוט-תכנית קנוני לבלוק ט — מרונדר דטרמיניסטית מהמרשם (db.format_plan_citation), מוזרק ל-prompt; תאריך-הפרסום ומספר-הילקוט לעולם לא מנוסחים מחדש ע"י ה-LLM.
  3. ייבוא (backfill) מכל ההחלטות הקיימות (טיוטות + סופיי-דפנה) → scripts/backfill_plans_registry.py.

הכרעות-יו"ר שעוצבו בתכנון: היקף רזה (זהות+תוקף+ייעוד) · רשומות בלבד (לא עיתונות — התוקף נקבע בילקוט) · נוסח-הקורפוס המלא של דפנה.

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

  • נוגע / מקיים:
    • G1 / INV-DM2 / X1plan_number מנורמל בכתיבה (_normalize_plan_number, פורמט-בלבד; שומר תמ"א/תב"ע, מסיר "תכנית"); ציטוט/תצוגה ב-display_name/citation_formatted בנפרד.
    • G2 / INV-DM6 — מקור-אמת יחיד: המרשם הוא SSOT לזהות+תוקף; appraiser_facts ללא שינוי כ-SSOT לעובדת-שמאי פר-תיק. אין מסלול מקביל.
    • G3upsert_plan idempotent על המפתח הקנוני.
    • INV-DM4 / G9 / X8 — provenance מלא (source_case_number/source_document_id/model_used).
    • INV-DM5 / G10review_status ∈ {pending_review, approved, rejected} כמו halachot; תוקף משמש בכתיבה רק כשמאושר (plan_review). כלל-מיזוג: תוקף-מאושר לא נדרס — סתירה נרשמת ב-discrepancies (אין בליעה שקטה, §6).
    • INV-AH — משפט-התוקף דטרמיניסטי מהמרשם → אפס הזיית-תאריכים.
    • G5 — המרשם הוא טבלת-lookup (tsvector בלבד), לא קורפוס-אחזור רביעי (אין embeddings).
    • G11 / block-schema — נוסח-הציטוט הוא תוכן-משפטי (סמכות-יו"ר), מתועד ב-block-schema/SKILL.
    • X9 — extract/get-symmetry + envelope (ok/err) ב-6 כלי-ה-MCP.

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

  • קראתי את docs/spec/00-constitution.md + ספ-התחום (02-data-model, 04-analysis-writing, X1) לפני הכתיבה
  • השינוי לא יוצר מסלול מקביל ליכולת קיימת (G2) ולא מתקן תסמין בקריאה (G1)
  • לא הוספתי מגע-Paperclip מחוץ ל-Platform Port (G12) — leak-guard עבר על כל קבצי mcp-server/src שנגעתי בהם
  • אין בליעה שקטה — סתירת-תוקף נרשמת ב-discrepancies; מועמד-חילוץ פגום מדווח ב-warning
  • בדקתי מול gap-audit.md — אין FU/GAP ממופה על תכניות (פיצ'ר חדש)
  • בדיקות עוברות (ראה אימות)
  • data-migration: אין שינוי-נתונים הרסני; ה-backfill נכנס pending_review (chair-gated דרך plan_review), ברירת-מחדל --dry-run

אימות

הורץ עם mcp-server/.venv/bin/python מול ה-DB המשותף (V38 אדיטיבי + idempotent):

  • פונקציות דטרמיניסטיות (ללא DB): _normalize_plan_number (7 מקרים — תמ"א/תב"ע נשמרים, "תכנית" מוסר, gershayim→", רווחים סביב /), _coerce_plan_date (ISO + DD.MM.YYYY + ריקים), format_plan_citation (3 וריאנטים מול נוסח-הקורפוס) — PASS.
  • round-trip DB: מיגרציה V38 → upsert (נרמול-מפתח + רנדור ציטוט) → get_plan_by_number (דרך נרמול) → search_plansplan_review(approved) → re-upsert עם תוקף-סותר ⇒ המאושר לא נדרס + סתירה נרשמה → cleanup — PASS.
  • רישום-כלים: 6 כלי-ה-MCP (extract_plans/plan_get/plan_search/plan_list/plan_upsert/plan_review) רשומים ב-FastMCP — PASS.
  • שערים: leak_guard.py (G12) על 5 קבצי mcp-server — PASS · pyflakes undefined-names — NONE · py_compile על כל הקבצים — PASS.

הערה תפעולית: הכלים החדשים טרם נוספו ל-allowlist של סוכני Paperclip (CEO/researcher) — מסלול-הכתיבה אינו זקוק להם (ה-context-builder קורא מהמרשם אוטומטית); extract_plans/plan_review הם פעולות-יו"ר/CEO ויתווספו ל-allowlist + sync-cross-company כ-follow-up. UI לתור-האישור מגודר-עיצוב (Claude Design) ונדחה לגל נפרד — בינתיים האישור דרך plan_list/plan_review.

🤖 Generated with Claude Code

## מה ולמה פרק התכניות בהחלטה = **בלוק ט (תכניות חלות / `block-tet`)**. עד היום מידע על תכניות הגיע לבלוק ט משני מקורות חלשים — `documents.metadata.references.plans` (regex רדוד, ללא תוקף) ו-`appraiser_facts` (תצלום עובדתי פר-שמאי-פר-תיק). **לא היתה ישות קנונית לתכנית-כעצם-עולמי**, ולכן אותן תכניות (מי/200, מי/820, 5166, תמ"א 38…) חזרו שוב ושוב והתוקף שלהן נגזר מחדש בכל תיק מתוך השומות — מקור-טעות וחוסר-עקביות; ונוסח-הציטוט בבלוק ט לא הוגדר ונסחף. ה-PR מוסיף: 1. **מרשם-תכניות קנוני** (טבלת `plans`, V38) — רשומה אחת לכל תכנית, שימוש חוזר בין תיקים: זהות + תוקף (פרסום למתן תוקף ברשומות + מס' ילקוט-הפרסומים) + משפט-ייעוד. 2. **משפט-ציטוט-תכנית קנוני** לבלוק ט — מרונדר **דטרמיניסטית** מהמרשם (`db.format_plan_citation`), מוזרק ל-prompt; תאריך-הפרסום ומספר-הילקוט לעולם לא מנוסחים מחדש ע"י ה-LLM. 3. **ייבוא (backfill)** מכל ההחלטות הקיימות (טיוטות + סופיי-דפנה) → `scripts/backfill_plans_registry.py`. הכרעות-יו"ר שעוצבו בתכנון: היקף רזה (זהות+תוקף+ייעוד) · **רשומות בלבד** (לא עיתונות — התוקף נקבע בילקוט) · נוסח-הקורפוס המלא של דפנה. ## Invariants — הצהרה (חובה) - **נוגע / מקיים:** - **G1 / INV-DM2 / X1** — `plan_number` מנורמל **בכתיבה** (`_normalize_plan_number`, פורמט-בלבד; שומר תמ"א/תב"ע, מסיר "תכנית"); ציטוט/תצוגה ב-`display_name`/`citation_formatted` בנפרד. - **G2 / INV-DM6** — מקור-אמת יחיד: המרשם הוא SSOT לזהות+תוקף; `appraiser_facts` **ללא שינוי** כ-SSOT לעובדת-שמאי פר-תיק. אין מסלול מקביל. - **G3** — `upsert_plan` idempotent על המפתח הקנוני. - **INV-DM4 / G9 / X8** — provenance מלא (`source_case_number`/`source_document_id`/`model_used`). - **INV-DM5 / G10** — `review_status ∈ {pending_review, approved, rejected}` כמו `halachot`; תוקף משמש בכתיבה רק כשמאושר (`plan_review`). כלל-מיזוג: תוקף-מאושר **לא נדרס** — סתירה נרשמת ב-`discrepancies` (אין בליעה שקטה, §6). - **INV-AH** — משפט-התוקף דטרמיניסטי מהמרשם → אפס הזיית-תאריכים. - **G5** — המרשם הוא טבלת-lookup (tsvector בלבד), לא קורפוס-אחזור רביעי (אין embeddings). - **G11 / block-schema** — נוסח-הציטוט הוא תוכן-משפטי (סמכות-יו"ר), מתועד ב-block-schema/SKILL. - **X9** — extract/get-symmetry + envelope (ok/err) ב-6 כלי-ה-MCP. ## צ'קליסט — פרוטוקול כתיבת-קוד - [x] קראתי את `docs/spec/00-constitution.md` + ספ-התחום (02-data-model, 04-analysis-writing, X1) לפני הכתיבה - [x] השינוי **לא** יוצר מסלול מקביל ליכולת קיימת (G2) ולא מתקן תסמין בקריאה (G1) - [x] **לא** הוספתי מגע-Paperclip מחוץ ל-Platform Port (G12) — leak-guard עבר על כל קבצי `mcp-server/src` שנגעתי בהם - [x] אין בליעה שקטה — סתירת-תוקף נרשמת ב-`discrepancies`; מועמד-חילוץ פגום מדווח ב-warning - [x] בדקתי מול `gap-audit.md` — אין FU/GAP ממופה על תכניות (פיצ'ר חדש) - [x] בדיקות עוברות (ראה אימות) - [ ] data-migration: אין שינוי-נתונים הרסני; ה-backfill נכנס pending_review (chair-gated דרך `plan_review`), ברירת-מחדל `--dry-run` ## אימות הורץ עם `mcp-server/.venv/bin/python` מול ה-DB המשותף (V38 אדיטיבי + idempotent): - **פונקציות דטרמיניסטיות (ללא DB):** `_normalize_plan_number` (7 מקרים — תמ"א/תב"ע נשמרים, "תכנית" מוסר, gershayim→`"`, רווחים סביב `/`), `_coerce_plan_date` (ISO + DD.MM.YYYY + ריקים), `format_plan_citation` (3 וריאנטים מול נוסח-הקורפוס) — **PASS**. - **round-trip DB:** מיגרציה V38 → upsert (נרמול-מפתח + רנדור ציטוט) → `get_plan_by_number` (דרך נרמול) → `search_plans` → `plan_review`(approved) → re-upsert עם תוקף-סותר ⇒ **המאושר לא נדרס + סתירה נרשמה** → cleanup — **PASS**. - **רישום-כלים:** 6 כלי-ה-MCP (`extract_plans`/`plan_get`/`plan_search`/`plan_list`/`plan_upsert`/`plan_review`) רשומים ב-FastMCP — **PASS**. - **שערים:** `leak_guard.py` (G12) על 5 קבצי mcp-server — PASS · pyflakes undefined-names — NONE · `py_compile` על כל הקבצים — PASS. **הערה תפעולית:** הכלים החדשים טרם נוספו ל-allowlist של סוכני Paperclip (CEO/researcher) — מסלול-הכתיבה אינו זקוק להם (ה-context-builder קורא מהמרשם אוטומטית); `extract_plans`/`plan_review` הם פעולות-יו"ר/CEO ויתווספו ל-allowlist + sync-cross-company כ-follow-up. UI לתור-האישור מגודר-עיצוב (Claude Design) ונדחה לגל נפרד — בינתיים האישור דרך `plan_list`/`plan_review`. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
chaim added 1 commit 2026-06-14 13:47:33 +00:00
feat(plans): מרשם-תכניות קנוני (V38) + נוסח-ציטוט אחיד דטרמיניסטי לבלוק ט
All checks were successful
G12 Leak-Guard / leak-guard (pull_request) Successful in 4s
Lint — undefined names / undefined-names (pull_request) Successful in 10s
4be9cf8543
מוסיף ישות קנונית לתכניות בניין-עיר (תב"ע) שחוזרות בין תיקים — SSOT לזהות+תוקף
(פרסום למתן תוקף ברשומות + מס' ילקוט-הפרסומים) + משפט-ייעוד — במקום גזירה-מחדש
מהשומות בכל תיק. בלוק ט מצטט את התוקף בנוסח אחיד דטרמיניסטי (format_plan_citation),
כך שתאריך-פרסום/מס'-ילקוט לעולם לא מהוזים ע"י ה-LLM.

- DB: טבלת plans (V38) + CRUD + _normalize_plan_number (G1) + format_plan_citation;
  upsert idempotent (G3) עם כלל-מיזוג: תוקף מאושר לא נדרס — סתירה נרשמת ב-discrepancies
  (G10 / אין בליעה שקטה).
- services/plans_extractor.py: חילוץ עובדתי (claude CLI מקומי) → pending_review.
- block_writer.py: _build_plans_registry_context מזריק משפטי-ציטוט מאושרים בלבד לבלוק ט;
  תכניות חסרות/לא-מאושרות מסומנות במפורש (לא נבלעות).
- tools/plans.py + server.py: extract_plans / plan_get / plan_search / plan_list /
  plan_upsert / plan_review (שער-יו"ר G10), עם extract/get-symmetry (X9).
- scripts/backfill_plans_registry.py: ייבוא מקורפוס-ההחלטות (טיוטות + סופיי-דפנה).
- docs: block-schema (בלוק ט), SKILL, spec 02-data-model + 04.

Invariants: G1/INV-DM2/X1 (מזהה מנורמל בכתיבה) · G2/INV-DM6 (מקור-אמת יחיד, appraiser_facts
ללא שינוי) · G3 (upsert) · INV-DM4/G9 (provenance) · INV-DM5/G10 (review_status) ·
INV-AH (ציטוט דטרמיניסטי) · G5 (lookup לא קורפוס) · G11/block-schema (נוסח-הציטוט) · X9.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
chaim merged commit 09ea1ee599 into main 2026-06-14 13:47:50 +00:00
chaim deleted branch worktree-plans-registry 2026-06-14 13:47:50 +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#252