@photivra/engine 1.4.0 → 2.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 (1074) hide show
  1. package/CHANGELOG.md +401 -6
  2. package/CITATION.cff +1 -1
  3. package/NODE_SUPPORT.md +64 -12
  4. package/README.md +301 -182
  5. package/SECURITY.md +37 -28
  6. package/THIRD_PARTY.md +148 -4
  7. package/dist/camera/equivalent-focal-length.d.ts +13 -14
  8. package/dist/camera/equivalent-focal-length.js +15 -13
  9. package/dist/camera/equivalent-focal-length.js.map +1 -1
  10. package/dist/camera/field-of-view.d.ts +30 -19
  11. package/dist/camera/field-of-view.js +67 -18
  12. package/dist/camera/field-of-view.js.map +1 -1
  13. package/dist/camera/lens-projection.d.ts +170 -0
  14. package/dist/camera/lens-projection.js +444 -0
  15. package/dist/camera/lens-projection.js.map +1 -0
  16. package/dist/camera/projected-object-size.d.ts +10 -11
  17. package/dist/camera/projected-object-size.js +12 -10
  18. package/dist/camera/projected-object-size.js.map +1 -1
  19. package/dist/capture/capture-export-metadata.d.ts +9 -10
  20. package/dist/capture/capture-export-metadata.js +8 -5
  21. package/dist/capture/capture-export-metadata.js.map +1 -1
  22. package/dist/capture/dng-import.d.ts +91 -0
  23. package/dist/capture/dng-import.js +343 -0
  24. package/dist/capture/dng-import.js.map +1 -0
  25. package/dist/capture/environment-raw-producer.d.ts +37 -17
  26. package/dist/capture/environment-raw-producer.js +43 -19
  27. package/dist/capture/environment-raw-producer.js.map +1 -1
  28. package/dist/capture/export-jpeg.d.ts +35 -4
  29. package/dist/capture/export-jpeg.js +133 -47
  30. package/dist/capture/export-jpeg.js.map +1 -1
  31. package/dist/capture/export-tiff.d.ts +48 -24
  32. package/dist/capture/export-tiff.js +91 -31
  33. package/dist/capture/export-tiff.js.map +1 -1
  34. package/dist/capture/focus-control.d.ts +42 -65
  35. package/dist/capture/focus-control.js +56 -75
  36. package/dist/capture/focus-control.js.map +1 -1
  37. package/dist/capture/host-yield-cadence.d.ts +25 -0
  38. package/dist/capture/host-yield-cadence.js +25 -0
  39. package/dist/capture/host-yield-cadence.js.map +1 -0
  40. package/dist/capture/linear-encoding.d.ts +14 -12
  41. package/dist/capture/linear-encoding.js +14 -13
  42. package/dist/capture/linear-encoding.js.map +1 -1
  43. package/dist/capture/lossless-jpeg.d.ts +27 -0
  44. package/dist/capture/lossless-jpeg.js +237 -0
  45. package/dist/capture/lossless-jpeg.js.map +1 -0
  46. package/dist/capture/native-environment-lean.d.ts +227 -0
  47. package/dist/capture/native-environment-lean.js +974 -0
  48. package/dist/capture/native-environment-lean.js.map +1 -0
  49. package/dist/capture/native-environment-optical-stage.d.ts +97 -0
  50. package/dist/capture/native-environment-optical-stage.js +340 -0
  51. package/dist/capture/native-environment-optical-stage.js.map +1 -0
  52. package/dist/capture/native-environment-raw.d.ts +140 -6
  53. package/dist/capture/native-environment-raw.js +435 -34
  54. package/dist/capture/native-environment-raw.js.map +1 -1
  55. package/dist/capture/native-raw-development.d.ts +118 -5
  56. package/dist/capture/native-raw-development.js +224 -59
  57. package/dist/capture/native-raw-development.js.map +1 -1
  58. package/dist/capture/native-raw-dng.d.ts +60 -0
  59. package/dist/capture/native-raw-dng.js +167 -0
  60. package/dist/capture/native-raw-dng.js.map +1 -0
  61. package/dist/capture/native-raw.d.ts +67 -10
  62. package/dist/capture/native-raw.js +90 -24
  63. package/dist/capture/native-raw.js.map +1 -1
  64. package/dist/capture/packed-sensor-raw.d.ts +160 -0
  65. package/dist/capture/packed-sensor-raw.js +221 -0
  66. package/dist/capture/packed-sensor-raw.js.map +1 -0
  67. package/dist/capture/photographic-export.d.ts +58 -35
  68. package/dist/capture/photographic-export.js +177 -70
  69. package/dist/capture/photographic-export.js.map +1 -1
  70. package/dist/capture/raw-development-kernel.d.ts +52 -0
  71. package/dist/capture/raw-development-kernel.js +88 -0
  72. package/dist/capture/raw-development-kernel.js.map +1 -0
  73. package/dist/capture/raw-frame-limits.d.ts +7 -7
  74. package/dist/capture/raw-frame-limits.js +7 -6
  75. package/dist/capture/raw-frame-limits.js.map +1 -1
  76. package/dist/capture/raw-frame-reconstruction.d.ts +8 -9
  77. package/dist/capture/raw-frame-reconstruction.js +9 -8
  78. package/dist/capture/raw-frame-reconstruction.js.map +1 -1
  79. package/dist/capture/raw-white-level.d.ts +55 -0
  80. package/dist/capture/raw-white-level.js +165 -0
  81. package/dist/capture/raw-white-level.js.map +1 -0
  82. package/dist/capture/release-sequence.d.ts +5 -7
  83. package/dist/capture/release-sequence.js +15 -13
  84. package/dist/capture/release-sequence.js.map +1 -1
  85. package/dist/capture/sensor-raw-frame.d.ts +5 -6
  86. package/dist/capture/sensor-raw-frame.js +26 -9
  87. package/dist/capture/sensor-raw-frame.js.map +1 -1
  88. package/dist/capture/sensor-raw-producer.d.ts +21 -13
  89. package/dist/capture/sensor-raw-producer.js +86 -25
  90. package/dist/capture/sensor-raw-producer.js.map +1 -1
  91. package/dist/capture/simulated-capture.d.ts +15 -16
  92. package/dist/capture/simulated-capture.js +22 -12
  93. package/dist/capture/simulated-capture.js.map +1 -1
  94. package/dist/color/camera-color-matrix.d.ts +69 -0
  95. package/dist/color/camera-color-matrix.js +132 -0
  96. package/dist/color/camera-color-matrix.js.map +1 -0
  97. package/dist/color/capture-color.d.ts +17 -10
  98. package/dist/color/capture-color.js +50 -17
  99. package/dist/color/capture-color.js.map +1 -1
  100. package/dist/color/chromatic-adaptation.d.ts +63 -0
  101. package/dist/color/chromatic-adaptation.js +91 -0
  102. package/dist/color/chromatic-adaptation.js.map +1 -0
  103. package/dist/color/color-difference.d.ts +104 -0
  104. package/dist/color/color-difference.js +205 -0
  105. package/dist/color/color-difference.js.map +1 -0
  106. package/dist/color/color-matching-functions.d.ts +168 -0
  107. package/dist/color/color-matching-functions.js +309 -0
  108. package/dist/color/color-matching-functions.js.map +1 -0
  109. package/dist/color/colorimetry-math.d.ts +52 -0
  110. package/dist/color/colorimetry-math.js +144 -0
  111. package/dist/color/colorimetry-math.js.map +1 -0
  112. package/dist/color/gamut-mapping.d.ts +54 -0
  113. package/dist/color/gamut-mapping.js +107 -0
  114. package/dist/color/gamut-mapping.js.map +1 -0
  115. package/dist/color/illuminants.d.ts +182 -0
  116. package/dist/color/illuminants.js +434 -0
  117. package/dist/color/illuminants.js.map +1 -0
  118. package/dist/color/rgb-color-spaces.d.ts +79 -0
  119. package/dist/color/rgb-color-spaces.js +115 -0
  120. package/dist/color/rgb-color-spaces.js.map +1 -0
  121. package/dist/color/sensor-color-development.d.ts +33 -11
  122. package/dist/color/sensor-color-development.js +104 -30
  123. package/dist/color/sensor-color-development.js.map +1 -1
  124. package/dist/color/srgb-icc.d.ts +9 -2
  125. package/dist/color/srgb-icc.js +16 -5
  126. package/dist/color/srgb-icc.js.map +1 -1
  127. package/dist/color/srgb-transfer.d.ts +1 -2
  128. package/dist/color/srgb-transfer.js +1 -1
  129. package/dist/color/srgb-transfer.js.map +1 -1
  130. package/dist/color/white-balance.d.ts +68 -19
  131. package/dist/color/white-balance.js +168 -35
  132. package/dist/color/white-balance.js.map +1 -1
  133. package/dist/composition/image-formation-plan.d.ts +152 -128
  134. package/dist/composition/image-formation-plan.js +292 -138
  135. package/dist/composition/image-formation-plan.js.map +1 -1
  136. package/dist/composition/plan-consumer.d.ts +6 -7
  137. package/dist/composition/plan-consumer.js +14 -11
  138. package/dist/composition/plan-consumer.js.map +1 -1
  139. package/dist/core/calculation-result.d.ts +21 -14
  140. package/dist/core/calculation-result.js +209 -11
  141. package/dist/core/calculation-result.js.map +1 -1
  142. package/dist/core/canonical-json.d.ts +13 -8
  143. package/dist/core/canonical-json.js +34 -15
  144. package/dist/core/canonical-json.js.map +1 -1
  145. package/dist/core/configuration-error.d.ts +5 -4
  146. package/dist/core/configuration-error.js +5 -3
  147. package/dist/core/configuration-error.js.map +1 -1
  148. package/dist/core/evidence-provenance.d.ts +12 -12
  149. package/dist/core/evidence-provenance.js +10 -9
  150. package/dist/core/evidence-provenance.js.map +1 -1
  151. package/dist/core/image-formation.d.ts +11 -10
  152. package/dist/core/image-formation.js +11 -9
  153. package/dist/core/image-formation.js.map +1 -1
  154. package/dist/core/owned-data.d.ts +9 -17
  155. package/dist/core/owned-data.js +9 -16
  156. package/dist/core/owned-data.js.map +1 -1
  157. package/dist/core/portable-math.d.ts +15 -0
  158. package/dist/core/portable-math.js +56 -0
  159. package/dist/core/portable-math.js.map +1 -0
  160. package/dist/core/record-validation.d.ts +48 -9
  161. package/dist/core/record-validation.js +93 -19
  162. package/dist/core/record-validation.js.map +1 -1
  163. package/dist/core/scientific-assurance.d.ts +16 -14
  164. package/dist/core/scientific-assurance.js +22 -18
  165. package/dist/core/scientific-assurance.js.map +1 -1
  166. package/dist/core/spectral-composition.d.ts +13 -14
  167. package/dist/core/spectral-composition.js +30 -27
  168. package/dist/core/spectral-composition.js.map +1 -1
  169. package/dist/core/spectral.d.ts +5 -6
  170. package/dist/core/spectral.js +9 -7
  171. package/dist/core/spectral.js.map +1 -1
  172. package/dist/core/validation.d.ts +3 -6
  173. package/dist/core/validation.js +3 -5
  174. package/dist/core/validation.js.map +1 -1
  175. package/dist/core/version.d.ts +6 -6
  176. package/dist/core/version.js +6 -5
  177. package/dist/core/version.js.map +1 -1
  178. package/dist/equipment/exposure-capabilities.d.ts +10 -10
  179. package/dist/equipment/exposure-capabilities.js +40 -30
  180. package/dist/equipment/exposure-capabilities.js.map +1 -1
  181. package/dist/equipment/generic-tier-assets.d.ts +13 -6
  182. package/dist/equipment/generic-tier-assets.js +34 -15
  183. package/dist/equipment/generic-tier-assets.js.map +1 -1
  184. package/dist/equipment/generic-tier-presets.d.ts +5 -6
  185. package/dist/equipment/generic-tier-presets.js +15 -13
  186. package/dist/equipment/generic-tier-presets.js.map +1 -1
  187. package/dist/equipment/iso-capabilities.d.ts +21 -22
  188. package/dist/equipment/iso-capabilities.js +49 -44
  189. package/dist/equipment/iso-capabilities.js.map +1 -1
  190. package/dist/equipment/metering-capabilities.d.ts +5 -6
  191. package/dist/equipment/metering-capabilities.js +22 -19
  192. package/dist/equipment/metering-capabilities.js.map +1 -1
  193. package/dist/equipment/release-capabilities.d.ts +3 -4
  194. package/dist/equipment/release-capabilities.js +18 -14
  195. package/dist/equipment/release-capabilities.js.map +1 -1
  196. package/dist/exposure/exposure-duration-control.d.ts +19 -17
  197. package/dist/exposure/exposure-duration-control.js +27 -23
  198. package/dist/exposure/exposure-duration-control.js.map +1 -1
  199. package/dist/exposure/exposure-mode-resolver.d.ts +42 -39
  200. package/dist/exposure/exposure-mode-resolver.js +127 -82
  201. package/dist/exposure/exposure-mode-resolver.js.map +1 -1
  202. package/dist/exposure/exposure.d.ts +17 -16
  203. package/dist/exposure/exposure.js +22 -15
  204. package/dist/exposure/exposure.js.map +1 -1
  205. package/dist/exposure/flash-ttl.d.ts +135 -0
  206. package/dist/exposure/flash-ttl.js +193 -0
  207. package/dist/exposure/flash-ttl.js.map +1 -0
  208. package/dist/exposure/flash.d.ts +144 -36
  209. package/dist/exposure/flash.js +259 -59
  210. package/dist/exposure/flash.js.map +1 -1
  211. package/dist/exposure/metering-scene-radiance.d.ts +10 -10
  212. package/dist/exposure/metering-scene-radiance.js +42 -23
  213. package/dist/exposure/metering-scene-radiance.js.map +1 -1
  214. package/dist/exposure/metering-target.d.ts +8 -8
  215. package/dist/exposure/metering-target.js +30 -20
  216. package/dist/exposure/metering-target.js.map +1 -1
  217. package/dist/exposure/metering-temporal.d.ts +16 -15
  218. package/dist/exposure/metering-temporal.js +41 -19
  219. package/dist/exposure/metering-temporal.js.map +1 -1
  220. package/dist/exposure/metering.d.ts +64 -17
  221. package/dist/exposure/metering.js +159 -30
  222. package/dist/exposure/metering.js.map +1 -1
  223. package/dist/exposure/program-line.d.ts +5 -5
  224. package/dist/exposure/program-line.js +20 -13
  225. package/dist/exposure/program-line.js.map +1 -1
  226. package/dist/facade/camera-preset.d.ts +8 -0
  227. package/dist/facade/camera-preset.js +102 -0
  228. package/dist/facade/camera-preset.js.map +1 -0
  229. package/dist/facade/chart-radiance-batch.d.ts +57 -0
  230. package/dist/facade/chart-radiance-batch.js +121 -0
  231. package/dist/facade/chart-radiance-batch.js.map +1 -0
  232. package/dist/facade/chart-scenes.d.ts +177 -0
  233. package/dist/facade/chart-scenes.js +232 -0
  234. package/dist/facade/chart-scenes.js.map +1 -0
  235. package/dist/facade/host-yield.d.ts +7 -0
  236. package/dist/facade/host-yield.js +23 -0
  237. package/dist/facade/host-yield.js.map +1 -0
  238. package/dist/facade/scene-radiance.d.ts +117 -0
  239. package/dist/facade/scene-radiance.js +205 -0
  240. package/dist/facade/scene-radiance.js.map +1 -0
  241. package/dist/facade/simulate-capture.d.ts +284 -0
  242. package/dist/facade/simulate-capture.js +1026 -0
  243. package/dist/facade/simulate-capture.js.map +1 -0
  244. package/dist/gpu/chart-radiance-gpu.d.ts +17 -0
  245. package/dist/gpu/chart-radiance-gpu.js +176 -0
  246. package/dist/gpu/chart-radiance-gpu.js.map +1 -0
  247. package/dist/gpu/image-kernel-accelerator.d.ts +132 -0
  248. package/dist/gpu/image-kernel-accelerator.js +720 -0
  249. package/dist/gpu/image-kernel-accelerator.js.map +1 -0
  250. package/dist/gpu/image-kernel-execution.d.ts +92 -0
  251. package/dist/gpu/image-kernel-execution.js +84 -0
  252. package/dist/gpu/image-kernel-execution.js.map +1 -0
  253. package/dist/gpu/sensor-stage-gpu.d.ts +44 -0
  254. package/dist/gpu/sensor-stage-gpu.js +317 -0
  255. package/dist/gpu/sensor-stage-gpu.js.map +1 -0
  256. package/dist/gpu/temporal-sum-gpu.d.ts +23 -0
  257. package/dist/gpu/temporal-sum-gpu.js +150 -0
  258. package/dist/gpu/temporal-sum-gpu.js.map +1 -0
  259. package/dist/gpu/webgpu-runtime.d.ts +63 -0
  260. package/dist/gpu/webgpu-runtime.js +215 -0
  261. package/dist/gpu/webgpu-runtime.js.map +1 -0
  262. package/dist/gpu/wgsl-chart-kernel.d.ts +30 -0
  263. package/dist/gpu/wgsl-chart-kernel.js +165 -0
  264. package/dist/gpu/wgsl-chart-kernel.js.map +1 -0
  265. package/dist/gpu/wgsl-kernels.d.ts +53 -0
  266. package/dist/gpu/wgsl-kernels.js +365 -0
  267. package/dist/gpu/wgsl-kernels.js.map +1 -0
  268. package/dist/gpu/wgsl-sensor-kernel.d.ts +64 -0
  269. package/dist/gpu/wgsl-sensor-kernel.js +409 -0
  270. package/dist/gpu/wgsl-sensor-kernel.js.map +1 -0
  271. package/dist/index.d.ts +89 -25
  272. package/dist/index.js +59 -15
  273. package/dist/index.js.map +1 -1
  274. package/dist/motion/camera-rotation.d.ts +92 -40
  275. package/dist/motion/camera-rotation.js +84 -47
  276. package/dist/motion/camera-rotation.js.map +1 -1
  277. package/dist/motion/capture-rotation-inverse-mapping.d.ts +37 -34
  278. package/dist/motion/capture-rotation-inverse-mapping.js +32 -24
  279. package/dist/motion/capture-rotation-inverse-mapping.js.map +1 -1
  280. package/dist/motion/capture-rotation-temporal-quadrature.d.ts +39 -35
  281. package/dist/motion/capture-rotation-temporal-quadrature.js +37 -28
  282. package/dist/motion/capture-rotation-temporal-quadrature.js.map +1 -1
  283. package/dist/motion/capture-rotation-trajectory.d.ts +32 -28
  284. package/dist/motion/capture-rotation-trajectory.js +36 -26
  285. package/dist/motion/capture-rotation-trajectory.js.map +1 -1
  286. package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts +23 -21
  287. package/dist/motion/capture-translation-parallax-temporal-quadrature.js +33 -14
  288. package/dist/motion/capture-translation-parallax-temporal-quadrature.js.map +1 -1
  289. package/dist/motion/extended-object-projection.d.ts +19 -16
  290. package/dist/motion/extended-object-projection.js +38 -18
  291. package/dist/motion/extended-object-projection.js.map +1 -1
  292. package/dist/motion/projected-motion.d.ts +18 -17
  293. package/dist/motion/projected-motion.js +25 -17
  294. package/dist/motion/projected-motion.js.map +1 -1
  295. package/dist/motion/temporal-exposure-sum.d.ts +55 -0
  296. package/dist/motion/temporal-exposure-sum.js +141 -0
  297. package/dist/motion/temporal-exposure-sum.js.map +1 -0
  298. package/dist/motion/video-sequence.d.ts +111 -0
  299. package/dist/motion/video-sequence.js +179 -0
  300. package/dist/motion/video-sequence.js.map +1 -0
  301. package/dist/optics/aperture.d.ts +14 -15
  302. package/dist/optics/aperture.js +13 -11
  303. package/dist/optics/aperture.js.map +1 -1
  304. package/dist/optics/atmospheric-haze.d.ts +83 -0
  305. package/dist/optics/atmospheric-haze.js +113 -0
  306. package/dist/optics/atmospheric-haze.js.map +1 -0
  307. package/dist/optics/brown-conrady-distortion.d.ts +116 -0
  308. package/dist/optics/brown-conrady-distortion.js +291 -0
  309. package/dist/optics/brown-conrady-distortion.js.map +1 -0
  310. package/dist/optics/circle-of-confusion.d.ts +10 -10
  311. package/dist/optics/circle-of-confusion.js +15 -11
  312. package/dist/optics/circle-of-confusion.js.map +1 -1
  313. package/dist/optics/complex-pupil-psf.d.ts +64 -33
  314. package/dist/optics/complex-pupil-psf.js +190 -98
  315. package/dist/optics/complex-pupil-psf.js.map +1 -1
  316. package/dist/optics/depth-of-field.d.ts +25 -15
  317. package/dist/optics/depth-of-field.js +67 -27
  318. package/dist/optics/depth-of-field.js.map +1 -1
  319. package/dist/optics/diffraction.d.ts +14 -13
  320. package/dist/optics/diffraction.js +14 -10
  321. package/dist/optics/diffraction.js.map +1 -1
  322. package/dist/optics/focus-breathing.d.ts +88 -27
  323. package/dist/optics/focus-breathing.js +114 -23
  324. package/dist/optics/focus-breathing.js.map +1 -1
  325. package/dist/optics/focus-state.d.ts +18 -18
  326. package/dist/optics/focus-state.js +21 -15
  327. package/dist/optics/focus-state.js.map +1 -1
  328. package/dist/optics/front-of-lens-filter.d.ts +45 -14
  329. package/dist/optics/front-of-lens-filter.js +259 -88
  330. package/dist/optics/front-of-lens-filter.js.map +1 -1
  331. package/dist/optics/illumination-vignetting.d.ts +16 -17
  332. package/dist/optics/illumination-vignetting.js +40 -17
  333. package/dist/optics/illumination-vignetting.js.map +1 -1
  334. package/dist/optics/irradiance-convolution.d.ts +59 -0
  335. package/dist/optics/irradiance-convolution.js +138 -0
  336. package/dist/optics/irradiance-convolution.js.map +1 -0
  337. package/dist/optics/lateral-chromatic-aberration.d.ts +33 -30
  338. package/dist/optics/lateral-chromatic-aberration.js +33 -23
  339. package/dist/optics/lateral-chromatic-aberration.js.map +1 -1
  340. package/dist/optics/lens-psf-kernels.d.ts +89 -0
  341. package/dist/optics/lens-psf-kernels.js +175 -0
  342. package/dist/optics/lens-psf-kernels.js.map +1 -0
  343. package/dist/optics/lens-psf-profile.d.ts +78 -46
  344. package/dist/optics/lens-psf-profile.js +335 -124
  345. package/dist/optics/lens-psf-profile.js.map +1 -1
  346. package/dist/optics/longitudinal-chromatic-aberration.d.ts +102 -0
  347. package/dist/optics/longitudinal-chromatic-aberration.js +210 -0
  348. package/dist/optics/longitudinal-chromatic-aberration.js.map +1 -0
  349. package/dist/optics/polygon-diffraction.d.ts +80 -23
  350. package/dist/optics/polygon-diffraction.js +130 -25
  351. package/dist/optics/polygon-diffraction.js.map +1 -1
  352. package/dist/optics/profile-contract.d.ts +5 -6
  353. package/dist/optics/profile-contract.js +14 -11
  354. package/dist/optics/profile-contract.js.map +1 -1
  355. package/dist/optics/psf-foundation.d.ts +23 -23
  356. package/dist/optics/psf-foundation.js +24 -21
  357. package/dist/optics/psf-foundation.js.map +1 -1
  358. package/dist/optics/pupil-vignetting.d.ts +118 -0
  359. package/dist/optics/pupil-vignetting.js +264 -0
  360. package/dist/optics/pupil-vignetting.js.map +1 -0
  361. package/dist/optics/radial-distortion.d.ts +34 -33
  362. package/dist/optics/radial-distortion.js +37 -30
  363. package/dist/optics/radial-distortion.js.map +1 -1
  364. package/dist/optics/scene-to-sensor-irradiance.d.ts +47 -33
  365. package/dist/optics/scene-to-sensor-irradiance.js +73 -45
  366. package/dist/optics/scene-to-sensor-irradiance.js.map +1 -1
  367. package/dist/optics/scene-to-sensor-quadrature.d.ts +23 -18
  368. package/dist/optics/scene-to-sensor-quadrature.js +16 -11
  369. package/dist/optics/scene-to-sensor-quadrature.js.map +1 -1
  370. package/dist/optics/sensor-aperture-rays.d.ts +20 -4
  371. package/dist/optics/sensor-aperture-rays.js +32 -14
  372. package/dist/optics/sensor-aperture-rays.js.map +1 -1
  373. package/dist/optics/sensor-environment-query.d.ts +81 -16
  374. package/dist/optics/sensor-environment-query.js +145 -12
  375. package/dist/optics/sensor-environment-query.js.map +1 -1
  376. package/dist/optics/sensor-psf-quadrature.d.ts +12 -10
  377. package/dist/optics/sensor-psf-quadrature.js +18 -11
  378. package/dist/optics/sensor-psf-quadrature.js.map +1 -1
  379. package/dist/optics/sensor-psf-support.d.ts +8 -6
  380. package/dist/optics/sensor-psf-support.js +8 -5
  381. package/dist/optics/sensor-psf-support.js.map +1 -1
  382. package/dist/optics/stray-light.d.ts +22 -19
  383. package/dist/optics/stray-light.js +18 -12
  384. package/dist/optics/stray-light.js.map +1 -1
  385. package/dist/optics/thin-lens.d.ts +10 -9
  386. package/dist/optics/thin-lens.js +12 -8
  387. package/dist/optics/thin-lens.js.map +1 -1
  388. package/dist/optics/zernike-wavefront.d.ts +154 -0
  389. package/dist/optics/zernike-wavefront.js +352 -0
  390. package/dist/optics/zernike-wavefront.js.map +1 -0
  391. package/dist/output/capture-corrected-sdr.d.ts +16 -8
  392. package/dist/output/capture-corrected-sdr.js +16 -8
  393. package/dist/output/capture-corrected-sdr.js.map +1 -1
  394. package/dist/output/capture-geometry.d.ts +34 -36
  395. package/dist/output/capture-geometry.js +52 -32
  396. package/dist/output/capture-geometry.js.map +1 -1
  397. package/dist/output/capture-sdr.d.ts +7 -6
  398. package/dist/output/capture-sdr.js +11 -8
  399. package/dist/output/capture-sdr.js.map +1 -1
  400. package/dist/output/crop.d.ts +22 -6
  401. package/dist/output/crop.js +40 -6
  402. package/dist/output/crop.js.map +1 -1
  403. package/dist/output/geometric-transforms.d.ts +60 -23
  404. package/dist/output/geometric-transforms.js +111 -24
  405. package/dist/output/geometric-transforms.js.map +1 -1
  406. package/dist/output/lens-corrections.d.ts +27 -19
  407. package/dist/output/lens-corrections.js +29 -13
  408. package/dist/output/lens-corrections.js.map +1 -1
  409. package/dist/output/native-capture-sdr.d.ts +71 -16
  410. package/dist/output/native-capture-sdr.js +190 -33
  411. package/dist/output/native-capture-sdr.js.map +1 -1
  412. package/dist/output/png-encoder.d.ts +65 -0
  413. package/dist/output/png-encoder.js +461 -0
  414. package/dist/output/png-encoder.js.map +1 -0
  415. package/dist/output/print-contrast-reference.d.ts +10 -9
  416. package/dist/output/print-contrast-reference.js +10 -8
  417. package/dist/output/print-contrast-reference.js.map +1 -1
  418. package/dist/output/print-detail.d.ts +18 -17
  419. package/dist/output/print-detail.js +12 -10
  420. package/dist/output/print-detail.js.map +1 -1
  421. package/dist/output/print-jpeg.d.ts +26 -5
  422. package/dist/output/print-jpeg.js +117 -50
  423. package/dist/output/print-jpeg.js.map +1 -1
  424. package/dist/output/print-plan.d.ts +19 -19
  425. package/dist/output/print-plan.js +11 -10
  426. package/dist/output/print-plan.js.map +1 -1
  427. package/dist/output/print-region-statistics.d.ts +14 -15
  428. package/dist/output/print-region-statistics.js +11 -11
  429. package/dist/output/print-region-statistics.js.map +1 -1
  430. package/dist/output/sdr-rendering.d.ts +48 -10
  431. package/dist/output/sdr-rendering.js +114 -25
  432. package/dist/output/sdr-rendering.js.map +1 -1
  433. package/dist/output/subject-framing-crop.d.ts +6 -10
  434. package/dist/output/subject-framing-crop.js +23 -13
  435. package/dist/output/subject-framing-crop.js.map +1 -1
  436. package/dist/processing/demosaic.d.ts +90 -0
  437. package/dist/processing/demosaic.js +275 -0
  438. package/dist/processing/demosaic.js.map +1 -0
  439. package/dist/processing/denoise.d.ts +68 -0
  440. package/dist/processing/denoise.js +214 -0
  441. package/dist/processing/denoise.js.map +1 -0
  442. package/dist/processing/focus-stacking.d.ts +17 -0
  443. package/dist/processing/focus-stacking.js +80 -0
  444. package/dist/processing/focus-stacking.js.map +1 -0
  445. package/dist/processing/hdr.d.ts +54 -0
  446. package/dist/processing/hdr.js +172 -0
  447. package/dist/processing/hdr.js.map +1 -0
  448. package/dist/processing/image-ops.d.ts +66 -0
  449. package/dist/processing/image-ops.js +192 -0
  450. package/dist/processing/image-ops.js.map +1 -0
  451. package/dist/processing/panorama.d.ts +51 -0
  452. package/dist/processing/panorama.js +305 -0
  453. package/dist/processing/panorama.js.map +1 -0
  454. package/dist/processing/processing-task.d.ts +85 -0
  455. package/dist/processing/processing-task.js +164 -0
  456. package/dist/processing/processing-task.js.map +1 -0
  457. package/dist/processing/tone-mapping.d.ts +69 -0
  458. package/dist/processing/tone-mapping.js +310 -0
  459. package/dist/processing/tone-mapping.js.map +1 -0
  460. package/dist/schema/camera.d.ts +5 -4
  461. package/dist/schema/illumination-spectral.d.ts +13 -19
  462. package/dist/schema/illumination-spectral.js +23 -19
  463. package/dist/schema/illumination-spectral.js.map +1 -1
  464. package/dist/schema/illumination-temporal.d.ts +12 -15
  465. package/dist/schema/illumination-temporal.js +43 -28
  466. package/dist/schema/illumination-temporal.js.map +1 -1
  467. package/dist/schema/illumination.d.ts +5 -4
  468. package/dist/schema/illumination.js +55 -20
  469. package/dist/schema/illumination.js.map +1 -1
  470. package/dist/schema/scene-radiance-temporal.d.ts +9 -11
  471. package/dist/schema/scene-radiance-temporal.js +26 -23
  472. package/dist/schema/scene-radiance-temporal.js.map +1 -1
  473. package/dist/schema/scene-radiance.d.ts +17 -17
  474. package/dist/schema/scene-radiance.js +56 -34
  475. package/dist/schema/scene-radiance.js.map +1 -1
  476. package/dist/schema/scene.d.ts +14 -13
  477. package/dist/schema/validation.d.ts +0 -1
  478. package/dist/schema/validation.js +17 -15
  479. package/dist/schema/validation.js.map +1 -1
  480. package/dist/sensor/accumulated-charge.d.ts +45 -64
  481. package/dist/sensor/accumulated-charge.js +41 -47
  482. package/dist/sensor/accumulated-charge.js.map +1 -1
  483. package/dist/sensor/architecture.d.ts +22 -25
  484. package/dist/sensor/architecture.js +17 -16
  485. package/dist/sensor/architecture.js.map +1 -1
  486. package/dist/sensor/camera-saturation-capacity.d.ts +21 -28
  487. package/dist/sensor/camera-saturation-capacity.js +36 -34
  488. package/dist/sensor/camera-saturation-capacity.js.map +1 -1
  489. package/dist/sensor/capture-color-sampling-binding.d.ts +46 -51
  490. package/dist/sensor/capture-color-sampling-binding.js +39 -41
  491. package/dist/sensor/capture-color-sampling-binding.js.map +1 -1
  492. package/dist/sensor/capture-mode-timing.d.ts +8 -9
  493. package/dist/sensor/capture-mode-timing.js +24 -21
  494. package/dist/sensor/capture-mode-timing.js.map +1 -1
  495. package/dist/sensor/capture-mode.d.ts +28 -30
  496. package/dist/sensor/capture-mode.js +33 -31
  497. package/dist/sensor/capture-mode.js.map +1 -1
  498. package/dist/sensor/color-sampling.d.ts +30 -33
  499. package/dist/sensor/color-sampling.js +32 -37
  500. package/dist/sensor/color-sampling.js.map +1 -1
  501. package/dist/sensor/constant-rate-temporal-integration.d.ts +19 -23
  502. package/dist/sensor/constant-rate-temporal-integration.js +28 -26
  503. package/dist/sensor/constant-rate-temporal-integration.js.map +1 -1
  504. package/dist/sensor/dark-current.d.ts +53 -49
  505. package/dist/sensor/dark-current.js +87 -46
  506. package/dist/sensor/dark-current.js.map +1 -1
  507. package/dist/sensor/environment-photo-signal.d.ts +71 -30
  508. package/dist/sensor/environment-photo-signal.js +127 -46
  509. package/dist/sensor/environment-photo-signal.js.map +1 -1
  510. package/dist/sensor/eqe-electron-rate.d.ts +14 -13
  511. package/dist/sensor/eqe-electron-rate.js +34 -14
  512. package/dist/sensor/eqe-electron-rate.js.map +1 -1
  513. package/dist/sensor/eqe-local-exposure.d.ts +24 -24
  514. package/dist/sensor/eqe-local-exposure.js +15 -11
  515. package/dist/sensor/eqe-local-exposure.js.map +1 -1
  516. package/dist/sensor/eqe-temporal-exposure.d.ts +11 -11
  517. package/dist/sensor/eqe-temporal-exposure.js +15 -10
  518. package/dist/sensor/eqe-temporal-exposure.js.map +1 -1
  519. package/dist/sensor/exposure-window.d.ts +48 -34
  520. package/dist/sensor/exposure-window.js +77 -36
  521. package/dist/sensor/exposure-window.js.map +1 -1
  522. package/dist/sensor/fixed-pattern-noise.d.ts +108 -0
  523. package/dist/sensor/fixed-pattern-noise.js +166 -0
  524. package/dist/sensor/fixed-pattern-noise.js.map +1 -0
  525. package/dist/sensor/iso-gain.d.ts +44 -0
  526. package/dist/sensor/iso-gain.js +119 -0
  527. package/dist/sensor/iso-gain.js.map +1 -0
  528. package/dist/sensor/iso-signal-chain.d.ts +25 -48
  529. package/dist/sensor/iso-signal-chain.js +52 -66
  530. package/dist/sensor/iso-signal-chain.js.map +1 -1
  531. package/dist/sensor/local-exposure-binding.d.ts +21 -21
  532. package/dist/sensor/local-exposure-binding.js +22 -18
  533. package/dist/sensor/local-exposure-binding.js.map +1 -1
  534. package/dist/sensor/optical-stack.d.ts +36 -40
  535. package/dist/sensor/optical-stack.js +34 -37
  536. package/dist/sensor/optical-stack.js.map +1 -1
  537. package/dist/sensor/photon-energy.d.ts +22 -28
  538. package/dist/sensor/photon-energy.js +42 -34
  539. package/dist/sensor/photon-energy.js.map +1 -1
  540. package/dist/sensor/physical-charge-capacity.d.ts +20 -30
  541. package/dist/sensor/physical-charge-capacity.js +35 -36
  542. package/dist/sensor/physical-charge-capacity.js.map +1 -1
  543. package/dist/sensor/pixel-pitch.d.ts +2 -3
  544. package/dist/sensor/pixel-pitch.js +4 -2
  545. package/dist/sensor/pixel-pitch.js.map +1 -1
  546. package/dist/sensor/radiometry-readiness.d.ts +13 -15
  547. package/dist/sensor/radiometry-readiness.js +20 -17
  548. package/dist/sensor/radiometry-readiness.js.map +1 -1
  549. package/dist/sensor/raw-readout.d.ts +173 -83
  550. package/dist/sensor/raw-readout.js +425 -160
  551. package/dist/sensor/raw-readout.js.map +1 -1
  552. package/dist/sensor/raw-reconstruction.d.ts +112 -44
  553. package/dist/sensor/raw-reconstruction.js +200 -47
  554. package/dist/sensor/raw-reconstruction.js.map +1 -1
  555. package/dist/sensor/readout-exposure-linkage.d.ts +103 -34
  556. package/dist/sensor/readout-exposure-linkage.js +125 -27
  557. package/dist/sensor/readout-exposure-linkage.js.map +1 -1
  558. package/dist/sensor/readout-timing.d.ts +43 -44
  559. package/dist/sensor/readout-timing.js +38 -30
  560. package/dist/sensor/readout-timing.js.map +1 -1
  561. package/dist/sensor/response-application-compatibility.d.ts +21 -28
  562. package/dist/sensor/response-application-compatibility.js +35 -34
  563. package/dist/sensor/response-application-compatibility.js.map +1 -1
  564. package/dist/sensor/response-operating-range.d.ts +26 -35
  565. package/dist/sensor/response-operating-range.js +40 -39
  566. package/dist/sensor/response-operating-range.js.map +1 -1
  567. package/dist/sensor/responsivity-photocurrent.d.ts +21 -29
  568. package/dist/sensor/responsivity-photocurrent.js +57 -40
  569. package/dist/sensor/responsivity-photocurrent.js.map +1 -1
  570. package/dist/sensor/sampling-aperture.d.ts +21 -25
  571. package/dist/sensor/sampling-aperture.js +29 -28
  572. package/dist/sensor/sampling-aperture.js.map +1 -1
  573. package/dist/sensor/scene-eqe-temporal-exposure.d.ts +14 -12
  574. package/dist/sensor/scene-eqe-temporal-exposure.js +13 -8
  575. package/dist/sensor/scene-eqe-temporal-exposure.js.map +1 -1
  576. package/dist/sensor/sensor-geometry.d.ts +28 -32
  577. package/dist/sensor/sensor-geometry.js +35 -20
  578. package/dist/sensor/sensor-geometry.js.map +1 -1
  579. package/dist/sensor/signal-noise.d.ts +14 -16
  580. package/dist/sensor/signal-noise.js +15 -13
  581. package/dist/sensor/signal-noise.js.map +1 -1
  582. package/dist/sensor/spatial-sample-reduction.d.ts +45 -60
  583. package/dist/sensor/spatial-sample-reduction.js +39 -48
  584. package/dist/sensor/spatial-sample-reduction.js.map +1 -1
  585. package/dist/sensor/spatial-sampling-quadrature.d.ts +46 -54
  586. package/dist/sensor/spatial-sampling-quadrature.js +31 -36
  587. package/dist/sensor/spatial-sampling-quadrature.js.map +1 -1
  588. package/dist/sensor/spatio-spectral-reduction.d.ts +32 -42
  589. package/dist/sensor/spatio-spectral-reduction.js +24 -29
  590. package/dist/sensor/spatio-spectral-reduction.js.map +1 -1
  591. package/dist/sensor/spectral-coverage.d.ts +6 -9
  592. package/dist/sensor/spectral-coverage.js +9 -6
  593. package/dist/sensor/spectral-coverage.js.map +1 -1
  594. package/dist/sensor/spectral-quadrature.d.ts +46 -60
  595. package/dist/sensor/spectral-quadrature.js +38 -48
  596. package/dist/sensor/spectral-quadrature.js.map +1 -1
  597. package/dist/sensor/spectral-response.d.ts +53 -41
  598. package/dist/sensor/spectral-response.js +80 -47
  599. package/dist/sensor/spectral-response.js.map +1 -1
  600. package/dist/sensor/stochastic-seed.d.ts +50 -0
  601. package/dist/sensor/stochastic-seed.js +123 -0
  602. package/dist/sensor/stochastic-seed.js.map +1 -0
  603. package/dist/sensor/temporal-eqe-sum.d.ts +2 -4
  604. package/dist/sensor/temporal-eqe-sum.js +5 -6
  605. package/dist/sensor/temporal-eqe-sum.js.map +1 -1
  606. package/dist/sensor/temporal-photo-signal.d.ts +5 -6
  607. package/dist/sensor/temporal-photo-signal.js +11 -10
  608. package/dist/sensor/temporal-photo-signal.js.map +1 -1
  609. package/dist/sensor/temporal-sample-binding.d.ts +1 -2
  610. package/dist/sensor/temporal-sample-binding.js +3 -3
  611. package/dist/sensor/temporal-sample-binding.js.map +1 -1
  612. package/dist/simulation/poc-simulation.d.ts +16 -16
  613. package/dist/simulation/poc-simulation.js +20 -15
  614. package/dist/simulation/poc-simulation.js.map +1 -1
  615. package/dist/stabilization/camera-shake.d.ts +42 -18
  616. package/dist/stabilization/camera-shake.js +43 -20
  617. package/dist/stabilization/camera-shake.js.map +1 -1
  618. package/dist/stabilization/system.d.ts +44 -41
  619. package/dist/stabilization/system.js +196 -108
  620. package/dist/stabilization/system.js.map +1 -1
  621. package/docs/AGENT_GUIDE.md +183 -0
  622. package/docs/API_REFERENCE.md +761 -2
  623. package/docs/QUICK_START.md +495 -0
  624. package/docs/USAGE.md +1719 -714
  625. package/docs/api/camera-equivalent-focal-length.md +6 -7
  626. package/docs/api/camera-field-of-view.md +16 -8
  627. package/docs/api/camera-lens-projection.md +246 -0
  628. package/docs/api/camera-projected-object-size.md +6 -5
  629. package/docs/api/capture-capture-export-metadata.md +10 -10
  630. package/docs/api/capture-dng-import.md +134 -0
  631. package/docs/api/capture-environment-raw-producer.md +17 -11
  632. package/docs/api/capture-export-jpeg.md +16 -0
  633. package/docs/api/capture-focus-control.md +25 -47
  634. package/docs/api/capture-linear-encoding.md +21 -12
  635. package/docs/api/capture-lossless-jpeg.md +49 -0
  636. package/docs/api/capture-native-environment-optical-stage.md +75 -0
  637. package/docs/api/capture-native-environment-raw.md +161 -4
  638. package/docs/api/capture-native-raw-development.md +69 -4
  639. package/docs/api/capture-native-raw-dng.md +84 -0
  640. package/docs/api/capture-native-raw.md +23 -8
  641. package/docs/api/capture-packed-sensor-raw.md +156 -0
  642. package/docs/api/capture-photographic-export.md +69 -31
  643. package/docs/api/capture-raw-frame-reconstruction.md +8 -8
  644. package/docs/api/capture-raw-white-level.md +37 -0
  645. package/docs/api/capture-release-sequence.md +6 -7
  646. package/docs/api/capture-sensor-raw-frame.md +6 -6
  647. package/docs/api/capture-sensor-raw-producer.md +17 -11
  648. package/docs/api/capture-simulated-capture.md +15 -15
  649. package/docs/api/color-camera-color-matrix.md +103 -0
  650. package/docs/api/color-capture-color.md +22 -11
  651. package/docs/api/color-chromatic-adaptation.md +82 -0
  652. package/docs/api/color-color-difference.md +134 -0
  653. package/docs/api/color-color-matching-functions.md +259 -0
  654. package/docs/api/color-colorimetry-math.md +54 -0
  655. package/docs/api/color-gamut-mapping.md +72 -0
  656. package/docs/api/color-illuminants.md +280 -0
  657. package/docs/api/color-rgb-color-spaces.md +151 -0
  658. package/docs/api/color-sensor-color-development.md +27 -0
  659. package/docs/api/color-srgb-icc.md +2 -4
  660. package/docs/api/color-white-balance.md +95 -19
  661. package/docs/api/composition-image-formation-plan.md +124 -95
  662. package/docs/api/composition-plan-consumer.md +7 -7
  663. package/docs/api/core-calculation-result.md +18 -14
  664. package/docs/api/core-configuration-error.md +1 -1
  665. package/docs/api/core-image-formation.md +7 -7
  666. package/docs/api/core-scientific-assurance.md +12 -10
  667. package/docs/api/core-spectral-composition.md +14 -14
  668. package/docs/api/core-spectral.md +6 -6
  669. package/docs/api/core-validation.md +3 -3
  670. package/docs/api/core-version.md +7 -6
  671. package/docs/api/equipment-exposure-capabilities.md +11 -10
  672. package/docs/api/equipment-generic-tier-assets.md +7 -2
  673. package/docs/api/equipment-generic-tier-presets.md +6 -6
  674. package/docs/api/equipment-iso-capabilities.md +18 -18
  675. package/docs/api/equipment-metering-capabilities.md +6 -6
  676. package/docs/api/equipment-release-capabilities.md +4 -4
  677. package/docs/api/exports.json +2213 -8
  678. package/docs/api/exposure-exposure-duration-control.md +9 -9
  679. package/docs/api/exposure-exposure-mode-resolver.md +35 -31
  680. package/docs/api/exposure-exposure.md +10 -10
  681. package/docs/api/exposure-flash-ttl.md +182 -0
  682. package/docs/api/exposure-flash.md +183 -28
  683. package/docs/api/exposure-metering-scene-radiance.md +11 -10
  684. package/docs/api/exposure-metering-target.md +9 -8
  685. package/docs/api/exposure-metering-temporal.md +8 -8
  686. package/docs/api/exposure-metering.md +69 -9
  687. package/docs/api/exposure-program-line.md +6 -5
  688. package/docs/api/facade-chart-radiance-batch.md +96 -0
  689. package/docs/api/facade-chart-scenes.md +240 -0
  690. package/docs/api/facade-scene-radiance.md +122 -0
  691. package/docs/api/facade-simulate-capture.md +324 -0
  692. package/docs/api/gpu-image-kernel-accelerator.md +157 -0
  693. package/docs/api/gpu-image-kernel-execution.md +152 -0
  694. package/docs/api/motion-camera-rotation.md +43 -26
  695. package/docs/api/motion-capture-rotation-inverse-mapping.md +24 -23
  696. package/docs/api/motion-capture-rotation-temporal-quadrature.md +22 -22
  697. package/docs/api/motion-capture-rotation-trajectory.md +15 -15
  698. package/docs/api/motion-capture-translation-parallax-temporal-quadrature.md +15 -14
  699. package/docs/api/motion-extended-object-projection.md +10 -8
  700. package/docs/api/motion-projected-motion.md +8 -8
  701. package/docs/api/motion-temporal-exposure-sum.md +98 -0
  702. package/docs/api/motion-video-sequence.md +159 -0
  703. package/docs/api/optics-aperture.md +8 -8
  704. package/docs/api/optics-atmospheric-haze.md +104 -0
  705. package/docs/api/optics-brown-conrady-distortion.md +123 -0
  706. package/docs/api/optics-circle-of-confusion.md +5 -4
  707. package/docs/api/optics-complex-pupil-psf.md +57 -16
  708. package/docs/api/optics-depth-of-field.md +12 -6
  709. package/docs/api/optics-diffraction.md +8 -7
  710. package/docs/api/optics-focus-breathing.md +104 -16
  711. package/docs/api/optics-focus-state.md +9 -10
  712. package/docs/api/optics-front-of-lens-filter.md +72 -14
  713. package/docs/api/optics-illumination-vignetting.md +10 -10
  714. package/docs/api/optics-irradiance-convolution.md +95 -0
  715. package/docs/api/optics-lateral-chromatic-aberration.md +22 -21
  716. package/docs/api/optics-lens-psf-kernels.md +72 -0
  717. package/docs/api/optics-lens-psf-profile.md +48 -26
  718. package/docs/api/optics-longitudinal-chromatic-aberration.md +128 -0
  719. package/docs/api/optics-polygon-diffraction.md +78 -13
  720. package/docs/api/optics-profile-contract.md +4 -4
  721. package/docs/api/optics-psf-foundation.md +12 -12
  722. package/docs/api/optics-pupil-vignetting.md +132 -0
  723. package/docs/api/optics-radial-distortion.md +12 -12
  724. package/docs/api/optics-scene-to-sensor-irradiance.md +25 -14
  725. package/docs/api/optics-scene-to-sensor-quadrature.md +15 -12
  726. package/docs/api/optics-sensor-aperture-rays.md +3 -2
  727. package/docs/api/optics-sensor-environment-query.md +52 -9
  728. package/docs/api/optics-sensor-psf-quadrature.md +13 -10
  729. package/docs/api/optics-stray-light.md +12 -11
  730. package/docs/api/optics-thin-lens.md +4 -3
  731. package/docs/api/optics-zernike-wavefront.md +229 -0
  732. package/docs/api/output-capture-corrected-sdr.md +10 -7
  733. package/docs/api/output-capture-geometry.md +35 -36
  734. package/docs/api/output-capture-sdr.md +4 -4
  735. package/docs/api/output-crop.md +7 -4
  736. package/docs/api/output-geometric-transforms.md +65 -19
  737. package/docs/api/output-lens-corrections.md +17 -15
  738. package/docs/api/output-native-capture-sdr.md +26 -13
  739. package/docs/api/output-png-encoder.md +105 -0
  740. package/docs/api/output-print-contrast-reference.md +8 -8
  741. package/docs/api/output-print-detail.md +14 -14
  742. package/docs/api/output-print-jpeg.md +22 -5
  743. package/docs/api/output-print-plan.md +18 -18
  744. package/docs/api/output-print-region-statistics.md +14 -14
  745. package/docs/api/output-sdr-rendering.md +52 -10
  746. package/docs/api/output-subject-framing-crop.md +5 -6
  747. package/docs/api/processing-demosaic.md +120 -0
  748. package/docs/api/processing-denoise.md +148 -0
  749. package/docs/api/processing-focus-stacking.md +41 -0
  750. package/docs/api/processing-hdr.md +113 -0
  751. package/docs/api/processing-panorama.md +82 -0
  752. package/docs/api/processing-processing-task.md +107 -0
  753. package/docs/api/processing-tone-mapping.md +142 -0
  754. package/docs/api/schema-camera.md +6 -4
  755. package/docs/api/schema-illumination-spectral.md +10 -11
  756. package/docs/api/schema-illumination-temporal.md +13 -15
  757. package/docs/api/schema-illumination.md +4 -4
  758. package/docs/api/schema-scene-radiance-temporal.md +10 -11
  759. package/docs/api/schema-scene-radiance.md +18 -17
  760. package/docs/api/schema-scene.md +9 -9
  761. package/docs/api/schema-validation.md +1 -1
  762. package/docs/api/sensor-accumulated-charge.md +12 -20
  763. package/docs/api/sensor-architecture.md +15 -16
  764. package/docs/api/sensor-camera-saturation-capacity.md +9 -11
  765. package/docs/api/sensor-capture-color-sampling-binding.md +47 -51
  766. package/docs/api/sensor-capture-mode-timing.md +9 -9
  767. package/docs/api/sensor-capture-mode.md +29 -30
  768. package/docs/api/sensor-color-sampling.md +31 -33
  769. package/docs/api/sensor-constant-rate-temporal-integration.md +10 -11
  770. package/docs/api/sensor-dark-current.md +30 -14
  771. package/docs/api/sensor-environment-photo-signal.md +13 -6
  772. package/docs/api/sensor-eqe-electron-rate.md +9 -8
  773. package/docs/api/sensor-eqe-local-exposure.md +18 -17
  774. package/docs/api/sensor-eqe-temporal-exposure.md +12 -11
  775. package/docs/api/sensor-exposure-window.md +24 -24
  776. package/docs/api/sensor-fixed-pattern-noise.md +104 -0
  777. package/docs/api/sensor-iso-gain.md +63 -0
  778. package/docs/api/sensor-iso-signal-chain.md +13 -22
  779. package/docs/api/sensor-local-exposure-binding.md +12 -13
  780. package/docs/api/sensor-optical-stack.md +37 -40
  781. package/docs/api/sensor-photon-energy.md +10 -11
  782. package/docs/api/sensor-physical-charge-capacity.md +8 -13
  783. package/docs/api/sensor-pixel-pitch.md +1 -1
  784. package/docs/api/sensor-radiometry-readiness.md +9 -9
  785. package/docs/api/sensor-raw-readout.md +118 -52
  786. package/docs/api/sensor-raw-reconstruction.md +97 -20
  787. package/docs/api/sensor-readout-exposure-linkage.md +120 -24
  788. package/docs/api/sensor-readout-timing.md +33 -35
  789. package/docs/api/sensor-response-application-compatibility.md +9 -11
  790. package/docs/api/sensor-response-operating-range.md +14 -18
  791. package/docs/api/sensor-responsivity-photocurrent.md +9 -12
  792. package/docs/api/sensor-sampling-aperture.md +22 -25
  793. package/docs/api/sensor-scene-eqe-temporal-exposure.md +9 -8
  794. package/docs/api/sensor-sensor-geometry.md +23 -24
  795. package/docs/api/sensor-signal-noise.md +10 -10
  796. package/docs/api/sensor-spatial-sample-reduction.md +27 -30
  797. package/docs/api/sensor-spatial-sampling-quadrature.md +37 -39
  798. package/docs/api/sensor-spatio-spectral-reduction.md +27 -29
  799. package/docs/api/sensor-spectral-coverage.md +5 -5
  800. package/docs/api/sensor-spectral-quadrature.md +33 -35
  801. package/docs/api/sensor-spectral-response.md +28 -16
  802. package/docs/api/sensor-temporal-photo-signal.md +6 -6
  803. package/docs/api/simulation-poc-simulation.md +17 -16
  804. package/docs/api/stabilization-camera-shake.md +29 -10
  805. package/docs/api/stabilization-system.md +25 -21
  806. package/docs/examples/production-request.json +3821 -2157
  807. package/docs/examples/simulate-capture.mjs +14 -0
  808. package/llms.txt +35 -0
  809. package/package.json +32 -12
  810. package/AGENTS.md +0 -674
  811. package/CONTRIBUTING.md +0 -76
  812. package/DCO +0 -33
  813. package/dist/camera/equivalent-focal-length.d.ts.map +0 -1
  814. package/dist/camera/field-of-view.d.ts.map +0 -1
  815. package/dist/camera/projected-object-size.d.ts.map +0 -1
  816. package/dist/capture/capture-export-metadata.d.ts.map +0 -1
  817. package/dist/capture/environment-raw-producer.d.ts.map +0 -1
  818. package/dist/capture/export-jpeg.d.ts.map +0 -1
  819. package/dist/capture/export-tiff.d.ts.map +0 -1
  820. package/dist/capture/focus-control.d.ts.map +0 -1
  821. package/dist/capture/linear-encoding.d.ts.map +0 -1
  822. package/dist/capture/native-environment-raw.d.ts.map +0 -1
  823. package/dist/capture/native-raw-development.d.ts.map +0 -1
  824. package/dist/capture/native-raw.d.ts.map +0 -1
  825. package/dist/capture/photographic-export.d.ts.map +0 -1
  826. package/dist/capture/raw-frame-limits.d.ts.map +0 -1
  827. package/dist/capture/raw-frame-reconstruction.d.ts.map +0 -1
  828. package/dist/capture/release-sequence.d.ts.map +0 -1
  829. package/dist/capture/sensor-raw-frame.d.ts.map +0 -1
  830. package/dist/capture/sensor-raw-producer.d.ts.map +0 -1
  831. package/dist/capture/simulated-capture.d.ts.map +0 -1
  832. package/dist/color/capture-color.d.ts.map +0 -1
  833. package/dist/color/sensor-color-development.d.ts.map +0 -1
  834. package/dist/color/srgb-icc.d.ts.map +0 -1
  835. package/dist/color/srgb-transfer.d.ts.map +0 -1
  836. package/dist/color/white-balance.d.ts.map +0 -1
  837. package/dist/composition/image-formation-plan.d.ts.map +0 -1
  838. package/dist/composition/plan-consumer.d.ts.map +0 -1
  839. package/dist/core/calculation-result.d.ts.map +0 -1
  840. package/dist/core/canonical-json.d.ts.map +0 -1
  841. package/dist/core/configuration-error.d.ts.map +0 -1
  842. package/dist/core/evidence-provenance.d.ts.map +0 -1
  843. package/dist/core/image-formation.d.ts.map +0 -1
  844. package/dist/core/owned-data.d.ts.map +0 -1
  845. package/dist/core/record-validation.d.ts.map +0 -1
  846. package/dist/core/scientific-assurance.d.ts.map +0 -1
  847. package/dist/core/spectral-composition.d.ts.map +0 -1
  848. package/dist/core/spectral.d.ts.map +0 -1
  849. package/dist/core/validation.d.ts.map +0 -1
  850. package/dist/core/version.d.ts.map +0 -1
  851. package/dist/equipment/exposure-capabilities.d.ts.map +0 -1
  852. package/dist/equipment/generic-tier-assets.d.ts.map +0 -1
  853. package/dist/equipment/generic-tier-presets.d.ts.map +0 -1
  854. package/dist/equipment/iso-capabilities.d.ts.map +0 -1
  855. package/dist/equipment/metering-capabilities.d.ts.map +0 -1
  856. package/dist/equipment/release-capabilities.d.ts.map +0 -1
  857. package/dist/exposure/exposure-duration-control.d.ts.map +0 -1
  858. package/dist/exposure/exposure-mode-resolver.d.ts.map +0 -1
  859. package/dist/exposure/exposure.d.ts.map +0 -1
  860. package/dist/exposure/flash.d.ts.map +0 -1
  861. package/dist/exposure/metering-scene-radiance.d.ts.map +0 -1
  862. package/dist/exposure/metering-target.d.ts.map +0 -1
  863. package/dist/exposure/metering-temporal.d.ts.map +0 -1
  864. package/dist/exposure/metering.d.ts.map +0 -1
  865. package/dist/exposure/program-line.d.ts.map +0 -1
  866. package/dist/index.d.ts.map +0 -1
  867. package/dist/motion/camera-rotation.d.ts.map +0 -1
  868. package/dist/motion/capture-rotation-inverse-mapping.d.ts.map +0 -1
  869. package/dist/motion/capture-rotation-temporal-quadrature.d.ts.map +0 -1
  870. package/dist/motion/capture-rotation-trajectory.d.ts.map +0 -1
  871. package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts.map +0 -1
  872. package/dist/motion/extended-object-projection.d.ts.map +0 -1
  873. package/dist/motion/projected-motion.d.ts.map +0 -1
  874. package/dist/optics/aperture.d.ts.map +0 -1
  875. package/dist/optics/circle-of-confusion.d.ts.map +0 -1
  876. package/dist/optics/complex-pupil-psf.d.ts.map +0 -1
  877. package/dist/optics/depth-of-field.d.ts.map +0 -1
  878. package/dist/optics/diffraction.d.ts.map +0 -1
  879. package/dist/optics/focus-breathing.d.ts.map +0 -1
  880. package/dist/optics/focus-state.d.ts.map +0 -1
  881. package/dist/optics/front-of-lens-filter.d.ts.map +0 -1
  882. package/dist/optics/illumination-vignetting.d.ts.map +0 -1
  883. package/dist/optics/lateral-chromatic-aberration.d.ts.map +0 -1
  884. package/dist/optics/lens-psf-profile.d.ts.map +0 -1
  885. package/dist/optics/polygon-diffraction.d.ts.map +0 -1
  886. package/dist/optics/profile-contract.d.ts.map +0 -1
  887. package/dist/optics/psf-foundation.d.ts.map +0 -1
  888. package/dist/optics/radial-distortion.d.ts.map +0 -1
  889. package/dist/optics/scene-to-sensor-irradiance.d.ts.map +0 -1
  890. package/dist/optics/scene-to-sensor-quadrature.d.ts.map +0 -1
  891. package/dist/optics/sensor-aperture-rays.d.ts.map +0 -1
  892. package/dist/optics/sensor-environment-query.d.ts.map +0 -1
  893. package/dist/optics/sensor-psf-quadrature.d.ts.map +0 -1
  894. package/dist/optics/sensor-psf-support.d.ts.map +0 -1
  895. package/dist/optics/stray-light.d.ts.map +0 -1
  896. package/dist/optics/thin-lens.d.ts.map +0 -1
  897. package/dist/output/capture-corrected-sdr.d.ts.map +0 -1
  898. package/dist/output/capture-geometry.d.ts.map +0 -1
  899. package/dist/output/capture-sdr.d.ts.map +0 -1
  900. package/dist/output/crop.d.ts.map +0 -1
  901. package/dist/output/geometric-transforms.d.ts.map +0 -1
  902. package/dist/output/lens-corrections.d.ts.map +0 -1
  903. package/dist/output/native-capture-sdr.d.ts.map +0 -1
  904. package/dist/output/print-contrast-reference.d.ts.map +0 -1
  905. package/dist/output/print-detail.d.ts.map +0 -1
  906. package/dist/output/print-jpeg.d.ts.map +0 -1
  907. package/dist/output/print-plan.d.ts.map +0 -1
  908. package/dist/output/print-region-statistics.d.ts.map +0 -1
  909. package/dist/output/sdr-rendering.d.ts.map +0 -1
  910. package/dist/output/subject-framing-crop.d.ts.map +0 -1
  911. package/dist/schema/camera.d.ts.map +0 -1
  912. package/dist/schema/camera.js +0 -3
  913. package/dist/schema/camera.js.map +0 -1
  914. package/dist/schema/illumination-spectral.d.ts.map +0 -1
  915. package/dist/schema/illumination-temporal.d.ts.map +0 -1
  916. package/dist/schema/illumination.d.ts.map +0 -1
  917. package/dist/schema/scene-radiance-temporal.d.ts.map +0 -1
  918. package/dist/schema/scene-radiance.d.ts.map +0 -1
  919. package/dist/schema/scene.d.ts.map +0 -1
  920. package/dist/schema/scene.js +0 -3
  921. package/dist/schema/scene.js.map +0 -1
  922. package/dist/schema/validation.d.ts.map +0 -1
  923. package/dist/sensor/accumulated-charge.d.ts.map +0 -1
  924. package/dist/sensor/architecture.d.ts.map +0 -1
  925. package/dist/sensor/camera-saturation-capacity.d.ts.map +0 -1
  926. package/dist/sensor/capture-color-sampling-binding.d.ts.map +0 -1
  927. package/dist/sensor/capture-mode-timing.d.ts.map +0 -1
  928. package/dist/sensor/capture-mode.d.ts.map +0 -1
  929. package/dist/sensor/color-sampling.d.ts.map +0 -1
  930. package/dist/sensor/constant-rate-temporal-integration.d.ts.map +0 -1
  931. package/dist/sensor/dark-current.d.ts.map +0 -1
  932. package/dist/sensor/environment-photo-signal.d.ts.map +0 -1
  933. package/dist/sensor/eqe-electron-rate.d.ts.map +0 -1
  934. package/dist/sensor/eqe-local-exposure.d.ts.map +0 -1
  935. package/dist/sensor/eqe-temporal-exposure.d.ts.map +0 -1
  936. package/dist/sensor/exposure-window.d.ts.map +0 -1
  937. package/dist/sensor/iso-signal-chain.d.ts.map +0 -1
  938. package/dist/sensor/local-exposure-binding.d.ts.map +0 -1
  939. package/dist/sensor/optical-stack.d.ts.map +0 -1
  940. package/dist/sensor/photon-energy.d.ts.map +0 -1
  941. package/dist/sensor/physical-charge-capacity.d.ts.map +0 -1
  942. package/dist/sensor/pixel-pitch.d.ts.map +0 -1
  943. package/dist/sensor/radiometry-readiness.d.ts.map +0 -1
  944. package/dist/sensor/raw-readout.d.ts.map +0 -1
  945. package/dist/sensor/raw-reconstruction.d.ts.map +0 -1
  946. package/dist/sensor/readout-exposure-linkage.d.ts.map +0 -1
  947. package/dist/sensor/readout-timing.d.ts.map +0 -1
  948. package/dist/sensor/response-application-compatibility.d.ts.map +0 -1
  949. package/dist/sensor/response-operating-range.d.ts.map +0 -1
  950. package/dist/sensor/responsivity-photocurrent.d.ts.map +0 -1
  951. package/dist/sensor/sampling-aperture.d.ts.map +0 -1
  952. package/dist/sensor/scene-eqe-temporal-exposure.d.ts.map +0 -1
  953. package/dist/sensor/sensor-geometry.d.ts.map +0 -1
  954. package/dist/sensor/signal-noise.d.ts.map +0 -1
  955. package/dist/sensor/spatial-sample-reduction.d.ts.map +0 -1
  956. package/dist/sensor/spatial-sampling-quadrature.d.ts.map +0 -1
  957. package/dist/sensor/spatio-spectral-reduction.d.ts.map +0 -1
  958. package/dist/sensor/spectral-coverage.d.ts.map +0 -1
  959. package/dist/sensor/spectral-quadrature.d.ts.map +0 -1
  960. package/dist/sensor/spectral-response.d.ts.map +0 -1
  961. package/dist/sensor/temporal-eqe-sum.d.ts.map +0 -1
  962. package/dist/sensor/temporal-photo-signal.d.ts.map +0 -1
  963. package/dist/sensor/temporal-sample-binding.d.ts.map +0 -1
  964. package/dist/simulation/poc-simulation.d.ts.map +0 -1
  965. package/dist/stabilization/camera-shake.d.ts.map +0 -1
  966. package/dist/stabilization/system.d.ts.map +0 -1
  967. package/docs/API_STYLE.md +0 -235
  968. package/docs/ARCHITECTURE.md +0 -356
  969. package/docs/AUTOMATION_COORDINATION.md +0 -190
  970. package/docs/CAPTURE_COLOR.md +0 -25
  971. package/docs/CAPTURE_CORRECTED_SDR.md +0 -25
  972. package/docs/CAPTURE_EXPORT_METADATA.md +0 -27
  973. package/docs/CAPTURE_SDR.md +0 -22
  974. package/docs/DEVELOPERS.md +0 -68
  975. package/docs/DIGITAL_OPTICS_FOUNDATION.md +0 -69
  976. package/docs/ENVIRONMENT_RAW_CAPTURE.md +0 -208
  977. package/docs/EXPORT_ACCEPTANCE.md +0 -133
  978. package/docs/GENERIC_TIER_PRESETS.md +0 -269
  979. package/docs/GEOMETRIC_PREPARATION_REUSE.md +0 -141
  980. package/docs/IMAGE_FORMATION.md +0 -247
  981. package/docs/LINEAR_CAPTURE_ENCODING.md +0 -25
  982. package/docs/MOTION_AND_SIGNAL.md +0 -250
  983. package/docs/NATIVE_CAPTURE_SDR.md +0 -70
  984. package/docs/NATIVE_CAPTURE_SDR_REVIEW.md +0 -37
  985. package/docs/NATIVE_CAPTURE_SDR_VALIDATION.md +0 -34
  986. package/docs/NATIVE_RAW_AND_PRINT.md +0 -47
  987. package/docs/NUMERICAL_CORRECTNESS.md +0 -191
  988. package/docs/PERFORMANCE_BASELINE.md +0 -56
  989. package/docs/PHOTOGRAPHIC_EXPORT.md +0 -206
  990. package/docs/PHYSICS_FOUNDATION.md +0 -426
  991. package/docs/POC_API.md +0 -278
  992. package/docs/POC_PROJECTION_PLATFORM_REFERENCE.md +0 -12
  993. package/docs/POC_PROJECTION_REUSE.md +0 -124
  994. package/docs/PRINT_195_196_REVIEW.md +0 -93
  995. package/docs/PRINT_196_ENGINE_ACCEPTANCE.md +0 -45
  996. package/docs/PRINT_CONTRAST_REFERENCE.md +0 -43
  997. package/docs/PRINT_DETAIL_ASSESSMENT.md +0 -81
  998. package/docs/PRINT_DETAIL_JPEG_EVIDENCE.md +0 -36
  999. package/docs/PRINT_DETAIL_SDR_EVIDENCE.md +0 -29
  1000. package/docs/PRINT_DETAIL_VALIDATION.md +0 -36
  1001. package/docs/PRINT_PLANNING.md +0 -75
  1002. package/docs/PRINT_REGION_STATISTICS.md +0 -38
  1003. package/docs/PROCESSED_OUTPUT.md +0 -157
  1004. package/docs/PRODUCTION_COMPOSITION.md +0 -373
  1005. package/docs/PRODUCTION_ENVIRONMENT_CAPTURE.md +0 -131
  1006. package/docs/PROVENANCE.md +0 -115
  1007. package/docs/PSF_FOUNDATION.md +0 -165
  1008. package/docs/RAW_FRAME_ENVELOPE.md +0 -56
  1009. package/docs/RAW_FRAME_RECONSTRUCTION.md +0 -30
  1010. package/docs/RELEASE_1_0.md +0 -66
  1011. package/docs/RELEASE_1_0_1.md +0 -61
  1012. package/docs/RELEASE_1_1_0.md +0 -25
  1013. package/docs/RELEASE_1_2_0.md +0 -51
  1014. package/docs/RELEASE_1_3_0.md +0 -15
  1015. package/docs/RELEASE_1_4_0.md +0 -23
  1016. package/docs/RELEASE_AUDIT.md +0 -39
  1017. package/docs/SCENE_RADIANCE_AND_ILLUMINATION.md +0 -298
  1018. package/docs/SCENE_SENSOR_QUADRATURE.md +0 -98
  1019. package/docs/SCENE_SENSOR_TEMPORAL_EXPOSURE.md +0 -86
  1020. package/docs/SCIENTIFIC_ASSURANCE.md +0 -280
  1021. package/docs/SCIENTIFIC_CONFORMANCE.md +0 -83
  1022. package/docs/SDR_RENDERING.md +0 -33
  1023. package/docs/SENSOR_APERTURE_RAYS.md +0 -23
  1024. package/docs/SENSOR_ENVIRONMENT_QUERY.md +0 -86
  1025. package/docs/SENSOR_EQE_LOCAL_EXPOSURE.md +0 -104
  1026. package/docs/SENSOR_EQE_TEMPORAL_EXPOSURE.md +0 -74
  1027. package/docs/SENSOR_PSF_QUADRATURE.md +0 -90
  1028. package/docs/SENSOR_RAW_FRAME.md +0 -20
  1029. package/docs/SENSOR_RAW_PRODUCER.md +0 -77
  1030. package/docs/SIGNAL_CONFORMANCE.md +0 -23
  1031. package/docs/SIMULATED_CAPTURE.md +0 -65
  1032. package/docs/STABILIZATION.md +0 -234
  1033. package/docs/TEMPORAL_PHOTO_RAW.md +0 -83
  1034. package/docs/TIER_ACCEPTANCE.md +0 -129
  1035. package/docs/TIER_PRESET_ACCEPTANCE.md +0 -59
  1036. package/docs/V1_COMPOSITION_MAP.md +0 -123
  1037. package/docs/V1_HELPER_REUSE_REVIEW.md +0 -60
  1038. package/docs/V1_PERFORMANCE_DISPOSITION.md +0 -88
  1039. package/docs/benchmarks/2026-10-01-main-baseline.json +0 -694
  1040. package/docs/benchmarks/2026-10-02-geometric-preparation-reuse.json +0 -2190
  1041. package/docs/benchmarks/2026-10-02-poc-projection-reuse.json +0 -2423
  1042. package/docs/benchmarks/2026-10-02-v1-environment-gc-profile.json +0 -210
  1043. package/docs/benchmarks/2026-10-02-v1-environment-ordinary.json +0 -187
  1044. package/docs/benchmarks/2026-10-02-v1-geometry-gc-profile.json +0 -756
  1045. package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-1.json +0 -711
  1046. package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-2.json +0 -711
  1047. package/docs/benchmarks/2026-10-02-v1-poc-gc-profile.json +0 -885
  1048. package/docs/benchmarks/2026-10-02-v1-poc-ordinary-1.json +0 -868
  1049. package/docs/benchmarks/2026-10-02-v1-poc-ordinary-2.json +0 -868
  1050. package/docs/licenses/castleCSF-MIT.txt +0 -21
  1051. package/docs/validation/documentation-fragments.json +0 -212
  1052. package/docs/validation/native-capture-sdr-darwin-arm64-node26-review.jsonl +0 -4
  1053. package/docs/validation/native-capture-sdr-darwin-arm64.jsonl +0 -3
  1054. package/docs/validation/native-raw-print-2026-10-04/fractional-asymmetric-crop.jpg +0 -0
  1055. package/docs/validation/native-raw-print-2026-10-04/gray-ramp.jpg +0 -0
  1056. package/docs/validation/native-raw-print-2026-10-04/linear-area-checker.jpg +0 -0
  1057. package/docs/validation/native-raw-print-2026-10-04/manifest.json +0 -218
  1058. package/docs/validation/native-raw-print-2026-10-04/megapixel-native.jpg +0 -0
  1059. package/docs/validation/native-raw-print-2026-10-04/native-color.jpg +0 -0
  1060. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel-validation.json +0 -9
  1061. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json +0 -29
  1062. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.codes.u16le.gz +0 -0
  1063. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.jpg +0 -0
  1064. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.rgb.gz +0 -0
  1065. package/docs/validation/native-raw-print-2026-10-04/srgb.icc +0 -0
  1066. package/docs/validation/native-raw-print-2026-10-04/validation.json +0 -41
  1067. package/docs/validation/print-196-candidate-capabilities.json +0 -28
  1068. package/docs/validation/print-196-candidate-evidence.json +0 -356
  1069. package/docs/validation/print-196-engine-acceptance.json +0 -81
  1070. package/docs/validation/print-detail-capabilities.json +0 -103
  1071. package/docs/validation/print-detail-jpeg-evidence.json +0 -116
  1072. package/docs/validation/print-detail-sdr-evidence.json +0 -81
  1073. package/docs/validation/release-audit-inventory.json +0 -1306
  1074. package/docs/validation/tier-acceptance-report-v1.json +0 -2538
