@photivra/engine 0.5.1 → 1.0.0

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 (753) hide show
  1. package/AGENTS.md +674 -0
  2. package/CHANGELOG.md +218 -0
  3. package/CITATION.cff +1 -1
  4. package/CONTRIBUTING.md +76 -0
  5. package/DCO +33 -0
  6. package/NODE_SUPPORT.md +37 -0
  7. package/NOTICE +2 -0
  8. package/README.md +157 -56
  9. package/SECURITY.md +55 -0
  10. package/THIRD_PARTY.md +63 -0
  11. package/dist/camera/equivalent-focal-length.d.ts +9 -0
  12. package/dist/camera/equivalent-focal-length.d.ts.map +1 -1
  13. package/dist/camera/equivalent-focal-length.js +9 -0
  14. package/dist/camera/equivalent-focal-length.js.map +1 -1
  15. package/dist/camera/field-of-view.d.ts +13 -0
  16. package/dist/camera/field-of-view.d.ts.map +1 -1
  17. package/dist/camera/field-of-view.js +13 -0
  18. package/dist/camera/field-of-view.js.map +1 -1
  19. package/dist/camera/projected-object-size.d.ts +8 -0
  20. package/dist/camera/projected-object-size.d.ts.map +1 -1
  21. package/dist/camera/projected-object-size.js +8 -0
  22. package/dist/camera/projected-object-size.js.map +1 -1
  23. package/dist/capture/capture-export-metadata.d.ts +60 -0
  24. package/dist/capture/capture-export-metadata.d.ts.map +1 -0
  25. package/dist/capture/capture-export-metadata.js +62 -0
  26. package/dist/capture/capture-export-metadata.js.map +1 -0
  27. package/dist/capture/environment-raw-producer.d.ts +55 -0
  28. package/dist/capture/environment-raw-producer.d.ts.map +1 -0
  29. package/dist/capture/environment-raw-producer.js +88 -0
  30. package/dist/capture/environment-raw-producer.js.map +1 -0
  31. package/dist/capture/export-jpeg.d.ts +12 -0
  32. package/dist/capture/export-jpeg.d.ts.map +1 -0
  33. package/dist/capture/export-jpeg.js +126 -0
  34. package/dist/capture/export-jpeg.js.map +1 -0
  35. package/dist/capture/export-tiff.d.ts +45 -0
  36. package/dist/capture/export-tiff.d.ts.map +1 -0
  37. package/dist/capture/export-tiff.js +129 -0
  38. package/dist/capture/export-tiff.js.map +1 -0
  39. package/dist/capture/focus-control.d.ts +210 -0
  40. package/dist/capture/focus-control.d.ts.map +1 -0
  41. package/dist/capture/focus-control.js +664 -0
  42. package/dist/capture/focus-control.js.map +1 -0
  43. package/dist/capture/linear-encoding.d.ts +59 -0
  44. package/dist/capture/linear-encoding.d.ts.map +1 -0
  45. package/dist/capture/linear-encoding.js +98 -0
  46. package/dist/capture/linear-encoding.js.map +1 -0
  47. package/dist/capture/photographic-export.d.ts +135 -0
  48. package/dist/capture/photographic-export.d.ts.map +1 -0
  49. package/dist/capture/photographic-export.js +273 -0
  50. package/dist/capture/photographic-export.js.map +1 -0
  51. package/dist/capture/raw-frame-limits.d.ts +12 -0
  52. package/dist/capture/raw-frame-limits.d.ts.map +1 -0
  53. package/dist/capture/raw-frame-limits.js +13 -0
  54. package/dist/capture/raw-frame-limits.js.map +1 -0
  55. package/dist/capture/raw-frame-reconstruction.d.ts +48 -0
  56. package/dist/capture/raw-frame-reconstruction.d.ts.map +1 -0
  57. package/dist/capture/raw-frame-reconstruction.js +146 -0
  58. package/dist/capture/raw-frame-reconstruction.js.map +1 -0
  59. package/dist/capture/release-sequence.d.ts +120 -0
  60. package/dist/capture/release-sequence.d.ts.map +1 -0
  61. package/dist/capture/release-sequence.js +446 -0
  62. package/dist/capture/release-sequence.js.map +1 -0
  63. package/dist/capture/sensor-raw-frame.d.ts +34 -0
  64. package/dist/capture/sensor-raw-frame.d.ts.map +1 -0
  65. package/dist/capture/sensor-raw-frame.js +106 -0
  66. package/dist/capture/sensor-raw-frame.js.map +1 -0
  67. package/dist/capture/sensor-raw-producer.d.ts +51 -0
  68. package/dist/capture/sensor-raw-producer.d.ts.map +1 -0
  69. package/dist/capture/sensor-raw-producer.js +235 -0
  70. package/dist/capture/sensor-raw-producer.js.map +1 -0
  71. package/dist/capture/simulated-capture.d.ts +125 -0
  72. package/dist/capture/simulated-capture.d.ts.map +1 -0
  73. package/dist/capture/simulated-capture.js +248 -0
  74. package/dist/capture/simulated-capture.js.map +1 -0
  75. package/dist/color/capture-color.d.ts +73 -0
  76. package/dist/color/capture-color.d.ts.map +1 -0
  77. package/dist/color/capture-color.js +145 -0
  78. package/dist/color/capture-color.js.map +1 -0
  79. package/dist/color/sensor-color-development.d.ts +23 -0
  80. package/dist/color/sensor-color-development.d.ts.map +1 -0
  81. package/dist/color/sensor-color-development.js +56 -0
  82. package/dist/color/sensor-color-development.js.map +1 -0
  83. package/dist/color/white-balance.d.ts +175 -0
  84. package/dist/color/white-balance.d.ts.map +1 -0
  85. package/dist/color/white-balance.js +606 -0
  86. package/dist/color/white-balance.js.map +1 -0
  87. package/dist/composition/image-formation-plan.d.ts +481 -0
  88. package/dist/composition/image-formation-plan.d.ts.map +1 -0
  89. package/dist/composition/image-formation-plan.js +2499 -0
  90. package/dist/composition/image-formation-plan.js.map +1 -0
  91. package/dist/composition/plan-consumer.d.ts +53 -0
  92. package/dist/composition/plan-consumer.d.ts.map +1 -0
  93. package/dist/composition/plan-consumer.js +119 -0
  94. package/dist/composition/plan-consumer.js.map +1 -0
  95. package/dist/core/calculation-result.d.ts.map +1 -1
  96. package/dist/core/calculation-result.js +6 -0
  97. package/dist/core/calculation-result.js.map +1 -1
  98. package/dist/core/canonical-json.d.ts +18 -0
  99. package/dist/core/canonical-json.d.ts.map +1 -0
  100. package/dist/core/canonical-json.js +44 -0
  101. package/dist/core/canonical-json.js.map +1 -0
  102. package/dist/core/configuration-error.d.ts +6 -0
  103. package/dist/core/configuration-error.d.ts.map +1 -1
  104. package/dist/core/configuration-error.js +6 -0
  105. package/dist/core/configuration-error.js.map +1 -1
  106. package/dist/core/evidence-provenance.d.ts +6 -0
  107. package/dist/core/evidence-provenance.d.ts.map +1 -1
  108. package/dist/core/evidence-provenance.js +7 -0
  109. package/dist/core/evidence-provenance.js.map +1 -1
  110. package/dist/core/image-formation.d.ts +9 -3
  111. package/dist/core/image-formation.d.ts.map +1 -1
  112. package/dist/core/image-formation.js +29 -5
  113. package/dist/core/image-formation.js.map +1 -1
  114. package/dist/core/owned-data.d.ts +25 -0
  115. package/dist/core/owned-data.d.ts.map +1 -0
  116. package/dist/core/owned-data.js +34 -0
  117. package/dist/core/owned-data.js.map +1 -0
  118. package/dist/core/record-validation.d.ts +17 -0
  119. package/dist/core/record-validation.d.ts.map +1 -0
  120. package/dist/core/record-validation.js +44 -0
  121. package/dist/core/record-validation.js.map +1 -0
  122. package/dist/core/scientific-assurance.d.ts +101 -0
  123. package/dist/core/scientific-assurance.d.ts.map +1 -0
  124. package/dist/core/scientific-assurance.js +301 -0
  125. package/dist/core/scientific-assurance.js.map +1 -0
  126. package/dist/core/spectral-composition.d.ts +106 -0
  127. package/dist/core/spectral-composition.d.ts.map +1 -0
  128. package/dist/core/spectral-composition.js +334 -0
  129. package/dist/core/spectral-composition.js.map +1 -0
  130. package/dist/core/spectral.d.ts +34 -0
  131. package/dist/core/spectral.d.ts.map +1 -0
  132. package/dist/core/spectral.js +57 -0
  133. package/dist/core/spectral.js.map +1 -0
  134. package/dist/core/validation.d.ts +6 -0
  135. package/dist/core/validation.d.ts.map +1 -1
  136. package/dist/core/validation.js +6 -0
  137. package/dist/core/validation.js.map +1 -1
  138. package/dist/core/version.d.ts +14 -0
  139. package/dist/core/version.d.ts.map +1 -0
  140. package/dist/core/version.js +15 -0
  141. package/dist/core/version.js.map +1 -0
  142. package/dist/equipment/exposure-capabilities.d.ts +125 -0
  143. package/dist/equipment/exposure-capabilities.d.ts.map +1 -0
  144. package/dist/equipment/exposure-capabilities.js +391 -0
  145. package/dist/equipment/exposure-capabilities.js.map +1 -0
  146. package/dist/equipment/generic-tier-assets.d.ts +82 -0
  147. package/dist/equipment/generic-tier-assets.d.ts.map +1 -0
  148. package/dist/equipment/generic-tier-assets.js +119 -0
  149. package/dist/equipment/generic-tier-assets.js.map +1 -0
  150. package/dist/equipment/generic-tier-presets.d.ts +57 -0
  151. package/dist/equipment/generic-tier-presets.d.ts.map +1 -0
  152. package/dist/equipment/generic-tier-presets.js +122 -0
  153. package/dist/equipment/generic-tier-presets.js.map +1 -0
  154. package/dist/equipment/iso-capabilities.d.ts +143 -0
  155. package/dist/equipment/iso-capabilities.d.ts.map +1 -0
  156. package/dist/equipment/iso-capabilities.js +578 -0
  157. package/dist/equipment/iso-capabilities.js.map +1 -0
  158. package/dist/equipment/metering-capabilities.d.ts +58 -0
  159. package/dist/equipment/metering-capabilities.d.ts.map +1 -0
  160. package/dist/equipment/metering-capabilities.js +151 -0
  161. package/dist/equipment/metering-capabilities.js.map +1 -0
  162. package/dist/equipment/release-capabilities.d.ts +33 -0
  163. package/dist/equipment/release-capabilities.d.ts.map +1 -0
  164. package/dist/equipment/release-capabilities.js +176 -0
  165. package/dist/equipment/release-capabilities.js.map +1 -0
  166. package/dist/exposure/exposure-duration-control.d.ts +72 -0
  167. package/dist/exposure/exposure-duration-control.d.ts.map +1 -0
  168. package/dist/exposure/exposure-duration-control.js +161 -0
  169. package/dist/exposure/exposure-duration-control.js.map +1 -0
  170. package/dist/exposure/exposure-mode-resolver.d.ts +637 -0
  171. package/dist/exposure/exposure-mode-resolver.d.ts.map +1 -0
  172. package/dist/exposure/exposure-mode-resolver.js +1905 -0
  173. package/dist/exposure/exposure-mode-resolver.js.map +1 -0
  174. package/dist/exposure/exposure.d.ts +8 -0
  175. package/dist/exposure/exposure.d.ts.map +1 -1
  176. package/dist/exposure/exposure.js +8 -0
  177. package/dist/exposure/exposure.js.map +1 -1
  178. package/dist/exposure/flash.d.ts +179 -0
  179. package/dist/exposure/flash.d.ts.map +1 -0
  180. package/dist/exposure/flash.js +644 -0
  181. package/dist/exposure/flash.js.map +1 -0
  182. package/dist/exposure/metering-scene-radiance.d.ts +72 -0
  183. package/dist/exposure/metering-scene-radiance.d.ts.map +1 -0
  184. package/dist/exposure/metering-scene-radiance.js +222 -0
  185. package/dist/exposure/metering-scene-radiance.js.map +1 -0
  186. package/dist/exposure/metering-target.d.ts +67 -0
  187. package/dist/exposure/metering-target.d.ts.map +1 -0
  188. package/dist/exposure/metering-target.js +265 -0
  189. package/dist/exposure/metering-target.js.map +1 -0
  190. package/dist/exposure/metering-temporal.d.ts +76 -0
  191. package/dist/exposure/metering-temporal.d.ts.map +1 -0
  192. package/dist/exposure/metering-temporal.js +210 -0
  193. package/dist/exposure/metering-temporal.js.map +1 -0
  194. package/dist/exposure/metering.d.ts +124 -0
  195. package/dist/exposure/metering.d.ts.map +1 -0
  196. package/dist/exposure/metering.js +422 -0
  197. package/dist/exposure/metering.js.map +1 -0
  198. package/dist/exposure/program-line.d.ts +29 -0
  199. package/dist/exposure/program-line.d.ts.map +1 -0
  200. package/dist/exposure/program-line.js +126 -0
  201. package/dist/exposure/program-line.js.map +1 -0
  202. package/dist/index.d.ts +101 -7
  203. package/dist/index.d.ts.map +1 -1
  204. package/dist/index.js +99 -7
  205. package/dist/index.js.map +1 -1
  206. package/dist/motion/camera-rotation.d.ts +76 -0
  207. package/dist/motion/camera-rotation.d.ts.map +1 -1
  208. package/dist/motion/camera-rotation.js +111 -0
  209. package/dist/motion/camera-rotation.js.map +1 -1
  210. package/dist/motion/capture-rotation-inverse-mapping.d.ts +113 -0
  211. package/dist/motion/capture-rotation-inverse-mapping.d.ts.map +1 -0
  212. package/dist/motion/capture-rotation-inverse-mapping.js +184 -0
  213. package/dist/motion/capture-rotation-inverse-mapping.js.map +1 -0
  214. package/dist/motion/capture-rotation-temporal-quadrature.d.ts +104 -0
  215. package/dist/motion/capture-rotation-temporal-quadrature.d.ts.map +1 -0
  216. package/dist/motion/capture-rotation-temporal-quadrature.js +131 -0
  217. package/dist/motion/capture-rotation-temporal-quadrature.js.map +1 -0
  218. package/dist/motion/capture-rotation-trajectory.d.ts +113 -0
  219. package/dist/motion/capture-rotation-trajectory.d.ts.map +1 -0
  220. package/dist/motion/capture-rotation-trajectory.js +168 -0
  221. package/dist/motion/capture-rotation-trajectory.js.map +1 -0
  222. package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts +119 -0
  223. package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts.map +1 -0
  224. package/dist/motion/capture-translation-parallax-temporal-quadrature.js +263 -0
  225. package/dist/motion/capture-translation-parallax-temporal-quadrature.js.map +1 -0
  226. package/dist/motion/extended-object-projection.d.ts +175 -0
  227. package/dist/motion/extended-object-projection.d.ts.map +1 -0
  228. package/dist/motion/extended-object-projection.js +402 -0
  229. package/dist/motion/extended-object-projection.js.map +1 -0
  230. package/dist/motion/projected-motion.d.ts +11 -0
  231. package/dist/motion/projected-motion.d.ts.map +1 -1
  232. package/dist/motion/projected-motion.js +11 -0
  233. package/dist/motion/projected-motion.js.map +1 -1
  234. package/dist/optics/aperture.d.ts +9 -0
  235. package/dist/optics/aperture.d.ts.map +1 -1
  236. package/dist/optics/aperture.js +9 -0
  237. package/dist/optics/aperture.js.map +1 -1
  238. package/dist/optics/circle-of-confusion.d.ts +8 -0
  239. package/dist/optics/circle-of-confusion.d.ts.map +1 -1
  240. package/dist/optics/circle-of-confusion.js +8 -0
  241. package/dist/optics/circle-of-confusion.js.map +1 -1
  242. package/dist/optics/complex-pupil-psf.d.ts +128 -0
  243. package/dist/optics/complex-pupil-psf.d.ts.map +1 -0
  244. package/dist/optics/complex-pupil-psf.js +462 -0
  245. package/dist/optics/complex-pupil-psf.js.map +1 -0
  246. package/dist/optics/depth-of-field.d.ts +18 -0
  247. package/dist/optics/depth-of-field.d.ts.map +1 -1
  248. package/dist/optics/depth-of-field.js +29 -4
  249. package/dist/optics/depth-of-field.js.map +1 -1
  250. package/dist/optics/diffraction.d.ts +8 -0
  251. package/dist/optics/diffraction.d.ts.map +1 -1
  252. package/dist/optics/diffraction.js +8 -0
  253. package/dist/optics/diffraction.js.map +1 -1
  254. package/dist/optics/focus-breathing.d.ts +13 -0
  255. package/dist/optics/focus-breathing.d.ts.map +1 -1
  256. package/dist/optics/focus-breathing.js +13 -0
  257. package/dist/optics/focus-breathing.js.map +1 -1
  258. package/dist/optics/focus-state.d.ts +47 -0
  259. package/dist/optics/focus-state.d.ts.map +1 -0
  260. package/dist/optics/focus-state.js +78 -0
  261. package/dist/optics/focus-state.js.map +1 -0
  262. package/dist/optics/front-of-lens-filter.d.ts +114 -0
  263. package/dist/optics/front-of-lens-filter.d.ts.map +1 -0
  264. package/dist/optics/front-of-lens-filter.js +468 -0
  265. package/dist/optics/front-of-lens-filter.js.map +1 -0
  266. package/dist/optics/illumination-vignetting.d.ts +9 -0
  267. package/dist/optics/illumination-vignetting.d.ts.map +1 -1
  268. package/dist/optics/illumination-vignetting.js +9 -0
  269. package/dist/optics/illumination-vignetting.js.map +1 -1
  270. package/dist/optics/lateral-chromatic-aberration.d.ts +11 -0
  271. package/dist/optics/lateral-chromatic-aberration.d.ts.map +1 -1
  272. package/dist/optics/lateral-chromatic-aberration.js +23 -4
  273. package/dist/optics/lateral-chromatic-aberration.js.map +1 -1
  274. package/dist/optics/lens-psf-profile.d.ts +217 -0
  275. package/dist/optics/lens-psf-profile.d.ts.map +1 -0
  276. package/dist/optics/lens-psf-profile.js +823 -0
  277. package/dist/optics/lens-psf-profile.js.map +1 -0
  278. package/dist/optics/polygon-diffraction.d.ts +67 -0
  279. package/dist/optics/polygon-diffraction.d.ts.map +1 -0
  280. package/dist/optics/polygon-diffraction.js +145 -0
  281. package/dist/optics/polygon-diffraction.js.map +1 -0
  282. package/dist/optics/profile-contract.d.ts +42 -0
  283. package/dist/optics/profile-contract.d.ts.map +1 -0
  284. package/dist/optics/profile-contract.js +92 -0
  285. package/dist/optics/profile-contract.js.map +1 -0
  286. package/dist/optics/psf-foundation.d.ts +16 -3
  287. package/dist/optics/psf-foundation.d.ts.map +1 -1
  288. package/dist/optics/psf-foundation.js +28 -15
  289. package/dist/optics/psf-foundation.js.map +1 -1
  290. package/dist/optics/radial-distortion.d.ts +22 -2
  291. package/dist/optics/radial-distortion.d.ts.map +1 -1
  292. package/dist/optics/radial-distortion.js +101 -23
  293. package/dist/optics/radial-distortion.js.map +1 -1
  294. package/dist/optics/scene-to-sensor-irradiance.d.ts +213 -0
  295. package/dist/optics/scene-to-sensor-irradiance.d.ts.map +1 -0
  296. package/dist/optics/scene-to-sensor-irradiance.js +662 -0
  297. package/dist/optics/scene-to-sensor-irradiance.js.map +1 -0
  298. package/dist/optics/scene-to-sensor-quadrature.d.ts +63 -0
  299. package/dist/optics/scene-to-sensor-quadrature.d.ts.map +1 -0
  300. package/dist/optics/scene-to-sensor-quadrature.js +82 -0
  301. package/dist/optics/scene-to-sensor-quadrature.js.map +1 -0
  302. package/dist/optics/sensor-environment-query.d.ts +60 -0
  303. package/dist/optics/sensor-environment-query.d.ts.map +1 -0
  304. package/dist/optics/sensor-environment-query.js +50 -0
  305. package/dist/optics/sensor-environment-query.js.map +1 -0
  306. package/dist/optics/sensor-psf-quadrature.d.ts +70 -0
  307. package/dist/optics/sensor-psf-quadrature.d.ts.map +1 -0
  308. package/dist/optics/sensor-psf-quadrature.js +101 -0
  309. package/dist/optics/sensor-psf-quadrature.js.map +1 -0
  310. package/dist/optics/sensor-psf-support.d.ts +20 -0
  311. package/dist/optics/sensor-psf-support.d.ts.map +1 -0
  312. package/dist/optics/sensor-psf-support.js +13 -0
  313. package/dist/optics/sensor-psf-support.js.map +1 -0
  314. package/dist/optics/stray-light.d.ts +91 -0
  315. package/dist/optics/stray-light.d.ts.map +1 -0
  316. package/dist/optics/stray-light.js +110 -0
  317. package/dist/optics/stray-light.js.map +1 -0
  318. package/dist/optics/thin-lens.d.ts +8 -0
  319. package/dist/optics/thin-lens.d.ts.map +1 -1
  320. package/dist/optics/thin-lens.js +8 -0
  321. package/dist/optics/thin-lens.js.map +1 -1
  322. package/dist/output/capture-corrected-sdr.d.ts +49 -0
  323. package/dist/output/capture-corrected-sdr.d.ts.map +1 -0
  324. package/dist/output/capture-corrected-sdr.js +149 -0
  325. package/dist/output/capture-corrected-sdr.js.map +1 -0
  326. package/dist/output/capture-geometry.d.ts.map +1 -1
  327. package/dist/output/capture-geometry.js +32 -11
  328. package/dist/output/capture-geometry.js.map +1 -1
  329. package/dist/output/capture-sdr.d.ts +49 -0
  330. package/dist/output/capture-sdr.d.ts.map +1 -0
  331. package/dist/output/capture-sdr.js +90 -0
  332. package/dist/output/capture-sdr.js.map +1 -0
  333. package/dist/output/crop.d.ts +6 -0
  334. package/dist/output/crop.d.ts.map +1 -1
  335. package/dist/output/crop.js +6 -0
  336. package/dist/output/crop.js.map +1 -1
  337. package/dist/output/geometric-transforms.d.ts +137 -0
  338. package/dist/output/geometric-transforms.d.ts.map +1 -0
  339. package/dist/output/geometric-transforms.js +225 -0
  340. package/dist/output/geometric-transforms.js.map +1 -0
  341. package/dist/output/lens-corrections.d.ts +121 -0
  342. package/dist/output/lens-corrections.d.ts.map +1 -0
  343. package/dist/output/lens-corrections.js +210 -0
  344. package/dist/output/lens-corrections.js.map +1 -0
  345. package/dist/output/sdr-rendering.d.ts +81 -0
  346. package/dist/output/sdr-rendering.d.ts.map +1 -0
  347. package/dist/output/sdr-rendering.js +106 -0
  348. package/dist/output/sdr-rendering.js.map +1 -0
  349. package/dist/output/subject-framing-crop.d.ts +8 -0
  350. package/dist/output/subject-framing-crop.d.ts.map +1 -1
  351. package/dist/output/subject-framing-crop.js +8 -0
  352. package/dist/output/subject-framing-crop.js.map +1 -1
  353. package/dist/schema/camera.d.ts +6 -0
  354. package/dist/schema/camera.d.ts.map +1 -1
  355. package/dist/schema/illumination-spectral.d.ts +51 -0
  356. package/dist/schema/illumination-spectral.d.ts.map +1 -0
  357. package/dist/schema/illumination-spectral.js +132 -0
  358. package/dist/schema/illumination-spectral.js.map +1 -0
  359. package/dist/schema/illumination-temporal.d.ts +156 -0
  360. package/dist/schema/illumination-temporal.d.ts.map +1 -0
  361. package/dist/schema/illumination-temporal.js +554 -0
  362. package/dist/schema/illumination-temporal.js.map +1 -0
  363. package/dist/schema/illumination.d.ts +138 -0
  364. package/dist/schema/illumination.d.ts.map +1 -0
  365. package/dist/schema/illumination.js +483 -0
  366. package/dist/schema/illumination.js.map +1 -0
  367. package/dist/schema/scene-radiance-temporal.d.ts +107 -0
  368. package/dist/schema/scene-radiance-temporal.d.ts.map +1 -0
  369. package/dist/schema/scene-radiance-temporal.js +259 -0
  370. package/dist/schema/scene-radiance-temporal.js.map +1 -0
  371. package/dist/schema/scene-radiance.d.ts +185 -0
  372. package/dist/schema/scene-radiance.d.ts.map +1 -0
  373. package/dist/schema/scene-radiance.js +535 -0
  374. package/dist/schema/scene-radiance.js.map +1 -0
  375. package/dist/schema/scene.d.ts +7 -0
  376. package/dist/schema/scene.d.ts.map +1 -1
  377. package/dist/schema/validation.d.ts.map +1 -1
  378. package/dist/schema/validation.js +7 -0
  379. package/dist/schema/validation.js.map +1 -1
  380. package/dist/sensor/accumulated-charge.d.ts +199 -0
  381. package/dist/sensor/accumulated-charge.d.ts.map +1 -0
  382. package/dist/sensor/accumulated-charge.js +450 -0
  383. package/dist/sensor/accumulated-charge.js.map +1 -0
  384. package/dist/sensor/architecture.d.ts +48 -13
  385. package/dist/sensor/architecture.d.ts.map +1 -1
  386. package/dist/sensor/architecture.js +58 -16
  387. package/dist/sensor/architecture.js.map +1 -1
  388. package/dist/sensor/camera-saturation-capacity.d.ts +138 -0
  389. package/dist/sensor/camera-saturation-capacity.d.ts.map +1 -0
  390. package/dist/sensor/camera-saturation-capacity.js +356 -0
  391. package/dist/sensor/camera-saturation-capacity.js.map +1 -0
  392. package/dist/sensor/capture-color-sampling-binding.d.ts +212 -0
  393. package/dist/sensor/capture-color-sampling-binding.d.ts.map +1 -0
  394. package/dist/sensor/capture-color-sampling-binding.js +437 -0
  395. package/dist/sensor/capture-color-sampling-binding.js.map +1 -0
  396. package/dist/sensor/capture-mode-timing.d.ts +63 -0
  397. package/dist/sensor/capture-mode-timing.d.ts.map +1 -0
  398. package/dist/sensor/capture-mode-timing.js +270 -0
  399. package/dist/sensor/capture-mode-timing.js.map +1 -0
  400. package/dist/sensor/capture-mode.d.ts +157 -0
  401. package/dist/sensor/capture-mode.d.ts.map +1 -0
  402. package/dist/sensor/capture-mode.js +447 -0
  403. package/dist/sensor/capture-mode.js.map +1 -0
  404. package/dist/sensor/color-sampling.d.ts +133 -0
  405. package/dist/sensor/color-sampling.d.ts.map +1 -0
  406. package/dist/sensor/color-sampling.js +245 -0
  407. package/dist/sensor/color-sampling.js.map +1 -0
  408. package/dist/sensor/constant-rate-temporal-integration.d.ts +126 -0
  409. package/dist/sensor/constant-rate-temporal-integration.d.ts.map +1 -0
  410. package/dist/sensor/constant-rate-temporal-integration.js +382 -0
  411. package/dist/sensor/constant-rate-temporal-integration.js.map +1 -0
  412. package/dist/sensor/dark-current.d.ts +169 -0
  413. package/dist/sensor/dark-current.d.ts.map +1 -0
  414. package/dist/sensor/dark-current.js +427 -0
  415. package/dist/sensor/dark-current.js.map +1 -0
  416. package/dist/sensor/environment-photo-signal.d.ts +123 -0
  417. package/dist/sensor/environment-photo-signal.d.ts.map +1 -0
  418. package/dist/sensor/environment-photo-signal.js +186 -0
  419. package/dist/sensor/environment-photo-signal.js.map +1 -0
  420. package/dist/sensor/eqe-electron-rate.d.ts +107 -0
  421. package/dist/sensor/eqe-electron-rate.d.ts.map +1 -0
  422. package/dist/sensor/eqe-electron-rate.js +561 -0
  423. package/dist/sensor/eqe-electron-rate.js.map +1 -0
  424. package/dist/sensor/eqe-local-exposure.d.ts +65 -0
  425. package/dist/sensor/eqe-local-exposure.d.ts.map +1 -0
  426. package/dist/sensor/eqe-local-exposure.js +84 -0
  427. package/dist/sensor/eqe-local-exposure.js.map +1 -0
  428. package/dist/sensor/eqe-temporal-exposure.d.ts +55 -0
  429. package/dist/sensor/eqe-temporal-exposure.d.ts.map +1 -0
  430. package/dist/sensor/eqe-temporal-exposure.js +62 -0
  431. package/dist/sensor/eqe-temporal-exposure.js.map +1 -0
  432. package/dist/sensor/exposure-window.d.ts +117 -0
  433. package/dist/sensor/exposure-window.d.ts.map +1 -0
  434. package/dist/sensor/exposure-window.js +305 -0
  435. package/dist/sensor/exposure-window.js.map +1 -0
  436. package/dist/sensor/iso-signal-chain.d.ts +148 -0
  437. package/dist/sensor/iso-signal-chain.d.ts.map +1 -0
  438. package/dist/sensor/iso-signal-chain.js +411 -0
  439. package/dist/sensor/iso-signal-chain.js.map +1 -0
  440. package/dist/sensor/local-exposure-binding.d.ts +87 -0
  441. package/dist/sensor/local-exposure-binding.d.ts.map +1 -0
  442. package/dist/sensor/local-exposure-binding.js +214 -0
  443. package/dist/sensor/local-exposure-binding.js.map +1 -0
  444. package/dist/sensor/optical-stack.d.ts +132 -0
  445. package/dist/sensor/optical-stack.d.ts.map +1 -0
  446. package/dist/sensor/optical-stack.js +303 -0
  447. package/dist/sensor/optical-stack.js.map +1 -0
  448. package/dist/sensor/photon-energy.d.ts +97 -0
  449. package/dist/sensor/photon-energy.d.ts.map +1 -0
  450. package/dist/sensor/photon-energy.js +390 -0
  451. package/dist/sensor/photon-energy.js.map +1 -0
  452. package/dist/sensor/physical-charge-capacity.d.ts +130 -0
  453. package/dist/sensor/physical-charge-capacity.d.ts.map +1 -0
  454. package/dist/sensor/physical-charge-capacity.js +345 -0
  455. package/dist/sensor/physical-charge-capacity.js.map +1 -0
  456. package/dist/sensor/pixel-pitch.d.ts +6 -0
  457. package/dist/sensor/pixel-pitch.d.ts.map +1 -1
  458. package/dist/sensor/pixel-pitch.js +6 -0
  459. package/dist/sensor/pixel-pitch.js.map +1 -1
  460. package/dist/sensor/radiometry-readiness.d.ts +10 -0
  461. package/dist/sensor/radiometry-readiness.d.ts.map +1 -1
  462. package/dist/sensor/radiometry-readiness.js +10 -0
  463. package/dist/sensor/radiometry-readiness.js.map +1 -1
  464. package/dist/sensor/raw-readout.d.ts +314 -0
  465. package/dist/sensor/raw-readout.d.ts.map +1 -0
  466. package/dist/sensor/raw-readout.js +914 -0
  467. package/dist/sensor/raw-readout.js.map +1 -0
  468. package/dist/sensor/raw-reconstruction.d.ts +170 -0
  469. package/dist/sensor/raw-reconstruction.d.ts.map +1 -0
  470. package/dist/sensor/raw-reconstruction.js +424 -0
  471. package/dist/sensor/raw-reconstruction.js.map +1 -0
  472. package/dist/sensor/readout-exposure-linkage.d.ts +123 -0
  473. package/dist/sensor/readout-exposure-linkage.d.ts.map +1 -0
  474. package/dist/sensor/readout-exposure-linkage.js +222 -0
  475. package/dist/sensor/readout-exposure-linkage.js.map +1 -0
  476. package/dist/sensor/readout-timing.d.ts +137 -0
  477. package/dist/sensor/readout-timing.d.ts.map +1 -0
  478. package/dist/sensor/readout-timing.js +243 -0
  479. package/dist/sensor/readout-timing.js.map +1 -0
  480. package/dist/sensor/response-application-compatibility.d.ts +136 -0
  481. package/dist/sensor/response-application-compatibility.d.ts.map +1 -0
  482. package/dist/sensor/response-application-compatibility.js +408 -0
  483. package/dist/sensor/response-application-compatibility.js.map +1 -0
  484. package/dist/sensor/response-operating-range.d.ts +173 -0
  485. package/dist/sensor/response-operating-range.d.ts.map +1 -0
  486. package/dist/sensor/response-operating-range.js +672 -0
  487. package/dist/sensor/response-operating-range.js.map +1 -0
  488. package/dist/sensor/responsivity-photocurrent.d.ts +158 -0
  489. package/dist/sensor/responsivity-photocurrent.d.ts.map +1 -0
  490. package/dist/sensor/responsivity-photocurrent.js +644 -0
  491. package/dist/sensor/responsivity-photocurrent.js.map +1 -0
  492. package/dist/sensor/sampling-aperture.d.ts +154 -0
  493. package/dist/sensor/sampling-aperture.d.ts.map +1 -0
  494. package/dist/sensor/sampling-aperture.js +388 -0
  495. package/dist/sensor/sampling-aperture.js.map +1 -0
  496. package/dist/sensor/scene-eqe-temporal-exposure.d.ts +45 -0
  497. package/dist/sensor/scene-eqe-temporal-exposure.d.ts.map +1 -0
  498. package/dist/sensor/scene-eqe-temporal-exposure.js +64 -0
  499. package/dist/sensor/scene-eqe-temporal-exposure.js.map +1 -0
  500. package/dist/sensor/sensor-geometry.d.ts +12 -0
  501. package/dist/sensor/sensor-geometry.d.ts.map +1 -1
  502. package/dist/sensor/sensor-geometry.js +12 -0
  503. package/dist/sensor/sensor-geometry.js.map +1 -1
  504. package/dist/sensor/signal-noise.d.ts +10 -0
  505. package/dist/sensor/signal-noise.d.ts.map +1 -1
  506. package/dist/sensor/signal-noise.js +10 -0
  507. package/dist/sensor/signal-noise.js.map +1 -1
  508. package/dist/sensor/spatial-sample-reduction.d.ts +171 -0
  509. package/dist/sensor/spatial-sample-reduction.d.ts.map +1 -0
  510. package/dist/sensor/spatial-sample-reduction.js +345 -0
  511. package/dist/sensor/spatial-sample-reduction.js.map +1 -0
  512. package/dist/sensor/spatial-sampling-quadrature.d.ts +179 -0
  513. package/dist/sensor/spatial-sampling-quadrature.d.ts.map +1 -0
  514. package/dist/sensor/spatial-sampling-quadrature.js +224 -0
  515. package/dist/sensor/spatial-sampling-quadrature.js.map +1 -0
  516. package/dist/sensor/spatio-spectral-reduction.d.ts +187 -0
  517. package/dist/sensor/spatio-spectral-reduction.d.ts.map +1 -0
  518. package/dist/sensor/spatio-spectral-reduction.js +373 -0
  519. package/dist/sensor/spatio-spectral-reduction.js.map +1 -0
  520. package/dist/sensor/spectral-coverage.d.ts +24 -0
  521. package/dist/sensor/spectral-coverage.d.ts.map +1 -0
  522. package/dist/sensor/spectral-coverage.js +86 -0
  523. package/dist/sensor/spectral-coverage.js.map +1 -0
  524. package/dist/sensor/spectral-quadrature.d.ts +169 -0
  525. package/dist/sensor/spectral-quadrature.d.ts.map +1 -0
  526. package/dist/sensor/spectral-quadrature.js +542 -0
  527. package/dist/sensor/spectral-quadrature.js.map +1 -0
  528. package/dist/sensor/spectral-response.d.ts +192 -0
  529. package/dist/sensor/spectral-response.d.ts.map +1 -0
  530. package/dist/sensor/spectral-response.js +664 -0
  531. package/dist/sensor/spectral-response.js.map +1 -0
  532. package/dist/sensor/temporal-eqe-sum.d.ts +15 -0
  533. package/dist/sensor/temporal-eqe-sum.d.ts.map +1 -0
  534. package/dist/sensor/temporal-eqe-sum.js +30 -0
  535. package/dist/sensor/temporal-eqe-sum.js.map +1 -0
  536. package/dist/sensor/temporal-photo-signal.d.ts +38 -0
  537. package/dist/sensor/temporal-photo-signal.d.ts.map +1 -0
  538. package/dist/sensor/temporal-photo-signal.js +110 -0
  539. package/dist/sensor/temporal-photo-signal.js.map +1 -0
  540. package/dist/sensor/temporal-sample-binding.d.ts +6 -0
  541. package/dist/sensor/temporal-sample-binding.d.ts.map +1 -0
  542. package/dist/sensor/temporal-sample-binding.js +32 -0
  543. package/dist/sensor/temporal-sample-binding.js.map +1 -0
  544. package/dist/simulation/poc-simulation.d.ts.map +1 -1
  545. package/dist/simulation/poc-simulation.js +34 -11
  546. package/dist/simulation/poc-simulation.js.map +1 -1
  547. package/dist/stabilization/camera-shake.d.ts +11 -0
  548. package/dist/stabilization/camera-shake.d.ts.map +1 -1
  549. package/dist/stabilization/camera-shake.js +11 -0
  550. package/dist/stabilization/camera-shake.js.map +1 -1
  551. package/dist/stabilization/system.d.ts +218 -0
  552. package/dist/stabilization/system.d.ts.map +1 -0
  553. package/dist/stabilization/system.js +695 -0
  554. package/dist/stabilization/system.js.map +1 -0
  555. package/docs/API_REFERENCE.md +2017 -0
  556. package/docs/API_STYLE.md +132 -0
  557. package/docs/ARCHITECTURE.md +150 -23
  558. package/docs/AUTOMATION_COORDINATION.md +190 -0
  559. package/docs/CAPTURE_COLOR.md +25 -0
  560. package/docs/CAPTURE_CORRECTED_SDR.md +25 -0
  561. package/docs/CAPTURE_EXPORT_METADATA.md +27 -0
  562. package/docs/CAPTURE_SDR.md +20 -0
  563. package/docs/DEVELOPERS.md +60 -0
  564. package/docs/DIGITAL_OPTICS_FOUNDATION.md +69 -0
  565. package/docs/ENVIRONMENT_RAW_CAPTURE.md +187 -0
  566. package/docs/EXPORT_ACCEPTANCE.md +133 -0
  567. package/docs/GENERIC_TIER_PRESETS.md +269 -0
  568. package/docs/GEOMETRIC_PREPARATION_REUSE.md +141 -0
  569. package/docs/IMAGE_FORMATION.md +105 -9
  570. package/docs/LINEAR_CAPTURE_ENCODING.md +25 -0
  571. package/docs/MOTION_AND_SIGNAL.md +145 -1
  572. package/docs/NUMERICAL_CORRECTNESS.md +191 -0
  573. package/docs/PERFORMANCE_BASELINE.md +56 -0
  574. package/docs/PHOTOGRAPHIC_EXPORT.md +206 -0
  575. package/docs/PHYSICS_FOUNDATION.md +152 -5
  576. package/docs/POC_API.md +2 -0
  577. package/docs/POC_PROJECTION_REUSE.md +124 -0
  578. package/docs/PROCESSED_OUTPUT.md +157 -0
  579. package/docs/PRODUCTION_COMPOSITION.md +373 -0
  580. package/docs/PRODUCTION_ENVIRONMENT_CAPTURE.md +131 -0
  581. package/docs/PROVENANCE.md +4 -0
  582. package/docs/PSF_FOUNDATION.md +110 -88
  583. package/docs/RAW_FRAME_ENVELOPE.md +56 -0
  584. package/docs/RAW_FRAME_RECONSTRUCTION.md +30 -0
  585. package/docs/RELEASE_1_0.md +65 -0
  586. package/docs/RELEASE_AUDIT.md +38 -0
  587. package/docs/SCENE_RADIANCE_AND_ILLUMINATION.md +298 -0
  588. package/docs/SCENE_SENSOR_QUADRATURE.md +98 -0
  589. package/docs/SCENE_SENSOR_TEMPORAL_EXPOSURE.md +86 -0
  590. package/docs/SCIENTIFIC_ASSURANCE.md +280 -0
  591. package/docs/SCIENTIFIC_CONFORMANCE.md +83 -0
  592. package/docs/SDR_RENDERING.md +33 -0
  593. package/docs/SENSOR_ENVIRONMENT_QUERY.md +86 -0
  594. package/docs/SENSOR_EQE_LOCAL_EXPOSURE.md +104 -0
  595. package/docs/SENSOR_EQE_TEMPORAL_EXPOSURE.md +74 -0
  596. package/docs/SENSOR_PSF_QUADRATURE.md +90 -0
  597. package/docs/SENSOR_RAW_FRAME.md +20 -0
  598. package/docs/SENSOR_RAW_PRODUCER.md +77 -0
  599. package/docs/SIGNAL_CONFORMANCE.md +23 -0
  600. package/docs/SIMULATED_CAPTURE.md +65 -0
  601. package/docs/STABILIZATION.md +160 -17
  602. package/docs/TEMPORAL_PHOTO_RAW.md +83 -0
  603. package/docs/TIER_ACCEPTANCE.md +129 -0
  604. package/docs/TIER_PRESET_ACCEPTANCE.md +59 -0
  605. package/docs/USAGE.md +5604 -331
  606. package/docs/V1_COMPOSITION_MAP.md +123 -0
  607. package/docs/V1_HELPER_REUSE_REVIEW.md +60 -0
  608. package/docs/V1_PERFORMANCE_DISPOSITION.md +88 -0
  609. package/docs/api/camera-equivalent-focal-length.md +53 -0
  610. package/docs/api/camera-field-of-view.md +119 -0
  611. package/docs/api/camera-projected-object-size.md +54 -0
  612. package/docs/api/capture-capture-export-metadata.md +107 -0
  613. package/docs/api/capture-environment-raw-producer.md +56 -0
  614. package/docs/api/capture-focus-control.md +419 -0
  615. package/docs/api/capture-linear-encoding.md +99 -0
  616. package/docs/api/capture-photographic-export.md +172 -0
  617. package/docs/api/capture-raw-frame-reconstruction.md +87 -0
  618. package/docs/api/capture-release-sequence.md +252 -0
  619. package/docs/api/capture-sensor-raw-frame.md +66 -0
  620. package/docs/api/capture-sensor-raw-producer.md +98 -0
  621. package/docs/api/capture-simulated-capture.md +179 -0
  622. package/docs/api/color-capture-color.md +122 -0
  623. package/docs/api/color-white-balance.md +386 -0
  624. package/docs/api/composition-image-formation-plan.md +825 -0
  625. package/docs/api/composition-plan-consumer.md +98 -0
  626. package/docs/api/core-calculation-result.md +220 -0
  627. package/docs/api/core-configuration-error.md +19 -0
  628. package/docs/api/core-image-formation.md +204 -0
  629. package/docs/api/core-scientific-assurance.md +214 -0
  630. package/docs/api/core-spectral-composition.md +268 -0
  631. package/docs/api/core-spectral.md +78 -0
  632. package/docs/api/core-validation.md +34 -0
  633. package/docs/api/core-version.md +14 -0
  634. package/docs/api/equipment-exposure-capabilities.md +270 -0
  635. package/docs/api/equipment-generic-tier-assets.md +82 -0
  636. package/docs/api/equipment-generic-tier-presets.md +103 -0
  637. package/docs/api/equipment-iso-capabilities.md +295 -0
  638. package/docs/api/equipment-metering-capabilities.md +126 -0
  639. package/docs/api/equipment-release-capabilities.md +91 -0
  640. package/docs/api/exports.json +5656 -0
  641. package/docs/api/exposure-exposure-duration-control.md +115 -0
  642. package/docs/api/exposure-exposure-mode-resolver.md +966 -0
  643. package/docs/api/exposure-exposure.md +150 -0
  644. package/docs/api/exposure-flash.md +327 -0
  645. package/docs/api/exposure-metering-scene-radiance.md +154 -0
  646. package/docs/api/exposure-metering-target.md +134 -0
  647. package/docs/api/exposure-metering-temporal.md +77 -0
  648. package/docs/api/exposure-metering.md +172 -0
  649. package/docs/api/exposure-program-line.md +64 -0
  650. package/docs/api/motion-camera-rotation.md +215 -0
  651. package/docs/api/motion-capture-rotation-inverse-mapping.md +128 -0
  652. package/docs/api/motion-capture-rotation-temporal-quadrature.md +127 -0
  653. package/docs/api/motion-capture-rotation-trajectory.md +132 -0
  654. package/docs/api/motion-capture-translation-parallax-temporal-quadrature.md +171 -0
  655. package/docs/api/motion-extended-object-projection.md +312 -0
  656. package/docs/api/motion-projected-motion.md +60 -0
  657. package/docs/api/optics-aperture.md +69 -0
  658. package/docs/api/optics-circle-of-confusion.md +46 -0
  659. package/docs/api/optics-complex-pupil-psf.md +193 -0
  660. package/docs/api/optics-depth-of-field.md +92 -0
  661. package/docs/api/optics-diffraction.md +46 -0
  662. package/docs/api/optics-focus-breathing.md +119 -0
  663. package/docs/api/optics-focus-state.md +64 -0
  664. package/docs/api/optics-front-of-lens-filter.md +263 -0
  665. package/docs/api/optics-illumination-vignetting.md +95 -0
  666. package/docs/api/optics-lateral-chromatic-aberration.md +225 -0
  667. package/docs/api/optics-lens-psf-profile.md +380 -0
  668. package/docs/api/optics-polygon-diffraction.md +68 -0
  669. package/docs/api/optics-profile-contract.md +47 -0
  670. package/docs/api/optics-psf-foundation.md +181 -0
  671. package/docs/api/optics-radial-distortion.md +194 -0
  672. package/docs/api/optics-scene-to-sensor-irradiance.md +371 -0
  673. package/docs/api/optics-scene-to-sensor-quadrature.md +78 -0
  674. package/docs/api/optics-sensor-environment-query.md +58 -0
  675. package/docs/api/optics-sensor-psf-quadrature.md +81 -0
  676. package/docs/api/optics-stray-light.md +109 -0
  677. package/docs/api/optics-thin-lens.md +53 -0
  678. package/docs/api/output-capture-corrected-sdr.md +71 -0
  679. package/docs/api/output-capture-geometry.md +500 -0
  680. package/docs/api/output-capture-sdr.md +69 -0
  681. package/docs/api/output-crop.md +47 -0
  682. package/docs/api/output-geometric-transforms.md +199 -0
  683. package/docs/api/output-lens-corrections.md +162 -0
  684. package/docs/api/output-sdr-rendering.md +122 -0
  685. package/docs/api/output-subject-framing-crop.md +59 -0
  686. package/docs/api/schema-camera.md +84 -0
  687. package/docs/api/schema-illumination-spectral.md +77 -0
  688. package/docs/api/schema-illumination-temporal.md +289 -0
  689. package/docs/api/schema-illumination.md +246 -0
  690. package/docs/api/schema-scene-radiance-temporal.md +215 -0
  691. package/docs/api/schema-scene-radiance.md +415 -0
  692. package/docs/api/schema-scene.md +105 -0
  693. package/docs/api/schema-validation.md +25 -0
  694. package/docs/api/sensor-accumulated-charge.md +273 -0
  695. package/docs/api/sensor-architecture.md +155 -0
  696. package/docs/api/sensor-camera-saturation-capacity.md +215 -0
  697. package/docs/api/sensor-capture-color-sampling-binding.md +323 -0
  698. package/docs/api/sensor-capture-mode-timing.md +123 -0
  699. package/docs/api/sensor-capture-mode.md +321 -0
  700. package/docs/api/sensor-color-sampling.md +228 -0
  701. package/docs/api/sensor-constant-rate-temporal-integration.md +152 -0
  702. package/docs/api/sensor-dark-current.md +227 -0
  703. package/docs/api/sensor-environment-photo-signal.md +77 -0
  704. package/docs/api/sensor-eqe-electron-rate.md +166 -0
  705. package/docs/api/sensor-eqe-local-exposure.md +68 -0
  706. package/docs/api/sensor-eqe-temporal-exposure.md +73 -0
  707. package/docs/api/sensor-exposure-window.md +183 -0
  708. package/docs/api/sensor-iso-signal-chain.md +264 -0
  709. package/docs/api/sensor-local-exposure-binding.md +126 -0
  710. package/docs/api/sensor-optical-stack.md +211 -0
  711. package/docs/api/sensor-photon-energy.md +149 -0
  712. package/docs/api/sensor-physical-charge-capacity.md +196 -0
  713. package/docs/api/sensor-pixel-pitch.md +41 -0
  714. package/docs/api/sensor-radiometry-readiness.md +240 -0
  715. package/docs/api/sensor-raw-readout.md +499 -0
  716. package/docs/api/sensor-raw-reconstruction.md +260 -0
  717. package/docs/api/sensor-readout-exposure-linkage.md +172 -0
  718. package/docs/api/sensor-readout-timing.md +209 -0
  719. package/docs/api/sensor-response-application-compatibility.md +256 -0
  720. package/docs/api/sensor-response-operating-range.md +293 -0
  721. package/docs/api/sensor-responsivity-photocurrent.md +245 -0
  722. package/docs/api/sensor-sampling-aperture.md +221 -0
  723. package/docs/api/sensor-scene-eqe-temporal-exposure.md +56 -0
  724. package/docs/api/sensor-sensor-geometry.md +143 -0
  725. package/docs/api/sensor-signal-noise.md +75 -0
  726. package/docs/api/sensor-spatial-sample-reduction.md +186 -0
  727. package/docs/api/sensor-spatial-sampling-quadrature.md +188 -0
  728. package/docs/api/sensor-spatio-spectral-reduction.md +217 -0
  729. package/docs/api/sensor-spectral-coverage.md +33 -0
  730. package/docs/api/sensor-spectral-quadrature.md +183 -0
  731. package/docs/api/sensor-spectral-response.md +291 -0
  732. package/docs/api/sensor-temporal-photo-signal.md +62 -0
  733. package/docs/api/simulation-poc-simulation.md +364 -0
  734. package/docs/api/stabilization-camera-shake.md +71 -0
  735. package/docs/api/stabilization-system.md +442 -0
  736. package/docs/benchmarks/2026-10-01-main-baseline.json +694 -0
  737. package/docs/benchmarks/2026-10-02-geometric-preparation-reuse.json +2190 -0
  738. package/docs/benchmarks/2026-10-02-poc-projection-reuse.json +2423 -0
  739. package/docs/benchmarks/2026-10-02-v1-environment-gc-profile.json +210 -0
  740. package/docs/benchmarks/2026-10-02-v1-environment-ordinary.json +187 -0
  741. package/docs/benchmarks/2026-10-02-v1-geometry-gc-profile.json +756 -0
  742. package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-1.json +711 -0
  743. package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-2.json +711 -0
  744. package/docs/benchmarks/2026-10-02-v1-poc-gc-profile.json +885 -0
  745. package/docs/benchmarks/2026-10-02-v1-poc-ordinary-1.json +868 -0
  746. package/docs/benchmarks/2026-10-02-v1-poc-ordinary-2.json +868 -0
  747. package/docs/examples/production-capture.mjs +34 -0
  748. package/docs/examples/production-request.json +4613 -0
  749. package/docs/examples/quick-start.mjs +12 -0
  750. package/docs/validation/documentation-fragments.json +212 -0
  751. package/docs/validation/release-audit-inventory.json +1306 -0
  752. package/docs/validation/tier-acceptance-report-v1.json +2538 -0
  753. package/package.json +18 -4
