{
  "schema": 1,
  "date": "2026-10-10",
  "sourceBaseline": "b9c857ed26603cab6e80b7ed68a0f96cf2e1cc95",
  "sourceState": "reviewable source snapshot on work; not a deployed release",
  "environment": {
    "host": "Codex Cloud",
    "node": "24.19.0",
    "next": "16.4.0"
  },
  "unitTests": {
    "passed": 63,
    "failed": 0,
    "files": 9,
    "method": "Vitest real run; independent exhaustive tiny-board enumerator, path checks, safe large-grid indices, Worker-boundary mocks, timer/history/sharing and synthetic OCR geometry; six synthetic structural OCR regressions cover merged selected tiles, missing row/column rejection, enclosed glyph regions and ambiguous light overlays",
    "report": "docs/artifacts/unit-results.json"
  },
  "verifiedCommands": {
    "build": {
      "passed": true,
      "staticPages": 47,
      "dailyRoute": "dynamic, New York date computed per request"
    },
    "typecheck": {
      "passed": true
    },
    "lint": {
      "passed": true,
      "errors": 0,
      "warnings": 0
    }
  },
  "limits": {
    "authorizedRealGameScreenshots": 0,
    "installedGameVersionsTested": 0,
    "physicalMobileDevicesTested": 0,
    "productionDomainDeployed": false,
    "recognitionAccuracyOnRealGameScreenshots": null,
    "officialGameDictionaryCompatibility": null,
    "publicSourceGameUIImagesEvaluated": 3,
    "representativeRealScreenshotCorpusAccuracy": null
  },
  "links": {
    "dictionaryManifest": "/dictionaries/manifest.json",
    "ocrMethod": "/benchmarks/ocr",
    "dictionaryMethod": "/benchmarks/dictionary-compatibility"
  },
  "browserTests": {
    "passed": 18,
    "failed": 0,
    "skipped": 0,
    "flaky": 0,
    "projects": [
      "desktop-chromium",
      "mobile-chromium-emulated"
    ],
    "browser": "Chromium 156.0.8078.4",
    "startedAt": "2026-10-10T11:49:14.059Z",
    "durationMs": 175124.441,
    "report": "docs/artifacts/browser-results.json",
    "conditions": "Cloud Chromium desktop and simulated iPhone 13 viewport, not physical devices. Complete workflow run before recognizer 1.1.0; post-1.1.0 targeted regressions and real public-source cases are recorded separately. Generated image fixtures; direct automatic crops and manual known-crop recognition recorded separately.",
    "recognizerVersion": "local-templates-1.0.0"
  },
  "contentAudit": {
    "publicPages": 41,
    "metric": "core-keyword-token-coverage",
    "method": "Whole-token core phrase occurrences multiplied by phrase token count, divided by all visible editorial body words. Related phrases measured independently and excluded from the numerator. Headings, alt text, nav/footer, forms and marked interactive UI excluded.",
    "targetPercent": [
      1.8,
      2.2
    ],
    "measuredPercentRange": [
      1.8120045300113252,
      2.188782489740082
    ],
    "bodyWordRange": [
      709,
      1140
    ],
    "allMappedRelatedPhrasesPresent": true,
    "decodedOriginalIllustrations": 41,
    "measuredAt": "2026-10-10T13:54:21.938Z",
    "report": "docs/artifacts/seo-content-audit.json"
  },
  "realScreenshotTests": {
    "uniquePublicSourceImages": 3,
    "developmentImages": 2,
    "separateSourceHeldoutImages": 1,
    "gameplayImages": 2,
    "instructionImages": 1,
    "sizes": [
      4
    ],
    "privateConsentedCorpusImages": 0,
    "recognizerVersion": "local-templates-1.1.0",
    "measuredAt": "2026-10-10T12:19:35.514Z",
    "manifestFrozenAt": "2026-10-10T11:57:40.502962+00:00",
    "sourceHashes": {
      "detect": "2ac535f3aa9de2251110611b3c2fece7e007bf6a1d38039a50a8c8fb7a0b73c0",
      "image": "0ed53f53273b62fac0a6c0551137527a0eb6106401b794670ab40363578b780e",
      "recognize": "ce25edf62ae02fd89d7af12ebdc505a182ceab5a5f503538585b6585b13623d5",
      "fallback": "f8efe2e7bb3a0577abadbdb8e159ffde084f1548b87be51c60849e9e6c225622",
      "screenshotInput": "c2daf597e156e3a627a950ed72b2ef195d808a4ad13f2568007946d1ff7bfc91"
    },
    "provenance": "Source-published as GamePigeon UI; original device, capture process and installed game version not independently authenticated. Convenience samples, not a representative accuracy corpus.",
    "originalImagesRedistributed": false,
    "baselineAutomatic": {
      "localizedBoards": 2,
      "correctCells": 29,
      "unknownCells": 17,
      "wrongNonemptyCells": 2,
      "totalCells": 48,
      "wholeBoardsCorrect": 1
    },
    "finalAutomatic": {
      "localizedBoards": 3,
      "correctCells": 47,
      "unknownCells": 1,
      "wrongNonemptyCells": 0,
      "totalCells": 48,
      "wholeBoardsCorrect": 2
    },
    "rawTesseractFallback": {
      "correctCells": 29,
      "unknownCells": 16,
      "wrongNonemptyCells": 3
    },
    "historicalAutomaticMerge": {
      "correctCells": 45,
      "unknownCells": 0,
      "wrongNonemptyCells": 3,
      "status": "Historical automatically merged UI; replaced after it worsened the development gameplay sample. Not the current policy."
    },
    "currentFallbackPolicy": {
      "mode": "Explicit per-cell suggestions; primary letters, review flags and corrections remain unchanged until user application.",
      "verified": true,
      "wrongSuggestionExplicitApplyAndUndoVerified": true,
      "userCorrectionSurvivedRepeatedFallback": true
    },
    "confirmedAndSolvedBoards": 3,
    "requiredPrimaryCorrections": 1,
    "sources": [
      {
        "id": "gworthin-game",
        "split": "development",
        "scene": "Gameplay cropped board with green selected tiles and white swipe overlay",
        "size": 4,
        "sourcePage": "https://github.com/gworthin/wordHunt-solver",
        "imageSHA256": "1e578c3b4a70efe398be540103ee177bebff254eb8152dd94629d0862148a3c2"
      },
      {
        "id": "gworthin-instructions",
        "split": "development",
        "scene": "Game instruction screenshot, not a random gameplay board; red tutorial swipe overlay",
        "size": 4,
        "sourcePage": "https://github.com/gworthin/wordHunt-solver",
        "imageSHA256": "5aff687f9e9fad6d741279a70d4de0d6a45b17e60cd18c2fc19a0f45a486c298"
      },
      {
        "id": "gamedev-board",
        "split": "heldout",
        "scene": "Cropped clean gameplay board presented by question author as an example of GamePigeon Word Hunt",
        "size": 4,
        "sourcePage": "https://gamedev.stackexchange.com/questions/200339/how-to-generate-boards-for-a-game-like-gamepigeons-word-hunt",
        "imageSHA256": "e3f0e88ab361d1eafe83824863415780e607fae4cb5636dbdc09a213c1172109"
      }
    ],
    "reports": {
      "manifest": "docs/artifacts/real-ocr-samples.json",
      "before": "docs/artifacts/real-ocr-baseline.json",
      "after": "docs/artifacts/real-ocr-final-review.json"
    },
    "browserCase": {
      "passed": 1,
      "uniqueImages": 3,
      "durationSeconds": 19.2,
      "conditions": "Same-case production review-interface rerun; not an additional blind evaluation."
    }
  },
  "browserRegressions": {
    "passed": 8,
    "failed": 0,
    "skipped": 0,
    "flaky": 0,
    "startedAt": "2026-10-10T12:22:03.286Z",
    "durationMs": 105973.86,
    "recognizerVersion": "local-templates-1.1.0",
    "fallbackPolicy": "explicit per-cell suggestions",
    "conditions": "Eight targeted Cloud Chromium desktop/emulated-mobile regressions after recognizer 1.1.0 and suggestion-only UI: complete recognition-to-history workflow, actual local WASM formats/fallback and cancellation, automatic versus known-crop 12-fixture matrix, stale jobs and solver cancellation. Not a repeat of all 18 prior workflow cases. Recorded before final presentation/layout polish, which has a separate validation record.",
    "report": "docs/artifacts/browser-ocr-regression-results.json"
  },
  "uiPolishValidation": {
    "majorLayoutWorkflowRun": {
      "passed": 4,
      "failed": 0,
      "skipped": 0,
      "flaky": 0,
      "startedAt": "2026-10-10T12:46:33.004Z",
      "durationMs": 36243.674999999996,
      "conditions": "Desktop and emulated-mobile complete workflow and local OCR format/suggestion/cancellation checks after the major layout polish, before the final narrow navigation and empty-word feedback adjustments.",
      "report": "docs/artifacts/browser-polish-flow-results.json"
    },
    "finalMobileWorkflowRun": {
      "passed": 1,
      "failed": 0,
      "skipped": 0,
      "flaky": 0,
      "startedAt": "2026-10-10T12:55:08.857Z",
      "durationMs": 11201.84,
      "conditions": "Latest final production presentation: emulated-mobile complete recognition, solving, path, practice, review and local-history workflow.",
      "report": "docs/artifacts/browser-polish-final-mobile-flow.json"
    },
    "focusedUIProbe": {
      "passed": true,
      "measuredAt": "2026-10-10T12:55:38.877Z",
      "browser": "Chromium 156.0.8078.4",
      "observations": 73,
      "viewportWidths": [
        320,
        360,
        390,
        640,
        768,
        1280
      ],
      "conditions": "Standalone actual Chromium assertions, touch emulation where applicable: document widths, navigation visibility, ordinary controls, contact/help page layouts, native large-board pan and right-column input, complete 49-tile compact/review paths, zoom size changes, local OCR suggestions and manual-edit preservation. Not a physical-device test or new algorithm accuracy estimate.",
      "report": "docs/artifacts/browser-ui-polish-final.json",
      "reproduce": "node tests/e2e/browser-polish-smoke.mjs"
    }
  },
  "historicalEvidenceBeforeAssetOptimizationCommit": "e048606953a50d27a4b31ce788dca11e0a260119",
  "assetDeliveryValidation": {
    "scope": "Lossless local Tesseract model delivery and cancellation/UI recovery; independent of the earlier recognition accuracy and workflow cohorts.",
    "historicalSourceCommit": "e048606953a50d27a4b31ce788dca11e0a260119",
    "recognizerVersion": "local-templates-1.1.0 (unchanged)",
    "modelVersion": "tessdata_fast 4.1.0 eng (unchanged decoded bytes)",
    "representations": {
      "raw": {
        "path": "public/ocr/eng.traineddata",
        "bytes": 4113088,
        "sha256": "7d4322bd2a7749724879683fc3912cb542f19906c83bcc1a52132556427170b2",
        "decodedBytes": 4113088,
        "decodedSHA256": "7d4322bd2a7749724879683fc3912cb542f19906c83bcc1a52132556427170b2",
        "matchesOriginal": true
      },
      "gzip": {
        "path": "public/ocr/eng.traineddata.gz",
        "bytes": 1962155,
        "sha256": "37d0ab3e791c1762f43e80f05187db859ce6c2d999112c9e979ac70c323c0220",
        "decodedBytes": 4113088,
        "decodedSHA256": "7d4322bd2a7749724879683fc3912cb542f19906c83bcc1a52132556427170b2",
        "matchesOriginal": true
      },
      "brotli": {
        "path": "public/ocr/brotli-fast-4.1.0/eng.traineddata",
        "bytes": 1633293,
        "sha256": "f17baf35df12ce5984dc589f61ff55e08560e1539d373a2b199610959abaab4e",
        "decodedBytes": 4113088,
        "decodedSHA256": "7d4322bd2a7749724879683fc3912cb542f19906c83bcc1a52132556427170b2",
        "matchesOriginal": true
      }
    },
    "independentIntegrity": {
      "passed": true,
      "measuredAt": "2026-10-10T13:44:06.416Z",
      "report": "docs/artifacts/ocr-asset-delivery-integrity.json"
    },
    "helperTests": {
      "passed": 6,
      "failed": 0,
      "files": 1,
      "report": "docs/artifacts/ocr-delivery-unit-results.json",
      "scope": "New transport helper assertions, separate from the historical 63-test core suite."
    },
    "supersededCandidate": {
      "passed": 0,
      "failed": 1,
      "interrupted": 1,
      "report": "docs/artifacts/browser-ocr-delivery-before-adapter-results.json",
      "cause": "Upstream Tesseract.js 7.0.0 initializes Lang[] with model data instead of language codes; corrected by the local initialize-only adapter. This failed candidate is excluded from successful counts."
    },
    "browserTests": {
      "passed": 2,
      "failed": 0,
      "skipped": 0,
      "flaky": 0,
      "startTime": "2026-10-10T13:54:12.924Z",
      "durationMs": 21073.260000000002,
      "projects": [
        "desktop Chromium",
        "emulated mobile Chromium"
      ],
      "report": "docs/artifacts/browser-ocr-delivery-results.json",
      "checks": [
        "native HTTP Brotli decoding and original model SHA-256",
        "cancellation does not initiate gzip recovery or apply late suggestions",
        "HTTP 503 and missing Content-Encoding each recover once using gzip",
        "manual letters and checked flags survive fallback; explicit candidate apply and undo"
      ]
    },
    "freshDelivery": {
      "measuredAt": "2026-10-10T13:54:53.038Z",
      "scope": "One fresh desktop Chromium context, localhost production server, no throttling; fresh Brotli-primary payload/integrity/UI-preservation measurement only. Gzip recovery was tested separately in two browser workflow cases; no recognition accuracy re-evaluation.",
      "payloadTotalBytes": 3133817,
      "payloads": [
        {
          "path": "/_next/static/chunks/23o_a_2f30qai.js",
          "kind": "javascript",
          "bodyBytes": 8231,
          "contentEncoding": "gzip"
        },
        {
          "path": "/ocr/brotli-fast-4.1.0/eng.traineddata",
          "kind": "ocr-model",
          "bodyBytes": 1633293,
          "contentEncoding": "br"
        },
        {
          "path": "/ocr/local-worker-7.0.0.js",
          "kind": "javascript",
          "bodyBytes": 522,
          "contentEncoding": null
        },
        {
          "path": "/ocr/worker-7.0.0.min.js",
          "kind": "javascript",
          "bodyBytes": 33865,
          "contentEncoding": "gzip"
        },
        {
          "path": "/ocr/tesseract-core-relaxedsimd-lstm.wasm.js",
          "kind": "core-with-embedded-WASM",
          "bodyBytes": 1457906,
          "contentEncoding": "gzip"
        }
      ],
      "payloadBoundary": "Incremental unique paths observed in actual browser fallback; body-only same-origin HTTP payload cross-check resolves Worker size API anomalies. No headers or chunk framing. Gzip core/JS, Content-Encoding br model. Browser-native decoded model hash verified; no isolated compression CPU benchmark.",
      "fallbackColdWallMs": 882,
      "clickToWorkerCreationMs": 91,
      "workerCreateToInitializeMs": 302.90000000037253,
      "timingBoundary": "Click to Worker creation includes lazy library import, model fetch, browser-native Brotli decoding and hash validation. Worker creation through initialize resolve then includes core download/WASM and data-backed engine initialization. Neither boundary isolates decompression CPU or phone performance.",
      "network": {
        "requests": 51,
        "external": 0,
        "requestBodies": 0,
        "nonGET": 0
      },
      "report": "docs/artifacts/browser-ocr-delivery-network.json"
    },
    "runtimeVerification": {
      "secureContext": "Brotli response natively decoded to 4,113,088 bytes, with original SHA-256 checked before Worker initialization. Non-cancel Brotli failure uses one gzip response with compressed SHA-256 validation.",
      "noWebCrypto": "Gzip recovery uses length and magic-byte checks; runtime SHA-256 is not claimed in this branch. Controlled helper coverage only.",
      "physicalMobileDevices": 0,
      "deployedVercelValidation": false
    },
    "sourceHashes": {
      "src/lib/ocr/fallback.ts": "670d3a4368d70129039882c5843d71d1cbaff10e9e8c4a2e4af7188083f93e21",
      "public/ocr/local-worker-7.0.0.js": "5e182522658d2b2bc9b3efc99d28285f2bc3269db0006f3e651076f9e09e5db7",
      "public/ocr/worker-7.0.0.min.js": "576b7df7e3393e137e51849357c9adb53fe7ac1bb69bfa06cf3d61520f182c6d",
      "next.config.ts": "55df975e16c227e9cc18a2ebb8bd243ed1850004d9a010229e3d0e035a64eb95"
    }
  }
}