@@ -1,26 +1,23 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
2
  /**
3
- * Module boundary and integration notes.
4
- * Validate an untrusted declaration and return the normalized typed contract. Unknown enum values,
5
- * missing required fields and incompatible scientific data fail at this boundary. The planner owns
6
- * scientific stage ordering, immutable capture identity and reproducibility. Well-formed unsupported
7
- * combinations produce structured blockers; malformed declarations throw. The bounded environment
8
- * route executes supplied radiance through native RAW and optional output, while sample-only and
9
- * attached-RAW routes retain missing upstream blockers. FNV fingerprints are reproducibility keys, not
10
- * cryptographic integrity proofs.
11
- * Validate an untrusted declaration and return the normalized typed contract. Unknown enum values,
12
- * missing required fields and incompatible scientific data fail at this boundary. The planner owns
13
- * scientific stage ordering, immutable capture identity and reproducibility. Well-formed unsupported
14
- * combinations produce structured blockers; malformed declarations throw. The bounded environment
15
- * route executes supplied radiance through native RAW and optional output, while sample-only and
16
- * attached-RAW routes retain missing upstream blockers. FNV fingerprints are reproducibility keys, not
17
- * cryptographic integrity proofs.
18
- * @see docs/PRODUCTION_ENVIRONMENT_CAPTURE.md for equations, coordinate/unit conventions, blockers and
19
- * support limits.
3
+ * The production image-formation plan: the ordered list of scientific stages that turns a scene into
4
+ * a capture, and the record of which stages ran.
5
+ *
6
+ * The parsers validate untrusted input and return the normalized typed contract. Unknown enum values,
7
+ * missing required fields and incompatible scientific data are rejected.
8
+ *
9
+ * The planner decides the order of the scientific stages, fixes each capture's identity so it cannot
10
+ * change, and makes results reproducible. A well-formed but unsupported combination returns
11
+ * structured blockers. A malformed declaration throws. The bounded environment route runs the
12
+ * supplied radiance through native RAW and, optionally, output processing. The sample-only and
13
+ * attached-RAW routes keep blockers for the upstream stages they lack. FNV fingerprints are keys for
14
+ * reproducibility, not cryptographic proof of integrity.
15
+ * @see docs/PRODUCTION_ENVIRONMENT_CAPTURE.md for the equations, units, coordinate conventions, known
16
+ * blockers and support limits.
20
17
  */