package/docs/API_STYLE.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # Public API Style
2
2
 
3
+ Release context: **package 1.0.0 candidate / root API 0.116.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0.md).
4
+
3
5
  The open engine should feel like one coherent library.
4
6
 
5
7
  ## Rules
@@ -97,3 +99,133 @@ Photivra has multiple independent version surfaces:
97
99
  Do not reuse one version as a proxy for another. A change to a parser/schema does not necessarily require changing the POC contract, and a POC response change does not necessarily mean the npm package has been released.
98
100
 
99
101
  Before 1.0, public APIs may evolve with documented changes. Breaking or semantically meaningful contract changes must update the relevant version surface, tests, changelog, and migration/compatibility documentation. After 1.0, breaking public-contract changes require an appropriate major-version transition.
102
+
103
+
104
+ ## Public function verb families
105
+
106
+ Use the established verb family that matches the operation's semantics. Do not invent a new synonym when one of these already fits.
107
+
108
+ - `calculate*` — deterministic scientific/numeric calculation.
109
+ - `estimate*` — explicit approximation/estimate.
110
+ - `parse*` — validate and normalize a versioned/untrusted configuration boundary.
111
+ - `validate*` — assert/check validity without changing semantic identity.
112
+ - `resolve*` — derive one deterministic semantic state from already-defined inputs/profiles.
113
+ - `assess*` — produce a compatibility/readiness/applicability assessment, including structured blockers.
114
+ - `create*` — construct a new semantic record/snapshot/manifest whose identity is part of the contract.
115
+ - `prepare*` — validate/canonicalize relatively static context for repeated later evaluation.
116
+ - `serialize*` — convert an authoritative semantic value to its documented deterministic serialized representation.
117
+ - `compose*` — combine multiple independently meaningful inputs/stages into a higher-level semantic result.
118
+ - `integrate*` / `reduce*` — mathematically aggregate explicit measures/samples under a documented model.
119
+ - `distribute*` — allocate an integrated quantity across explicitly normalized fractions while preserving its quantity domain; this does not create a continuous density from discrete spectral lines.
120
+ - `evaluate*` / `meter*` — evaluate a declared model/policy against current scene/capture data.
121
+ - `map*` / `transform*` — coordinate/domain transformation with explicit source/destination semantics.
122
+ - `bind*` — attach one already-defined result/state to another authoritative context without re-solving it.
123
+ - `set*` — return an updated immutable semantic value for a narrowly defined state-setting operation.
124
+ - `get*` — return a descriptive/static contract owned by the engine.
125
+ - `simulate*` — intentionally composed simulation/orchestration API.
126
+
127
+ Existing result factories `calculatedResult`, `estimatedResult`, `approximationResult`, and `calibratedResult` are documented core helpers rather than new public verb families.
128
+
129
+ A new verb family requires a concrete semantic distinction from the existing set and a documentation/update review.
130
+
131
+ ## Input and return-shape consistency
132
+
133
+ Choose API shape from semantic role, not module history.
134
+
135
+ - Public scientific calculations with multiple inputs accept one typed input object.
136
+ - Parsers accept one value/configuration and return the validated semantic value or throw the appropriate typed/domain error.
137
+ - Compatibility/readiness assessments should return structured blockers for scientifically incomplete-but-well-formed requests instead of converting every blocker into an exception.
138
+ - Malformed schema/numeric input should fail fast with the established typed/domain error.
139
+ - Calculations normally return `CalculationResult<T>`; do not wrap parsers merely to make every function look identical.
140
+ - Immutable snapshots/plans/manifests may use their own versioned record contracts when provenance, identity, or serialization semantics require them.
141
+ - Do not create module-specific aliases for shared concepts such as evidence, uncertainty, coordinate spaces, ranges, or scientific status unless the domain meaning actually differs.
142
+
143
+ Consistency must never erase a meaningful scientific distinction.
144
+
145
+ Internal immutable-data mechanics are shared through `src/core/owned-data.ts`.
146
+ Capture, RAW attachment/reconstruction, export metadata and equipment presets use
147
+ its child-first freeze helper only on their owned plain-data trees. Each domain
148
+ keeps its own validation and copy boundary; freezing is not parsing or cloning.
149
+ Already-frozen parents still require descendant traversal in this helper. The
150
+ production planner, focus and release helpers retain their distinct early-return
151
+ behavior for already-frozen objects. This internal module is not a root export.
152
+
153
+ `src/core/canonical-json.ts` shares sorted-key finite-JSON mechanics while each
154
+ caller supplies its existing omission and error policy. Production-plan records
155
+ omit undefined object properties; capture comparison and export hashing reject
156
+ them. Array order and JSON number/string representation are preserved. Planner
157
+ FNV-1a fingerprints and export SHA-256 hashes remain separate identity contracts;
158
+ the helper neither selects a hash nor changes either contract. Capture's public
159
+ serialization keeps its existing validated JSON.stringify representation.
160
+
161
+ ## Compatibility and deprecation policy
162
+
163
+ Photivra has independent compatibility surfaces. Update only the surface whose observable contract changed.
164
+
165
+ ### Package version
166
+
167
+ The npm package version identifies a published distribution. It is not a proxy for every internal/public contract version.
168
+
169
+ ### `ENGINE_API_VERSION`
170
+
171
+ Bump when the browser-safe root public engine contract changes materially, including a breaking or semantically meaningful exported API change.
172
+
173
+ ### Subsystem/schema versions
174
+
175
+ Versioned schemas, production-plan contracts, POC contracts, and similar surfaces own their own versions. A change to one does not automatically bump unrelated contracts.
176
+
177
+ ### Before package 1.0
178
+
179
+ The project may make breaking public changes when the scientific/architectural benefit justifies them, but such a change must:
180
+
181
+ - be intentional rather than incidental;
182
+ - update the relevant API/schema/contract version;
183
+ - update tests and public documentation;
184
+ - describe migration/compatibility impact;
185
+ - avoid silently reinterpreting previously valid serialized data.
186
+
187
+ ### After package 1.0
188
+
189
+ Breaking root-package public-contract changes require the normal SemVer major-version process. Independently versioned schema/contract changes still follow their own documented compatibility rules.
190
+
191
+ ### Deprecation
192
+
193
+ When practical, prefer an additive migration period:
194
+
195
+ 1. introduce the replacement contract;
196
+ 2. document the migration;
197
+ 3. keep old behavior stable long enough for deliberate downstream migration;
198
+ 4. remove only through the appropriate breaking/versioned change.
199
+
200
+ Do not keep an unsafe or scientifically false API solely to avoid a breaking change. Correctness remains the higher priority, but the break must be explicit.
201
+
202
+ ## Compatibility guard tests
203
+
204
+ The repository should maintain representative compatibility sentinels rather than freezing every pre-1.0 export forever.
205
+
206
+ Sentinels should cover:
207
+
208
+ - root engine and composed POC version surfaces;
209
+ - representative `calculate`, `parse`, composition, and simulation APIs;
210
+ - public function naming conventions;
211
+ - typed error/result semantics where relevant.
212
+
213
+ Adding a legitimate new API may require extending the naming test. Removing or renaming a sentinel requires explicit compatibility/version review.
214
+
215
+ ## OpenSource V1 API consistency audit
216
+
217
+ The OpenSource V1 audit treats the existing engine conventions as the baseline rather than redesigning stable APIs.
218
+
219
+ The root runtime surface currently uses the documented verb families above, with the four result-factory helpers as explicit exceptions. Future OpenSource V1 work should follow these conventions at implementation time.
220
+
221
+ Audit rule:
222
+
223
+ - preserve scientifically meaningful existing differences;
224
+ - normalize accidental naming/shape drift when low risk;
225
+ - do not perform broad cosmetic refactors solely for symmetry;
226
+ - record/document any intentional exception;
227
+ - keep private-app conventions from becoming public-engine contracts by accident.
228
+
229
+ ## Stable 1.0 distribution transition
230
+
231
+ Package 1.0.0 intentionally retains `ENGINE_API_VERSION = "0.116.0"`: this independent root contract identity is already embedded in serialized captures and does not itself signal a published distribution. The package 1.0 policy now governs breaking changes despite that historical root ID. No schema/model/POC/plan version is reset. See [migration and release procedure](RELEASE_1_0.md).
@@ -1,5 +1,7 @@
1
1
  # Architecture
2
2
 
3
+ Release context: **package 1.0.0 candidate / root API 0.116.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0.md).
4
+
3
5
  Photivra separates a reusable scientific core from optional composition and transport layers.
4
6
 
5
7
  ## Current root package
@@ -17,7 +19,7 @@ The browser-safe root package currently owns:
17
19
 
18
20
  The root package has no runtime npm dependencies. CI walks the root import graph and fails if Node-only modules or the `src/api` transport layer become reachable from it.
19
21
 
20
- Comparison, optimization, real-camera calibration databases, renderer effects, and full optical simulation are **not** current root-package capabilities.
22
+ A complete optical renderer, real-camera calibration database and hosted comparison/optimization service are outside the root package. Measured private reuse and explicit generic correction/PSF primitives are implemented within their documented envelopes.
21
23
 
22
24
  The sensor foundation intentionally keeps physical image-formation geometry separate from digital sampling. `SensorImagingArea` represents the photosensitive imaging dimensions used for image formation; `NativeImageRaster` represents effective image samples and does not imply one image sample equals one physical photodiode. Derived sampling pitch is geometric spacing only, not fill factor or photon-collection area.
23
25
 
@@ -45,23 +47,70 @@ Equivalent focal length is also layered on top of physical capture geometry rath
45
47
 
46
48
  Sensor architecture is a separate descriptive layer. Illumination (FSI/BSI), integration/stacking, readout capabilities, and color-sampling family are independent evidence-backed facts. Their presence alone has no image-quality effect in the engine. Evidence origin is modeled independently from reuse rights, scalar facts may cite multiple evidence records, and multi-valued capabilities carry evidence per value. Omitted facts remain unknown rather than being inferred. Capture-mode semantics, readout timing, reconstruction, and calibrated radiometry consume these facts only through later explicit models.
47
49
 
50
+ Exact color-sampling topology is a separate layer again. `SensorColorSamplingProfile` can describe monochrome or an arbitrary periodic mosaic on an abstract native sensor sampling-site lattice, while layered color uses a separate unresolved spatial reference and remains structural-only until per-layer spatial sampling is modeled. This lattice is intentionally not `NativeImageRaster`; the separate evidence-backed binding establishes how capture-mode effective samples relate to color-sampling sites. Active crop/orientation/output transforms therefore cannot reset periodic CFA phase, and architecture-family metadata cannot synthesize an exact tile.
51
+
52
+ That binding is now explicit through the native-effective-raster/color-site foundation. One evidence-backed profile ties one exact canonical native effective raster to regular sensor-anchored color-site blocks; a second resolver composes that relationship with a selected capture mode. Grouped modes require separately evidenced full-frame grouping phase, use absolute full-frame mode indices, and return compact pre-reconstruction source rectangles plus channel-site counts. Matching dimensions alone never create a binding. Pixel-shift metadata does not re-phase the CFA because the sensor/filter structure moves together; its optical-registration effect remains a later spatial-sampling concern. Declared-effective capture modes and unresolved layered layouts fail closed rather than receiving inferred mappings.
53
+
54
+ Sensor optical-stack metadata is a separate upstream layer. `SensorOpticalStackProfile` records ordered physical component roles and microlens presence independently from the effective anti-aliasing spatial response. Unknown AA response, documented absence/cancellation, unresolved presence, and an explicit normalized point-splitting kernel remain distinct. The first kernel is native-sensor-physical, field/wavelength/polarization-invariant, and spatial-only; it does not include throughput, spectral filtering, cover-glass refraction, microlens collection, or whole-stack PSF composition. This prevents OLPF presence from becoming a universal Gaussian/four-ray blur and prevents descriptive filter/microlens metadata from silently changing image formation.
55
+
56
+ Physical sampling aperture is a separate downstream prerequisite for CFA/site sampling. `SensorSamplingApertureProfile` explicitly registers the regular color-site center lattice in native sensor physical coordinates and can declare the first geometric sensitive-region approximation as a uniform rectangle. Site pitch/origin is never derived from `NativeImageRaster`, and aperture dimensions/offset are never inferred from pitch or a scalar fill fraction. The derived geometric sensitive-area fraction is diagnostic only. AA redistribution, microlenses, charge diffusion/crosstalk, spectral response, QE, optical throughput, radiometric collection area, and physical photodiode geometry remain separate models so spatial sampling can later compose them deliberately rather than double-count them.
57
+
58
+ The spatial-quadrature foundation now performs that first explicit composition of AA redistribution and geometric aperture support. It inverse-samples the pre-AA optical field, keeps the destination CFA channel authoritative, returns both normalized-average and geometric-area measures, and preserves off-imaging-area optical support without clamping. It still evaluates no optical/radiometric values and remains separate from temporal quadrature, microlens response, diffusion/crosstalk, RAW generation, and reconstruction.
59
+
60
+ The spatial-sample reducer now evaluates those quadrature weights against explicitly supplied nonnegative linear values. It supports either a dimensionless relative irradiance proxy or physical sensor-plane irradiance in W/m², matches values by node identity rather than position, and preserves both average and area-integral semantics. CFA channel labeling remains metadata until a later spectral response model; temporal exposure, photons/electrons, noise, ADC and RAW/reconstruction remain downstream.
61
+
62
+ The spectral-response foundation now supplies that next channel-specific metadata layer. It binds exact topology channel IDs to reusable wavelength-dependent effective EQE, A/W responsivity, or explicitly separable channel-filter×detector-EQE data. Wavelength basis/range/interpolation and response scope remain explicit, direct effective response is not decomposed without evidence, and condition-dependent response remains unmodeled. Separate spectral/EQE/temporal APIs perform explicit integration without widening this profile resolver.
63
+
64
+ The spectral-quadrature foundation now plans the next wavelength dimension without performing signal integration. It partitions an explicitly requested response-supported interval at sensor-response knots plus optional caller-supplied continuous-spectrum/optics breakpoints, then uses bounded equal-width midpoint subintervals with dλ expressed in nanometres. The result preserves response kind, scope, uncertainty and evidence but does not apply response values, establish common scene/optics/sensor spectral coverage, or calculate photons, electrons, current or RAW values. QE and A/W therefore remain separate downstream signal paths, response scope must later match the source plane, and discrete line spectra remain outside the continuous-density quadrature contract.
65
+
66
+ The spatio-spectral reducer now composes the spatial and wavelength measures against explicitly supplied E_lambda(x,y) in W/m²/nm. Spatial plans carry their exact colorSamplingProfileId so composition can require profile identity rather than channel-name coincidence. The reducer validates the full spatial × spectral Cartesian product, caps it independently, reports per-wavelength spatial averages and geometric-aperture spectral flux density, and integrates those pre-response quantities over dλ. It still applies no QE, A/W responsivity, channel-filter transmission, temporal exposure, effective collection-area correction, photon/electron conversion or RAW processing.
67
+
68
+ The response-application compatibility gate binds the response profile/channel to the exact sampling-aperture and optical-stack identities used by the spatial plan, matches response scope to an evidence-backed source reference plane, distinguishes geometric-sensitive-aperture from full-site/effective-collection-area normalization, requires explicit spatial response uniformity/separability before allowing post-spatial response, and handles response reference conditions without treating omitted dependence as invariance.
69
+
70
+ The response operating-range gate follows that structural assessment. It preserves whether linearity was characterized in incident radiant power or irradiance, requires the current wavelength basis/range and operating conditions to remain inside the declared calibration applicability, records the allowed relative nonlinearity criterion, and distinguishes broadband-only evidence from per-spectral-bin applicability with an explicit maximum bin width. Wavelength-dependent conversion requires per-bin validity and spatial linear superposition; broadband total power alone cannot authorize it. Exposure/full-well saturation, accumulated-charge linearity and downstream electronics linearity remain separate because they depend on temporal integration and later signal stages.
71
+
72
+ The photon-energy wavelength foundation supplies the unit bridge for photon-domain response. Vacuum wavelengths use exact SI h and c directly. Air wavelengths require an exact-wavelength sourced phase refractive index to obtain vacuum wavelength, plus explicit atmosphere compatibility because refractive index varies with conditions. Refractive-index uncertainty is preserved as input metadata but is not yet propagated into photon-energy uncertainty.
73
+
74
+ The EQE electron-rate foundation performs the photon-domain response conversion. It requires the structural and operating-range gates, including explicit geometric-aperture linear superposition and per-spectral-bin input validity; binds the operating-range bin identities/values back to the exact reduction; requires an exact canonical response-channel data binding so changed numeric calibration samples cannot hide behind the same IDs/evidence; evaluates response per wavelength node; converts each spectral power contribution to photon rate through hν; and applies direct or explicitly separable effective EQE to produce expected electron rate. Wavelength contributions use compensated summation.
75
+
76
+ The sibling A/W foundation remains a separate current-domain path. It applies spectral responsivity per wavelength bin directly to radiant-power contributions and returns detector-terminal photocurrent magnitude. It uses the same exact canonical response-channel binding so A/W sample drift cannot be substituted under unchanged provenance. A separate electrical applicability profile binds detector bias and current-readout load semantics to the calibration. It deliberately does not infer electron rate or circuit polarity, and it stops before transimpedance gain, voltage, temporal charge, saturation/noise, ADC or RAW processing.
77
+
78
+ Both response paths therefore converge only at a later temporal/electrical composition boundary; neither is allowed to reinterpret the other's signal domain.
79
+
80
+ The local exposure-binding foundation begins that temporal boundary without integrating signal. Engine-produced rate results preserve their color-site identity. The binding validates the site/channel, resolves the existing color-site/native-effective-raster relationship, and recomputes the shutter window at the mapped native sample center. The first binding accepts only one-to-one site/sample registration; grouped multi-site blocks do not prove sub-sample timing coordinates.
81
+
82
+ The constant-rate temporal-integration foundation then requires an evidence-backed stationarity declaration tied to that exact rate domain, site, binding ID and local start/end window. Only then may rate × duration be evaluated. EQE produces expected photon/electron counts without stochastic sampling; A/W produces photocurrent charge magnitude without carrier-count inference.
83
+
84
+ The dark-current foundation begins charge completion for the EQE path only. It integrates evidence-backed pre-compensation thermal electron rate over the exact local exposure and keeps temperature applicability explicit. Exact-reference values and measured piecewise-linear temperature tables are supported; no universal exponential temperature law is inferred. Population-mean dark current remains an approximation and does not imply DCNU/hot-pixel modeling. A/W photocharge remains outside electron-storage/full-well semantics until a separate carrier/storage mapping exists.
85
+
86
+ The accumulated-charge foundation then rebinds photo signal, dark charge, and every explicitly incremental additional stored-electron contributor to one exact local exposure event. A separate evidence-backed completeness profile must enumerate the supplied additional-component IDs and assert that all material stored-electron contributors are accounted for.
87
+
88
+ The physical charge-capacity foundation compares that complete **expected** stored-electron total to an evidence-backed storage-capacity profile tied to site, operating state and temperature applicability. It reports ratio/headroom and whether the unsaturated expected charge lies below, at or above capacity. It does not clamp charge, calculate nonlinear post-saturation storage, infer blooming/neighbor transfer, or claim the stochastic saturation state is known.
89
+
90
+ The camera saturation-capacity foundation separately compares dark-corrected photo-generated electron-equivalent signal against an evidence-backed camera response-chain saturation capacity. It deliberately does not use total stored charge or physical full-well capacity. The capacity may reflect an earlier analog/digital limit, but the first contract does not infer the limiting stage, ADC code, or post-saturation transfer behavior.
91
+
92
+ Physical storage capacity and camera saturation are therefore parallel assessments in different calibrated domains, not one shared clamp.
93
+
48
94
 
49
95
  ## Image-formation ownership and ordering
50
96
 
51
97
  The root package exports `getImageFormationContract()` as the canonical semantic map for current and future image-formation work.
52
98
 
53
- It defines five scientific domains:
99
+ It defines six scientific domains:
54
100
 
55
101
  1. scene/ray geometry;
56
- 2. lens mapping plus pupil/throughput;
57
- 3. field- and wavelength-dependent PSF;
58
- 4. time-dependent exposure/readout;
59
- 5. sensor sampling through orientation/output/display.
102
+ 2. scene-radiance formation;
103
+ 3. lens mapping plus pupil/throughput;
104
+ 4. field- and wavelength-dependent PSF;
105
+ 5. time-dependent exposure/readout;
106
+ 6. sensor sampling through orientation/output/display.
60
107
 
61
108
  The graph is a **dependency/ownership graph**, not a literal renderer filter list. Hard upstream dependencies are acyclic; explicit couplings record interactions that must not be split into scientifically independent post-effects.
62
109
 
63
110
  Important consequences:
64
111
 
112
+ - illumination-source metadata is upstream input to scene-radiance formation, not a sensor shortcut or post-render RGB overlay;
113
+ - outgoing scene spectral radiance is distinct from `SceneRadiometry` luminance anchors, source spectra, and sensor-plane irradiance;
65
114
  - focus breathing is projection/lens mapping;
66
115
  - lateral CA is wavelength/channel-dependent field mapping;
67
116
  - illumination vignetting is throughput-only;
@@ -69,12 +118,40 @@ Important consequences:
69
118
  - diffraction belongs to the pupil/PSF domain;
70
119
  - camera rotation should be time-parameterized so global and rolling readout consume one motion model;
71
120
  - exposure duration and readout timing remain independent;
72
- - future sensor ordering is reserved from optical stack/CFA sampling through charge/noise/ADC/reconstruction before oriented/output transforms.
121
+ - sensor ordering runs from optical stack/CFA sampling through charge/noise/ADC/reconstruction before oriented/output transforms; plan 0.7.0 executes this bounded declared environment route, while unsupported effects still block.
73
122
 
74
123
  Renderer implementations may optimize or approximate only when they preserve the engine-owned semantics. Geometric warps use inverse destination-to-source sampling, premultiplied alpha, and stable depth/occlusion order.
75
124
 
76
125
  See `docs/IMAGE_FORMATION.md`.
77
126
 
127
+ The standalone `parseSceneIlluminationProfile()` foundation now provides stable renderer-independent point/spot/area/directional/environment source identities, scene-object binding, source-specific magnitude semantics, continuous-spectrum provenance, and explicit approximation boundaries. It intentionally stops before material/visibility/transport evaluation, so the `scene-radiance-evaluation` stage remains only partially founded. See `docs/SCENE_RADIANCE_AND_ILLUMINATION.md`.
128
+
129
+ The additive scene-radiance provider boundary now defines material-response metadata, provider fidelity, exact surface/environment evaluation requests, and validated outgoing spectral-radiance results. The engine validates identities, units, provenance, wavelength/time/direction semantics and declared fidelity, but does not implement the renderer or recompute the provider's transport result. Provider/result schema 0.1.0 is approximation-only even when calibrated spectral material inputs are present; it therefore cannot satisfy a calibrated scene-radiance claim by itself. RGB/PBR material inputs remain explicit approximation data, while wavelength-changing material behavior, emission, volumetrics and polarization remain unmodeled.
130
+
131
+ The shared spectral-composition foundation now separates two mathematical domains. Continuous spectral factors declare a resolved air/vacuum basis, finite wavelength support and interpolation breakpoints; composition intersects support and unions breakpoints without applying values. Delta-like discrete lines instead carry normalized wavelength-integrated line weights and are integrated by summing line contributions with no dλ multiplier. A sensor-response adapter exposes existing response support/knots to the shared continuous plan, and the illumination layer exposes continuous source support or discrete-line source measures without broadening one representation into the other.
132
+
133
+ The temporal illumination foundation overlays time-varying relative source modulation on the existing static illumination profile without changing that base schema. Waveforms are aperiodic or periodic piecewise-linear multiplier data with evidence and uncertainty. Each time-varying source requires an explicit registration mapping waveform-local t=0 onto the existing capture reference `first-opening-boundary-phase`. Evaluation and local-exposure integration consume physical seconds from that reference; sensor data-readout timing remains independent. The temporal layer never chooses shutter/aperture/ISO, so downstream metering/automatic-exposure consumers can observe changed pre-exposure light without creating a display-brightness feedback loop.
134
+
135
+ The first exposure-metering foundation consumes an explicitly relative **pre-exposure linear signal** sample set over the physically oriented active capture frame. It is approximation-only and does not reinterpret those samples as calibrated luminance, spectral radiance or sensor-plane irradiance. Generic multi-zone, center-weighted, spot and highlight-weighted profiles state their weighting policy directly; the declared relative target is profile policy rather than a universal gray-card truth. The meter returns a stable measurement/scene-state identity plus the stop offset required to reach that target, while final output crop, tone mapping/display gamma, exposure compensation and automatic aperture/shutter/ISO resolution remain separate. #99 should consume this typed result rather than renderer-specific buffers.
136
+
137
+ The additive #85→#100 bridge validates that a relative meter sample set is bound to one scene-radiance provider, illumination profile, material-response profile and derivation profile. The scalar reduction remains explicitly renderer/provider supplied because spectral scene radiance cannot be collapsed into a camera exposure-meter scalar without a declared spectral/color weighting model. Schema 0.1.0 therefore labels the reduction uncalibrated/approximate instead of inventing photopic or camera-specific weighting. If the provider binds temporal illumination, each sample set also requires a finite capture time on the shared `first-opening-boundary-phase` reference. A separate temporal-metering function may combine multiple such measurements only under an explicit positive normalized weighted-time-average policy; it averages the linear meter signal first and derives the stop offset afterward. Mixed scene-state/provider/geometry contexts fail closed.
138
+
139
+ #110 now provides the first physical primary-optics bridge from one validated #85 outgoing spectral-radiance sample to pre-sensor-stack spectral irradiance. `calculateSceneRadianceToSensorIrradiance()` preserves request/result time and wavelength identity, applies a paraxial circular-pupil acceptance term using an explicit working f-number, then applies exactly one transmission path and at most one field-throughput result. Wavelength-resolved transmission and effective working T-stop are mutually exclusive so transmission loss cannot be double-counted. Finite-focus handling is explicit: infinity focus uses nominal f-number; the ideal symmetric thin-lens approximation may use `N_working = N(1+m)` only with unity pupil-magnification declared; real/generic profiles may instead supply an evidence-backed working f-number. The bridge deliberately adds no universal cos^4 falloff, distortion/Jacobian brightness correction, PSF energy redistribution, sensor optical-stack/microlens/CFA/QE response, or stray-light contribution. Its output is wavelength-resolved sensor-plane incident irradiance in W/m²/nm for #14/downstream consumers.
140
+
141
+ The meter-target seam then freezes a spatial or temporal metering result into a stable value object for #99. The frozen snapshot preserves measurement ID, scene-state ID and metering-profile ID so AE lock can intentionally keep one target while later scene states change. Exposure compensation is a separate absolute-stop transform over that frozen base target; it never rewrites the source meter measurement, and a changed compensation state receives a new target ID. Positive compensation requests more exposure. No-signal remains unresolved rather than becoming infinity. Aperture/shutter/ISO selection still belongs entirely to #99.
142
+
143
+ The first #109 equipment-capability slice introduces separate generic Photivra body and lens exposure profiles rather than extending the legacy selected-state `CameraConfiguration`. Body profiles own shutter-duration and ISO capability ranges/grids plus Auto ISO availability; lens profiles own focal-length capability and aperture capability, including focal-length-dependent widest available f-number. `resolveGenericEquipmentExposureCapabilities()` combines them at one selected focal length and returns an immutable exposure envelope for #99. It does not select aperture/shutter/ISO, model ISO noise/gain topology, infer shutter mechanism/readout, or claim named commercial equipment emulation. Generic product profile identity/version is the normal applicability seam.
144
+
145
+ The first #99 resolver slice consumes that capability envelope plus the frozen #100 meter target. In Manual mode, aperture and shutter are always manual axes. ISO is either manual-preserved or automatic. Because the relative meter target does not define an absolute ISO by itself, the resolver requires an explicit reference exposure anchor `(aperture, shutter, ISO)`; the target scale and current manual optical exposure are measured relative to that anchor. Auto ISO then resolves only ISO, applies the declared equipment range/grid, and reports signed residual stops plus the limiting constraint. Manual ISO never changes when compensation changes; only its meter residual diagnostic changes. ISO control remains a nominal exposure-index/gain-control decision and does not infer sensor noise, conversion gain, photons, or analog topology.
146
+
147
+ The second #99 resolver slice adds Aperture Priority with manual ISO without introducing a new exposure equation. Aperture and ISO are validated manual axes; shutter is the only automatic axis. Ideal shutter duration is solved from the same relative target/reference anchor used by Manual + Auto ISO, then constrained by the #109 shutter envelope. Continuous grids preserve the ideal duration; discrete grids quantize in log2 duration space with a shorter-duration tie break. Shutter limits and grid quantization report signed residual stops. Exposure compensation remains already embedded in the typed target and is never reapplied by the resolver.
148
+
149
+ The larger #99 priority-policy layer adds the remaining A/S priority combinations needed before Program/Full Auto. Multi-axis automatic behavior is declared policy: A+Auto ISO uses minimum selectable ISO until a named slowest-preferred shutter threshold, then ISO, with an explicit after-ISO-max fallback; S+Auto ISO uses aperture-first selection at minimum ISO, choosing a discrete aperture no wider than the ideal so ISO can fill the remaining exposure. S+manual ISO resolves only aperture. These choices are generic educational/product policies, not physical laws or claims about a named camera. All modes still resolve to the same aperture/shutter/ISO physical variables and reuse common target/reference/capability math.
150
+
151
+ The next #99 layer introduces versioned generic exposure program lines for Program Auto and Full Auto exposure. A line is a sequence of control-policy nodes `(optical stops from reference, aperture, shutter)`; each node must be consistent with the explicit reference exposure and current #109 capability envelope. Between nodes, aperture and shutter interpolate in log2 space so optical exposure stops interpolate linearly before equipment quantization. Program Auto may keep ISO manual or use Auto ISO to absorb line-endpoint/quantization residuals. Full Auto exposure uses the same line with Auto ISO but remains exposure-only: AF, WB, flash, drive, scene recognition, and stabilization are explicitly unresolved. Program lines are product policy approximations, not scientific laws or claims of commercial-camera emulation.
152
+
153
+ The final #99 control seam treats fixed-duration, Bulb, and Time as duration-control behavior only. `resolveExposureDurationControl()` returns either an active unfinished control or a concrete positive elapsed duration. Only a resolved result may be bound into the authoritative #12 `CalculateCaptureExposureWindowsInput`; the adapter replaces only `nominalExposureDurationSeconds` and leaves shutter mechanism/opening/closing schedules untouched. No universal 30 s limit is introduced. Once seconds are resolved, long exposure follows the same local exposure-window, temporal integration, motion, charge, dark-current, and saturation pathways as any other duration. Bulb/Time do not imply mechanical shutter, tripod support, stabilization state, long-exposure NR, or sensor-temperature behavior.
154
+
78
155
  ## Radiometry readiness boundary
