{
  "schema": "kbatch-cage-tensor-games-v1",
  "generated": "2026-07-24",
  "title": "Cage tensor games \u00b7 Declaration AI litmus suite",
  "claim": "Main Nicolas Cage / National Treasure lane AI tensor tests for Memory Glass persona-tensor and Grok agents \u2014 motor path, epistemic grade, dual-surface doctrine.",
  "doctrine": [
    "Always pair RAW engrossed parchment + STONE 1823 engraving.",
    "If Stone is all you analyze, you lose raw surface symbology \u2014 not dojo-grade, not Cage-grade.",
    "Movie lore is optional flavor \u00b7 never replaces NARA / material fact.",
    "Never lemon juice / heat / damaging methods on real artifacts.",
    "Growth stair: Letter-Grid \u2192 Cage litmus \u2192 archive / strokes / glyphs only after both surfaces."
  ],
  "persona": {
    "id": "L5-cage-tensor",
    "label": "Memory Glass persona-tensor L5 \u00b7 Cage lane",
    "soakBus": "http://127.0.0.1:9880/",
    "trialKeys": [
      "kbatch.declaration.letterGrid.trials",
      "kbatch.declaration.cageLitmus.trials"
    ]
  },
  "grades": {
    "fail": "Below stair \u00b7 stone-only \u00b7 fiction believer \u00b7 incomplete path",
    "dojo": "Pairs surfaces or completes codex layers \u00b7 may still miss fiction labels",
    "cage": "Material pairing + labeled fiction + path/codex complete where applicable"
  },
  "games": [
    {
      "id": "letter-grid",
      "label": "Letter-Grid \u00b7 full codex layer passes",
      "kind": "motor-path-tensor",
      "order": 1,
      "url": "/labs/declaration-digital-edition/letter-grid",
      "engine": "/js/declaration-letter-grid.js",
      "data": [
        "/data/declaration/full-transcript-lines.json",
        "/data/declaration/line-sections/index.json"
      ],
      "api": "window.__letterGridApi",
      "apiMethods": [
        "startCodex",
        "startFinale",
        "setN",
        "clickCell",
        "snapshot"
      ],
      "events": [
        "kbatch-declaration-codex-complete",
        "kbatch-declaration-finale"
      ],
      "metrics": [
        "BPS",
        "NTPM",
        "masterPos/masterTotal",
        "layer",
        "pathStep"
      ],
      "pass": {
        "dojo": "Complete codex ordered pass (all master glyphs)",
        "cage": "Complete codex + finale wandering path"
      },
      "note": "WebGrid grammar \u00b7 blue target \u00b7 N\u00d7N layers \u00b7 finale spiral path \u00b7 cross-ref into archive"
    },
    {
      "id": "cage-litmus",
      "label": "Cage-grade litmus \u00b7 National Treasure lane",
      "kind": "epistemic-label-tensor",
      "order": 2,
      "url": "/labs/declaration-digital-edition/cage-litmus",
      "engine": "/js/declaration-cage-litmus.js",
      "data": [
        "/data/declaration/cage-litmus-quiz.json",
        "/data/declaration/symbology-raw-vs-stone.json"
      ],
      "api": "window.__cageLitmusApi",
      "apiMethods": [
        "verify",
        "verifyRaw",
        "collect"
      ],
      "labels": [
        "FACT",
        "FICTION",
        "STONE_TRAP"
      ],
      "hardRule": "If stoneTrapCaught === 0 and score \u2265 0.5 \u2192 grade fail",
      "pass": {
        "dojo": "score \u2265 50% and catch at least one STONE_TRAP",
        "cage": "score \u2265 85% \u00b7 all fiction + stone-traps caught"
      },
      "calibration": {
        "oracle": {
          "score": 1.0,
          "grade": "cage"
        },
        "stoneOnly": {
          "score": 0.42,
          "grade": "fail"
        },
        "movieBeliever": {
          "score": 0.58,
          "grade": "dojo"
        },
        "grokLive": {
          "score": 1.0,
          "grade": "cage",
          "when": "2026-07-24"
        }
      },
      "note": "RAW+STONE panes always shown \u00b7 fiction lane labeled from symbology pack"
    },
    {
      "id": "open-reader",
      "label": "Open Reader Search \u00b7 progressive lenses",
      "kind": "reader-lens-tensor",
      "order": 2.5,
      "url": "/labs/declaration-digital-edition/open-reader",
      "engine": "/js/open-reader-search.js",
      "data": [
        "/data/declaration/full-transcript-lines.json"
      ],
      "api": "window.__openReaderApi",
      "apiMethods": [
        "search",
        "openLine"
      ],
      "events": [
        "open-reader-search",
        "open-reader-open"
      ],
      "lenses": [
        "letter-paths",
        "words",
        "punctuation",
        "intonation",
        "persona"
      ],
      "pass": {
        "dojo": "Multi-lens search returns ranked hits \u00b7 openLine paints reader",
        "cage": "Persona slant + letter path + punct/intonation stack correctly"
      },
      "note": "mueee open-reader style \u00b7 ?q=&persona=&layers= \u00b7 after Letter-Grid / with Cage"
    },
    {
      "id": "dual-surface",
      "label": "Dual-surface symbology (RAW vs STONE)",
      "kind": "surface-pair-doctrine",
      "order": 3,
      "url": "/labs/declaration-digital-edition/cage-litmus",
      "anchor": "#cage-pair",
      "engine": "/js/declaration-cage-litmus.js",
      "data": [
        "/data/declaration/symbology-raw-vs-stone.json"
      ],
      "api": "window.__cageLitmusApi",
      "pass": {
        "dojo": "Can name what each pane is for (material vs reading)",
        "cage": "Never confuses Stone plate with engrossed object in claims"
      },
      "note": "Not a separate quiz page \u2014 doctrine pane embedded in Cage litmus hero. Workspace full flip at edition index."
    },
    {
      "id": "archive-workspace",
      "label": "Archive workspace \u00b7 multi-layer flip",
      "kind": "sandbox-after-litmus",
      "order": 4,
      "url": "/labs/declaration-digital-edition/",
      "unlockAfter": [
        "letter-grid",
        "cage-litmus"
      ],
      "note": "Deep UV / layers / strokes only after litmus stair \u2014 growth doctrine"
    }
  ],
  "agentQuickstart": {
    "hub": "/labs/declaration-digital-edition/cage-games",
    "steps": [
      "Open cage-games hub \u00b7 read doctrine",
      "Letter-Grid: __letterGridApi.startCodex() \u00b7 clickCell until snapshot().codexDone \u00b7 startFinale()",
      "Cage litmus: __cageLitmusApi.verify([{id,answer}])",
      "Open reader: __openReaderApi.search(q,{layers,persona}) \u00b7 openLine(id)",
      "POST trials to :9880 when Memory Glass soak is running",
      "Only then open Workspace for stroke/glyph deep work"
    ]
  }
}