21
18
  import { simulateEnvironmentSensorRawFrame } from "../capture/environment-raw-producer.js";
22
19
  import { parseSimulatedCapture } from "../capture/simulated-capture.js";
23
- import { calculateProcessedSensorRaw, validateProcessedSensorRawEnvelope } from "../capture/photographic-export.js";
20
+ import { calculateProcessedSensorRaw, validateProcessedSensorRawEnvelope, PROCESSED_SENSOR_RAW_MODEL_VERSION } from "../capture/photographic-export.js";
24
21
  import { stringifyCanonicalJson } from "../core/canonical-json.js";
25
22
  import { RELEASE_SEQUENCE_VERSION } from "../capture/release-sequence.js";
26
23
  import { parseResolvedWhiteBalanceState } from "../color/white-balance.js";
@@ -29,6 +26,8 @@ import { getImageFormationContract, IMAGE_FORMATION_CONTRACT_VERSION } from "../
29
26
  import { ENGINE_API_VERSION } from "../core/version.js";
30
27
  import { SCIENTIFIC_ASSURANCE_CONTRACT_VERSION, composeScientificAssurance } from "../core/scientific-assurance.js";
31
28
  import { InvalidScientificInputError } from "../core/validation.js";
29
+ import { parseEvidenceList } from "../core/evidence-provenance.js";
30
+ import { isElectronicRollingShutterExposureSchedule } from "../sensor/readout-exposure-linkage.js";
32
31
  import { calculateCaptureRotationTemporalQuadrature } from "../motion/capture-rotation-temporal-quadrature.js";