79
156
 
80
157
  Radiometry prerequisites are represented separately from the composed POC and from low-level signal/noise primitives. `parseRadiometryReadinessProfile()` validates declared scene spectral radiance, optical transmission, pupil/vignetting behavior, photosite collection-area semantics, exposure integration, and sensor response together with evidence and uncertainty declarations.
@@ -118,6 +195,11 @@ Compatibility boundaries remain explicit:
118
195
  The POC still does **not** consume:
119
196
 
120
197
  - `SensorArchitectureProfile`;
198
+ - `SensorColorSamplingProfile`;
199
+ - `NativeEffectiveRasterColorSamplingBindingProfile`;
200
+ - `SensorOpticalStackProfile`;
201
+ - `SensorSamplingApertureProfile`;
202
+ - `CaptureModeProfile`;
121
203
  - `RadiometryReadinessProfile` or calibrated photon/noise output.
122
204
 
123
205
  That separation is deliberate. Further foundation APIs should remain independently testable and only enter the POC through explicit contract/version changes and migration review.
@@ -192,6 +274,63 @@ It is intentionally **not** composed into `simulatePocCamera()` yet. The existin
192
274
 
193
275
  The new primitive provides deterministic yaw/pitch/roll rotation geometry only. It does not model camera translation, stabilization control laws, rolling-readout scheduling, or scene-depth-dependent parallax.
194
276
 
277
+ ## Production image-formation composition
278
+
279
+ The production composition contract is additive and separate from `simulatePocCamera()`.
280
+
281
+ `prepareImageFormationContext()` owns relatively static validated context:
282
+
283
+ - resolved equipment capability identity;
284
+ - scene/provider identity;
285
+ - #110 optical-throughput profile;
286
+ - output-geometry profile identity;
287
+ - renderer capability declaration;
288
+ - fidelity requirements.
289
+
290
+ `createProductionCaptureSnapshot()` commits per-capture state:
291
+
292
+ - capture/release-frame/scene-state identity;
293
+ - scene time;
294
+ - aperture/shutter/ISO;
295
+ - deterministic capture seed;
296
+ - optional #85 scene-radiance + #110 field/focus input.
297
+
298
+ Prepared context and capture snapshots are copied, deeply frozen and fingerprinted. Later UI mutation cannot alter a committed plan.
299
+
300
+ `createProductionImageFormationPlan()` expands required dependencies from `getImageFormationContract()`; it does not maintain a second hidden stage order. Every contract stage/effect remains visible in the plan as active, modeled-zero, omitted by fidelity, unsupported, or blocked.
301
+
302
+ The initial composer intentionally integrates only a conservative subset:
303
+
304
+ The next production-composition slice adds temporal capture semantics without inventing a new timing model. The immutable capture snapshot may now carry:
305
+
306
+ - authoritative #12 exposure-window input;
307
+ - invariant native sensor readout declaration;
308
+ - physical imaging area/orientation;
309
+ - optional pure-camera-rotation velocity and deterministic temporal sample count.
310
+
311
+ The plan evaluates local exposure windows and sensor readout separately. It does **not** assume those clocks are synchronized. When rotation is supplied, it delegates temporal geometry to the existing pure-rotation midpoint quadrature and preserves the committed temporal sample count.
312
+
313
+ This does not weaken the image-formation dependency graph. `temporal-exposure-readout` still depends on `field-wavelength-psf`; until PSF is intentionally production-composed, a fidelity profile requiring the full temporal stage can carry useful timing/rotation results while the overall plan remains blocked on that upstream stage.
314
+
315
+ A separate consumer-manifest API projects the same finalized semantic plan into either `interactive-optimized` or `reference` execution roles. Consumer role does not permit changing scientific inputs, stage order, capture seed, or committed temporal sample count.
316
+
317
+
318
+ ```text
319
+ scene-ray-projection semantic binding
320
+ -> #85 scene-radiance result
321
+ -> #110 lens/pupil/throughput evaluation
322
+ ```
323
+
324
+ Requesting later stages such as PSF, sensor optical stack, CFA/charge/ADC/reconstruction produces structured `engine-stage-not-composed` blockers until those standalone foundations are deliberately integrated.
325
+
326
+ Renderer declarations are semantic capability metadata only; the plan accepts no React/Three.js/WebGPU objects. Optimized and reference renderers consume the same stage/effect semantics and must declare spectral, depth, warp, alpha and sensor-domain capabilities.
327
+
328
+ Plan fingerprints use canonical serialization plus FNV-1a 32-bit only as deterministic reproducibility keys. They are not security/integrity hashes.
329
+
330
+ The capture seed is explicit and backend randomness may not redefine the scientific result. Future stochastic stages must derive deterministic sub-seeds through an engine-owned policy.
331
+
332
+ See [Production Image-Formation Plan](PRODUCTION_COMPOSITION.md).
333
+
195
334
  ## Repository-local Node POC transport
