From 4df2040a40b7a1f1bf2adc742e16bb6292978a0d Mon Sep 17 00:00:00 2001 From: Chaim Date: Tue, 7 Apr 2026 15:25:53 +0000 Subject: [PATCH] Fix: save_block_content now writes draft file + writer must update status MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two issues that caused QA agent to fail: 1. save_block_content saved to DB only — now also rebuilds drafts/decision.md 2. legal-writer.md now has explicit mandatory step: case_update(status="drafted") Without these, workflow_status reports has_draft=false and QA can't run. Co-Authored-By: Claude Opus 4.6 (1M context) --- .claude/agents/legal-writer.md | 15 +++++++-- .../src/legal_mcp/services/block_writer.py | 33 ++++++++++++++++++- 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/.claude/agents/legal-writer.md b/.claude/agents/legal-writer.md index 5435184..e0d3d54 100644 --- a/.claude/agents/legal-writer.md +++ b/.claude/agents/legal-writer.md @@ -81,12 +81,21 @@ tools: 3. שמור (`save_block_content`) 4. דווח התקדמות ל-Paperclip -### שלב 3: דיווח — חובה! -פרסם comment ב-Paperclip עם: +### שלב 3: סיום — חובה! + +**אחרי שכל הבלוקים נשמרו, חובה לבצע את שתי הפעולות הבאות:** + +1. **עדכן סטטוס התיק ל-drafted:** +``` +case_update(case_number, status="drafted") +``` + +2. **פרסם comment ב-Paperclip עם:** - אילו בלוקים נכתבו - ספירת מילים לכל בלוק - יחסי משקל (% מהמסמך) -- עדכן סטטוס ל-drafted + +**אם לא תעדכן סטטוס ל-drafted — בודק האיכות לא יוכל לרוץ!** ## בלוק י — דיון (הבלוק החשוב ביותר) diff --git a/mcp-server/src/legal_mcp/services/block_writer.py b/mcp-server/src/legal_mcp/services/block_writer.py index 18bb78b..08599e5 100644 --- a/mcp-server/src/legal_mcp/services/block_writer.py +++ b/mcp-server/src/legal_mcp/services/block_writer.py @@ -685,7 +685,10 @@ async def get_block_context(case_id: UUID, block_id: str, instructions: str = "" async def save_block_content(case_id: UUID, block_id: str, content: str) -> dict: - """Save block content written by Claude Code (or any external writer).""" + """Save block content written by Claude Code (or any external writer). + + Saves to DB and also writes/updates the draft file on disk. + """ if block_id not in BLOCK_CONFIG: raise ValueError(f"Unknown block: {block_id}") @@ -699,9 +702,37 @@ async def save_block_content(case_id: UUID, block_id: str, content: str) -> dict result["model_used"] = "claude-code" await store_block(UUID(decision["id"]), result) + + # Also write/update the draft file on disk + await _update_draft_file(case_id, UUID(decision["id"])) + return result +async def _update_draft_file(case_id: UUID, decision_id: UUID) -> None: + """Rebuild drafts/decision.md from all blocks in DB.""" + from pathlib import Path + + case = await db.get_case(case_id) + if not case: + return + + case_dir = config.find_case_dir(case["case_number"]) + draft_dir = case_dir / "drafts" + draft_dir.mkdir(parents=True, exist_ok=True) + + pool = await db.get_pool() + async with pool.acquire() as conn: + rows = await conn.fetch( + "SELECT content FROM decision_blocks WHERE decision_id = $1 AND content != '' ORDER BY block_index", + decision_id, + ) + + draft_path = draft_dir / "decision.md" + draft_path.write_text("\n\n".join(row["content"] for row in rows if row["content"]), encoding="utf-8") + logger.info("Draft file updated: %s (%d blocks)", draft_path, len(rows)) + + # ── Renumbering ─────────────────────────────────────────────────── async def renumber_all_blocks(decision_id: UUID) -> dict: