zorya-classifier 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (311) hide show
  1. package/NOTICE.md +2 -0
  2. package/README.md +37 -9
  3. package/dist/app/cli-arguments.d.ts +40 -0
  4. package/dist/app/cli-arguments.js +67 -0
  5. package/dist/app/create-classifier.d.ts +24 -0
  6. package/dist/app/create-classifier.js +226 -14
  7. package/dist/app/extraction-files.d.ts +9 -0
  8. package/dist/app/extraction-files.js +28 -0
  9. package/dist/cli.js +58 -14
  10. package/dist/entities/boundary-view.d.ts +29 -0
  11. package/dist/entities/boundary-view.js +1 -0
  12. package/dist/entities/contracts.d.ts +81 -1
  13. package/dist/entities/contracts.js +7 -0
  14. package/dist/entities/cutout-raster.d.ts +7 -0
  15. package/dist/entities/cutout-raster.js +1 -0
  16. package/dist/entities/object-proposals.d.ts +56 -0
  17. package/dist/entities/object-proposals.js +8 -0
  18. package/dist/entities/representation.d.ts +225 -0
  19. package/dist/entities/representation.js +33 -0
  20. package/dist/entities/segmentation-metadata.d.ts +11 -0
  21. package/dist/entities/segmentation-metadata.js +1 -0
  22. package/dist/entities/segmentation-verification.d.ts +31 -0
  23. package/dist/entities/segmentation-verification.js +1 -0
  24. package/dist/entities/segmentation.d.ts +164 -0
  25. package/dist/entities/segmentation.js +5 -0
  26. package/dist/entities/whole-object.d.ts +132 -0
  27. package/dist/entities/whole-object.js +7 -0
  28. package/dist/features/choice.d.ts +1 -1
  29. package/dist/features/choice.js +2 -2
  30. package/dist/features/segmentation/box-check.d.ts +10 -0
  31. package/dist/features/segmentation/box-check.js +299 -0
  32. package/dist/features/segmentation/mask.d.ts +6 -0
  33. package/dist/features/segmentation/mask.js +89 -0
  34. package/dist/features/segmentation/packed-mask.d.ts +5 -0
  35. package/dist/features/segmentation/packed-mask.js +53 -0
  36. package/dist/index.d.ts +6 -1
  37. package/dist/infrastructure/boundary-view.d.ts +2 -0
  38. package/dist/infrastructure/boundary-view.js +263 -0
  39. package/dist/infrastructure/openrouter-common.d.ts +8 -8
  40. package/dist/infrastructure/openrouter-vision.d.ts +3 -0
  41. package/dist/infrastructure/openrouter-vision.js +5 -0
  42. package/dist/infrastructure/raster.d.ts +10 -1
  43. package/dist/infrastructure/raster.js +99 -4
  44. package/dist/infrastructure/segmentation/box-presentation.d.ts +2 -0
  45. package/dist/infrastructure/segmentation/box-presentation.js +136 -0
  46. package/dist/infrastructure/segmentation/cutout-raster.d.ts +3 -0
  47. package/dist/infrastructure/segmentation/cutout-raster.js +79 -0
  48. package/dist/infrastructure/segmentation/grabcut/index.d.ts +17 -0
  49. package/dist/infrastructure/segmentation/grabcut/index.js +121 -0
  50. package/dist/infrastructure/segmentation/grabcut/worker-inference.d.ts +47 -0
  51. package/dist/infrastructure/segmentation/grabcut/worker-inference.js +260 -0
  52. package/dist/infrastructure/segmentation/index.d.ts +2 -0
  53. package/dist/infrastructure/segmentation/index.js +2 -0
  54. package/dist/infrastructure/segmentation/mobile-sam/index.d.ts +66 -0
  55. package/dist/infrastructure/segmentation/mobile-sam/index.js +478 -0
  56. package/dist/infrastructure/segmentation/mobile-sam/worker-inference.d.ts +149 -0
  57. package/dist/infrastructure/segmentation/mobile-sam/worker-inference.js +845 -0
  58. package/dist/infrastructure/segmentation/native-child.d.ts +23 -0
  59. package/dist/infrastructure/segmentation/native-child.js +297 -0
  60. package/dist/infrastructure/segmentation/native-protocol.d.ts +923 -0
  61. package/dist/infrastructure/segmentation/native-protocol.js +242 -0
  62. package/dist/infrastructure/segmentation/native-worker.d.ts +1 -0
  63. package/dist/infrastructure/segmentation/native-worker.js +93 -0
  64. package/dist/infrastructure/segmentation/probe-backend.d.ts +1 -0
  65. package/dist/infrastructure/segmentation/probe-backend.js +31 -0
  66. package/dist/infrastructure/segmentation/proposal-presentation.d.ts +3 -0
  67. package/dist/infrastructure/segmentation/proposal-presentation.js +371 -0
  68. package/dist/infrastructure/segmentation/verify-asset.d.ts +4 -0
  69. package/dist/infrastructure/segmentation/verify-asset.js +32 -0
  70. package/dist/infrastructure/text-representation.d.ts +23 -0
  71. package/dist/infrastructure/text-representation.js +226 -0
  72. package/dist/infrastructure/vision-chat.d.ts +1 -1
  73. package/dist/infrastructure/vision-chat.js +13 -4
  74. package/dist/openai-compatible.d.ts +3 -0
  75. package/dist/openai-compatible.js +4 -0
  76. package/dist/openrouter.d.ts +2 -2
  77. package/dist/openrouter.js +1 -1
  78. package/dist/processes/boundary-state.d.ts +12 -0
  79. package/dist/processes/boundary-state.js +196 -0
  80. package/dist/processes/classify.d.ts +2 -1
  81. package/dist/processes/classify.js +21 -3
  82. package/dist/processes/extract-from-region.d.ts +19 -0
  83. package/dist/processes/extract-from-region.js +415 -0
  84. package/dist/processes/extract.d.ts +25 -0
  85. package/dist/processes/extract.js +223 -0
  86. package/dist/processes/locate.d.ts +2 -1
  87. package/dist/processes/locate.js +84 -11
  88. package/dist/processes/proposal-location.d.ts +19 -0
  89. package/dist/processes/proposal-location.js +396 -0
  90. package/dist/processes/whole-object.d.ts +7 -0
  91. package/dist/processes/whole-object.js +272 -0
  92. package/dist/segmentation.d.ts +10 -0
  93. package/dist/segmentation.js +4 -0
  94. package/dist/shared/input-budget.d.ts +7 -0
  95. package/dist/shared/input-budget.js +21 -0
  96. package/docs/0.2.0-plan.md +190 -0
  97. package/docs/README.ru.md +43 -14
  98. package/docs/acceptance.md +116 -3
  99. package/docs/api.md +12 -6
  100. package/docs/architecture.md +22 -7
  101. package/docs/benchmarks.md +10 -0
  102. package/docs/categorical-presence-port.md +26 -0
  103. package/docs/evidence/v02/baseline.json +1043 -0
  104. package/docs/evidence/v02/boundary-variants.md +17 -0
  105. package/docs/evidence/v02/box-confirmation-dev40/README.md +15 -0
  106. package/docs/evidence/v02/box-confirmation-dev40/component-refinement.json +246 -0
  107. package/docs/evidence/v02/box-confirmation-dev40/evaluation.json +1663 -0
  108. package/docs/evidence/v02/box-confirmation-dev40/provenance.json +130 -0
  109. package/docs/evidence/v02/box-confirmation-dev40/report.json +127 -0
  110. package/docs/evidence/v02/box-confirmation-dev40-freeze-20261020-v1.json +230 -0
  111. package/docs/evidence/v02/box-confirmation-method-selection-20261020-v1.json +85 -0
  112. package/docs/evidence/v02/box-heldout-cancelled-before-dispatch-20261021-v1.json +32 -0
  113. package/docs/evidence/v02/box-heldout-combined-seal-20261021-v1.json +89 -0
  114. package/docs/evidence/v02/box-heldout-evaluator-truth-seal-20261021-v1.json +61 -0
  115. package/docs/evidence/v02/box-heldout-exclusion-audit-20261020-v1.json +81 -0
  116. package/docs/evidence/v02/box-heldout-map-seal-20261021-v1.json +48 -0
  117. package/docs/evidence/v02/box-heldout-photo-seal-20261020-v1.json +62 -0
  118. package/docs/evidence/v02/box-heldout-run-freeze-20261021-v1.json +61 -0
  119. package/docs/evidence/v02/box-heldout-source-review-20261020-v1.json +134 -0
  120. package/docs/evidence/v02/box-heldout-ui-seal-20261020-v1.json +44 -0
  121. package/docs/evidence/v02/calculator-proof-root-review-20261020-v1.json +63 -0
  122. package/docs/evidence/v02/categorical-dev40-freeze.json +94 -0
  123. package/docs/evidence/v02/categorical-dev40-preserve.json +460 -0
  124. package/docs/evidence/v02/categorical-dev40-target-only.json +460 -0
  125. package/docs/evidence/v02/categorical-heldout-admission-20261020-v3.json +215 -0
  126. package/docs/evidence/v02/categorical-heldout-admission-20261020-v4.json +270 -0
  127. package/docs/evidence/v02/categorical-heldout-dispatch-authorization-20261020-v4.json +79 -0
  128. package/docs/evidence/v02/categorical-heldout-predispatch-20261020-v3.json +57 -0
  129. package/docs/evidence/v02/categorical-heldout-producer-source-map-v4.json +262 -0
  130. package/docs/evidence/v02/categorical-heldout-producer-source-map.json +263 -0
  131. package/docs/evidence/v02/categorical-heldout-run-freeze-20261020-v3.json +35 -0
  132. package/docs/evidence/v02/categorical-heldout-run-freeze-20261020-v4.json +35 -0
  133. package/docs/evidence/v02/categorical-heldout-v4/candidate-evaluation.json +2812 -0
  134. package/docs/evidence/v02/categorical-heldout-v4/candidate-physical-receipts.json +15261 -0
  135. package/docs/evidence/v02/categorical-heldout-v4/candidate-provenance.json +131 -0
  136. package/docs/evidence/v02/categorical-heldout-v4/control-evaluation.json +855 -0
  137. package/docs/evidence/v02/categorical-heldout-v4/control-physical-receipts.json +4402 -0
  138. package/docs/evidence/v02/categorical-heldout-v4/control-provenance.json +31 -0
  139. package/docs/evidence/v02/categorical-heldout-v4/mask-normalized-exploratory.json +682 -0
  140. package/docs/evidence/v02/categorical-heldout-v4/paired-qualification.json +21 -0
  141. package/docs/evidence/v02/categorical-heldout-v4/report.json +258 -0
  142. package/docs/evidence/v02/categorical-presence-dev6.json +144 -0
  143. package/docs/evidence/v02/categorical-presence-dev6.md +18 -0
  144. package/docs/evidence/v02/categorical-vision-method-selection.json +90 -0
  145. package/docs/evidence/v02/checked-region-component-v1/README.md +7 -0
  146. package/docs/evidence/v02/checked-region-component-v1/evidence.json +311 -0
  147. package/docs/evidence/v02/checked-region-resource-interrupted-2b0d09f.json +102 -0
  148. package/docs/evidence/v02/checked-region-segmentation-resource-4df544c-receipt.json +167 -0
  149. package/docs/evidence/v02/checked-region-segmentation-resource-4df544c-root-review.json +58 -0
  150. package/docs/evidence/v02/checked-region-segmentation-resource-987ac32-receipt.json +158 -0
  151. package/docs/evidence/v02/ci-012b935.json +17 -0
  152. package/docs/evidence/v02/ci-0c365cb.json +372 -0
  153. package/docs/evidence/v02/ci-185bde8.json +32 -0
  154. package/docs/evidence/v02/ci-24f849f.json +95 -0
  155. package/docs/evidence/v02/ci-25c19cd.json +375 -0
  156. package/docs/evidence/v02/ci-2922caf.json +375 -0
  157. package/docs/evidence/v02/ci-29357d7.json +29 -0
  158. package/docs/evidence/v02/ci-32aa90d.json +24 -0
  159. package/docs/evidence/v02/ci-35e3064.json +376 -0
  160. package/docs/evidence/v02/ci-4331b1b.json +384 -0
  161. package/docs/evidence/v02/ci-43b7426.json +376 -0
  162. package/docs/evidence/v02/ci-450439c.json +373 -0
  163. package/docs/evidence/v02/ci-46283fe.json +29 -0
  164. package/docs/evidence/v02/ci-4c9c09f.json +34 -0
  165. package/docs/evidence/v02/ci-5579646.json +27 -0
  166. package/docs/evidence/v02/ci-6f9cc15.json +127 -0
  167. package/docs/evidence/v02/ci-7c1051f.json +27 -0
  168. package/docs/evidence/v02/ci-9837888.json +34 -0
  169. package/docs/evidence/v02/ci-987ac32.json +29 -0
  170. package/docs/evidence/v02/ci-9d00fe5.json +25 -0
  171. package/docs/evidence/v02/ci-9f85acc.json +127 -0
  172. package/docs/evidence/v02/ci-be275a6.json +201 -0
  173. package/docs/evidence/v02/ci-c107ddf.json +372 -0
  174. package/docs/evidence/v02/ci-c35f67d.json +127 -0
  175. package/docs/evidence/v02/ci-c5eddd8.json +32 -0
  176. package/docs/evidence/v02/ci-d2042e0.json +372 -0
  177. package/docs/evidence/v02/ci-d684259.json +375 -0
  178. package/docs/evidence/v02/ci-e0c190b.json +127 -0
  179. package/docs/evidence/v02/ci-e551253.json +372 -0
  180. package/docs/evidence/v02/ci-f9d4633.json +29 -0
  181. package/docs/evidence/v02/dev1-proposal-evaluation.md +13 -0
  182. package/docs/evidence/v02/dev2-mobile-sam-proposal-oracle.md +21 -0
  183. package/docs/evidence/v02/dev2-proposal-evaluation.md +21 -0
  184. package/docs/evidence/v02/fresh-development.md +16 -0
  185. package/docs/evidence/v02/fresh-native-numeric/artifact-hashes.json +9 -0
  186. package/docs/evidence/v02/fresh-native-numeric/evaluation-root-v1.json +568 -0
  187. package/docs/evidence/v02/fresh-native-numeric/run-manifest.json +342 -0
  188. package/docs/evidence/v02/fresh-native-numeric/summary.json +5654 -0
  189. package/docs/evidence/v02/fresh-native-outline-axis/artifact-hashes.json +9 -0
  190. package/docs/evidence/v02/fresh-native-outline-axis/evaluation-root-v1.json +568 -0
  191. package/docs/evidence/v02/fresh-native-outline-axis/run-manifest.json +378 -0
  192. package/docs/evidence/v02/fresh-native-outline-axis/summary.json +5605 -0
  193. package/docs/evidence/v02/fresh-text/README.md +23 -0
  194. package/docs/evidence/v02/fresh-text/ascii-contours-v1/classify-followup-run-manifest.json +405 -0
  195. package/docs/evidence/v02/fresh-text/ascii-contours-v1/classify-followup-summary.json +1646 -0
  196. package/docs/evidence/v02/fresh-text/ascii-contours-v1/evaluation.json +568 -0
  197. package/docs/evidence/v02/fresh-text/ascii-contours-v1/original-run-manifest.json +404 -0
  198. package/docs/evidence/v02/fresh-text/ascii-contours-v1/original-summary.json +4416 -0
  199. package/docs/evidence/v02/fresh-text/ascii-luma-v1/classify-followup-run-manifest.json +405 -0
  200. package/docs/evidence/v02/fresh-text/ascii-luma-v1/classify-followup-summary.json +1646 -0
  201. package/docs/evidence/v02/fresh-text/ascii-luma-v1/evaluation.json +568 -0
  202. package/docs/evidence/v02/fresh-text/ascii-luma-v1/original-run-manifest.json +404 -0
  203. package/docs/evidence/v02/fresh-text/ascii-luma-v1/original-summary.json +4647 -0
  204. package/docs/evidence/v02/fresh-text/ascii-svg-layered-v1/classify-followup-run-manifest.json +405 -0
  205. package/docs/evidence/v02/fresh-text/ascii-svg-layered-v1/classify-followup-summary.json +846 -0
  206. package/docs/evidence/v02/fresh-text/ascii-svg-layered-v1/evaluation.json +568 -0
  207. package/docs/evidence/v02/fresh-text/ascii-svg-layered-v1/original-run-manifest.json +404 -0
  208. package/docs/evidence/v02/fresh-text/ascii-svg-layered-v1/original-summary.json +1789 -0
  209. package/docs/evidence/v02/fresh-text/no-image-control/evaluation.json +568 -0
  210. package/docs/evidence/v02/fresh-text/no-image-control/original-run-manifest.json +404 -0
  211. package/docs/evidence/v02/fresh-text/no-image-control/original-summary.json +3953 -0
  212. package/docs/evidence/v02/fresh-text/palette-grid-v1/classify-followup-run-manifest.json +405 -0
  213. package/docs/evidence/v02/fresh-text/palette-grid-v1/classify-followup-summary.json +1646 -0
  214. package/docs/evidence/v02/fresh-text/palette-grid-v1/evaluation.json +568 -0
  215. package/docs/evidence/v02/fresh-text/palette-grid-v1/original-run-manifest.json +404 -0
  216. package/docs/evidence/v02/fresh-text/palette-grid-v1/original-summary.json +3974 -0
  217. package/docs/evidence/v02/fresh-text/pixel-rle-v1/classify-followup-run-manifest.json +405 -0
  218. package/docs/evidence/v02/fresh-text/pixel-rle-v1/classify-followup-summary.json +1646 -0
  219. package/docs/evidence/v02/fresh-text/pixel-rle-v1/evaluation.json +568 -0
  220. package/docs/evidence/v02/fresh-text/pixel-rle-v1/original-run-manifest.json +404 -0
  221. package/docs/evidence/v02/fresh-text/pixel-rle-v1/original-summary.json +4945 -0
  222. package/docs/evidence/v02/fresh-text/report.json +284 -0
  223. package/docs/evidence/v02/fresh-text/svg-contours-v1/classify-followup-run-manifest.json +405 -0
  224. package/docs/evidence/v02/fresh-text/svg-contours-v1/classify-followup-summary.json +846 -0
  225. package/docs/evidence/v02/fresh-text/svg-contours-v1/evaluation.json +568 -0
  226. package/docs/evidence/v02/fresh-text/svg-contours-v1/original-run-manifest.json +404 -0
  227. package/docs/evidence/v02/fresh-text/svg-contours-v1/original-summary.json +2189 -0
  228. package/docs/evidence/v02/heldout-evaluation-20261020.md +37 -0
  229. package/docs/evidence/v02/heldout-input-derivation.md +18 -0
  230. package/docs/evidence/v02/integration-0c365cb.json +90 -0
  231. package/docs/evidence/v02/integration-25c19cd.json +52 -0
  232. package/docs/evidence/v02/integration-35e3064.json +41 -0
  233. package/docs/evidence/v02/integration-4331b1b.json +42 -0
  234. package/docs/evidence/v02/integration-4c9c09f.json +46 -0
  235. package/docs/evidence/v02/integration-8010aad.json +48 -0
  236. package/docs/evidence/v02/integration-c1aa640.json +41 -0
  237. package/docs/evidence/v02/integration-eea1790.json +46 -0
  238. package/docs/evidence/v02/integration-fa82e65.json +42 -0
  239. package/docs/evidence/v02/jpeg-transport-offline.json +268 -0
  240. package/docs/evidence/v02/jpeg-transport-offline.md +7 -0
  241. package/docs/evidence/v02/local-archive-cleanup.json +59 -0
  242. package/docs/evidence/v02/native-base64-after.json +30 -0
  243. package/docs/evidence/v02/native-base64-before.json +32 -0
  244. package/docs/evidence/v02/native-checked-region-windows-46283fe.json +248 -0
  245. package/docs/evidence/v02/native-checked-region-windows-987ac32.json +141 -0
  246. package/docs/evidence/v02/native-grabcut-windows-4c494a3-run2.json +148 -0
  247. package/docs/evidence/v02/native-grabcut-windows-4c494a3-run3.json +148 -0
  248. package/docs/evidence/v02/native-grabcut-windows-4c494a3.json +56 -0
  249. package/docs/evidence/v02/native-proposal-windows-0c365cb.json +148 -0
  250. package/docs/evidence/v02/native-proposal-windows-450439c.json +156 -0
  251. package/docs/evidence/v02/native-proposal-windows-4c9c09f-retry1.json +147 -0
  252. package/docs/evidence/v02/native-proposal-windows-4c9c09f.json +52 -0
  253. package/docs/evidence/v02/native-region-windows-efc9318.json +163 -0
  254. package/docs/evidence/v02/native-windows-eea1790-baseline.json +198 -0
  255. package/docs/evidence/v02/native-windows-eea1790.json +228 -0
  256. package/docs/evidence/v02/ordinary-luna-axis/run-manifest.json +99 -0
  257. package/docs/evidence/v02/ordinary-luna-axis/summary.json +811 -0
  258. package/docs/evidence/v02/owned-temp-cleanup-20261020-v1.json +28 -0
  259. package/docs/evidence/v02/presentation-paired-20261020.json +1438 -0
  260. package/docs/evidence/v02/proposal-resource-soak-261dc23.json +201 -0
  261. package/docs/evidence/v02/proposal-resource-soak-450439c-receipt.md +13 -0
  262. package/docs/evidence/v02/reconstructed-c03-box.json +41 -0
  263. package/docs/evidence/v02/region-seeded-dev-v1/README.md +17 -0
  264. package/docs/evidence/v02/region-seeded-dev-v1/evaluation.json +260 -0
  265. package/docs/evidence/v02/region-seeded-dev-v2/README.md +15 -0
  266. package/docs/evidence/v02/region-seeded-dev-v2/evaluation.json +232 -0
  267. package/docs/evidence/v02/region-seeded-dev-v3-candidate-only/README.md +9 -0
  268. package/docs/evidence/v02/region-seeded-dev-v3-candidate-only/control-identity-failure.json +22 -0
  269. package/docs/evidence/v02/region-seeded-dev-v3-candidate-only/evaluation.json +160 -0
  270. package/docs/evidence/v02/region-seeded-dev-v3-control-r2/README.md +9 -0
  271. package/docs/evidence/v02/region-seeded-dev-v3-control-r2/attempt-accounting.json +55 -0
  272. package/docs/evidence/v02/region-seeded-dev-v3-control-r2/evaluation.json +136 -0
  273. package/docs/evidence/v02/region-seeded-development-control-r2-freeze-20261021.json +132 -0
  274. package/docs/evidence/v02/region-seeded-development-freeze-20261021-v1.json +167 -0
  275. package/docs/evidence/v02/region-seeded-development-freeze-20261021-v2.json +186 -0
  276. package/docs/evidence/v02/region-seeded-development-freeze-20261021-v3.json +205 -0
  277. package/docs/evidence/v02/region-seeded-heldout-cancelled-before-dispatch-20261021-v2.json +20 -0
  278. package/docs/evidence/v02/region-seeded-heldout-dispatch-authorization-20261021-v3.json +47 -0
  279. package/docs/evidence/v02/region-seeded-heldout-readiness-audit-20261021-v3.json +125 -0
  280. package/docs/evidence/v02/region-seeded-heldout-run-freeze-20261021-v2.json +234 -0
  281. package/docs/evidence/v02/region-seeded-heldout-run-freeze-20261021-v3.json +357 -0
  282. package/docs/evidence/v02/region-seeded-heldout-v3/README.md +19 -0
  283. package/docs/evidence/v02/region-seeded-heldout-v3/evaluation-summary.json +445 -0
  284. package/docs/evidence/v02/region-seeded-method-selection-20261021-v2.json +66 -0
  285. package/docs/evidence/v02/region-seeded-method-selection-20261021-v3.json +120 -0
  286. package/docs/evidence/v02/region-segmentation-resource-0ba4c87-receipt.json +156 -0
  287. package/docs/evidence/v02/resource-soak-linux-8010aad.json +125 -0
  288. package/docs/evidence/v02/screen-v2-terminal-evaluation.md +22 -0
  289. package/docs/evidence/v02/seed-outline/run-manifest.json +59 -0
  290. package/docs/evidence/v02/seed-outline/summary.json +487 -0
  291. package/docs/evidence/v02/seed-unbounded/run-manifest.json +80 -0
  292. package/docs/evidence/v02/seed-unbounded/summary.json +730 -0
  293. package/docs/evidence/v02/segmentation/README.md +21 -0
  294. package/docs/evidence/v02/segmentation/component-comparison-summary.json +240 -0
  295. package/docs/evidence/v02/segmentation/provenance/MOBILE-SAM-LICENSE.txt +201 -0
  296. package/docs/evidence/v02/segmentation/provenance/OPENCV-LICENSE.txt +202 -0
  297. package/docs/evidence/v02/segmentation/provenance/mobile-sam-download-receipt.json +29 -0
  298. package/docs/evidence/v02/segmentation/provenance/mobile-sam-graph-audit.json +214 -0
  299. package/docs/evidence/v02/segmentation/provenance/mobile-sam-model-metadata.json +166 -0
  300. package/docs/evidence/v02/split-choice-noul-dev6.json +72 -0
  301. package/docs/evidence/v02/split-choice-noul-dev6.md +11 -0
  302. package/docs/evidence/v02/supported-vision-screen-20261020.md +65 -0
  303. package/docs/evidence/v02/wesnoth-1.16.11-minimap-projection-source-audit.md +56 -0
  304. package/docs/evidence/v02/wesnoth-proof-root-review-20261020-v1.json +76 -0
  305. package/docs/operations.md +8 -2
  306. package/docs/plan.md +2 -0
  307. package/docs/publishing.md +16 -1
  308. package/docs/research/text-transport-audit.md +66 -0
  309. package/docs/v02-usage.md +164 -0
  310. package/docs/vision-results.md +31 -2
  311. package/package.json +30 -5