33
32
  import { calculateCaptureExposureWindows } from "../sensor/exposure-window.js";
34
33
  import { calculateSensorReadoutTiming } from "../sensor/readout-timing.js";
@@ -37,6 +36,7 @@ import { parseFrontOfLensFilterProfile, resolveFrontOfLensFilterTransmission } f
37
36
  import { parseFocusPlane } from "../optics/focus-state.js";
38
37
  import { calculateSceneRadianceToSensorIrradiance, parseSceneToSensorIrradianceProfile } from "../optics/scene-to-sensor-irradiance.js";
39
38
  import { parseSceneRadianceEvaluationRequest, parseSceneRadianceEvaluationResult } from "../schema/scene-radiance.js";
39
+ import { requireInputObject, requireInputKeys, rejectUnknownFields, rejectUnknownVariantFields } from "../core/record-validation.js";
40
40
  export const PRODUCTION_IMAGE_FORMATION_PLAN_VERSION = "0.7.0";
41
41
  export const PREPARED_IMAGE_FORMATION_CONTEXT_VERSION = "0.1.0";
42
42
  export const PRODUCTION_CAPTURE_SNAPSHOT_VERSION = "0.3.0";
@@ -53,15 +53,18 @@ const COMPOSER_SUPPORTED_STAGES = new Set([
53
53
  ]);