196
335
 
197
336
  The repository contains a minimal Node-only HTTP transport under `src/api` for contributor integration testing.
@@ -200,23 +339,11 @@ It wraps `simulatePocCamera()` with an unauthenticated localhost server. The HTT
200
339
 
201
340
  This transport is intentionally **not** part of the public `@photivra/engine` package surface and is excluded from the npm tarball. The POC server is not the intended production architecture.
202
341
 
203
- ## Optional/future capability modules
204
-
205
- Future capabilities should compose onto the scientific core rather than silently widening unrelated models. Examples include:
342
+ ## Boundaries beyond the 1.0 route
206
343
 
207
- - composed use of the standalone spatial camera-rotation model plus future depth-aware camera translation;
208
- - panning and rolling/global shutter;
209
- - flash;
210
- - spectral/color modeling;
211
- - macro/high-magnification calibration;
212
- - non-circular diffraction PSFs;
213
- - computational capture;
214
- - lens calibration profiles;
215
- - advanced/calibrated sensor profiles;
216
- - comparison and optimization systems;
217
- - renderer-specific effects.
344
+ The root package already has direct extended-object motion, depth-aware translation/parallax quadrature, manual flash/sync, generic stabilization, spectral response/color and polygon/complex-pupil PSF primitives. Their existence does not make every combination available to the production composer.
218
345
 
219
- Capabilities should remain discoverable and explicitly versioned rather than being assumed present for every scene or runtime.
346
+ The bounded production environment route uses declared environment radiance, ideal projection, constant-axis rotation, explicit spatial/spectral/temporal EQE and seeded native RAW with optional output. General surface intersection/visibility, world translation, calibrated commercial profiles, computational multi-frame image combination, full field-dependent PSF transport and megapixel execution remain outside that route. See [production envelope](PRODUCTION_ENVIRONMENT_CAPTURE.md) and [composition map](V1_COMPOSITION_MAP.md).
220
347
 
221
348
  ## Repository scope
222
349
 
@@ -226,4 +353,4 @@ The published npm package intentionally exposes only the browser-safe scientific
226
353
 
227
354
  ## Version surfaces
228
355
 
229
- The root library contract and the composed POC simulation contract are versioned independently. `ENGINE_API_VERSION` describes the root browser-safe engine surface. `POC_SIMULATION_API_VERSION` describes the request/response behavior of `simulatePocCamera()` and the repository-local POC HTTP transport. Package versioning remains separate from both.
356
+ The root library, semantic image-formation graph, production composition plan, and composed POC simulation are versioned independently. `ENGINE_API_VERSION` describes the root browser-safe engine surface; `IMAGE_FORMATION_CONTRACT_VERSION` describes ownership/order semantics; `PRODUCTION_IMAGE_FORMATION_PLAN_VERSION` describes the production composition result contract; and `POC_SIMULATION_API_VERSION` describes `simulatePocCamera()` plus the repository-local POC HTTP transport. Prepared-context, capture-snapshot, renderer-capability, and fidelity-profile schemas also retain their own versions. Package versioning remains separate from all of them.
@@ -0,0 +1,190 @@
1
+ # Public-engine automation coordination
2
+
3
+ Release context: **package 1.0.0 candidate / root API 0.116.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0.md).
4
+
5
+ This document coordinates the two recurring automation lanes that work only in the public
6
+ `Photivra/photivra` repository. It is process guidance, not a scientific roadmap. Open issues and
7
+ the repository's scientific/API documentation remain authoritative for product and model semantics.
8
+
9
+ ## Lanes
10
+
11
+ - **Engine Science** (`engine-science`) owns scientific/foundational roadmap work.
12
+ - **Export & Performance** (`export-performance`) owns `SimulatedCapture`, TIFF/DNG export,
13
+ measured performance work, and CI-efficiency work.
14
+
15
+ Each roadmap issue should contain a short **Automation coordination** block identifying its owner
16
+ lane, dependencies, and cross-lane handoff. That block coordinates work; it does not override the
17
+ issue's scientific acceptance criteria.
18
+
19
+ ## Control plane
20
+
21
+ Automation coordination state lives on the repository's dedicated `automation-state` branch:
22
+
23
+ - `coordination/registry.v1.json`
24
+ - `coordination/registry.schema.json`
25
+
26
+ The control branch belongs to this public repository. No private repository or other project is a
27
+ coordination dependency.
28
+
29
+ Before any automation-owned project write:
30
+
31
+ 1. Read current `main`, open PRs, recent merges, the target issue, and applicable `AGENTS.md` /
32
+ scientific/API documentation.
33
+ 2. Read the registry from `automation-state` together with its exact blob SHA.
34
+ 3. Acquire the lane mutex and every shared resource required for the intended mutation in one
35
+ SHA-guarded registry update.
36
+ 4. If the registry changed, re-read and retry the compare-and-swap at most three times.
37
+ 5. Never steal an unexpired lease. A lease may be reclaimed only after its `expiresAt` is at
38
+ least two minutes in the past.
39
+ 6. Use a lease duration no longer than 55 minutes. If work cannot safely finish inside that
40
+ window, stop at a clean boundary and continue on the next scheduled run rather than holding a
41
+ resource indefinitely.
42
+ 7. Release every registry entry carrying the exact `leaseId` when the task is merged, abandoned,
43
+ or safely stopped.
44
+
45
+ If the registry cannot be read or validated, automation may inspect and plan but must not mutate
46
+ the repository.
47
+
48
+ ## Resource names
49
+
50
+ Every mutating run acquires exactly one lane mutex:
51
+
52
+ - `lane:engine-science`
53
+ - `lane:export-performance`
54
+
55
+ Acquire additional shared resources only when the change touches them:
56
+
57
+ - `shared:ci` — `.github/workflows/**`, CI policy/scripts, or test-runner configuration.
58
+ - `shared:package` — root `package.json`, `package-lock.json`, package exports, or dependency
59
+ changes.
60
+ - `shared:api-version` — `ENGINE_API_VERSION`, `POC_SIMULATION_API_VERSION`, or public schema
61
+ version surfaces.
62
+ - `shared:changelog` — `CHANGELOG.md` when both lanes could plausibly update it.
63
+ - `issue:<number>` — when mutating issue state/body/comments as part of active implementation.
64
+ - `path:<repository-path>` — for another high-collision file not covered by a shared resource.
65
+
66
+ Do not acquire broad resources speculatively. The registry is intended to prevent collisions, not
67
+ serialize unrelated science and export work.
68
+
69
+ ## Branch and PR ownership
70
+
71
+ Use focused branches:
72
+
73
+ - Engine Science: `science/*`, `sensor/*`, `motion/*`, `optics/*`, or another clearly
74
+ science-owned prefix.
75
+ - Export & Performance: `export/*`, `dng/*`, `perf/*`, or `ci/*`.
76
+
77
+ Normally each lane has at most one active behavioral PR. Before creating new work, inspect existing
78
+ open PRs and reuse an automation-owned branch/PR when it represents the same task.
79
+
80
+ Never modify another lane's active branch. A dependent lane consumes prerequisite work only after it
81
+ is merged to `main`, unless the project owner explicitly approves another integration path.
82
+
83
+ After every merge, rescan open PRs and the relevant dependency issues before selecting the next task.
84
+
85
+ ## Cross-lane handoff
86
+
87
+ When one lane lands a prerequisite for the other:
88
+
89
+ 1. Merge the prerequisite independently with its own tests and contract documentation.
90
+ 2. Record the exact merged commit and public API/contract surface on the dependent issue when a
91
+ handoff note materially helps.
92
+ 3. The dependent lane starts from current `main`; it does not continue on the prerequisite
93
+ lane's branch.
94
+ 4. If a downstream task exposes a missing scientific contract, Export & Performance records the
95
+ dependency and moves to independent work instead of implementing science locally.
96
+ 5. If Engine Science needs a benchmark/CI change, it records the requirement and lets Export &
97
+ Performance own the shared implementation unless the change is inseparable from the science
98
+ patch.
99
+
100
+ ## DCO and automated commits
101
+
102
+ The repository requires Developer Certificate of Origin sign-off for commits intended for
103
+ inclusion.
104
+
105
+ Automation must fail closed rather than invent a contributor identity. When operating through the
106
+ repository owner's authenticated GitHub connection under explicit owner authorization, use the
107
+ owner's established DCO identity from existing signed-off commits. Otherwise, do not create a
108
+ merge-intended commit until an authorized sign-off identity/path is available.
109
+
110
+ Every automation-created merge-intended commit must contain a valid `Signed-off-by:` trailer.
111
+
112
+ ## Merge discipline
113
+
114
+ Automation-owned non-breaking PRs may be merged only when:
115
+
116
+ - the exact final head is current and mergeable;
117
+ - required checks for that head are green;
118
+ - no expected check is missing or silently skipped;
119
+ - the complete final diff is reviewed;
120
+ - the lane still owns every required lease;
121
+ - issue dependencies are satisfied;
122
+ - DCO sign-off is present;
123
+ - scientific, provenance/licensing, security, browser/package-boundary, compatibility, and release
124
+ gates remain satisfied.
125
+
126
+ Intentional breaking public API/schema changes, releases/publication, new paid services, ambiguous
127
+ provenance/legal decisions, or other owner-gated actions still require explicit human approval.
128
+
129
+ ## Productive-run contract
130
+
131
+ A scheduled implementation run is successful only when it produces at least one concrete delivery
132
+ outcome:
133
+
134
+ 1. a safe roadmap PR is merged;
135
+ 2. an active roadmap PR contains substantive implementation/documentation changes and exact-head CI
136
+ is running or has produced actionable results;
137
+ 3. a roadmap issue is closed or materially narrowed with repository evidence because current
138
+ `main` already satisfies part or all of its acceptance criteria; or
139
+ 4. a specific blocker that truly requires external/human action is recorded with the exact missing
140
+ prerequisite and the lane immediately moves to another independent ready issue when one exists.
141
+
142
+ A general audit, plan, status recap, repeated inspection, or rediscovery of an already-known blocker
143
+ does **not** count as a productive outcome while actionable work exists.
144
+
145
+ Before starting implementation, read the issue's latest **Roadmap reconciliation** section when
146
+ present. Do not redo capabilities already verified on `main`. If reconciliation evidence shows the
147
+ issue is already complete, close it with evidence and continue to the next ready issue in the same
148
+ run when practical.
149
+
150
+ ## Stalled-progress rule
151
+
152
+ A lane must not spend repeated scheduled runs on the same non-productive state.
153
+
154
+ If two consecutive expected lane runs have produced none of the productive outcomes above:
155
+
156
+ 1. rescan current `main`, open PRs, recent merges, reconciliation state, dependencies, and leases;
157
+ 2. stop repeating the same audit or retry path;
158
+ 3. choose the next independent ready issue owned by the lane; or
159
+ 4. if no owned issue is actionable, record the precise blocker/dependency and surface it through the
160
+ health process.
161
+
162
+ An ordinary CI failure, owned merge conflict, stale automation branch, test regression, or expired
163
+ lease is an implementation problem to resolve, not by itself a reason to declare the lane blocked.
164
+ Only owner-gated decisions, unavailable external prerequisites, unresolved legal/provenance
165
+ questions, release gates, or another genuinely external dependency qualify as persistent blockers
166
+ after safe remediation paths are exhausted.
167
+
168
+ The health watch should treat an enabled/on-cadence lane with two consecutive scheduled windows and
169
+ no concrete delivery outcome as potentially stalled when a reconciled ready issue exists. It should
170
+ identify the lane and ready issue rather than disabling the lane.
171
+
172
+ ## Roadmap reconciliation discipline
173
+
174
+ Open issues are the roadmap, but issue state must reflect current `main`.
175
+
176
+ - Periodically reconcile issue acceptance criteria against merged implementation and tests.
177
+ - Close an issue when all of its open-source acceptance criteria are demonstrably satisfied.
178
+ - For partially completed issues, record the landed capability and the exact remaining scope in the
179
+ issue itself so future runs do not recreate completed work.
180
+ - Unmerged historical branches are evidence to inspect, not authoritative project state.
181
+ - A private/product requirement outside the current open-source scope does not keep an otherwise
182
+ completed public-engine issue open.
183
+ - After reconciliation or a merge, select work from the remaining dependency graph rather than issue
184
+ age.
185
+
186
+ ## Avoiding coordination drift
187
+
188
+ Do not duplicate scientific requirements or rewrite roadmap acceptance criteria in this document or
189
+ the registry. If issue ownership/dependencies change, update the issue's coordination block and the
190
+ automation prompt together. The issue remains authoritative for the work itself.