@@ -0,0 +1,29 @@
1
+ {
2
+ "modelRepository": "Acly/MobileSAM",
3
+ "revision": "0d3b403339b4674a82493d5e97964dd78089ddc8",
4
+ "budgetBytes": 314572800,
5
+ "downloadedBytes": 61154975,
6
+ "files": [
7
+ {
8
+ "file": "mobile_sam_image_encoder.onnx",
9
+ "url": "https://huggingface.co/Acly/MobileSAM/resolve/0d3b403339b4674a82493d5e97964dd78089ddc8/mobile_sam_image_encoder.onnx",
10
+ "bytes": 28157093,
11
+ "sha256": "580f5fb648ea1062c0aabc26217aed56921985f03f0cbbd852bba81d760cc749",
12
+ "downloadDurationMs": 2495.53
13
+ },
14
+ {
15
+ "file": "sam_mask_decoder_multi.onnx",
16
+ "url": "https://huggingface.co/Acly/MobileSAM/resolve/0d3b403339b4674a82493d5e97964dd78089ddc8/sam_mask_decoder_multi.onnx",
17
+ "bytes": 16496559,
18
+ "sha256": "8976b90a87ba50a6a72217a5ff994f7d25ce16f2229fcc1ed259e1294c622ffe",
19
+ "downloadDurationMs": 2254.584
20
+ },
21
+ {
22
+ "file": "sam_mask_decoder_single.onnx",
23
+ "url": "https://huggingface.co/Acly/MobileSAM/resolve/0d3b403339b4674a82493d5e97964dd78089ddc8/sam_mask_decoder_single.onnx",
24
+ "bytes": 16501323,
25
+ "sha256": "93915fc7c993ab9d59ab8c9ccd3bce37f7509c81ab4150a74abd4d2abbd8570d",
26
+ "downloadDurationMs": 1931.268
27
+ }
28
+ ]
29
+ }
@@ -0,0 +1,214 @@
1
+ [
2
+ {
3
+ "file": "sam_mask_decoder_single.onnx",
4
+ "irVersion": 8,
5
+ "producer": "pytorch",
6
+ "producerVersion": "2.0.1",
7
+ "opsets": [
8
+ {
9
+ "domain": "",
10
+ "version": 17
11
+ }
12
+ ],
13
+ "nodes": 1199,
14
+ "operators": {
15
+ ":Constant": 362,
16
+ ":Add": 69,
17
+ ":Div": 36,
18
+ ":Mul": 40,
19
+ ":Sub": 6,
20
+ ":MatMul": 49,
21
+ ":Sin": 2,
22
+ ":Cos": 2,
23
+ ":Concat": 48,
24
+ ":Unsqueeze": 109,
25
+ ":Shape": 116,
26
+ ":Expand": 6,
27
+ ":Equal": 11,
28
+ ":Not": 1,
29
+ ":Cast": 56,
30
+ ":Conv": 3,
31
+ ":ReduceMean": 6,
32
+ ":Pow": 3,
33
+ ":Sqrt": 3,
34
+ ":Erf": 4,
35
+ ":Transpose": 32,
36
+ ":Gather": 119,
37
+ ":Reshape": 40,
38
+ ":ConstantOfShape": 5,
39
+ ":Where": 5,
40
+ ":Split": 4,
41
+ ":Slice": 7,
42
+ ":Softmax": 7,
43
+ ":LayerNormalization": 9,
44
+ ":Relu": 12,
45
+ ":ConvTranspose": 2,
46
+ ":Gemm": 15,
47
+ ":ArgMax": 1,
48
+ ":Range": 2,
49
+ ":Flatten": 2,
50
+ ":Resize": 2,
51
+ ":ReduceMax": 1,
52
+ ":Reciprocal": 1,
53
+ ":Floor": 1
54
+ },
55
+ "firstOperators": [
56
+ "Constant",
57
+ "Constant",
58
+ "Add",
59
+ "Constant",
60
+ "Div",
61
+ "Constant",
62
+ "Mul",
63
+ "Constant",
64
+ "Sub",
65
+ "MatMul"
66
+ ],
67
+ "resizeAttributes": [
68
+ {
69
+ "coordinate_transformation_mode": "half_pixel",
70
+ "cubic_coeff_a": null,
71
+ "mode": "linear",
72
+ "nearest_mode": "floor"
73
+ },
74
+ {
75
+ "coordinate_transformation_mode": "half_pixel",
76
+ "cubic_coeff_a": null,
77
+ "mode": "linear",
78
+ "nearest_mode": "floor"
79
+ }
80
+ ],
81
+ "externalInitializerNames": []
82
+ },
83
+ {
84
+ "file": "mobile_sam_image_encoder.onnx",
85
+ "irVersion": 8,
86
+ "producer": "pytorch",
87
+ "producerVersion": "2.0.1",
88
+ "opsets": [
89
+ {
90
+ "domain": "",
91
+ "version": 17
92
+ }
93
+ ],
94
+ "nodes": 1887,
95
+ "operators": {
96
+ ":Constant": 767,
97
+ ":Sub": 6,
98
+ ":Div": 26,
99
+ ":Transpose": 98,
100
+ ":Shape": 58,
101
+ ":Gather": 55,
102
+ ":Unsqueeze": 227,
103
+ ":Concat": 117,
104
+ ":Cast": 12,
105
+ ":ConstantOfShape": 11,
106
+ ":Reshape": 128,
107
+ ":Slice": 34,
108
+ ":Pad": 11,
109
+ ":Conv": 29,
110
+ ":Erf": 23,
111
+ ":Add": 99,
112
+ ":Mul": 78,
113
+ ":LayerNormalization": 20,
114
+ ":MatMul": 60,
115
+ ":Split": 10,
116
+ ":Softmax": 10,
117
+ ":ReduceMean": 4,
118
+ ":Pow": 2,
119
+ ":Sqrt": 2
120
+ },
121
+ "firstOperators": [
122
+ "Constant",
123
+ "Sub",
124
+ "Constant",
125
+ "Div",
126
+ "Transpose",
127
+ "Shape",
128
+ "Constant",
129
+ "Gather",
130
+ "Shape",
131
+ "Constant"
132
+ ],
133
+ "resizeAttributes": [],
134
+ "externalInitializerNames": []
135
+ },
136
+ {
137
+ "file": "sam_mask_decoder_multi.onnx",
138
+ "irVersion": 8,
139
+ "producer": "pytorch",
140
+ "producerVersion": "2.0.1",
141
+ "opsets": [
142
+ {
143
+ "domain": "",
144
+ "version": 17
145
+ }
146
+ ],
147
+ "nodes": 1142,
148
+ "operators": {
149
+ ":Constant": 345,
150
+ ":Add": 66,
151
+ ":Div": 36,
152
+ ":Mul": 37,
153
+ ":Sub": 5,
154
+ ":MatMul": 49,
155
+ ":Sin": 2,
156
+ ":Cos": 2,
157
+ ":Concat": 45,
158
+ ":Unsqueeze": 107,
159
+ ":Shape": 109,
160
+ ":Expand": 6,
161
+ ":Equal": 11,
162
+ ":Not": 1,
163
+ ":Cast": 53,
164
+ ":Conv": 3,
165
+ ":ReduceMean": 6,
166
+ ":Pow": 3,
167
+ ":Sqrt": 3,
168
+ ":Erf": 4,
169
+ ":Transpose": 32,
170
+ ":Gather": 110,
171
+ ":Reshape": 36,
172
+ ":ConstantOfShape": 5,
173
+ ":Where": 5,
174
+ ":Split": 4,
175
+ ":Slice": 7,
176
+ ":Softmax": 7,
177
+ ":LayerNormalization": 9,
178
+ ":Relu": 12,
179
+ ":ConvTranspose": 2,
180
+ ":Gemm": 15,
181
+ ":Resize": 2,
182
+ ":ReduceMax": 1,
183
+ ":Reciprocal": 1,
184
+ ":Floor": 1
185
+ },
186
+ "firstOperators": [
187
+ "Constant",
188
+ "Constant",
189
+ "Add",
190
+ "Constant",
191
+ "Div",
192
+ "Constant",
193
+ "Mul",
194
+ "Constant",
195
+ "Sub",
196
+ "MatMul"
197
+ ],
198
+ "resizeAttributes": [
199
+ {
200
+ "coordinate_transformation_mode": "half_pixel",
201
+ "cubic_coeff_a": null,
202
+ "mode": "linear",
203
+ "nearest_mode": "floor"
204
+ },
205
+ {
206
+ "coordinate_transformation_mode": "half_pixel",
207
+ "cubic_coeff_a": null,
208
+ "mode": "linear",
209
+ "nearest_mode": "floor"
210
+ }
211
+ ],
212
+ "externalInitializerNames": []
213
+ }
214
+ ]
@@ -0,0 +1,166 @@
1
+ [
2
+ {
3
+ "file": "mobile_sam_image_encoder.onnx",
4
+ "initializationMs": 119.023259,
5
+ "inputs": [
6
+ {
7
+ "name": "input_image",
8
+ "isTensor": true,
9
+ "type": "float32",
10
+ "shape": ["image_height", "image_width", 3]
11
+ }
12
+ ],
13
+ "outputs": [
14
+ {
15
+ "name": "image_embeddings",
16
+ "isTensor": true,
17
+ "type": "float32",
18
+ "shape": [1, 256, 64, 64]
19
+ }
20
+ ]
21
+ },
22
+ {
23
+ "file": "sam_mask_decoder_multi.onnx",
24
+ "initializationMs": 83.34738200000001,
25
+ "inputs": [
26
+ {
27
+ "name": "image_embeddings",
28
+ "isTensor": true,
29
+ "type": "float32",
30
+ "shape": [1, 256, 64, 64]
31
+ },
32
+ {
33
+ "name": "point_coords",
34
+ "isTensor": true,
35
+ "type": "float32",
36
+ "shape": [1, "num_points", 2]
37
+ },
38
+ {
39
+ "name": "point_labels",
40
+ "isTensor": true,
41
+ "type": "float32",
42
+ "shape": [1, "num_points"]
43
+ },
44
+ {
45
+ "name": "mask_input",
46
+ "isTensor": true,
47
+ "type": "float32",
48
+ "shape": [1, 1, 256, 256]
49
+ },
50
+ {
51
+ "name": "has_mask_input",
52
+ "isTensor": true,
53
+ "type": "float32",
54
+ "shape": [1]
55
+ },
56
+ {
57
+ "name": "orig_im_size",
58
+ "isTensor": true,
59
+ "type": "float32",
60
+ "shape": [2]
61
+ }
62
+ ],
63
+ "outputs": [
64
+ {
65
+ "name": "masks",
66
+ "isTensor": true,
67
+ "type": "float32",
68
+ "shape": [
69
+ "Resizemasks_dim_0",
70
+ "Resizemasks_dim_1",
71
+ "Resizemasks_dim_2",
72
+ "Resizemasks_dim_3"
73
+ ]
74
+ },
75
+ {
76
+ "name": "iou_predictions",
77
+ "isTensor": true,
78
+ "type": "float32",
79
+ "shape": ["Gemmiou_predictions_dim_0", 4]
80
+ },
81
+ {
82
+ "name": "low_res_masks",
83
+ "isTensor": true,
84
+ "type": "float32",
85
+ "shape": [
86
+ "Reshapelow_res_masks_dim_0",
87
+ "Reshapelow_res_masks_dim_1",
88
+ "Reshapelow_res_masks_dim_2",
89
+ "Reshapelow_res_masks_dim_3"
90
+ ]
91
+ }
92
+ ]
93
+ },
94
+ {
95
+ "file": "sam_mask_decoder_single.onnx",
96
+ "initializationMs": 89.630123,
97
+ "inputs": [
98
+ {
99
+ "name": "image_embeddings",
100
+ "isTensor": true,
101
+ "type": "float32",
102
+ "shape": [1, 256, 64, 64]
103
+ },
104
+ {
105
+ "name": "point_coords",
106
+ "isTensor": true,
107
+ "type": "float32",
108
+ "shape": [1, "num_points", 2]
109
+ },
110
+ {
111
+ "name": "point_labels",
112
+ "isTensor": true,
113
+ "type": "float32",
114
+ "shape": [1, "num_points"]
115
+ },
116
+ {
117
+ "name": "mask_input",
118
+ "isTensor": true,
119
+ "type": "float32",
120
+ "shape": [1, 1, 256, 256]
121
+ },
122
+ {
123
+ "name": "has_mask_input",
124
+ "isTensor": true,
125
+ "type": "float32",
126
+ "shape": [1]
127
+ },
128
+ {
129
+ "name": "orig_im_size",
130
+ "isTensor": true,
131
+ "type": "float32",
132
+ "shape": [2]
133
+ }
134
+ ],
135
+ "outputs": [
136
+ {
137
+ "name": "masks",
138
+ "isTensor": true,
139
+ "type": "float32",
140
+ "shape": [
141
+ "Resizemasks_dim_0",
142
+ "Resizemasks_dim_1",
143
+ "Resizemasks_dim_2",
144
+ "Resizemasks_dim_3"
145
+ ]
146
+ },
147
+ {
148
+ "name": "iou_predictions",
149
+ "isTensor": true,
150
+ "type": "float32",
151
+ "shape": ["Unsqueezeiou_predictions_dim_0", 1]
152
+ },
153
+ {
154
+ "name": "low_res_masks",
155
+ "isTensor": true,
156
+ "type": "float32",
157
+ "shape": [
158
+ "Unsqueezelow_res_masks_dim_0",
159
+ 1,
160
+ "Unsqueezelow_res_masks_dim_2",
161
+ "Unsqueezelow_res_masks_dim_3"
162
+ ]
163
+ }
164
+ ]
165
+ }
166
+ ]
@@ -0,0 +1,72 @@
1
+ {
2
+ "schema": "zorya-v02-independent-pilot-evaluation-v1",
3
+ "evaluation": {
4
+ "evaluator": "manual independent application of frozen DEV truth and benchmark gate",
5
+ "evaluatorSourceSha256": "6e12a97f476551d4414e6ab04e187c7a274696ce3e91d1547ab7bd77b366cb8e",
6
+ "truthSha256": "793e26845deaa2cb56748ef270b8cb02877218d680068573f02e5af92b26af6a",
7
+ "inputManifestSha256": "6c9ed29d8586c7887ae0861fc853baf203cb43790df4959390da4b5cc9ac679a"
8
+ },
9
+ "producer": {
10
+ "profileId": "split-choice-sol-noul-native-luna-sam-v1",
11
+ "runId": "v02-fresh-split-choice-noul-dev6-2026-10-20T154929763Z-35a3ef5c",
12
+ "status": "complete",
13
+ "plannedCases": 6,
14
+ "completedCases": 6,
15
+ "missingCases": 0,
16
+ "canonicalSummarySha256": "a62bd4452aa703c83ebc920f0b8b7521ebe3e6909750425391756f384bfb49f1",
17
+ "prettySummaryFileSha256": "5b9557c12b60d2ffb8c22cb617da4c4c5e2f13bbe57255c399629af5f5cb4402",
18
+ "runManifestSha256": "267e74c2e62ec05ba9de316618d59e9d85010d364edc1a0679d41166927ab826",
19
+ "completionMarkerSha256": "557abe705ec31c8d8bacfb6be62f585dc606d9ff250d62a09bd8f30e4438aebe",
20
+ "outerFinalSealSha256": "e69a26ff9fe1e501b0edfbb6dc5c2469e598456ccf969761f6754c1320f6a9cb",
21
+ "variantSha256": "f400457eb7778b8a57a51153a15654d3d4bcda63ad4a797674804b57d1514dfd",
22
+ "producerSourceSha256": "d19ab5e6c17bfd84d81d4389302dc2d0f301aa2a833aee9770aceeac22340368",
23
+ "pilotControllerSha256": "35102c61a45c64440231ac1cfc7a974c34101986040d08f5aa8dc18edda2fb69",
24
+ "pilotRunnerSha256": "b8b7c49aaf527a00baa7cb11a009424d278aec7d1c9e67427930c5886fb40810",
25
+ "choiceNoulPortSha256": "27e8a6d9c5819315f98749fb27e15568f6d301bc1d2c91e1c022c50183e5cfe4",
26
+ "policy": {
27
+ "maxPhysicalCalls": 100,
28
+ "maxCostUsd": 5,
29
+ "admittedPhysicalCalls": 26,
30
+ "knownCostUsd": 0.1424405,
31
+ "unknownCostCalls": 1,
32
+ "reservedUnknownCostUsd": 0.05,
33
+ "inFlightCallsAtClose": 0
34
+ }
35
+ },
36
+ "metrics": {
37
+ "classification": {
38
+ "correct": 4,
39
+ "denominator": 6,
40
+ "accuracy": 0.6666666667,
41
+ "errors": ["photo-dev-absent-02", "photo-dev-absent-04"]
42
+ },
43
+ "wholeObjectPositiveLocalization": {
44
+ "correct": 0,
45
+ "denominator": 2,
46
+ "caseOutcomes": {
47
+ "photo-dev-present-01": "unknown:extent-uncertain",
48
+ "photo-dev-present-02": "not-found:absent-in-evaluated-region"
49
+ }
50
+ },
51
+ "negativeFalseLocations": {
52
+ "falseLocations": 0,
53
+ "denominator": 4,
54
+ "caseOutcomes": {
55
+ "photo-dev-absent-01": "not-found",
56
+ "photo-dev-absent-02": "not-found",
57
+ "photo-dev-absent-03": "failed:INVALID_RESPONSE",
58
+ "photo-dev-absent-04": "not-found"
59
+ }
60
+ },
61
+ "mask": {
62
+ "successfulExtractions": 0,
63
+ "scoredInstances": 0,
64
+ "reason": "No case produced an extraction mask; no mask-quality claim is available."
65
+ }
66
+ },
67
+ "decision": {
68
+ "status": "FAIL",
69
+ "reason": "Pilot gate required at least one correct whole-object positive localization of two and zero false locations among four verified negatives; positive localization was 0/2.",
70
+ "full40DispatchEligible": false
71
+ }
72
+ }
@@ -0,0 +1,11 @@
1
+ # Split Choice/NoUL DEV6 pilot evaluation
2
+
3
+ This is an independent evaluation of the frozen six-case DEV pilot for the caller-owned split Choice/NoUL route. It is a pilot only; it does not qualify the variant for the full 40-case DEV run.
4
+
5
+ The producer completed all six planned cases. Classification was correct on 4/6 cases (66.7%). Whole-object localization succeeded on 0/2 positive cases: one returned `unknown` with `extent-uncertain`, and one returned `not-found`. There were 0 false locations on the four verified negatives; one negative localization failed with `INVALID_RESPONSE`, and the other three returned `not-found`. No extraction mask was produced, so this pilot provides no mask-quality result.
6
+
7
+ The predeclared pilot gate required at least one correct positive whole-object localization and zero false locations on the four negatives. The negative condition passed, but the positive condition failed. The variant was therefore ineligible for the full 40-case DEV run. All producer failures and costs remain included in the counts.
8
+
9
+ The producer closed with 26 admitted physical calls, $0.1424405 known cost, one call with unknown cost covered by the $0.05 reserve, and zero in-flight calls. Its configured limits were 100 calls and $5.
10
+
11
+ Hashes, case-level outcomes, and the exact gate verdict are recorded in [split-choice-noul-dev6.json](split-choice-noul-dev6.json). The JSON contains hashes for the producer summary, run manifest, completion markers, variant, controller, runner, split-port implementation, evaluator source, DEV inputs, and DEV truth.
@@ -0,0 +1,65 @@
1
+ # Supported vision screen: independent evaluation
2
+
3
+ This is a 20-photo DEV screen, not the full 40-photo DEV gate. Both routes are closed and were evaluated independently after the final run seal. Accuracy is the primary comparison; latency is unranked because the screen ran during the concurrent resource soak. Neither route qualifies for winner freeze or heldout evaluation from this screen alone.
4
+
5
+ ## Frozen inputs and outputs
6
+
7
+ | Artifact | SHA-256 |
8
+ | ----------------------------------------- | ------------------------------------------------------------------ |
9
+ | Run manifest | `b97b44e9640ab37ae7269e24a91df4c84ba4b8e1c6f2ad0189440c0052ee0208` |
10
+ | Screen controller | `6442a38e24e51eefc12cf8e88bc21acf78f9723bb881c2c53bb8d1f735251c6b` |
11
+ | Final pair seal | `1e13039fd12cb136df5ab1f69475b627b368e4f76296cf82ad42121d89b367ec` |
12
+ | DEV photo inputs | `6c9ed29d8586c7887ae0861fc853baf203cb43790df4959390da4b5cc9ac679a` |
13
+ | Independent photo truth | `793e26845deaa2cb56748ef270b8cb02877218d680068573f02e5af92b26af6a` |
14
+ | Qwen profile summary | `a14b1d56a14e65337daa8080bbdbfd356e0096f25d8cb7165e95f6764a37ab9d` |
15
+ | GPT-6 Sol profile summary | `16304c8e8363dce36399c585c6831f3bc46fb3ed2e86ae93a4024e3597edd1ac` |
16
+ | Independent aggregate evaluation | `df7450f763753aea2b2e1c93a1015967065d3b6a722723b47a039444ae19f721` |
17
+ | Sol per-reference box IoU/coverage detail | `c332f6583b842ca9152784ef38a794a41a0b95d092d30de41b8eff57a28bedf6` |
18
+
19
+ The evaluation verified the exact raw hashes, source file hashes, receipt ledgers, route completion markers, budgets, case IDs, input image hashes and truth hash. Producer source HEAD changed from `a6c2683af6615e5496fec449abb3f27f91d86050` to `03b8febe01cb242a23d87a50e0a7932915c7dfce` across a clean documentation-only change; all pinned producer source hashes remained unchanged. The pair made 166 physical calls at known cost `$1.717302148`, with zero unknown charges and zero in-flight calls. Latency ranking was disabled.
20
+
21
+ ## Whole-object and classification results
22
+
23
+ All 20 cases were reported for each route: 16 positive photos and 4 verified negatives. The whole-object match rule requires both IoU ≥ 0.5 and visible-reference coverage ≥ 0.9 for the same instance. Classification is reported separately.
24
+
25
+ | Route | Classification | Positive whole-object matches | Negative false locations | Other localization outcomes |
26
+ | ----------------------------------------------------- | -------------: | ----------------------------: | -----------------------: | -------------------------------------------------------------------------- |
27
+ | Qwen 3.7 Flash / Alibaba, JSON object, reasoning none | 19/20 | 0/16 | 0/4 | 19 `INVALID_RESPONSE` failures and 1 unknown; no positive box was returned |
28
+ | GPT-6 Sol / OpenAI, JSON schema, reasoning none | 19/20 | 6/16 | 2/4 | 7 unknowns, 1 correct negative `not-found`, 0 transport/protocol failures |
29
+
30
+ For GPT-6 Sol, the best reference-instance values for positive cases with returned boxes were:
31
+
32
+ | Case | Best IoU | Visible-reference coverage | Match |
33
+ | --------------------------- | -------: | -------------------------: | ------- |
34
+ | `photo-dev-present-01` | 0.8767 | 0.9890 | Pass |
35
+ | `photo-dev-present-02` | 0.6855 | 0.9787 | Pass |
36
+ | `photo-dev-present-03` | 0.3280 | 0.3280 | Fail |
37
+ | `photo-dev-present-04`–`06` | — | — | Unknown |
38
+ | `photo-dev-present-07` | 0.9629 | 0.9636 | Pass |
39
+ | `photo-dev-present-08` | 0.0728 | 0.1618 | Fail |
40
+ | `photo-dev-present-09` | 0.9762 | 0.9762 | Pass |
41
+ | `photo-dev-present-10` | 0.4786 | 0.4866 | Fail |
42
+ | `photo-dev-present-11`–`12` | — | — | Unknown |
43
+ | `photo-dev-present-13` | 0.8753 | 0.9900 | Pass |
44
+ | `photo-dev-present-14` | 0.9888 | 0.9888 | Pass |
45
+ | `photo-dev-present-15` | 0.5477 | 0.5477 | Fail |
46
+ | `photo-dev-present-16` | — | — | Unknown |
47
+
48
+ The two false locations were on negative cases `photo-dev-absent-02` and `photo-dev-absent-04`; `photo-dev-absent-01` was unknown and `photo-dev-absent-03` was correctly not found. The complete per-instance box overlaps, including secondary reference instances, are retained in the pinned detail artifact above.
49
+
50
+ The negative labels remain the original frozen target categories. Two examples are semantically adjacent: the `Tree` negative shows a close-up plant fruit with a foreground trunk or stem, and the `Bowl` negative shows egg-shaped tableware. These are retained unchanged; the false-location count is specific to the authored target classes and should be interpreted with that ambiguity in mind.
51
+
52
+ ## Extraction masks
53
+
54
+ The independent truth contains masks for 5 of 20 photos, covering 7 reference instances. Mask IoU uses a separate ≥ 0.8 threshold and does not follow from a correct box.
55
+
56
+ | Route | Scored annotated cases | Scored reference instances | Instances passing IoU ≥ 0.8 | Other mask results |
57
+ | -------------- | ---------------------: | -------------------------: | --------------------------: | -------------------------------------------------------------------------- |
58
+ | Qwen 3.7 Flash | 0/5 | 0/7 | 0 | All 5 annotated cases unavailable; route returned no extractable masks |
59
+ | GPT-6 Sol | 4/5 | 6/7 | 2/7, in 2 cases | One annotated case unavailable; mean IoU across 6 scored instances: 0.4131 |
60
+
61
+ GPT-6 Sol's scored reference-instance IoUs were 0 and 0.0002 for case 08; 0.9462 for case 09; 0.8041 for case 13; and 0.0048 and 0.7229 for case 15. Fifteen cases were unannotated and are excluded from mask-quality denominators.
62
+
63
+ ## Interpretation
64
+
65
+ This screen establishes only these exact route outcomes on the pinned 20-photo DEV set. Qwen classification was mostly correct, but its object stage produced 19 response failures. GPT-6 Sol had better whole-object and mask results in this sample, with two false locations and seven unknowns; these results do not establish universal model superiority or monotonic gains from model strength. Full 40-case DEV, the remaining independent UI/map strata, resource/platform gates and a new winner freeze are still required before heldout evaluation.
@@ -0,0 +1,56 @@
1
+ # Wesnoth 1.16.11 minimap projection source audit
2
+
3
+ This is a source-only geometry audit. It does not qualify any captured screenshot, inspect cohort pixels or truth, or establish that a capture used the expected map/layout.
4
+
5
+ ## Pinned sources
6
+
7
+ All source links refer to the upstream `1.16.11` tag, not current master.
8
+
9
+ | Source | SHA-256 |
10
+ | ---------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ |
11
+ | [`src/minimap.cpp`](https://raw.githubusercontent.com/wesnoth/wesnoth/1.16.11/src/minimap.cpp) | `e889375b80b7f886b403954e3ee02ee48c16240fb8d24bbecdb5a9224ed6c030` |
12
+ | [`src/display.cpp`](https://raw.githubusercontent.com/wesnoth/wesnoth/1.16.11/src/display.cpp) | `20203f564470d3f8ddf01bd560472257f9785f1ad178422c38f60a77e0b465b0` |
13
+ | [`src/sdl/utils.cpp`](https://raw.githubusercontent.com/wesnoth/wesnoth/1.16.11/src/sdl/utils.cpp) | `ee66d5a2b3d1b8aa6205aba69e5215963a7c8c77d801a1c0401b6f6afbe4e249` |
14
+ | [`src/sdl/rect.hpp`](https://raw.githubusercontent.com/wesnoth/wesnoth/1.16.11/src/sdl/rect.hpp) | `c4e1bc99a269a7242ffe4d272d87c41f995a209263f078f7342b512d79f1c6a8` |
15
+ | [`src/map/map.hpp`](https://raw.githubusercontent.com/wesnoth/wesnoth/1.16.11/src/map/map.hpp) | `33e13a400bdbd8e4c9b16d3ece31226c4f0c20a2c6512db153b86021d9e376bc` |
16
+ | [`src/map/map.cpp`](https://raw.githubusercontent.com/wesnoth/wesnoth/1.16.11/src/map/map.cpp) | `91627ad840ec9c7a0d09e5d90b8dbaf5141d568f47347fccd26be6f2786a684a` |
17
+ | [`src/terrain/translation.cpp`](https://raw.githubusercontent.com/wesnoth/wesnoth/1.16.11/src/terrain/translation.cpp) | `535930dd53ee6e897796e355dc37e3faf23968db18087eaacdcbb1dabcb1c91f` |
18
+
19
+ The curator capture scripts audited read-only were `capture_wesnoth.py` (`8762609d2eb22e4f70086135824dcc48e0adbb65c32b89f14609f2e0a3b10178`) and `capture_wesnoth_layer.py` (`df2c25850d9b4bf835d4ef7cfe0416c84718dbdb9d37cb865bad659700c9c84c`).
20
+
21
+ ## Projection before compositing
22
+
23
+ `read_game_map` stores serialized `map_data[row][column]` at the same tile-array coordinates; `gamemap::read` supplies border offset `(1,1)`. The playable game coordinate for raw map cell `(c,r)` is therefore `(x,y)=(c-1,r-1)`. A playable raw cell has `1 <= c < Wraw-1` and `1 <= r < Hraw-1`.
24
+
25
+ `getMinimap` uses `s=24` if terrain drawing and terrain coding are both enabled, and `s=4` otherwise. The unscaled bitmap is `Cw=map.w()*3s/4`, `Ch=map.h()*s`; the map border is excluded from these dimensions. For game coordinate `(x,y)`, the loop computes:
26
+
27
+ ```text
28
+ left = x * 3s/4 - s/4
29
+ top = y * s + (s/4) * (odd(x) ? 1 : -1) - s/4
30
+ ```
31
+
32
+ Thus odd columns have `top=y*s`, even columns `top=y*s-s/2`. The village draw fills the half-open rectangle `[left,left+3s/4) × [top,top+s)` with an opaque RGB color after drawing that cell's terrain. The fill is clipped to the unscaled minimap bitmap. These coordinates describe the cell's requested fill, not necessarily the final support after later drawing operations.
33
+
34
+ ## Compositing caveat and correction
35
+
36
+ The loop is row-major (`y` outer, `x` inner), and terrain is drawn before the village fill for each cell. An initial review incorrectly concluded that this guarantees the full target fill survives: it assumed a target cell would be drawn again in the next row. That is false—the next-row cell at the same `x` is a different game cell and its hex is vertically shifted.
37
+
38
+ For example, with `s=24`, target `(x=1,y=1)` requests fill `[12,30) × [24,48)`. Later cell `(x=0,y=2)` draws terrain into `[-6,18) × [36,60)`, overlapping `[12,18) × [36,48)` after the target's village fill. Terrain tiles come from `image::HEXED` and are alpha-composited; without the specific terrain image's alpha values, source code alone cannot say whether those overlap pixels preserve or overwrite the village signal. Therefore the fill rectangle is only a geometric upper bound on final changed support in terrain-coded mode. Do not claim its full rectangle as the final mask or exact bounding box from formulas alone.
39
+
40
+ In non-terrain-coded mode, terrain uses fill rectangles with the same `3s/4 × s` footprint, so the above 24×24 alpha-tile overlap does not apply. The source-level statement still does not validate screenshot layout or capture correctness.
41
+
42
+ ## Resampling and placement
43
+
44
+ The minimap bitmap is fitted into requested area `(areaW,areaH)` with `q=min(areaW/Cw, areaH/Ch)`, then dimensions are truncated: `Fw=int(Cw*q)`, `Fh=int(Ch*q)`. `scale_surface_sharp` stores `xratio=Cw/Fw` and `yratio=Ch/Fh` as C++ `float`, initializes `xsrc` and `ysrc` to `0.0f`, and advances each accumulator by its ratio after each destination pixel. The index read is `static_cast<int>(xsrc)` / `static_cast<int>(ysrc)` (truncation, equal to floor for these nonnegative positions). It is not equivalent at every edge to calculating `int(destinationIndex * ratio)` independently with floating-point multiplication.
45
+
46
+ For the 4p map geometry used by the excluded proof, the unscaled bitmap is `648×864` and output bitmap is `159×212`. Both axes therefore use the same ratio, `648/159 = 864/212`, stored as float32 `4.075471878051758` (`0x40826a44`). Repeating the source expression `ysrc += yratio` yields `ysrc=215.99992370605469` at destination row `53`, so the sampled source index is `215`. Computing the row independently as a rounded float32 multiplication gives `float32(53*yratio)=216.00001525878906`, which truncates to `216`. The same recurrence/multiply difference occurs at destination row `106` (`431` versus `432`). This is the source-level reason a sample immediately before an exclusive source edge can survive at an output position where ideal-rational projection puts it outside.
47
+
48
+ The minimap forms village fill rectangles with integer `{left,top,width=scale*3/4,height=scale}` and calls `sdl::fill_surface_rect`. In `src/sdl/rect.hpp` that helper directly calls `SDL_FillRect`. Its integer rectangle extent is half-open: `[left,left+width) × [top,top+height)`. Thus if the source bottom is `216`, row `215` is filled and row `216` is excluded; the float32 accumulator case above samples the included row at destination `53`. A source-faithful recurrence produces the projected X/Y arrays for the `648×864` to `159×212` transform; the complete arrays are preserved in ignored audit metadata `wesnoth-scale-sampler-f32-v1.json` (SHA-256 `9835e6843e246396f2460df94af97a99a1ed2183ab9febf0aefe49f4258f6396`).
49
+
50
+ An independent, excluded-proof pixel review by root is recorded in [`wesnoth-proof-root-review-20261020-v1.json`](wesnoth-proof-root-review-20261020-v1.json). Its metadata reports that float32 repeated sampling covers all 1,297 changed pixels, while ideal-rational sampling leaves three bottom-edge pixels outside. This is independent empirical confirmation, not part of this source-only review: I did not inspect its image files or recompute its pixel masks. It also reports 66 projected pixels unchanged, consistent with the earlier painter-overdraw caveat; projected fill remains an upper bound rather than an exact foreground mask.
51
+
52
+ `display::draw_minimap` centers the resulting bitmap at `ox=area.x+(area.w-Fw)/2`, `oy=area.y+(area.h-Fh)/2`, and clips drawing to `area`. Add that origin to bitmap coordinates; pixels outside the clipping rectangle are not part of the minimap. This assumes the capture pixels are at the same rendered resolution and do not undergo external display scaling.
53
+
54
+ ## Qualification limits
55
+
56
+ The source establishes formulas and a compositing risk, not observed screenshot geometry. An A/B/A capture can establish whether a controlled change produced a repeatable pixel difference, but exact final support needs the relevant terrain tile alpha and actual capture/layout evidence. No application was launched, no provider calls were made, and no cohort pixels or truth were inspected for this audit. The excluded proof reference above is separately produced and reviewed evidence; it does not change this scope statement.