fix: prevent JSONB double-encoding on methodology save #6
Reference in New Issue
Block a user
Delete Branch "fix/methodology-jsonb-double-encoding"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
json.dumps()from asyncpg call — passreq.value(Python list/dict) directly with::jsonbso asyncpg serializes it correctly as a JSONB array/objectDISCUSSION_RULESdefault:"אסה רציפה"→"מאסה רציפה"Root Cause
json.dumps(list)produces a Pythonstr. When asyncpg receives a Pythonstrfor a::jsonb-typed parameter, it encodes it as a JSONB string value — not a JSONB array.Test plan
/methodology→ verifies saves and reloads as arrayGET /api/methodology/discussion_rules—universal.valueshould be a JSON array🤖 Generated with Claude Code
Two bugs caused all 5 interim blocks to fail with "Claude CLI failed (exit 1): unknown error": 1. source_context was embedded BOTH inside the prompt template (via {source_context}) AND prepended again in write_block — doubling every block's context size (232K chars × 2 = 465K chars). 2. _build_source_context loaded all 9 case documents for every block regardless of relevance. Fixes: - Remove the duplicate source_context prepend in write_block; the template already contains it via {source_context} - Add per-block document filtering (_BLOCK_DOC_TYPES): block-he/zayin → empty, block-chet → protocol only, block-tet → appraisals only - Add 400K char guard before calling claude -p with a descriptive error (vs opaque "exit 1: unknown error") - Add prompt-size warning and size info in claude_session error messages Result: block-he 0 chars, block-zayin 0 chars, block-vav ~172K, block-chet ~45K, block-tet ~300K (all under 400K limit) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>