54
54
  const COMPOSER_SUPPORTED_EFFECTS = new Set([
55
55
  "illumination-vignetting",
56
+ "geometric-distortion",
56
57
  "spatial-camera-rotation",
57
58
  "rolling-readout"
58
59
  ]);
59
- function requireRecord(value, path) {
60
+ function requireRecord(value, path, allowedKeys) {
60
61
  if (typeof value !== "object" ||
61
62
  value === null ||
62
63
  Array.isArray(value)) {
63
64
  throw new InvalidConfigurationError(path + " must be an object.");
64
65
  }
66
+ if (allowedKeys !== null)
67
+ rejectUnknownFields(value, allowedKeys, path);
65
68
  return value;
66
69
  }
67
70
  function requireNonEmptyString(value, path) {
@@ -157,21 +160,22 @@ function parseUniqueEffectIds(value, path) {
157
160
  .filter((effectId) => seen.has(effectId));
158
161
  }
159
162
  /**
160
- * Validate an untrusted declaration and return the normalized typed contract. Unknown enum values,
161
- * missing required fields and incompatible scientific data fail at this boundary.
163
+ * Validates an untrusted declaration and returns the normalized typed contract. Unknown enum values,
164
+ * missing required fields and incompatible scientific data are rejected here.
162
165
  *
163
- * The planner owns scientific stage ordering, immutable capture identity and reproducibility.
164
- * Well-formed unsupported combinations produce structured blockers; malformed declarations throw. The
165
- * bounded environment route executes supplied radiance through native RAW and optional output, while
166
- * sample-only and attached-RAW routes retain missing upstream blockers. FNV fingerprints are
167
- * reproducibility keys, not cryptographic integrity proofs.
168
- * @param value - unknown. Treated as untrusted data; static typing alone is not validation.
169
- * @returns RendererCapabilityDeclaration. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
166
+ * The planner decides the order of the scientific stages, fixes each capture's identity so it cannot
167
+ * change, and makes results reproducible. A well-formed but unsupported combination returns
168
+ * structured blockers. A malformed declaration throws. The bounded environment route runs the
169
+ * supplied radiance through native RAW and, optionally, output processing. The sample-only and
170
+ * attached-RAW routes keep blockers for the upstream stages they lack. FNV fingerprints are keys for
171
+ * reproducibility, not cryptographic proof of integrity.
172
+ * @param value - unknown. Untrusted input; TypeScript types alone are not validation.
173
+ * @returns RendererCapabilityDeclaration. The result states its shape and scientific status; a successful call does not imply calibration.
170
174
  *
171
175
  * @see docs/API_REFERENCE.md for the root export and exact type graph.
172
176
  */
173
177
  export function parseRendererCapabilityDeclaration(value) {
174
- const record = requireRecord(value, "rendererCapability");
178
+ const record = requireRecord(value, "rendererCapability", ["schemaVersion", "consumerKind", "spectralCapability", "temporalSampling", "depthCapability", "alphaRepresentation", "inverseFieldMapping", "preservesDepthOrderAcrossWarps", "sensorDomainProcessing", "rendererId", "rendererVersion", "supportedStages", "supportedEffects"]);
175
179
  if (record.schemaVersion !==
176
180
  RENDERER_CAPABILITY_SCHEMA_VERSION) {
177
181
  throw new InvalidConfigurationError('rendererCapability.schemaVersion must be "' +
@@ -191,7 +195,8 @@ export function parseRendererCapabilityDeclaration(value) {
191
195
  "wavelength-independent-approximation") {
192
196
  throw new InvalidConfigurationError("rendererCapability.spectralCapability is invalid.");
193
197
  }
194
- const temporal = requireRecord(record.temporalSampling, "rendererCapability.temporalSampling");
198
+ const temporal = requireRecord(record.temporalSampling, "rendererCapability.temporalSampling", null);
199
+ rejectUnknownVariantFields(temporal, "kind", { none: ["kind"], bounded: ["kind", "maximumSamples"] }, "rendererCapability.temporalSampling");
195
200
  let temporalSampling;
196
201
  if (temporal.kind === "none") {
197
202
  temporalSampling = {
@@ -267,21 +272,22 @@ export function parseRendererCapabilityDeclaration(value) {
267
272
  };
268
273
  }
269
274
  /**
270
- * Validate an untrusted declaration and return the normalized typed contract. Unknown enum values,
271
- * missing required fields and incompatible scientific data fail at this boundary.
275
+ * Validates an untrusted declaration and returns the normalized typed contract. Unknown enum values,
276
+ * missing required fields and incompatible scientific data are rejected here.
272
277
  *
273
- * The planner owns scientific stage ordering, immutable capture identity and reproducibility.
274
- * Well-formed unsupported combinations produce structured blockers; malformed declarations throw. The
275
- * bounded environment route executes supplied radiance through native RAW and optional output, while
276
- * sample-only and attached-RAW routes retain missing upstream blockers. FNV fingerprints are
277
- * reproducibility keys, not cryptographic integrity proofs.
278
- * @param value - unknown. Treated as untrusted data; static typing alone is not validation.
279
- * @returns ImageFormationFidelityProfile. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
278
+ * The planner decides the order of the scientific stages, fixes each capture's identity so it cannot
279
+ * change, and makes results reproducible. A well-formed but unsupported combination returns
280
+ * structured blockers. A malformed declaration throws. The bounded environment route runs the
281
+ * supplied radiance through native RAW and, optionally, output processing. The sample-only and
282
+ * attached-RAW routes keep blockers for the upstream stages they lack. FNV fingerprints are keys for
283
+ * reproducibility, not cryptographic proof of integrity.
284
+ * @param value - unknown. Untrusted input; TypeScript types alone are not validation.
285
+ * @returns ImageFormationFidelityProfile. The result states its shape and scientific status; a successful call does not imply calibration.
280
286
  *
281
287
  * @see docs/API_REFERENCE.md for the root export and exact type graph.
282
288
  */
283
289
  export function parseImageFormationFidelityProfile(value) {
284
- const record = requireRecord(value, "imageFormationFidelityProfile");
290
+ const record = requireRecord(value, "imageFormationFidelityProfile", ["schemaVersion", "requiredEffects", "rendererRequirements", "profileId", "profileVersion", "requiredStages"]);
285
291
  if (record.schemaVersion !==
286
292
  IMAGE_FORMATION_FIDELITY_PROFILE_SCHEMA_VERSION) {
287
293
  throw new InvalidConfigurationError('imageFormationFidelityProfile.schemaVersion must be "' +
@@ -297,7 +303,7 @@ export function parseImageFormationFidelityProfile(value) {
297
303
  const path = "imageFormationFidelityProfile.requiredEffects[" +
298
304
  index +
299
305
  "]";
300
- const effect = requireRecord(entry, path);
306
+ const effect = requireRecord(entry, path, ["effectId", "modelId", "modelVersion"]);
301
307
  const effectId = effect.effectId;
302
308
  if (typeof effectId !==
303
309
  "string" ||
@@ -326,7 +332,7 @@ export function parseImageFormationFidelityProfile(value) {
326
332
  ...requestedEffects
327
333
  ].sort((left, right) => (effectOrder.get(left.effectId) ?? 0) -
328
334
  (effectOrder.get(right.effectId) ?? 0));
329
- const requirements = requireRecord(record.rendererRequirements, "imageFormationFidelityProfile.rendererRequirements");
335
+ const requirements = requireRecord(record.rendererRequirements, "imageFormationFidelityProfile.rendererRequirements", ["spectral", "sensorDomainProcessing", "depth"]);
330
336
  const spectral = requirements.spectral;
331
337
  if (spectral !==
332
338
  "wavelength-resolved" &&
@@ -359,6 +365,7 @@ export function parseImageFormationFidelityProfile(value) {
359
365
  };
360
366
  }
361
367
  function validateEquipmentCapabilities(value) {
368
+ requireInputObject(value, "value input");
362
369
  if (value.schemaVersion !==
363
370
  GENERIC_EQUIPMENT_EXPOSURE_CAPABILITY_SCHEMA_VERSION ||
364
371
  value.scientificStatus !==
@@ -436,39 +443,65 @@ function fingerprintText(text) {
436
443
  function fingerprintValue(value) {
437
444
  return fingerprintText(canonicalStringify(value));
438
445
  }
446
+ /** Top-level fields of `ProductionImageFormationPlan`. */
447
+ const PRODUCTION_PLAN_FIELDS = ["version", "status", "versions", "contextIdentity", "captureIdentity", "rendererIdentity",
448
+ "fidelityIdentity", "stagePlan", "effectPlan", "blockers", "environmentCaptureRequestFingerprint", "environmentCaptureResult",
449
+ "processedOutputResult", "physicalSceneToSensorResult", "temporalCaptureResult", "scientificAssurance", "stochastic",
450
+ "immutableCaptureSnapshot", "legacyPocModified", "fingerprint"];
439
451
  /**
440
- * Return deterministic canonical JSON of a validated production plan. Sorted object keys preserve
441
- * array order; the representation contains data and excludes executable provider callbacks.
452
+ * Returns deterministic canonical JSON for a validated production plan. Object keys are sorted;
453
+ * array order is kept. The JSON holds data only and leaves out provider callbacks. The plan version
454
+ * and its fingerprint (recomputed over the content) must match, so an empty or edited object is
455
+ * rejected instead of serialized.
442
456
  *
443
- * The planner owns scientific stage ordering, immutable capture identity and reproducibility.
444
- * Well-formed unsupported combinations produce structured blockers; malformed declarations throw. The
445
- * bounded environment route executes supplied radiance through native RAW and optional output, while
446
- * sample-only and attached-RAW routes retain missing upstream blockers. FNV fingerprints are
447
- * reproducibility keys, not cryptographic integrity proofs.
448
- * @param plan - ProductionImageFormationPlan. See the linked contract for coordinate, unit and profile binding semantics.
449
- * @returns string. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
457
+ * The planner decides the order of the scientific stages, fixes each capture's identity so it cannot
458
+ * change, and makes results reproducible. A well-formed but unsupported combination returns
459
+ * structured blockers. A malformed declaration throws. The bounded environment route runs the
460
+ * supplied radiance through native RAW and, optionally, output processing. The sample-only and
461
+ * attached-RAW routes keep blockers for the upstream stages they lack. FNV fingerprints are keys for
462
+ * reproducibility, not cryptographic proof of integrity.
463
+ * @param plan - ProductionImageFormationPlan. See that type for coordinates, units and profile binding.
464
+ * @returns string. The result states its shape and scientific status; a successful call does not imply calibration.
450
465
  *
451
466
  * @see docs/API_REFERENCE.md for the root export and exact type graph.
452
467
  */
453
468
  export function serializeProductionImageFormationPlan(plan) {
469
+ requireInputObject(plan, "serializeProductionImageFormationPlan input");
470
+ // 2.0.0: unknown top-level and fingerprint fields are named. Nested content is bound by the recomputed fingerprint.
471
+ rejectUnknownFields(plan, PRODUCTION_PLAN_FIELDS, "productionImageFormationPlan");
472
+ const { fingerprint, ...core } = plan;
473
+ if (isPlainObjectValue(fingerprint)) {
474
+ rejectUnknownFields(fingerprint, ["algorithm", "value", "purpose"], "productionImageFormationPlan.fingerprint");
475
+ }
476
+ if (core.version !== PRODUCTION_IMAGE_FORMATION_PLAN_VERSION) {
477
+ throw new InvalidConfigurationError(`Production plan version must be "${PRODUCTION_IMAGE_FORMATION_PLAN_VERSION}".`);
478
+ }
479
+ const supplied = fingerprint;
480
+ if (typeof supplied !== "object" || supplied === null ||
481
+ supplied.algorithm !== "fnv1a-32-non-cryptographic" ||
482
+ supplied.purpose !== "deterministic-reproducibility-key-not-integrity-security" ||
483
+ supplied.value !== fingerprintValue(core)) {
484
+ throw new InvalidConfigurationError("Production plan fingerprint does not match its content; serialize only a plan returned by createProductionImageFormationPlan.");
485
+ }
454
486
  return canonicalStringify(plan);
455
487
  }
456
488
  /**
457
- * Validate an untrusted declaration and return the normalized typed contract. Unknown enum values,
458
- * missing required fields and incompatible scientific data fail at this boundary.
489
+ * Validates an untrusted declaration and returns the normalized typed contract. Unknown enum values,
490
+ * missing required fields and incompatible scientific data are rejected here.
459
491
  *
460
- * The planner owns scientific stage ordering, immutable capture identity and reproducibility.
461
- * Well-formed unsupported combinations produce structured blockers; malformed declarations throw. The
462
- * bounded environment route executes supplied radiance through native RAW and optional output, while
463
- * sample-only and attached-RAW routes retain missing upstream blockers. FNV fingerprints are
464
- * reproducibility keys, not cryptographic integrity proofs.
465
- * @param value - unknown. Treated as untrusted data; static typing alone is not validation.
466
- * @returns PreparedImageFormationContext. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
492
+ * The planner decides the order of the scientific stages, fixes each capture's identity so it cannot
493
+ * change, and makes results reproducible. A well-formed but unsupported combination returns
494
+ * structured blockers. A malformed declaration throws. The bounded environment route runs the
495
+ * supplied radiance through native RAW and, optionally, output processing. The sample-only and
496
+ * attached-RAW routes keep blockers for the upstream stages they lack. FNV fingerprints are keys for
497
+ * reproducibility, not cryptographic proof of integrity.
498
+ * @param value - unknown. Untrusted input; TypeScript types alone are not validation.
499
+ * @returns PreparedImageFormationContext. The result states its shape and scientific status; a successful call does not imply calibration.
467
500
  *
468
501
  * @see docs/API_REFERENCE.md for the root export and exact type graph.
469
502
  */
470
503
  export function parsePreparedImageFormationContext(value) {
471
- const record = requireRecord(value, "preparedImageFormationContext");
504
+ const record = requireRecord(value, "preparedImageFormationContext", ["version", "contextId", "sceneId", "sceneRadianceProviderProfileId", "outputGeometryProfileId", "equipmentCapabilities", "opticalBridgeProfile", "renderer", "fidelity", "fingerprint"]);
472
505
  if (record.version !==
473
506
  PREPARED_IMAGE_FORMATION_CONTEXT_VERSION) {
474
507
  throw new InvalidConfigurationError('preparedImageFormationContext.version must be "' +
@@ -500,7 +533,7 @@ export function parsePreparedImageFormationContext(value) {
500
533
  record.fingerprint === null) {
501
534
  throw new InvalidConfigurationError("preparedImageFormationContext.fingerprint must be present.");
502
535
  }
503
- const supplied = requireRecord(record.fingerprint, "preparedImageFormationContext.fingerprint");
536
+ const supplied = requireRecord(record.fingerprint, "preparedImageFormationContext.fingerprint", ["algorithm", "value"]);
504
537
  if (supplied.algorithm !==
505
538
  "fnv1a-32-non-cryptographic" ||
506
539
  supplied.value !==
@@ -510,20 +543,23 @@ export function parsePreparedImageFormationContext(value) {
510
543
  return parsed;
511
544
  }
512
545
  /**
513
- * Parse, own and freeze relatively static equipment, scene, renderer and fidelity declarations for
514
- * reuse by later immutable captures. This prepares semantic state and does not render a frame.
546
+ * Parses, copies and freezes the declarations that change rarely (equipment, scene, renderer and
547
+ * fidelity), so later immutable captures can reuse them. This prepares state; it does not render a
548
+ * frame.
515
549
  *
516
- * The planner owns scientific stage ordering, immutable capture identity and reproducibility.
517
- * Well-formed unsupported combinations produce structured blockers; malformed declarations throw. The
518
- * bounded environment route executes supplied radiance through native RAW and optional output, while
519
- * sample-only and attached-RAW routes retain missing upstream blockers. FNV fingerprints are
520
- * reproducibility keys, not cryptographic integrity proofs.
521
- * @param input - PrepareImageFormationContextInput. See the linked contract for coordinate, unit and profile binding semantics.
522
- * @returns PreparedImageFormationContext. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
550
+ * The planner decides the order of the scientific stages, fixes each capture's identity so it cannot
551
+ * change, and makes results reproducible. A well-formed but unsupported combination returns
552
+ * structured blockers. A malformed declaration throws. The bounded environment route runs the
553
+ * supplied radiance through native RAW and, optionally, output processing. The sample-only and
554
+ * attached-RAW routes keep blockers for the upstream stages they lack. FNV fingerprints are keys for
555
+ * reproducibility, not cryptographic proof of integrity.
556
+ * @param input - PrepareImageFormationContextInput. See that type for coordinates, units and profile binding.
557
+ * @returns PreparedImageFormationContext. The result states its shape and scientific status; a successful call does not imply calibration.
523
558
  *
524
559
  * @see docs/API_REFERENCE.md for the root export and exact type graph.
525
560
  */
526
561
  export function prepareImageFormationContext(input) {
562
+ requireInputKeys(input, "prepareImageFormationContext", ["contextId", "sceneId", "sceneRadianceProviderProfileId", "outputGeometryProfileId", "equipmentCapabilities", "opticalBridgeProfile", "renderer", "fidelity", "version", "fingerprint"]);
527
563
  validateEquipmentCapabilities(input.equipmentCapabilities);
528
564
  const renderer = parseRendererCapabilityDeclaration(input.renderer);
529
565
  const fidelity = parseImageFormationFidelityProfile(input.fidelity);
@@ -568,7 +604,41 @@ export function prepareImageFormationContext(input) {
568
604
  };
569
605
  return deepFreeze(cloneJson(prepared));
570
606
  }
607
+ /**
608
+ * Rejects unknown fields in the optical-bridge focus and field-throughput declarations carried by a
609
+ * physical scene sample. Values that are not objects are left to the optical bridge, which reports
610
+ * them; the vignetting `result` is an engine result and is checked where it is used.
611
+ */
612
+ function rejectUnknownOpticalBridgeFields(focus, fieldThroughput, path) {
613
+ if (isPlainObjectValue(focus)) {
614
+ rejectUnknownVariantFields(focus, "kind", {
615
+ "infinity-focus": ["kind"],
616
+ "ideal-symmetric-thin-lens": ["kind", "objectDistanceM", "pupilMagnificationAssumption"],
617
+ "supplied-working-f-number": ["kind", "focus", "workingFNumber", "basis"]
618
+ }, path + ".focus");
619
+ if (focus.kind === "supplied-working-f-number") {
620
+ if (isPlainObjectValue(focus.focus)) {
621
+ rejectUnknownVariantFields(focus.focus, "kind", { infinity: ["kind"], finite: ["kind", "objectDistanceM"] }, path + ".focus.focus");
622
+ }
623
+ if (isPlainObjectValue(focus.workingFNumber)) {
624
+ rejectUnknownFields(focus.workingFNumber, ["value", "evidence"], path + ".focus.workingFNumber");
625
+ }
626
+ }
627
+ }
628
+ if (isPlainObjectValue(fieldThroughput)) {
629
+ rejectUnknownVariantFields(fieldThroughput, "kind", {
630
+ unity: ["kind"],
631
+ "illumination-vignetting-result": ["kind", "result"]
632
+ }, path + ".fieldThroughput");
633
+ }
634
+ }
635
+ function isPlainObjectValue(value) {
636
+ return typeof value === "object" && value !== null && !Array.isArray(value);
637
+ }
571
638
  function validatePhysicalSceneSample(sample, sceneTimeSecondsFromExposureStart) {
639
+ requireRecord(sample, "physicalSceneSample", ["sceneRadianceRequest", "sceneRadianceResult", "focus", "imagePointMm",
640
+ "fieldThroughput", "frontOfLensFilters"]);
641
+ rejectUnknownOpticalBridgeFields(sample.focus, sample.fieldThroughput, "physicalSceneSample");
572
642
  const request = parseSceneRadianceEvaluationRequest(sample.sceneRadianceRequest);
573
643
  const result = parseSceneRadianceEvaluationResult(sample.sceneRadianceResult);
574
644
  if (request
@@ -576,7 +646,7 @@ function validatePhysicalSceneSample(sample, sceneTimeSecondsFromExposureStart)
576
646
  sceneTimeSecondsFromExposureStart) {
577
647
  throw new InvalidConfigurationError("physicalSceneSample.sceneRadianceRequest.timeSecondsFromExposureStart must equal the capture snapshot scene time.");
578
648
  }
579
- const imagePoint = requireRecord(sample.imagePointMm, "physicalSceneSample.imagePointMm");
649
+ const imagePoint = requireRecord(sample.imagePointMm, "physicalSceneSample.imagePointMm", ["x", "y"]);
580
650
  return cloneJson({
581
651
  sceneRadianceRequest: request,
582
652
  sceneRadianceResult: result,
@@ -601,6 +671,16 @@ const CAPTURE_ORIENTATIONS = new Set([
601
671
  "portrait-counter-clockwise"
602
672
  ]);
603
673
  function validateTemporalCaptureInput(input, shutterSeconds) {
674
+ requireRecord(input, "temporalCapture", ["exposureWindowInput", "imagingArea", "orientation", "readout",
675
+ "readoutExposureLinkage", "rotation"]);
676
+ requireRecord(input.imagingArea, "temporalCapture.imagingArea", ["widthMm", "heightMm"]);
677
+ if (isPlainObjectValue(input.readoutExposureLinkage)) {
678
+ rejectUnknownFields(input.readoutExposureLinkage, ["kind", "evidence"], "temporalCapture.readoutExposureLinkage");
679
+ }
680
+ if (input.rotation !== undefined) {
681
+ requireRecord(input.rotation, "temporalCapture.rotation", ["angularVelocityRadPerSec", "focusDistanceM", "temporalSampleCount"]);
682
+ requireRecord(input.rotation.angularVelocityRadPerSec, "temporalCapture.rotation.angularVelocityRadPerSec", ["pitch", "yaw", "roll"]);
683
+ }
604
684
  const exposureWindows = calculateCaptureExposureWindows(input.exposureWindowInput).value;
605
685
  if (!settingEquals(exposureWindows
606
686
  .nominalExposureDurationSeconds
@@ -639,6 +719,19 @@ function validateTemporalCaptureInput(input, shutterSeconds) {
639
719
  })
640
720
  });
641
721
  }
722
+ if (input.readoutExposureLinkage !== undefined) {
723
+ const linkage = input.readoutExposureLinkage;
724
+ if (typeof linkage !== "object" ||
725
+ linkage === null ||
726
+ linkage.kind !== "electronic-rolling-shutter-line-reset-read") {
727
+ throw new InvalidConfigurationError("temporalCapture.readoutExposureLinkage.kind is invalid.");
728
+ }
729
+ parseEvidenceList(linkage.evidence, "temporalCapture.readoutExposureLinkage.evidence");
730
+ if (input.readout === undefined ||
731
+ !isElectronicRollingShutterExposureSchedule(input.exposureWindowInput, input.readout)) {
732
+ throw new InvalidConfigurationError("temporalCapture electronic rolling-shutter linkage requires a rolling readout and the exposure schedule derived from it.");
733
+ }
734
+ }
642
735
  if (input.rotation !== undefined) {
643
736
  const sampleCount = input.rotation
644
737
  .temporalSampleCount;
@@ -700,6 +793,9 @@ function validateReleaseAutomationState(value, path) {
700
793
  return value;
701
794
  }
702
795
  function validateProductionReleaseFrameBinding(binding, releaseFrameId, exposure, stochasticSeedUint32) {
796
+ requireRecord(binding, "releaseFrameBinding", ["releaseSequenceVersion", "sequenceId", "releaseFrameId", "frameIndex", "exposure",
797
+ "stochasticSeedUint32", "exposureStartTimeSeconds", "exposureEndTimeSeconds", "sceneTimeSecondsFromSequenceStart",
798
+ "startIntervalFromPreviousSeconds", "timingConstraints", "focus", "automation", "whiteBalanceStateId"]);
703
799
  if (binding.releaseSequenceVersion !==
704
800
  RELEASE_SEQUENCE_VERSION) {
705
801
  throw new InvalidConfigurationError('releaseFrameBinding.releaseSequenceVersion must be "' +
@@ -752,7 +848,7 @@ function validateProductionReleaseFrameBinding(binding, releaseFrameId, exposure
752
848
  timingConstraints.length) {
753
849
  throw new InvalidConfigurationError("releaseFrameBinding.timingConstraints must not contain duplicates.");
754
850
  }
755
- const automationRecord = requireRecord(binding.automation, "releaseFrameBinding.automation");
851
+ const automationRecord = requireRecord(binding.automation, "releaseFrameBinding.automation", ["ae", "af", "awb"]);
756
852
  const automation = {
757
853
  ae: validateReleaseAutomationState(automationRecord.ae, "releaseFrameBinding.automation.ae"),
758
854
  af: validateReleaseAutomationState(automationRecord.af, "releaseFrameBinding.automation.af"),
@@ -762,7 +858,7 @@ function validateProductionReleaseFrameBinding(binding, releaseFrameId, exposure
762
858
  undefined
763
859
  ? undefined
764
860
  : requireNonEmptyString(binding.whiteBalanceStateId, "releaseFrameBinding.whiteBalanceStateId");
765
- const exposureRecord = requireRecord(binding.exposure, "releaseFrameBinding.exposure");
861
+ const exposureRecord = requireRecord(binding.exposure, "releaseFrameBinding.exposure", ["aperture", "shutterSeconds", "iso"]);
766
862
  const parsedExposure = {
767
863
  aperture: requirePositiveFinite(exposureRecord.aperture, "releaseFrameBinding.exposure.aperture"),
768
864
  shutterSeconds: requirePositiveFinite(exposureRecord.shutterSeconds, "releaseFrameBinding.exposure.shutterSeconds"),
@@ -856,26 +952,30 @@ function validateCommittedWhiteBalanceState(state, binding) {
856
952
  return parsed;
857
953
  }
858
954
  /**
859
- * Commit resolved capture settings, scene time/identity, stochastic seed and optional
860
- * temporal/focus/WB state by value. Later application mutations cannot alter this scientific event.
955
+ * Records, by value, the resolved capture settings, the scene time and identity, the random seed,
956
+ * and optional timing, focus and white-balance state. Later changes in the application cannot alter
957
+ * this captured event.
861
958
  *
862
- * The planner owns scientific stage ordering, immutable capture identity and reproducibility.
863
- * Well-formed unsupported combinations produce structured blockers; malformed declarations throw. The
864
- * bounded environment route executes supplied radiance through native RAW and optional output, while
865
- * sample-only and attached-RAW routes retain missing upstream blockers. FNV fingerprints are
866
- * reproducibility keys, not cryptographic integrity proofs.
867
- * @param input - CreateProductionCaptureSnapshotInput. See the linked contract for coordinate, unit and profile binding semantics.
868
- * @returns ProductionCaptureSnapshot. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
959
+ * The planner decides the order of the scientific stages, fixes each capture's identity so it cannot
960
+ * change, and makes results reproducible. A well-formed but unsupported combination returns
961
+ * structured blockers. A malformed declaration throws. The bounded environment route runs the
962
+ * supplied radiance through native RAW and, optionally, output processing. The sample-only and
963
+ * attached-RAW routes keep blockers for the upstream stages they lack. FNV fingerprints are keys for
964
+ * reproducibility, not cryptographic proof of integrity.
965
+ * @param input - CreateProductionCaptureSnapshotInput. See that type for coordinates, units and profile binding.
966
+ * @returns ProductionCaptureSnapshot. The result states its shape and scientific status; a successful call does not imply calibration.
869
967
  *
870
968
  * @see docs/API_REFERENCE.md for the root export and exact type graph.
871
969
  */
872
970
  export function createProductionCaptureSnapshot(input) {
971
+ requireInputKeys(input, "createProductionCaptureSnapshot", ["captureId", "releaseFrameId", "sceneStateId", "sceneTimeSecondsFromExposureStart", "outputStateId", "exposure", "stochasticSeedUint32", "releaseFrameBinding", "whiteBalanceState", "physicalSceneSample", "temporalCapture", "version", "fingerprint"]);
873
972
  const sceneTime = requireFinite(input
874
973
  .sceneTimeSecondsFromExposureStart, "sceneTimeSecondsFromExposureStart");
875
974
  if (sceneTime < 0) {
876
975
  throw new InvalidConfigurationError("sceneTimeSecondsFromExposureStart must be greater than or equal to zero.");
877
976
  }
878
977
  const releaseFrameId = requireNonEmptyString(input.releaseFrameId, "releaseFrameId");
978
+ requireRecord(input.exposure, "exposure", null);
879
979
  const exposure = {
880
980
  aperture: requirePositiveFinite(input.exposure.aperture, "exposure.aperture"),
881
981
  shutterSeconds: requirePositiveFinite(input.exposure
@@ -942,13 +1042,15 @@ export function createProductionCaptureSnapshot(input) {
942
1042
  return deepFreeze(cloneJson(snapshot));
943
1043
  }
944
1044
  /**
945
- * Creates one immutable production snapshot directly from a committed #105
946
- * release frame. The release frame owns exposure/focus/automation/seed
947
- * identity; callers provide only the scene/output-local state that is not
948
- * owned by the release sequence.
1045
+ * Creates one immutable production snapshot directly from a committed release
1046
+ * frame (ResolvedReleaseFrame). The release frame supplies the exposure, focus,
1047
+ * automation and seed. The caller supplies only the scene and output state that
1048
+ * the release sequence does not.
949
1049
  */
950
1050
  export function createProductionCaptureSnapshotFromReleaseFrame(input) {
1051
+ requireInputKeys(input, "createProductionCaptureSnapshotFromReleaseFrame", ["captureId", "sceneStateId", "sceneTimeSecondsFromExposureStart", "outputStateId", "releaseFrame", "whiteBalanceState", "physicalSceneSample", "temporalCapture"]);
951
1052
  const frame = input.releaseFrame;
1053
+ requireInputObject(frame, "frame input");
952
1054
  const releaseFrameBinding = {
953
1055
  releaseSequenceVersion: RELEASE_SEQUENCE_VERSION,
954
1056
  sequenceId: requireNonEmptyString(frame.sequenceId, "releaseFrame.sequenceId"),
@@ -1009,27 +1111,29 @@ export function createProductionCaptureSnapshotFromReleaseFrame(input) {
1009
1111
  });
1010
1112
  }
1011
1113
  /**
1012
- * Validate an untrusted declaration and return the normalized typed contract. Unknown enum values,
1013
- * missing required fields and incompatible scientific data fail at this boundary.
1114
+ * Validates an untrusted declaration and returns the normalized typed contract. Unknown enum values,
1115
+ * missing required fields and incompatible scientific data are rejected here.
1014
1116
  *
1015
- * The planner owns scientific stage ordering, immutable capture identity and reproducibility.
1016
- * Well-formed unsupported combinations produce structured blockers; malformed declarations throw. The
1017
- * bounded environment route executes supplied radiance through native RAW and optional output, while
1018
- * sample-only and attached-RAW routes retain missing upstream blockers. FNV fingerprints are
1019
- * reproducibility keys, not cryptographic integrity proofs.
1020
- * @param value - unknown. Treated as untrusted data; static typing alone is not validation.
1021
- * @returns ProductionCaptureSnapshot. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
1117
+ * The planner decides the order of the scientific stages, fixes each capture's identity so it cannot
1118
+ * change, and makes results reproducible. A well-formed but unsupported combination returns
1119
+ * structured blockers. A malformed declaration throws. The bounded environment route runs the
1120
+ * supplied radiance through native RAW and, optionally, output processing. The sample-only and
1121
+ * attached-RAW routes keep blockers for the upstream stages they lack. FNV fingerprints are keys for
1122
+ * reproducibility, not cryptographic proof of integrity.
1123
+ * @param value - unknown. Untrusted input; TypeScript types alone are not validation.
1124
+ * @returns ProductionCaptureSnapshot. The result states its shape and scientific status; a successful call does not imply calibration.
1022
1125
  *
1023
1126
  * @see docs/API_REFERENCE.md for the root export and exact type graph.
1024
1127
  */
1025
1128
  export function parseProductionCaptureSnapshot(value) {
1026
- const record = requireRecord(value, "productionCaptureSnapshot");
1129
+ const record = requireRecord(value, "productionCaptureSnapshot", ["version", "captureId", "releaseFrameId", "sceneStateId", "sceneTimeSecondsFromExposureStart", "outputStateId", "exposure", "stochasticSeedUint32", "releaseFrameBinding", "whiteBalanceState", "physicalSceneSample", "temporalCapture", "fingerprint"]);
1027
1130
  if (record.version !==
1028
1131
  PRODUCTION_CAPTURE_SNAPSHOT_VERSION) {
1029
1132
  throw new InvalidConfigurationError('productionCaptureSnapshot.version must be "' +
1030
1133
  PRODUCTION_CAPTURE_SNAPSHOT_VERSION +
1031
1134
  '".');
1032
1135
  }
1136
+ requireRecord(record.exposure, "productionCaptureSnapshot.exposure", ["aperture", "shutterSeconds", "iso"]);
1033
1137
  const parsed = createProductionCaptureSnapshot({
1034
1138
  captureId: record.captureId,
1035
1139
  releaseFrameId: record.releaseFrameId,
@@ -1072,7 +1176,7 @@ export function parseProductionCaptureSnapshot(value) {
1072
1176
  .temporalCapture
1073
1177
  })
1074
1178
  });
1075
- const supplied = requireRecord(record.fingerprint, "productionCaptureSnapshot.fingerprint");
1179
+ const supplied = requireRecord(record.fingerprint, "productionCaptureSnapshot.fingerprint", ["algorithm", "value"]);
1076
1180
  if (supplied.algorithm !==
1077
1181
  "fnv1a-32-non-cryptographic" ||
1078
1182
  supplied.value !==
@@ -1082,10 +1186,11 @@ export function parseProductionCaptureSnapshot(value) {
1082
1186
  return parsed;
1083
1187
  }
1084
1188
  /**
1085
- * Expand the requested graph through hard upstream dependencies in the engine
1086
- * contract. Shared/coupled effects remain distinct from serialization order.
1087
- * Dependency presence is not execution: deriveStagePlan still assesses declared
1088
- * inputs, renderer capabilities and scientific support for every expanded stage.
1189
+ * Adds the hard upstream dependencies of each requested stage, as the engine
1190
+ * contract defines them. Shared or coupled effects stay separate from the
1191
+ * serialization order. Adding a dependency does not mean it runs: deriveStagePlan
1192
+ * still checks the declared inputs, renderer capabilities and scientific support
1193
+ * for every added stage.
1089
1194
  */
1090
1195
  function expandRequiredStages(fidelity) {
1091
1196
  const contract = getImageFormationContract();
@@ -1252,6 +1357,15 @@ function requestedEffectMap(fidelity) {
1252
1357
  effect
1253
1358
  ]));
1254
1359
  }
1360
+ /** True when a declared lens field mapping applies no distortion (absent, "none" or all-zero terms). */
1361
+ function lensDistortionIsZero(mapping) {
1362
+ const distortion = mapping?.distortion;
1363
+ if (distortion === undefined || distortion.kind === "none")
1364
+ return true;
1365
+ const coefficients = distortion.profile?.coefficients;
1366
+ return typeof coefficients === "object" && coefficients !== null &&
1367
+ Object.values(coefficients).every(value => value === 0);
1368
+ }
1255
1369
  function hasActiveUndeclaredFieldThroughput(prepared, snapshot) {
1256
1370
  const sample = snapshot.physicalSceneSample;
1257
1371
  if (sample === undefined ||
@@ -1395,7 +1509,10 @@ function computeTemporalResult(prepared, snapshot, requiredStages, blockers) {
1395
1509
  rotationQuadrature
1396
1510
  }),
1397
1511
  exposureTimeReference: "first-opening-boundary-phase",
1398
- readoutExposureSynchronization: "not-assumed",
1512
+ readoutExposureSynchronization: temporal.readoutExposureLinkage ===
1513
+ undefined
1514
+ ? "not-assumed"
1515
+ : "electronic-rolling-shutter-line-linked",
1399
1516
  sensorReadoutTimingRemainsSeparate: true,
1400
1517
  temporalRadianceIntegrated: false
1401
1518
  };
@@ -1491,6 +1608,30 @@ function deriveEffectPlan(prepared, snapshot, temporalResult, blockers, environm
1491
1608
  ]
1492
1609
  };
1493
1610
  }
1611
+ if (placement.id === "geometric-distortion") {
1612
+ // 2.0: lens distortion is applied only through an executed environment capture whose
1613
+ // sites declare a lens field mapping. The ray query applies the inverse map and area factor.
1614
+ const mapping = environmentCapture?.capture.sites[0]?.environment.lensFieldMapping;
1615
+ if (mapping === undefined) {
1616
+ const blocker = {
1617
+ code: "missing-lens-field-mapping",
1618
+ effectId: placement.id,
1619
+ message: "Geometric-distortion planning requires an executed environment capture with an explicit lens field mapping."
1620
+ };
1621
+ addBlocker(blockers, blocker);
1622
+ return {
1623
+ effectId: placement.id, primaryStage: placement.primaryStage, coupledStages: [...placement.coupledStages],
1624
+ state: "blocked", scientificStatus: "not-applicable", requiredByFidelity: true,
1625
+ modelId: request.modelId, modelVersion: request.modelVersion, blockerCodes: [blocker.code]
1626
+ };
1627
+ }
1628
+ return {
1629
+ effectId: placement.id, primaryStage: placement.primaryStage, coupledStages: [...placement.coupledStages],
1630
+ state: lensDistortionIsZero(mapping) ? "modeled-zero" : "active",
1631
+ scientificStatus: "approximation", requiredByFidelity: true,
1632
+ modelId: request.modelId, modelVersion: request.modelVersion, blockerCodes: []
1633
+ };
1634
+ }
1494
1635
  if (placement.id ===
1495
1636
  "illumination-vignetting") {
1496
1637
  const environmentField = environmentCapture?.capture.sites[0]?.environment.fieldThroughput;
@@ -1665,7 +1806,7 @@ function computePhysicalResult(prepared, snapshot, requiredStages, blockers) {
1665
1806
  addBlocker(blockers, {
1666
1807
  code: "missing-optical-bridge-profile",
1667
1808
  stageId: "lens-field-pupil-evaluation",
1668
- message: "Physical lens-throughput planning requires a prepared #110 optical bridge profile."
1809
+ message: "Physical lens-throughput planning requires a prepared scene-radiance-to-sensor-irradiance optical bridge profile."
1669
1810
  });
1670
1811
  return undefined;
1671
1812
  }
@@ -1779,7 +1920,7 @@ function deriveStagePlan(prepared, snapshot, requiredStages, physicalResult, tem
1779
1920
  return { stageId: stage.id, contractStatus: stage.status, state: supported ? "active" : "blocked",
1780
1921
  scientificStatus: supported ? "approximation" : "not-applicable", requiredByFidelity: true,
1781
1922
  requiredUpstreamStages: [...stage.requiredUpstreamStages], coupledStages: [...stage.coupledStages],
1782
- modelId: "processed-sensor-raw-sdr", modelVersion: "0.1.0",
1923
+ modelId: "processed-sensor-raw-sdr", modelVersion: PROCESSED_SENSOR_RAW_MODEL_VERSION,
1783
1924
  resultIdentity: processedResult.value.source.value.rawFrame.frameId,
1784
1925
  blockerCodes: supported ? [] : ["renderer-stage-unsupported"] };
1785
1926
  }
@@ -1886,7 +2027,7 @@ function deriveStagePlan(prepared, snapshot, requiredStages, physicalResult, tem
1886
2027
  const blocker = {
1887
2028
  code: "missing-physical-scene-sample",
1888
2029
  stageId: stage.id,
1889
- message: "Scene-radiance stage requires one immutable #85 request/result sample."
2030
+ message: "Scene-radiance stage requires one immutable scene-radiance provider request/result sample."
1890
2031
  };
1891
2032
  addBlocker(blockers, blocker);
1892
2033
  return {
@@ -2197,10 +2338,11 @@ function temporalAssuranceComponent(snapshot) {
2197
2338
  };
2198
2339
  }
2199
2340
  /**
2200
- * Compose evidence/status from actual child stages without averaging uncertainty
2201
- * or upgrading declared approximation to calibration. Requested blockers and
2202
- * executed lineage are part of assurance; a complete graph alone cannot establish
2203
- * physical accuracy or validate an external provider's numerical transport.
2341
+ * Builds the evidence and status from the child stages that actually ran. It
2342
+ * does not average uncertainty and never upgrades a declared approximation to
2343
+ * calibration. Requested blockers and executed lineage are part of the
2344
+ * assurance. A complete graph alone cannot show physical accuracy or validate
2345
+ * an external provider's numerical transport.
2204
2346
  */
2205
2347
  function composeProductionScientificAssurance(prepared, snapshot, physicalResult, temporalResult, processedResult, environmentResult) {
2206
2348
  const components = [];
@@ -2221,7 +2363,7 @@ function composeProductionScientificAssurance(prepared, snapshot, physicalResult
2221
2363
  }
2222
2364
  if (processedResult !== undefined) {
2223
2365
  components.push({ componentId: "processed-sensor-raw-sdr", role: "committed post-capture SDR development", required: true,
2224
- sourceIdentity: { kind: "model", id: "processed-sensor-raw-sdr", version: "0.1.0" }, basisKind: "photivra-model-assumption",
2366
+ sourceIdentity: { kind: "model", id: "processed-sensor-raw-sdr", version: PROCESSED_SENSOR_RAW_MODEL_VERSION }, basisKind: "photivra-model-assumption",
2225
2367
  scientificStatus: "approximation", evidenceRequirement: "required", evidence: processedResult.value.colorProfile.evidence,
2226
2368
  uncertainty: { kind: "not-quantified", limitation: "Reconstruction, color interpretation and optional correction uncertainty are not propagated into a combined output uncertainty." },
2227
2369
  limitations: [...processedResult.value.colorProfile.limitations,
@@ -2236,7 +2378,7 @@ function composeProductionScientificAssurance(prepared, snapshot, physicalResult
2236
2378
  components
2237
2379
  });
2238
2380
  }
2239
- /** Check immutable event ownership before source code or downstream pixel work. */
2381
+ /** Checks that the event is immutable and owned before any provider code or pixel work runs. */
2240
2382
  function validateProductionRawCapture(capture, snapshot, label = "Processed RAW") {
2241
2383
  if (capture.captureId !== snapshot.captureId || capture.sceneStateId !== snapshot.sceneStateId ||
2242
2384
  capture.sceneTimeSeconds !== snapshot.sceneTimeSecondsFromExposureStart || capture.noise.seedUint32 !== snapshot.stochasticSeedUint32 ||
@@ -2254,12 +2396,12 @@ function validateProductionRawCapture(capture, snapshot, label = "Processed RAW"
2254
2396
  throw new InvalidConfigurationError(label + " focus differs from the committed optical sample.");
2255
2397
  }
2256
2398
  }
2257
- /** Execute the committed post-capture boundary without blessing absent upstream stages. */
2399
+ /** Runs the committed post-capture step, without treating missing upstream stages as done. */
2258
2400
  function computeProcessedOutput(input, prepared, snapshot, required, blockers) {
2259
2401
  if (input === undefined)
2260
2402
  return undefined;
2261
2403
  try {
2262
- const declaration = requireRecord(input, "processedOutput");
2404
+ const declaration = requireRecord(input, "processedOutput", null);
2263
2405
  if (Object.keys(declaration).some(key => key !== "outputStateId" && key !== "processing"))
2264
2406
  throw new InvalidConfigurationError("Unknown processed output declaration fields.");
2265
2407
  if (!required.has("display-processing") || !prepared.renderer.sensorDomainProcessing)
@@ -2278,22 +2420,24 @@ function computeProcessedOutput(input, prepared, snapshot, required, blockers) {
2278
2420
  }
2279
2421
  }
2280
2422
  /**
2281
- * Commit the execution envelope before invoking supplied provider code. A failed
2282
- * preflight returns a structured blocker and never invokes that code. The existing
2283
- * environment producer owns all node budgets, response validity and seeded RAW.
2423
+ * Fixes the execution limits before any supplied provider code runs. If the
2424
+ * preflight check fails, a structured blocker is returned and the code is never
2425
+ * called. The existing environment producer handles all node budgets, response
2426
+ * checks and the seeded RAW.
2284
2427
  */
2285
2428
  /**
2286
- * Validate shared capture/context, renderer and supported-envelope commitments
2287
- * before any trusted provider callback runs. Snapshot owned scientific and output
2288
- * policy data first, then delegate to the one existing environment RAW producer.
2289
- * Callback failure propagates; a successful call proves invocation and data binding,
2290
- * not physical transport, visibility, calibration or a fallback renderer.
2429
+ * Validates the shared capture and context, the renderer and the supported range
2430
+ * before any trusted provider callback runs. Takes a snapshot of the scientific
2431
+ * and output policy data first, then hands off to the single existing
2432
+ * environment RAW producer. A callback failure is passed on. A successful call
2433
+ * shows only that the code ran and the data was bound. It does not show physical
2434
+ * transport, visibility or calibration, and there is no fallback renderer.
2291
2435
  */
2292
2436
  function computeEnvironmentCapture(input, externalOutput, prepared, snapshot, required, blockers) {
2293
2437
  if (input === undefined)
2294
2438
  return undefined;
2295
2439
  try {
2296
- const declaration = requireRecord(input, "environmentCapture");
2440
+ const declaration = requireRecord(input, "environmentCapture", null);
2297
2441
  if (Object.keys(declaration).some(key => key !== "capture" && key !== "processing")) {
2298
2442
  throw new InvalidConfigurationError("Unknown environment capture declaration fields.");
2299
2443
  }
@@ -2333,17 +2477,24 @@ function computeEnvironmentCapture(input, externalOutput, prepared, snapshot, re
2333
2477
  throw new InvalidConfigurationError("Environment geometry, scene, focal length and shutter schedule differ from the committed production context.");
2334
2478
  }
2335
2479
  const rendererTemporal = prepared.renderer.temporalSampling;
2480
+ // Frame-constant serializations are computed once, lazily at their first comparison, instead of once per site.
2481
+ let opticalBridgeCanonical, rotationVelocityCanonical;
2336
2482
  for (const site of owned.sites) {
2337
2483
  const e = site.environment;
2338
2484
  if (e.fieldThroughput.kind !== "unity" &&
2339
2485
  !prepared.fidelity.requiredEffects.some(effect => effect.effectId === "illumination-vignetting")) {
2340
2486
  throw new InvalidConfigurationError("Non-unity environment field throughput requires an explicitly requested illumination-vignetting effect.");
2341
2487
  }
2488
+ if (e.lensFieldMapping !== undefined && !lensDistortionIsZero(e.lensFieldMapping) &&
2489
+ !prepared.fidelity.requiredEffects.some(effect => effect.effectId === "geometric-distortion")) {
2490
+ throw new InvalidConfigurationError("Active environment lens distortion requires an explicitly requested geometric-distortion effect.");
2491
+ }
2342
2492
  if (e.sceneBindings.providerProfile.profileId !== prepared.sceneRadianceProviderProfileId ||
2343
- canonicalStringify(e.optics.profile) !== canonicalStringify(prepared.opticalBridgeProfile) ||
2493
+ canonicalStringify(e.optics.profile) !== (opticalBridgeCanonical ??= canonicalStringify(prepared.opticalBridgeProfile)) ||
2344
2494
  rendererTemporal.kind !== "bounded" || e.temporalSampleCount > rendererTemporal.maximumSamples ||
2345
2495
  (temporal.rotation === undefined && !angularVelocityIsZero(e.motion.angularVelocityRadPerSec)) ||
2346
- (temporal.rotation !== undefined && (canonicalStringify(e.motion.angularVelocityRadPerSec) !== canonicalStringify(temporal.rotation.angularVelocityRadPerSec) ||
2496
+ (temporal.rotation !== undefined && (canonicalStringify(e.motion.angularVelocityRadPerSec) !==
2497
+ (rotationVelocityCanonical ??= canonicalStringify(temporal.rotation.angularVelocityRadPerSec)) ||
2347
2498
  e.temporalSampleCount !== temporal.rotation.temporalSampleCount ||
2348
2499
  (capture.focus.kind === "finite" ? capture.focus.distanceM : undefined) !== temporal.rotation.focusDistanceM))) {
2349
2500
  throw new InvalidConfigurationError("Environment provider, optics, motion or temporal sampling differs from the committed production context.");
@@ -2360,22 +2511,24 @@ function computeEnvironmentCapture(input, externalOutput, prepared, snapshot, re
2360
2511
  }
2361
2512
  }
2362
2513
  /**
2363
- * Expand requested stages through the authoritative graph, validate shared commitments and capability
2364
- * limits, then execute only supported declared input routes. Return explicit
2365
- * active/zero/omitted/blocked dispositions and child evidence rather than silently skipping a
2366
- * requested effect.
2514
+ * Builds the production plan. Adds dependencies to the requested stages using the stage graph,
2515
+ * checks the shared state and capability limits, then runs only supported, declared input routes.
2516
+ * Each requested effect is reported as active, zero, omitted or blocked, with child evidence. A
2517
+ * requested effect is never skipped silently.
2367
2518
  *
2368
- * The planner owns scientific stage ordering, immutable capture identity and reproducibility.
2369
- * Well-formed unsupported combinations produce structured blockers; malformed declarations throw. The
2370
- * bounded environment route executes supplied radiance through native RAW and optional output, while
2371
- * sample-only and attached-RAW routes retain missing upstream blockers. FNV fingerprints are
2372
- * reproducibility keys, not cryptographic integrity proofs.
2373
- * @param input - CreateProductionImageFormationPlanInput. See the linked contract for coordinate, unit and profile binding semantics.
2374
- * @returns ProductionImageFormationPlan. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
2519
+ * The planner decides the order of the scientific stages, fixes each capture's identity so it cannot
2520
+ * change, and makes results reproducible. A well-formed but unsupported combination returns
2521
+ * structured blockers. A malformed declaration throws. The bounded environment route runs the
2522
+ * supplied radiance through native RAW and, optionally, output processing. The sample-only and
2523
+ * attached-RAW routes keep blockers for the upstream stages they lack. FNV fingerprints are keys for
2524
+ * reproducibility, not cryptographic proof of integrity.
2525
+ * @param input - CreateProductionImageFormationPlanInput. See that type for coordinates, units and profile binding.
2526
+ * @returns ProductionImageFormationPlan. The result states its shape and scientific status; a successful call does not imply calibration.
2375
2527
  *
2376
2528
  * @see docs/API_REFERENCE.md for the root export and exact type graph.
2377
2529
  */
2378
2530
  export function createProductionImageFormationPlan(input) {
2531
+ requireInputKeys(input, "createProductionImageFormationPlan", ["environmentCapture", "processedOutput", "preparedContext", "captureSnapshot"]);
2379
2532
  const prepared = parsePreparedImageFormationContext(input.preparedContext);
2380
2533
  const snapshot = parseProductionCaptureSnapshot(input.captureSnapshot);
2381
2534
  validateSnapshotAgainstContext(prepared, snapshot);
@@ -2386,13 +2539,14 @@ export function createProductionImageFormationPlan(input) {
2386
2539
  computePhysicalResult(prepared, snapshot, requiredStages, blockers);
2387
2540
  const temporalResult = computeTemporalResult(prepared, snapshot, requiredStages, blockers);
2388
2541
  let effectPlan = deriveEffectPlan(prepared, snapshot, temporalResult, blockers, input.environmentCapture);
2389
- // Snapshot post-capture policy before a provider can mutate caller-owned state.
2542
+ // Copy the post-capture policy before a provider can change the caller's objects.
2390
2543
  const environmentProcessing = input.environmentCapture?.processing === undefined ? undefined :
2391
2544
  structuredClone(input.environmentCapture.processing);
2392
2545
  const environmentExecution = computeEnvironmentCapture(input.environmentCapture, input.processedOutput, prepared, snapshot, requiredStages, blockers);
2393
2546
  const environmentCaptureResult = environmentExecution?.result;
2394
2547
  if (input.environmentCapture !== undefined && environmentCaptureResult === undefined) {
2395
- effectPlan = effectPlan.map(effect => effect.effectId === "illumination-vignetting" && effect.requiredByFidelity
2548
+ effectPlan = effectPlan.map(effect => (effect.effectId === "illumination-vignetting" ||
2549
+ (effect.effectId === "geometric-distortion" && effect.state !== "blocked")) && effect.requiredByFidelity
2396
2550
  ? { ...effect, state: "blocked", scientificStatus: "not-applicable",
2397
2551
  blockerCodes: ["environment-capture-evaluation-blocked"] } : effect);
2398
2552
  }