@photivra/engine 1.5.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 (1078) hide show
  1. package/CHANGELOG.md +393 -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 +116 -9
  56. package/dist/capture/native-raw-development.js +221 -62
  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 +65 -12
  62. package/dist/capture/native-raw.js +81 -19
  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 -8
  639. package/docs/api/capture-native-raw-dng.md +84 -0
  640. package/docs/api/capture-native-raw.md +21 -10
  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/DENSE_PUPIL_QUALIFICATION.md +0 -121
  975. package/docs/DEVELOPERS.md +0 -68
  976. package/docs/DIGITAL_OPTICS_FOUNDATION.md +0 -69
  977. package/docs/ENVIRONMENT_RAW_CAPTURE.md +0 -208
  978. package/docs/EXPORT_ACCEPTANCE.md +0 -133
  979. package/docs/GENERIC_TIER_PRESETS.md +0 -269
  980. package/docs/GEOMETRIC_PREPARATION_REUSE.md +0 -141
  981. package/docs/IMAGE_FORMATION.md +0 -247
  982. package/docs/LINEAR_CAPTURE_ENCODING.md +0 -25
  983. package/docs/MOTION_AND_SIGNAL.md +0 -250
  984. package/docs/NATIVE_CAPTURE_SDR.md +0 -70
  985. package/docs/NATIVE_CAPTURE_SDR_REVIEW.md +0 -37
  986. package/docs/NATIVE_CAPTURE_SDR_VALIDATION.md +0 -34
  987. package/docs/NATIVE_RAW_AND_PRINT.md +0 -54
  988. package/docs/NUMERICAL_CORRECTNESS.md +0 -191
  989. package/docs/PERFORMANCE_BASELINE.md +0 -56
  990. package/docs/PHOTOGRAPHIC_EXPORT.md +0 -206
  991. package/docs/PHYSICS_FOUNDATION.md +0 -426
  992. package/docs/POC_API.md +0 -278
  993. package/docs/POC_PROJECTION_PLATFORM_REFERENCE.md +0 -12
  994. package/docs/POC_PROJECTION_REUSE.md +0 -124
  995. package/docs/PRINT_195_196_REVIEW.md +0 -93
  996. package/docs/PRINT_196_ENGINE_ACCEPTANCE.md +0 -45
  997. package/docs/PRINT_CONTRAST_REFERENCE.md +0 -43
  998. package/docs/PRINT_DETAIL_ASSESSMENT.md +0 -81
  999. package/docs/PRINT_DETAIL_JPEG_EVIDENCE.md +0 -36
  1000. package/docs/PRINT_DETAIL_SDR_EVIDENCE.md +0 -29
  1001. package/docs/PRINT_DETAIL_VALIDATION.md +0 -36
  1002. package/docs/PRINT_PLANNING.md +0 -75
  1003. package/docs/PRINT_REGION_STATISTICS.md +0 -38
  1004. package/docs/PROCESSED_OUTPUT.md +0 -157
  1005. package/docs/PRODUCTION_COMPOSITION.md +0 -373
  1006. package/docs/PRODUCTION_ENVIRONMENT_CAPTURE.md +0 -131
  1007. package/docs/PROVENANCE.md +0 -115
  1008. package/docs/PSF_FOUNDATION.md +0 -165
  1009. package/docs/RAW_FRAME_ENVELOPE.md +0 -56
  1010. package/docs/RAW_FRAME_RECONSTRUCTION.md +0 -30
  1011. package/docs/RELEASE_1_0.md +0 -66
  1012. package/docs/RELEASE_1_0_1.md +0 -61
  1013. package/docs/RELEASE_1_1_0.md +0 -25
  1014. package/docs/RELEASE_1_2_0.md +0 -51
  1015. package/docs/RELEASE_1_3_0.md +0 -15
  1016. package/docs/RELEASE_1_4_0.md +0 -23
  1017. package/docs/RELEASE_1_5_0.md +0 -105
  1018. package/docs/RELEASE_AUDIT.md +0 -39
  1019. package/docs/SCENE_RADIANCE_AND_ILLUMINATION.md +0 -298
  1020. package/docs/SCENE_SENSOR_QUADRATURE.md +0 -98
  1021. package/docs/SCENE_SENSOR_TEMPORAL_EXPOSURE.md +0 -86
  1022. package/docs/SCIENTIFIC_ASSURANCE.md +0 -280
  1023. package/docs/SCIENTIFIC_CONFORMANCE.md +0 -83
  1024. package/docs/SDR_RENDERING.md +0 -33
  1025. package/docs/SENSOR_APERTURE_RAYS.md +0 -23
  1026. package/docs/SENSOR_ENVIRONMENT_QUERY.md +0 -86
  1027. package/docs/SENSOR_EQE_LOCAL_EXPOSURE.md +0 -104
  1028. package/docs/SENSOR_EQE_TEMPORAL_EXPOSURE.md +0 -74
  1029. package/docs/SENSOR_PSF_QUADRATURE.md +0 -90
  1030. package/docs/SENSOR_RAW_FRAME.md +0 -20
  1031. package/docs/SENSOR_RAW_PRODUCER.md +0 -77
  1032. package/docs/SEPARABLE_EMISSION_DRAFT.md +0 -103
  1033. package/docs/SIGNAL_CONFORMANCE.md +0 -23
  1034. package/docs/SIMULATED_CAPTURE.md +0 -65
  1035. package/docs/STABILIZATION.md +0 -234
  1036. package/docs/TEMPORAL_PHOTO_RAW.md +0 -83
  1037. package/docs/TIER_ACCEPTANCE.md +0 -129
  1038. package/docs/TIER_PRESET_ACCEPTANCE.md +0 -59
  1039. package/docs/V1_COMPOSITION_MAP.md +0 -123
  1040. package/docs/V1_HELPER_REUSE_REVIEW.md +0 -60
  1041. package/docs/V1_PERFORMANCE_DISPOSITION.md +0 -88
  1042. package/docs/benchmarks/2026-10-01-main-baseline.json +0 -694
  1043. package/docs/benchmarks/2026-10-02-geometric-preparation-reuse.json +0 -2190
  1044. package/docs/benchmarks/2026-10-02-poc-projection-reuse.json +0 -2423
  1045. package/docs/benchmarks/2026-10-02-v1-environment-gc-profile.json +0 -210
  1046. package/docs/benchmarks/2026-10-02-v1-environment-ordinary.json +0 -187
  1047. package/docs/benchmarks/2026-10-02-v1-geometry-gc-profile.json +0 -756
  1048. package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-1.json +0 -711
  1049. package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-2.json +0 -711
  1050. package/docs/benchmarks/2026-10-02-v1-poc-gc-profile.json +0 -885
  1051. package/docs/benchmarks/2026-10-02-v1-poc-ordinary-1.json +0 -868
  1052. package/docs/benchmarks/2026-10-02-v1-poc-ordinary-2.json +0 -868
  1053. package/docs/licenses/castleCSF-MIT.txt +0 -21
  1054. package/docs/validation/dense-pupil-2026-10-06/pilot.jsonl +0 -6
  1055. package/docs/validation/documentation-fragments.json +0 -212
  1056. package/docs/validation/native-capture-sdr-darwin-arm64-node26-review.jsonl +0 -4
  1057. package/docs/validation/native-capture-sdr-darwin-arm64.jsonl +0 -3
  1058. package/docs/validation/native-raw-print-2026-10-04/fractional-asymmetric-crop.jpg +0 -0
  1059. package/docs/validation/native-raw-print-2026-10-04/gray-ramp.jpg +0 -0
  1060. package/docs/validation/native-raw-print-2026-10-04/linear-area-checker.jpg +0 -0
  1061. package/docs/validation/native-raw-print-2026-10-04/manifest.json +0 -218
  1062. package/docs/validation/native-raw-print-2026-10-04/megapixel-native.jpg +0 -0
  1063. package/docs/validation/native-raw-print-2026-10-04/native-color.jpg +0 -0
  1064. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel-validation.json +0 -9
  1065. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json +0 -29
  1066. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.codes.u16le.gz +0 -0
  1067. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.jpg +0 -0
  1068. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.rgb.gz +0 -0
  1069. package/docs/validation/native-raw-print-2026-10-04/srgb.icc +0 -0
  1070. package/docs/validation/native-raw-print-2026-10-04/validation.json +0 -41
  1071. package/docs/validation/print-196-candidate-capabilities.json +0 -28
  1072. package/docs/validation/print-196-candidate-evidence.json +0 -356
  1073. package/docs/validation/print-196-engine-acceptance.json +0 -81
  1074. package/docs/validation/print-detail-capabilities.json +0 -103
  1075. package/docs/validation/print-detail-jpeg-evidence.json +0 -116
  1076. package/docs/validation/print-detail-sdr-evidence.json +0 -81
  1077. package/docs/validation/release-audit-inventory.json +0 -1306
  1078. package/docs/validation/tier-acceptance-report-v1.json +0 -2538
package/CHANGELOG.md CHANGED
@@ -1,6 +1,390 @@
1
1
  # Changelog
2
2
 
3
- ## 1.5.0 — release candidate
3
+ ## 2.0.0 — unreleased (prepared October 17, 2026)
4
+
5
+ A major release.
6
+
7
+ **In short.** 2.0.0 fixes correctness problems found in the first 2.0 review, makes several parts much faster without changing their output, and adds a large set of new features. Some of the fixes change numbers that 1.x produced, change stored identities (hashes and seeds), or reject input that 1.x accepted. Any of those can break existing users, so the version number goes from 1 to 2. Root exports grow from 1,227 to 1,668 symbols, and none is removed.
8
+
9
+ What it contains:
10
+
11
+ - the correctness fixes and bit-identical performance work of the first 2.0 review (#270–#288);
12
+ - the 2.0 feature streams (#290–#304): sensor gain and fixed-pattern noise, colorimetry, RAW development fixes, optics, rolling shutter and flash, export formats, image processing, the `simulateCapture()` facade (a single simple entry point), and an opt-in WebGPU backend;
13
+ - the completion work (#305–#323): the lean native RAW executor and further native RAW speed-ups, the `simulateCapture()` integration, the native RAW DNG writer, the agent guide, free-source citations, strict inputs everywhere, the licence cleanup, and the finished WebGPU backend;
14
+ - the licence guard (#324) and the final pre-release review fixes (#325–#328 and this record's update).
15
+
16
+ See [the 2.0.0 release record](https://github.com/Photivra/photivra/blob/main/docs/RELEASE_2_0_0.md) for the science evidence and the compatibility table.
17
+
18
+ ### Breaking changes
19
+
20
+ Each item ends with its *Migration* (what an existing user must do). Several items only add new values to a type union. Those break only code that switches over every value of that type (an exhaustive switch).
21
+
22
+ **Sensor and noise**
23
+
24
+ - **Noise model `photivra-native-raw-noise` 0.4.0, with independent per-site seeds (#270, #283, #290).**
25
+ - *Why:* the old seed schedule, `seed + 2i`, gave neighbouring pixels a lag-1 noise correlation of about 0.84, so their noise was not independent.
26
+ - *What changed:* per-site charge and read-noise seeds are now `MurmurHash3_x86_32(captureSeed, absoluteNativeIndex, streamId)` (seed schedule `murmur3-capture-seed-native-index-stream-v2`). `createRandom` scrambles its seed with the MurmurHash3 `fmix32` finalizer.
27
+ - *Effect:* every realized RAW code and every recorded seed changes, including direct `simulateSensorChargeRealization`/`simulateSensorRawCode` calls. Result model versions: charge realization **3.0.0**, stochastic RAW code **4.0.0**, expected readout **2.0.0**.
28
+ - *Migration:* results stay deterministic for a given seed at any tile width, but 1.x realizations cannot be reproduced. Captures, plans and replays that carry noise model 0.1.0–0.3.0 are rejected. Re-capture with 2.0.0, and keep old outputs as historical artifacts.
29
+ - **ISO now drives sensor gain; generic tier presets 2.0.0 (#290).**
30
+ - *What changed:* readout regimes `base`/`high` are replaced by one regime per ISO, `iso-<S>`, with 12-bit (consumer) or 14-bit ADCs (analog-to-digital converters). `presetVersion: "1.0.0"` is rejected. The producer rejects a regime whose `exposureIndexGain.exposureIndex` differs from `capture.exposure.iso`.
31
+ - *New required result fields:*
32
+ - `SensorChargeRealization` gains `fixedPatternNoiseProfileId`, `photoResponseGainFactor`, `darkCurrentFactor`, `hotPixel`, `photoSampledMeanElectronCount` and `darkSampledMeanElectronCount`.
33
+ - `SensorRawCodeSample` gains `fixedPatternNoiseProfileId`, `fixedPatternReadoutOffsetElectrons`, `adcIntegralNonLinearityOffsetCodes`, `adcCodeBeforeDigitalGain` and `digitalGain`.
34
+ - `SensorExpectedReadoutSignal` gains `adcIntegralNonLinearityOffsetCodes`, `digitalGain` and `expectedCodeAfterDigitalGain`. `expectedDigitalSaturation` now uses the code after digital gain.
35
+ - *Migration:* save selections and optical states with preset 2.0.0, and pick the `iso-<S>` regime that matches the capture ISO.
36
+ - **Capacity assessments are bound to their charge (#273, #280).**
37
+ - *What changed:* an assessment must match the charge it is applied to, by exact equality of `totalExpectedStoredElectronCount`, on both readout paths. The stochastic path reports `digitalSaturationApplied` once the code reaches (`>=`) the digital saturation code.
38
+ - *Migration:* compute the assessment from the same charge you pass.
39
+
40
+ **RAW development and DNG**
41
+
42
+ - **RAW development output changes (#295).**
43
+ - *What was wrong and is now fixed:* white balance was applied twice with camera matrices that were not white-normalized. Normalization now uses the effective white rather than digital full scale. Clipped highlights stay neutral, and saturation flags are honoured.
44
+ - *DNG output changes:* WhiteLevel, AsShotNeutral, BlackLevel/CFAPattern phase (now relative to the ActiveArea origin) and DNGVersion (now 1.4).
45
+ - *Effect:* `simulationHash` and file hashes change. `diagnostics.captureSaturation` can be `"consumed-in-raw-development"`.
46
+ - *Migration:* re-develop and re-export; update stored hashes.
47
+ - **New required RAW fields (#295).**
48
+ - `NativeRawOutput` requires `effectiveSaturationCodes` (one Uint16 per CFA phase).
49
+ - `SensorRawCaptureSample` requires `effectiveSaturationCode`, `systemConversionGainElectronsPerCode` and `readNoiseRmsElectrons`, each constant per CFA phase.
50
+ - *Migration:* hand-built RAW objects must supply them. `calculateEffectiveSaturationCode` computes the first.
51
+ - **`createNativeRawDevelopmentTask` takes ownership of `input.raw` (#295).**
52
+ - Its arrays are detached (zero-copy `ArrayBuffer.transfer`, or copied where that is unsupported) and returned in `output.raw`.
53
+ - RAW integrity errors (spans, flags, white levels) now surface from `run()`, not at creation.
54
+ - The provider is now `{ yieldControl, onProgress? }`. A bare function is deprecated but still accepted in 2.x.
55
+ - *Migration:* copy the RAW first if you still need it, and handle integrity errors from `run()`.
56
+
57
+ **Optics and geometry**
58
+
59
+ - **Exact thin-lens depth-of-field limits (#271, #279, #293).**
60
+ - *What changed:* `calculateDepthOfField` (and `simulatePocCamera().depthOfField`) now uses the exact thin-lens formulas: near = s(H − f)/(H + s − 2f) and far = s(H − f)/(H − s), with far infinite (`null`) when s ≥ H. (s = focus distance, H = hyperfocal distance, f = focal length.) Model `thin-lens-depth-of-field` 1.1.0.
61
+ - *Example:* for 50 mm at f/8, c 0.03 mm, s 5 m, the limits move from 3.394595/9.486405 m to 3.389371/9.527439 m.
62
+ - It now rejects `circleOfConfusionMm ≥ focalLengthMm/aperture`.
63
+ - `calculateDefocusCircle` uses a numerically stable closed form (model 1.1.0). Values change in the last bits, and more where cancellation used to occur.
64
+ - *Migration:* update stored expectations. There is no option for the old approximation.
65
+ - **Camera rotation sign on all three axes, and shake pitch sign (#276, #284).**
66
+ - *What was wrong:* 1.x produced the mirror image on every axis. Rotation mappings now follow the documented right-hand rule about camera +X/+Y/+Z.
67
+ - *Now:* positive yaw gives `deltaMm.x = +d·tan(yaw·t)`; positive pitch gives `deltaMm.y = −d·tan(pitch·t)`; positive roll rotates content counter-clockwise.
68
+ - *Effect:* everything built on the mappings changes with them: trajectories, temporal quadrature, rolling-shutter paths, aperture rays, environment radiance query and capture.
69
+ - `estimateCameraShakeBlur()` keeps its yaw sign, but its pitch `deltaYmm`/`deltaYPixels` flip sign. It rejects a per-axis rotation ≥ π/2 over the exposure.
70
+ - Rotation and stabilization provenance models go to 2.0.0.
71
+ - *Migration:* to reproduce 1.x mappings, negate all three angular-velocity components. To reproduce 1.x shake values, negate the pitch rate.
72
+ - **Complex-pupil PSF zero padding and support bound (#276, #284, #293).** (PSF = point-spread function, how the lens spreads a point of light.)
73
+ - *What changed:* `calculateLensComplexPupilPsf()` pads each axis to M = max(grid, 2S − 1). That is the exact condition for no wrap-around (Goodman sampling Q > 2).
74
+ - *Effect:* pupils whose support exceeds (grid + 1)/2 samples get a larger kernel with different values (a full 5×5 disk becomes 9×9).
75
+ - Support wider than `propagationDistanceMm / apertureFNumber` throws `InvalidScientificInputError`. `sampling.declaredPupilDiameterMm` reports that bound.
76
+ - Model 2.0.0; tier envelopes re-baselined.
77
+ - *Migration:* read kernel geometry from the returned kernel, and fix profiles whose support contradicts their f-number.
78
+ - **Crop rounding; crop models 2.0.0 (#276, #282, #293).**
79
+ - *What changed:* `calculateCenteredCrop` floors the shorter axis, and derives the longer one as round(short · L / S), capped at floor(L / cropFactor). A quotient within 4 ulps (units in the last place) of the next whole pixel counts as that pixel.
80
+ - *Effect:* the longer axis can be 1 px smaller than in 1.x (6000×4000 at 1.7× gives 3528×2352).
81
+ - `calculateSubjectFramingCrop` no longer reports a subject that fits as clipped.
82
+ - *Migration:* update stored crop dimensions.
83
+ - **35 mm crop factor (#293).**
84
+ - *What changed:* the crop factor is now √(1872/(w² + h²)), and the diagonal avoids `Math.hypot`. Some `cropFactor35Mm`, `diagonalMm` and `equivalentFocalLength35Mm` values change by 1 ulp.
85
+ - *Migration:* none for archives; stored focal equivalents are accepted within 8 ulps.
86
+ - **Type widenings (#296, #303).**
87
+ - `LensSampledPsfProfile.interpolation` is the union `LensSampledPsfInterpolation`.
88
+ - Front-of-lens filter `polarizationModeled` fields are `boolean`; filter `schemaVersion` is `"0.1.0" | "0.2.0"`; `compositionModel` gains a Stokes–Mueller value; results add `incidentPolarization`/`transmittedPolarization`.
89
+ - `PreparedGeometricMapping.schemaVersion` is `"0.1.0" | "0.2.0"`; the transform purpose union gains `"projection"`; `DigitalGeometricTransform` gains two variants.
90
+ - `SensorEnvironmentRadianceQuery.projection` can be `null` (only with a non-rectilinear mapping).
91
+ - `ProductionImageFormationBlockerCode` gains `missing-lens-field-mapping`.
92
+ - *Migration:* existing 0.1.0 profiles and documents work unchanged; update exhaustive switches.
93
+
94
+ **Exposure, motion and flash**
95
+
96
+ - **Flash, readout and metering unions (#297).**
97
+ - `FlashSyncCapabilityProfile.highSpeedSyncSupported` is `boolean`, with optional `highSpeedSync`. `schemaVersion` is `"0.1.0" | "0.2.0"`. 0.1.0 documents parse unchanged and cannot claim HSS (high-speed sync).
98
+ - `ProductionTemporalCaptureResult.readoutExposureSynchronization` adds `"electronic-rolling-shutter-line-linked"`.
99
+ - `CreateManualFlashIlluminationOverlayInput.resolvedSync` widens to `FlashOverlaySyncRegistration`.
100
+ - `ExposureMeteringPolicy` gains `highlight-priority`.
101
+ - Metering provenance `relative-pre-exposure-metering` is 1.1.0, with no change in value.
102
+ - *Migration:* update exhaustive switches; use a 0.2.0 sync profile for HSS.
103
+ - **White-balance source `"color-temperature"` (#291).**
104
+ - `ResolvedWhiteBalanceState.source` and `CaptureWhiteBalanceIntent.source` gain this value.
105
+ - The `adopted-white-xyz-scaling` variant of `CaptureColorWhiteBalance` gains an optional `transform`, which is rejected on other kinds.
106
+ - *Migration:* add a case to exhaustive switches; existing serialized states still parse.
107
+
108
+ **Serialization, validation and export**
109
+
110
+ - **Stricter input validation (#276, #282, #293).**
111
+ - Canonical JSON rejects non-plain objects (Map, Set, Date, typed arrays, class instances and similar) and array holes, instead of hashing them as `{}`. Output for plain JSON is byte-identical.
112
+ - Root functions throw `InvalidConfigurationError` for null, primitive, array or missing sub-object input. Every calculator rejects unknown fields (next item).
113
+ - `estimatedResult`/`calibratedResult` require `quality`, and result factories reject empty provenance identities.
114
+ - `calculateSensorResponsivityPhotocurrent` always validates `operatingElectricalConditions` and returns them parsed.
115
+ - `serializeProductionImageFormationPlan` rejects objects whose version or fingerprint does not match.
116
+ - *Migration:* pass plain JSON, remove extra fields, and give factories a quality and a provenance.
117
+ - **Every calculator rejects unknown input fields (#276).**
118
+ - *Why:* 1.x ignored an unknown field on 196 root functions, for example `calculateSignalToNoise()` and `calculateProjectedMotionBlur()`. A typo or a wrong unit suffix (`focusDistanceMm` for `focusDistanceM`) then fell back to a default without any error.
119
+ - *What changed:* every root function that takes an input object now throws `InvalidConfigurationError` for an unknown top-level field, most with the message `<name> input has unknown field "<field>".` `test/root-export-input-errors.test.ts` lists every root function. The record parsers follow in the next item.
120
+ - *Effect:* calls with extra fields now fail. `prepareImageFormationContext()` and `createProductionCaptureSnapshot()` still accept the `version` and `fingerprint` of a record they produced, and recompute both.
121
+ - *Migration:* remove extra fields, and fix misspelled or wrong-unit field names. To change an engine result and pass it back, copy only the documented input fields.
122
+ - **Every record parser rejects unknown fields, at every level (owner decision, 2026-10-17).**
123
+ - *Why:* the `parse*()` parsers and the functions that take a whole record silently dropped fields they did not know. A misspelled or stale field in a stored profile was lost without any error.
124
+ - *What changed:* every `parse*()` record parser, and the 13 record-taking functions (`assessMtfOnlyPsfRenderability`, `assessRadiometryReadiness`, `assessSceneMaterialResponseFidelity`, `calculateEffectiveSaturationCode`, `createRollingShutterCaptureExposureSchedule`, `createTtlScaledFlashProfile`, `integrateDiscreteSpectralLineMeasure`, `prepareColorMatchingFunctions`, `prepareColorimetricSpectrum`, `resolveAntiAliasingSpatialKernel`, `resolveSceneIlluminationDiscreteLineMeasure`, `serializeProductionImageFormationPlan`, `validateCalculationQuality`), throws `InvalidConfigurationError` for an unknown field at any object level. The message names the path and the field, for example `sceneIlluminationProfile.sources[0].magnitude has unknown field "wattsPerSteradian".` Parsers that already had their own message keep it and add `Unknown field "<field>".` Each accepted schema version, and each `kind` of a record, has its own allowed fields, so a field of another version or kind is rejected too. Records the engine writes still parse: fixed flags such as `sceneRadianceCalculated: false` are accepted with their fixed value only, and a resolved boundary schedule may keep its derived `unitVectorNative` if it matches. `calculateEffectiveSaturationCode` accepts a `SensorRawCodeSample` plus the regime's `integralNonLinearity`, and nothing else. Scientific output is unchanged.
125
+ - *Effect:* stored profiles and records with extra fields no longer parse. Old schema versions (for example filter 0.1.0, flash sync 0.1.0, sensor architecture 0.2.0) still parse when they hold only their own fields. Nested records passed to calculators are checked by the same parsers, so extra nested fields fail there too.
126
+ - *Migration:* remove unknown fields from stored profiles and records; the error names the field.
127
+ - **Read-only result envelopes (#276).**
128
+ - *Why:* a caller could change a result that another caller or a cache shared.
129
+ - *What changed:* every `CalculationResult` is frozen. The envelope, `provenance` (with `assumptions`) and `quality` are frozen all the way down; `value` is frozen at its top level. `CalculationResult` marks `value`, `provenance` and `quality` as `readonly`. Nested objects inside `value` and typed arrays stay mutable; domains that own their data (captures, RAW, export metadata, presets) already freeze it deeply.
130
+ - *Effect:* writing to a result throws a `TypeError` in strict-mode code (and fails silently in sloppy-mode scripts). The result factories also freeze the value, assumptions and quality objects you pass them. Every result costs a few `Object.freeze` calls (measured A/B against 28f8b61 on a shared 4-vCPU Xeon host, Node 24.21, medians of 3–5 alternating runs; indicative only):
131
+ - per-point mapping calls (`npm run bench:image-formation`): about 0.3–0.45 µs more per call, 1.2–1.9× slower; the batch mapping APIs 0.91–1.08× (within noise);
132
+ - `simulatePocCamera()` (`scripts/benchmark-composed-baseline.mjs`), which builds many internal results per request: 1.62–1.69× slower (11.9 → 19.6 µs per base request). Freezing only the envelope measured 1.15–1.28×; no freezing measured 0.97–1.20×;
133
+ - native environment RAW (`scripts/benchmark-v1-environment.mjs`): 0.84–1.08×, within noise, because its lean executor builds few envelopes;
134
+ - a generic deep freeze of `value` made a small scalar call about 3× slower and was not adopted. See `docs/API_STYLE.md` "Read-only results".
135
+ - *Migration:* copy a value before changing it (`{ ...result.value }` or `structuredClone(result.value)`). Use the batch mapping APIs in per-point loops.
136
+ - **Consistent error classes (#276).**
137
+ - *Why:* the same kind of mistake threw different classes in different modules. For example a non-object input threw `InvalidScientificInputError` in some calculators and `InvalidConfigurationError` in others, and a negative flash guide number threw `InvalidConfigurationError`.
138
+ - *What changed:* one rule (`docs/API_STYLE.md` "Error classes"). A wrong shape is an `InvalidConfigurationError`: a non-object or non-array, a missing sub-object, an unknown field, an unknown kind, mode, policy or version string, or a malformed identifier. A bad number in a calculation is an `InvalidScientificInputError`. Defects inside a versioned record or options object stay configuration errors. About 190 throw sites moved from `InvalidScientificInputError` to `InvalidConfigurationError`. The scalar flash (`calculateFlashGuideNumber`, `calculateFlashPowerForDistance`, `resolveTtlFlashExposure` numbers), shutter-angle and video (`calculateShutterAngleExposureSeconds`, `calculateShutterAngleFromExposureSeconds`, `assessShutterAngleRule`, `resolveVideoFrameSequence` numbers), `calculateHighlightPriorityPlacementSignal` and `calculatePhotonEnergyFromWavelength` wavelength checks moved the other way. Internal seed-derivation errors are `InvalidScientificInputError` instead of a plain `RangeError`. Messages and `code` fields are unchanged. `test/error-class-consistency.test.ts` scans the source for violations.
139
+ - *Effect:* `instanceof` checks and `code` comparisons on these errors can change. `InvalidScientificInputError` still extends `RangeError` and `InvalidConfigurationError` still extends `TypeError`.
140
+ - *Migration:* catch both domain classes, or branch on `error.code`: `INVALID_CONFIGURATION` means fix the shape or field names, `INVALID_SCIENTIFIC_INPUT` means fix the value.
141
+ - **Spectral channel binding format v2 (#276, #282, #293).**
142
+ - `SENSOR_SPECTRAL_RESPONSE_CHANNEL_BINDING_FORMAT` is `photivra-spectral-channel-response-canonical-json-v2` (sorted-key JSON of the parsed channel).
143
+ - v1 bindings from 1.5.0 and earlier are rejected with a version error.
144
+ - *Migration:* recompute the quadrature and reduction with 2.0.0.
145
+ - **Print JPEG schema 0.2.0 and baseline JPEG encoder v2 (#274, #278, #298).**
146
+ - Print JPEG output gains `encoderId`.
147
+ - IFD0 always carries XResolution/YResolution/ResolutionUnit (72 dpi when `pixelsPerInch` is omitted — the Exif 2.32 value for unknown resolution) and YCbCrPositioning.
148
+ - The Exif IFD adds ExifVersion `"0232"`, FlashpixVersion and ComponentsConfiguration. The paired-export JPEG gets the same tags.
149
+ - `EXPORT_JPEG_ENCODER_ID` is `photivra-baseline-jpeg-444-v2`: correctly rounded DCT cosines and half-away-from-zero quantization. Bytes differ from 1.x only where a coefficient sat within about one ulp of a half-integer, and are now identical across V8 and JavaScriptCore.
150
+ - `maximumProviderReads` now caps exactly ⌈crop height/32⌉ × ⌈crop width/256⌉ crop-aligned strip reads, and fails before the first read when the cap is too small.
151
+ - *Migration:* treat JFIF units = 0, or the absence of `pixelsPerInch` in the XMP plan, as "no physical size"; size the read budget by the new formula.
152
+ - **POC API 1.0.0 (#276, #282, #293).** (POC = the proof-of-concept `simulatePocCamera()` contract.)
153
+ - `POC_SIMULATION_API_VERSION` is **1.0.0**. `simulatePocCamera()` values change through depth of field, crop and shake pitch.
154
+ - The repository-only POC transport (not a package export) now returns: 400 for out-of-range aperture/focus and malformed JSON (fixed message); 413 `PAYLOAD_TOO_LARGE`; 422 `SIMULATION_RESULT_OUT_OF_RANGE` for non-finite results; 500 `INTERNAL_ERROR` with a fixed message; and a bodiless 204 preflight.
155
+ - *Migration:* handle 413, 422 and 500 as well as 400.
156
+ - **Package contents (#293).**
157
+ - The manifest has no `prepare` or other install scripts. Git installs need `npm ci && npm run build`; contributors run `npm run hooks:install`.
158
+ - No longer shipped: declaration maps; docs other than USAGE, API_REFERENCE, QUICK_START, AGENT_GUIDE (#313), `llms.txt` (#313), `api/` and examples; and the unreachable `browser-native-reference-*` and `schema/{camera,scene}.js` modules.
159
+ - *Migration:* read the other guides in the repository.
160
+
161
+ **Colorimetry: third-party coefficients removed (owner decision, 2026-10-17)**
162
+
163
+ - **Own CIE 1931 colour-matching-function fit replaces the Wyman et al. (2013) coefficients.**
164
+ - *Why:* the Wyman, Sloan & Shirley paper is CC BY-ND. The owner decided to remove third-party numbers with any licence question.
165
+ - *What changed:* `estimateCie1931ColorMatchingFunctions` uses coefficients the engine fitted itself to the CIE 1931 2° data (same kind of model: a sum of piecewise Gaussians). The CMF source kind `"wyman-2013-cie-1931-multi-lobe-fit"` is now `"analytic-cie-1931-multi-lobe-fit"`, and `WYMAN_2013_CMF_DOMAIN_NANOMETERS` is now `ANALYTIC_CIE_1931_CMF_DOMAIN_NANOMETERS` (still 360–830 nm). The provenance model is `cie-xyz-spectral-integration-analytic-cmf`, and `COLORIMETRY_MODEL_VERSION` is 2.0.0. The fit is still an approximation, slightly closer to the CIE data (maximum error 0.0122/0.00733/0.0221 for x̄/ȳ/z̄, was 0.0140/0.00800/0.0222; see `docs/COLORIMETRY.md`).
166
+ - *Effect:* colour outputs change slightly. Illuminant A integrates to xy (0.4480, 0.4074), was (0.4463, 0.4087). `simulateCapture()` RAW codes move by up to about 0.5 % (mean +1 to +5 codes), so its pinned output digests changed.
167
+ - *Migration:* replace the old kind and constant names. Re-render anything that must match 2.0.0 colour exactly.
168
+ - **Planckian locus computed from Planck's law; the Kim et al. (2002) spline is removed.**
169
+ - *Why:* the cubic-spline coefficients come from Kang et al. (2002), which is also claimed in a (lapsed) patent. The owner decided to remove them.
170
+ - *What changed:* the locus is the chromaticity of Planck's law integrated against the engine's analytic CMFs on 1 nm nodes, 1000–100000 K. The locus kind `"kim-2002-cubic-spline"` is now `"planck-analytic-cmf"`, the default of `resolveColorTemperatureWhiteBalance`. `KIM_2002_PLANCKIAN_LOCUS_RANGE_KELVIN` (1667–25000 K) is now `PLANCKIAN_LOCUS_RANGE_KELVIN` (1000–100000 K). `estimatePlanckianLocusChromaticity` keeps its name and uses the new locus. Resolved white-balance states record `planckianLocusModel: "planck-analytic-cmf"`, and states with `"kim-2002-cubic-spline"` are rejected.
171
+ - *Effect:* locus points move by up to 7.0e-4 in CIE 1960 uv from 2000 to 25000 K (1.4e-3 at 1667 K). The CCT of the daylight-locus point at 6504 K becomes 6516.6 K (was 6500.0 K), and Kelvin white-balance gains change by up to 0.5 %. A CCT/Duv search costs about 0.03 ms (0.02 ms with the spline; see Performance).
172
+ - *Migration:* replace `{ kind: "kim-2002-cubic-spline" }` with `{ kind: "planck-analytic-cmf" }` (or omit it for the default) and the range constant name. Re-resolve stored Kelvin/tint white-balance states. For a locus from tabulated CIE CMFs, use `{ kind: "planck-integration", colorMatchingFunctions, quadratureNodes }`.
173
+ - **CIE94: the `cie94-textiles` preset is removed; callers pass their own factors.**
174
+ - *Why:* the textiles weights trace only to secondary web pages, not to a free primary source. The primary, CIE 116-1995, is not free.
175
+ - *What changed:* the formulas `"cie94-graphic-arts"` and `"cie94-textiles"` are replaced by one formula, `"cie94"`. By default it uses the formula's published reference conditions (k_L = k_C = k_H = 1, K₁ = 0.045, K₂ = 0.015, the old graphic-arts values). A new option, `cie94Factors: { lightness, chroma, hue, k1, k2 }` (type `Cie94ParametricFactors`), sets all five factors. It is validated and rejects unknown fields.
176
+ - *Effect:* the old formula names are rejected. Default results equal the old `"cie94-graphic-arts"` results. The result's `formula` and method id are now `"cie94"` and `"color-difference-cie94"`.
177
+ - *Migration:* replace `"cie94-graphic-arts"` with `"cie94"`. For textiles or other conditions, pass the factors explicitly from a source you have checked: `{ formula: "cie94", cie94Factors: { lightness, chroma, hue, k1, k2 } }`.
178
+
179
+ ### Added
180
+
181
+ - **`simulateCapture()` (#300).** A full capture from a few options.
182
+ - Returns the image, packed RAW, the executed request and plan, provenance, and an `assumptions` list naming every default.
183
+ - Exposure modes: manual, aperture-priority, shutter-priority and program.
184
+ - White balance: by scene illuminant, auto, none, Kelvin/tint, or gains.
185
+ - Output: `srgb-8`, `srgb-16` or `jpeg`.
186
+ - Procedural chart presets (uniform, slanted edge, Siemens star, step wedge, grey ramp, checkerboard, point grid, caller-spectrum patches) with `resolveChartScene` and helpers.
187
+ - `SIMULATE_CAPTURE_FACADE_VERSION` 1.0.0; `docs/QUICK_START.md` (shipped) and `docs/examples/simulate-capture.mjs`.
188
+ - **`simulateCapture()` uses the 2.0 features (#306, #307).** All opt-in. Without the new options, the 1.0 facade output is byte-identical at the same illuminance (the default illuminance changed; see *Free-source citations* below), apart from the colour-matching-function change under *Breaking changes*. Every choice is listed in `assumptions`.
189
+ - `output.format: "png"` with `colorEncoding` `srgb`, `display-p3` or `rec2020`. The unclipped linear development is converted through CIE XYZ, clipped once in the target gamut, and signalled with cICP. The `rec2100-pq` and `rec2100-hlg` encodings prepared for 2.0 were removed before release: pQ and HLG (ITU-R BT.2100) are not shipped in 2.0 because their patent holders offer only licence-on-request declarations (owner decision, 2026-10-17; see the patent review in `THIRD_PARTY.md`).
190
+ - Optional `gamutMapping: "perceptual"` (constant CIELAB L* and hue).
191
+ - `output.format: "dng"`.
192
+ - `output.demosaic` (`bilinear`) and `borderHandling` (`margin`, `mirror`).
193
+ - `lens.projection`, `lens.distortion` (radial or Brown–Conrady), `lens.vignetting` and `lens.psf`.
194
+ - `motion.angularVelocityRadPerSec` and `motion.shutter: "rolling"`.
195
+ - **Native RAW DNG (#307).** `serializeNativeRawDng()` writes a lossless 16-bit CFA (colour filter array) DNG directly from packed native RAW.
196
+ - Tags: per-phase BlackLevel and CFAPattern from the ActiveArea origin; WhiteLevel from the effective saturation code; ActiveArea, DefaultCrop, Orientation, ColorMatrix1, ForwardMatrix1, AsShotNeutral, BaselineExposure and an optional NoiseProfile.
197
+ - It declares no linear master, and counts the saturation flags DNG cannot carry.
198
+ - `NATIVE_RAW_DNG_SCHEMA_VERSION` 1.0.0.
199
+ - **Colorimetry (#291).**
200
+ - Analytic CIE 1931 colour-matching functions (the engine's own fit, labelled approximation) or caller-tabulated CMFs; `integrateSpectrumToXyz`.
201
+ - Planck radiance, illuminant A, CIE daylight with caller-supplied basis spectra, the Planckian locus from Planck's law, McCamy CCT, and nearest-locus CCT/Duv with its inverse. (CCT = correlated colour temperature.)
202
+ - Chromatic adaptation: Bradford, CAT16 and XYZ scaling, with a caller-supplied degree of adaptation. CAT02, the von Kries Hunt–Pointer–Estévez transform and a CIECAM02 degree-of-adaptation helper are not part of 2.0: no free source we could confirm prints the CAT02 or HPE matrix or the CIECAM02 formula for D (owner decisions, 2026-10-17). The `"cat02"` and `"von-kries-hpe"` transforms and `calculateDegreeOfAdaptation` prepared for 2.0 never ship, in `calculateChromaticAdaptationMatrix` or in `calculateCaptureColorTransform`. CAT16 has a free source, IS&T CIC24 2016 Eq. (15).
203
+ - CIELAB/LCh, and ΔE76, CIE94 and CIEDE2000.
204
+ - `estimateCameraColorMatrix`.
205
+ - RGB colour spaces (sRGB, Rec.709, Display P3, Rec.2020) and sRGB, BT.709 and BT.1886 transfers; gamut mapping. PQ and HLG (ITU-R BT.2100) are not shipped in 2.0 because their patent holders offer only licence-on-request declarations (owner decision, 2026-10-17; see the patent review in `THIRD_PARTY.md`). The PQ/HLG functions and constants prepared for 2.0 (`evaluatePqEotf`, `evaluatePqInverseEotf`, `PQ_CONSTANTS`, `evaluateHlgOetf`, `evaluateHlgInverseOetf`, `HLG_CONSTANTS`, `calculateHlgSystemGamma`, `prepareHlgReferenceDisplay`, `HlgReferenceDisplay`) never ship. `resolveRgbColorSpace("rec2020").sources` lists only ITU-R BT.2020-2.
206
+ - `resolveColorTemperatureWhiteBalance` turns Kelvin + tint into channel gains. `calculateCaptureColorTransform` takes an optional adaptation `transform`.
207
+ - **Sensor (#290).**
208
+ - `createIsoGainReadoutRegimes()`: ISO-dependent analog and digital gain, with read noise per conversion gain.
209
+ - Regime fields `adc.digitalGain`, `adc.integralNonLinearity` and `exposureIndexGain`.
210
+ - Opt-in fixed-pattern noise (`parseSensorFixedPatternNoiseProfile`, `calculateSensorFixedPatternSite`, `SENSOR_FIXED_PATTERN_NOISE_MODEL`).
211
+ - A `log-linear-temperature-table` dark-current model.
212
+ - Tier `rollingReadoutTiming` and `fixedPatternNoise` assets.
213
+ - **RAW development (#295).**
214
+ - `highlightMode` (`clip` or `reconstruct`) with diagnostics.
215
+ - Tone curves `extended-reinhard-luminance` and `naka-rushton-luminance`.
216
+ - `calculateEffectiveSaturationCode`.
217
+ - DNG ForwardMatrix1, BaselineExposure, NoiseProfile and AnalogBalance.
218
+ - Progress reporting on development and native SDR.
219
+ - `createPhotographicExportPair(input, { signal })`.
220
+ - **Optics (#296, #303).**
221
+ - Fisheye and equirectangular projections (`calculateLensProjection*`, and an optional `projectionModel` on field of view).
222
+ - Brown–Conrady distortion and its inverse.
223
+ - Longitudinal chromatic aberration and Cauchy dispersion.
224
+ - Natural and mechanical vignetting.
225
+ - Polygon-pupil Fraunhofer PSF.
226
+ - Zernike/Seidel wavefronts and the Maréchal Strehl ratio.
227
+ - Centroid-aligned and rotational PSF interpolation.
228
+ - A linear polarizer (filter schema 0.2.0).
229
+ - Atmospheric haze.
230
+ - Focus breathing.
231
+ - Geometric mappings gain `brown-conrady` and `projection-remap` transforms (mapping schema 0.2.0). Environment capture accepts an optional `lensFieldMapping`, which the production plan composes.
232
+ - **Motion, video and flash (#297).**
233
+ - Electronic rolling-shutter exposure schedules, so skew, partial exposure and flicker banding emerge in image formation.
234
+ - Video frame sequences and shutter-angle helpers.
235
+ - Flash guide number, pre-flash TTL (through-the-lens metering) and high-speed sync (sync schema 0.2.0).
236
+ - The `highlight-priority` metering policy.
237
+ - **Export formats (#298).**
238
+ - `parseDngRawImage`: a bounded DNG/TIFF-EP reader (uncompressed and lossless JPEG, 8–16 bit), with `DNG_IMPORT_SCHEMA_VERSION` 1.0.0 and `DNG_IMPORT_LIMITS`.
239
+ - `parseLosslessJpeg` (ITU-T T.81 Annex H).
240
+ - `serializePngImage`: 8/16-bit RGB PNG with sRGB, iCCP or cICP for Display P3 and BT.2020 (sRGB, BT.709 or linear transfer); mDCV/cLLI metadata; deterministic in-house zlib. No PQ or HLG code points.
241
+ - `EXPORT_JPEG_ENCODER_ID`.
242
+ - AVIF and HEIC are not provided.
243
+ - **Processing (#302).** All opt-in. See `docs/PROCESSING.md`.
244
+ - Bilinear Bayer demosaic profiles, AHD demosaicing and CFA-plane reconstruction. The Malvar–He–Cutler kernels prepared for 2.0 were removed before release (owner decision, 2026-10-17): Microsoft's US 7,502,505 is in force until about January 25, 2027, and its claim 1 closely matches the method. The `malvar-he-cutler-2004` kernel and the `simulateCapture()` option `output.demosaic: "malvar-he-cutler"` never ship. They may return after the patent expires (about 25 Jan 2027). Bilinear (the default) and AHD are unchanged, and the hash-lock tests confirm the default output is unchanged. See the patent review in `THIRD_PARTY.md`.
245
+ - `borderHandling: "mirror"` for RAW development.
246
+ - Noise-optimal HDR bracket merge, and conversion to float32 linear BT.2020 (`createHdrImageEncodingTask`, `transfer: "linear-float32"` only). Its PQ/HLG modes and their integer-code options were removed before release; the SDR outputs are unchanged, as the hash-lock tests confirm.
247
+ - Reinhard and Durand–Dorsey tone mapping, exposure fusion, focus stacking and known-rotation panoramas.
248
+ - Bilateral and non-local-means denoise, unsharp mask, and an explicitly synthetic film grain.
249
+ - A shared `ProcessingTask` contract.
250
+ - **Opt-in WebGPU backend (#304).** See `docs/WEBGPU.md`.
251
+ - `createImageKernelAccelerator()` runs isoplanatic PSF convolution, native capture SDR and packed RAW development as `webgpu-f32`.
252
+ - Results are labelled with a float32 error bound stated in advance, and are never claimed to be bit-identical. The CPU float64 reference stays the default.
253
+ - Also `calculateIrradianceConvolution()` and its plan (schema 0.1.0), `ImageKernelExecutionError`, and the repository-only `npm run test:webgpu`.
254
+ - **WebGPU image-formation stages and accuracy contract (#277).** See `docs/WEBGPU.md`.
255
+ - **Accuracy contract:** per-stage a-priori bounds, kept separate from method error, and `composeRelativeErrorBounds()` for chaining linear stages.
256
+ - **Sensor stage:** `simulatePackedSensorRaw()` (schema 0.1.0) is the per-site producer's charge, noise and ADC on typed arrays. It is bit-identical to `calculateNativeRawSite`. `accelerator.simulateSensorRaw()` runs it on `webgpu-f32` with the same seeded noise model (`photivra-native-raw-noise` 0.4.0, MurmurHash3 per-site seeds). The new `exact-except-flagged-sites` label means every unflagged site equals the reference exactly. Flagged sites are listed in `flaggedSiteIndices` and covered by a statistical-equivalence test.
257
+ - **Sensor stage, fixed-pattern noise and extra charge:** `PackedSensorRawInput` takes an optional `fixedPatternNoise` (a `SensorFixedPatternNoiseProfile` and its colour-site origin) and up to 8 `additionalChargeComponents` (Poisson or deterministic). The reference stays bit-identical to the per-site engine functions with both (tested), and `webgpu-f32` keeps the `exact-except-flagged-sites` guarantee (0 differing sites on SwiftShader).
258
+ - **Luminance tone curves on the GPU:** `renderNativeCaptureSdr` and `developNativeRaw` on `webgpu-f32` now run `extended-reinhard-luminance` and `naka-rushton-luminance` (exponent ≥ 1) instead of rejecting them. Their code bound is a running bound: a fixed per-sample formula evaluated from the kernel's own values, and the run's largest value is reported. On SwiftShader every code was within 1 of the reference.
259
+ - **Kernels from lens PSFs:** `resolveLensPsfConvolutionKernels()` (schema 0.1.0) resolves a `LensSampledPsfProfile` at each patch centre with `resolveLensSampledPsf` and maps its taps onto site displacements with the per-site quadrature's own inverse support. Equal pitches give exact site sampling; other pitches use bilinear splatting, a labelled approximation that is the adjoint of bilinear interpolation (tested). Several wavelengths give a weighted spectral kernel.
260
+ - **Scene radiance on the GPU:** `calculateChartRadianceBatch()` (schema 0.1.0) answers many radiance or spectral-integral queries on the engine's chart presets, using the planar provider's own `radianceAt`. `accelerator.evaluateChartRadiance()` runs it on `webgpu-f32`: the GPU classifies materials with a-priori bounds, flagged points are recomputed on the host, and every value is the reference rounded once to float32 (relative 2^-24; 0 misclassified points on SwiftShader). `mapEnvironmentDirectionsToChartPoints()` converts environment-direction queries.
261
+ - **Per-fixture rollout:** for every built-in chart preset, the GPU image-formation path's method error against the per-site engine is measured on sampled tiles and pinned in tests (`docs/WEBGPU.md`, "Per-fixture rollout"). With a synthetic, strongly field-varying PSF and 8-site patches it is 1.2–2.5 % of the tile peak, and larger at sub-site detail (16.8 % at a point-grid disk edge with 2 µm PSF samples; 24.9 % at the Siemens-star centre, where both paths alias). These are accuracy numbers, not speed.
262
+ - **Exposure and motion:** `calculateTemporalExposureSum()` (schema 0.1.0) is a weighted sum of shifted frames with per-row weights, for rolling or global readout. Sub-site shifts use bilinear interpolation, a labelled approximation. `accelerator.sumTemporalExposure()` runs it on `webgpu-f32` with a relative bound.
263
+ - **Timings:** the repository-only `npm run bench:webgpu` times the stages at 6–24 MP on the owner's hardware. No hardware timings have been measured yet.
264
+ - **Optical-stage reuse (#288).** `NativeEnvironmentRawInput.opticalStage` returns an opaque optical stage. `createNativeEnvironmentSensorStageTask()` then re-runs only dark charge, capacity, noise and ADC after edits that come after the optics. Optical changes are refused.
265
+ - **Opt-in parallel native environment RAW (#275).** `calculateNativeRawRowBands()` splits a capture into row bands, `createNativeEnvironmentRawPartitionTask()` runs one band (for example in a Web Worker or Node worker thread, with the caller's own provider), and `composeNativeEnvironmentRawPartitions()` joins the posted partitions. The merged output is byte-identical to `createNativeEnvironmentRawTask()` for the same input (`test/native-environment-partitions.test.ts`). No worker code is bundled. Measured with `scripts/benchmark-native-environment-workers.mjs` on a shared 4-vCPU host, 48×48 sampled PSF: 1.53 s on one thread, 0.66 s with 4 workers (2.3×); cheap default-optics sites gain much less.
266
+ - **Batched light sampling (#275).** Optional `NativeEnvironmentRawProvider.evaluateRadianceBatch(queries, signal)` receives every radiance query of a tile (`NativeEnvironmentRadianceQuery`, in per-query callback order) and returns the results in order, synchronously or as a promise. Results are validated like per-query results, so the output is identical for the same results (`test/native-environment-batch.test.ts`). It is meant for GPU, WebAssembly or cross-thread providers; with a JavaScript provider on the CPU it is about as fast as per-query callbacks (48×48: default 0.29 → 0.27 s, 4 pupil rays 2.11 → 2.43 s).
267
+ - **Smaller additions.**
268
+ - `PrintJpegInput.pixelsPerInch` (1–65535; #278).
269
+ - The `LensComplexPupilPsf.sampling` field (#284).
270
+ - `SENSOR_SPECTRAL_RESPONSE_CHANNEL_BINDING_FORMAT` (#293).
271
+ - A `"default"` export condition so Node ≥ 22.12 can `require()` the package; the `./package.json` export; JS source maps with inline sources; and declarations that type-check with `lib: ["es2022"]` alone (#293).
272
+
273
+ ### Free-source citations (owner decisions)
274
+
275
+ The engine now relies on free-to-read sources wherever one was found. See the citation audit in the 2.0.0 release record.
276
+
277
+ - **Numeric change: `simulateCapture()` exposure anchor.**
278
+ - *What changed:* the anchor no longer uses the reflected-light meter constant K = 12.5 cd·s/m² of a paid standard. It uses CIPA DC-004-2020 (free): standard output sensitivity S = 10/H and the camera equation H = 0.65·L·t/N², with an 18 % grey as the reference. This is equivalent to K = 10/0.65 ≈ 15.38 cd·s/m².
279
+ - *Effect:* `SIMULATE_CAPTURE_DEFAULT_ILLUMINANCE_LUX` changes from π·12.5·64·125/18 ≈ 17 453.29 lux to π·10·64·125/(0.65·100·0.18) = π·80 000/11.7 ≈ 21 480.98 lux, a factor of 10/(0.65·12.5) ≈ 1.231 (about 0.30 EV). The metered reference luminance for f/8, 1/125 s, ISO 100 changes from 1000 cd/m² to 80 000/65 ≈ 1230.77 cd/m², so `exposure.meteredSceneLuminanceCdPerSquareMeter` of the default grey card changes by the same factor. Default captures are brighter: the green RAW level of the 18 % grey card goes from about 10.6 % to about 13.1 % of RAW white. Auto-exposure modes resolve N²/t = 0.65·L·S/10 instead of L·S/12.5. The `illuminanceLux` and `exposure.referenceExposure` assumption texts change.
280
+ - *Unchanged:* with `illuminanceLux` set to the old default, every 1.0 facade output (samples, RAW codes, JPEG, request, scene digest) is byte-identical; a test checks that, and pins the new default digests.
281
+ - *Migration:* pass `illuminanceLux: Math.PI * 12.5 * 64 * 125 / 18` to reproduce earlier captures.
282
+ - **Text-only output change: runtime strings.** No number changes.
283
+ - Provenance and assumption strings that named paid standards now name free sources: RGB colour-space `sources` (`srgb`: "W3C CSS Color Module Level 4 srgb"; `display-p3`: "W3C CSS Color Module Level 4 display-p3 (…)", "ITU-T H.273 ColourPrimaries 12"), the matrix-derivation assumption of `resolveRgbColorSpace`, the CIELAB assumptions, the daylight-locus assumption, the CCT Duv-sign assumption (now the engine's own convention), the HDR encoding assumptions (ITU-R BT.2100 PQ; BT.2020 matrices), the facade's PNG colour-encoding texts, and the illuminant A scene description.
284
+ - The `calculateCorrelatedColorTemperature` error for |Duv| > 0.05 is reworded.
285
+ - Limitation and error strings that used internal ticket numbers as model names (#12, #14, #85, #110) now name the model: exposure-window model, sensor pipeline, scene-radiance provider, and the scene-radiance-to-sensor-irradiance optical bridge (stabilization, extended-object projection, flash, temporal metering, RAW frame and production image-formation plan).
286
+ - *Migration:* code that matches these strings exactly must update them. Result model ids are unchanged.
287
+ - **Documentation and tests.** The flash guide-number relations are derived in full from the inverse-square law and the camera equation (the guide-number measurement standard is no longer cited). Tristimulus integration cites Wyman, Sloan & Shirley (2013), Eq. 1; Planck's law cites the BIPM kelvin *mise en pratique*. CIE94 cites a free secondary source and is checked by closed-form cases computed in the test. The RGB↔XYZ derivation is written out in `docs/COLORIMETRY.md`, and a new test shows the engine's matrices equal the W3C CSS Color 4 matrices within 1e-12. The Duv sign (positive above the Planckian locus) cites Ohno's free CORM 2011 slides (slide 5); the engine documents it, and a new test checks that a greenish light has a positive Duv. The ISO-brightness test uses the DC-004 mid-grey reference (0.18 of white) instead of a paid saturation-speed ratio.
288
+ - **Documentation: CAT16 matrix source (owner decision, 2026-10-17).** The CAT16 cone matrix now cites the free IS&T paper of Li et al. (2016), "A Revision of CIECAM02 and its CAT and UCS", CIC24, Eq. (15), doi:10.2352/ISSN.2169-2629.2017.32.208; its nine coefficients were checked against the engine. That paper does not print the CAT02 matrix, so CAT02 keeps its earlier sources. The patent review in `THIRD_PARTY.md` records that no patent was found claiming either matrix. Comments and docs only.
289
+
290
+ ### Fixed
291
+
292
+ - Captures, packed RAW and export hashes (`simulationHash`, DNG/JPEG SHA-256) are now identical across the V8 and JavaScriptCore JavaScript engines. The POC hash corpus passes on every engine without overrides (#293).
293
+ - ISO now changes RAW and developed brightness. Base-ISO white sits at ADC full scale, instead of code 20512 of 65535 (#290).
294
+ - ADC round-half-up is exact (0.49999999999999994 rounds to 0). Poisson draws for means ≥ 1e9 have the correct variance (#290).
295
+ - RAW development (#295) fixes:
296
+ - double white balance;
297
+ - AsShotNeutral written as the camera white squared;
298
+ - coloured clipped highlights;
299
+ - ignored saturation flags;
300
+ - WhiteLevel written as the ADC maximum;
301
+ - BlackLevel and CFA phase taken from the absolute origin instead of the ActiveArea;
302
+ - an unclear error when Web Crypto is missing.
303
+ - Print and paired-export JPEG Exif carry every tag that Exif 2.32 makes mandatory for compressed images (#278, #298).
304
+ - `Math.floor(x + 0.5)` rounding is replaced by exact rounding in SDR rendering, linear encoding and Print JPEG sRGB codes (#295, #298).
305
+ - Auto ISO with Shutter or Aperture Priority picks a grid value equal to the ideal within `settingEquals` tolerance. Grid end points within tolerance are no longer reported as clamped (#272, #281).
306
+ - Valid exit-pupil declarations are no longer rejected, and packaged docs no longer link to unshipped files (#293).
307
+ - The illumination-vignetting solver for interior extremes uses a stable scaled quadratic (#296).
308
+ - `resolveLensSampledPsf` no longer rejects an interpolated pupil throughput that floating-point weights lift a few ulps above 1 (#307).
309
+ - `simulateCapture()` validates pupil sampling (4–64 angular samples, at most 256 rays) before doing any work (#306).
310
+ - Colour, haze, projection and PNG inputs reject unknown fields in nested records too, as the 2.0.0 strict-records rule requires: XYZ and white points (`x`, `y`, `z` only), xy chromaticities (`x`, `y` only), CIELAB/LCh colours, CIEDE2000 `parametricFactors` (now as strict as `cie94Factors`), each Planckian `locus` kind, `wavelengthRangeNanometers`, the `createCieDaylightSpectrum` basis, RGB `primaries`, the haze `extinction` model, lens-projection `direction` and `imagePointMm`, and the PNG `colourEncoding`, `masteringDisplay` and `contentLightLevel`. Before, a typo such as `extinction.rayleighExponet` silently fell back to the default Rayleigh exponent 4. *Migration:* remove extra fields; a luminance `Y` beside an xy chromaticity is no longer accepted.
311
+ - `calculateChromaticityFromCorrelatedColorTemperature` (and so `resolveColorTemperatureWhiteBalance`) throws `InvalidScientificInputError` when CCT + Duv lands outside x ≥ 0, y > 0, x + y ≤ 1. 2000 K with Duv +0.02 used to return x + y = 1.0595, a chromaticity the engine itself rejects as input, and a Kelvin white-balance state built on it.
312
+ - `serializePngImage` no longer accepts `Object.prototype` names as code points: `primaries: "constructor"`, `transfer: "toString"` or `renderingIntent: "toString"` wrote reserved cICP or sRGB bytes. The lookups are now maps, and unknown `colourEncoding` fields are rejected.
313
+ - `createHdrBracketMergeTask` never returns NaN or Infinity. Exposure times below 1 ns are rejected (at 10⁻¹⁷⁰ s, t² underflowed and the weights became 0/0; see `docs/PROCESSING.md` for why 1 ns keeps every quantity finite in float32), and a merge that still gives a non-finite or out-of-float32 value fails with `InvalidScientificInputError`.
314
+ - `mapEnvironmentDirectionsToChartPoints` rejects directions that map to a non-finite chart point, such as the grazing (1, 0, −1e-320), which gave −Infinity and NaN, or a non-finite component.
315
+ - `highlight-weighted` metering is now documented as a highlight-emphasis mean: about 0.5–0.8 EV darker than uniform metering in scenes with bright accents. Its behaviour is unchanged. The new `highlight-priority` policy is the one that places highlights (#297).
316
+ - **A missing, null or non-object sub-object no longer escapes as a raw `TypeError` (pre-release review).** As "Stricter input validation" promises, these root functions now throw `InvalidConfigurationError` naming the part: `estimateCameraShakeBlur`, `calculateProjectedMotionBlur`, both camera-rotation mappings, every `src/output/capture-geometry.ts` transform and field-of-view function, `resolveVideoFrameSequence` (`rollingShutter: null`), `resolveTtlFlashExposure` (`guideNumber: null`, malformed zones), `simulateCapture` (`camera: { body: 1, lens: 1 }`, `output.whiteBalance.channelGains: null`), and, from a sweep of the motion, stabilization and exposure modules, the exposure-mode resolvers, ordinary and high-speed flash sync and overlays, `parseManualFlashProfile`, `meterRelativeExposure`, scene-radiance and temporal metering, `setExposureCompensationOnMeterTarget`, `calculateSensorGeometryMetrics` (`nativeRaster: null`), the capture-rotation trajectory, inverse-mapping and quadrature functions, `calculateStabilizedCaptureTemporalSamples`, extended-object projection and translation parallax. Valid input gives the same result. `test/helpers/sub-object-probe.ts` removes, nulls or replaces each nested object of a valid input in turn and requires a domain error.
317
+ - **Nested objects reject unknown fields (pre-release review).** Before, an extra field was dropped silently, for example `angularVelocityRadPerSec: { yaw, pitch, roll: 5 }` in `estimateCameraShakeBlur`, which has no roll term. Now these throw `InvalidConfigurationError` naming the field: `estimateCameraShakeBlur` `angularVelocityRadPerSec`; `calculateProjectedMotionBlur` `positionM` and `velocityMps`; the camera-rotation mappings' `imagePointMm`, `angularVelocityRadPerSec` and `samplingPitchMicrometers`; `resolveVideoFrameSequence` `automation` and `rollingShutter`; the TTL `guideNumber`; `simulateCapture` `output.whiteBalance.channelGains`.
318
+ - A `simulateCapture` camera given as a preset object must have exactly the `GenericEquipmentTierPreset` shape: unknown fields at the top level, in `body`, in `lens` and in `lens.matchedReference` are rejected, and each body and lens profile is re-checked by its own strict parser. A copy of a catalog preset still gives the same capture as its tier id.
319
+ - `output.jpegQuantizationStep` is rejected unless `output.format` is `"jpeg"` (`format: "png", jpegQuantizationStep: 9999` used to succeed silently).
320
+ - *Migration:* remove the extra field; the error names it.
321
+ - **`simulateCapture` scene digest covers caller spectra (pre-release review).** `scene.sourceSha256` (also the RAW source and spectral data-artifact checksum) ignored caller spectra, so a 3000 K and a 9000 K `spectrum` illuminant gave the same digest. The hashed scene description now includes each caller spectrum: tabulated data exactly as its (wavelength, value) pairs, a function spectrum sampled at 1 nm over 380–780 nm. This covers a `spectrum` illuminant, a `daylight` illuminant (its computed spectrum and the basis `datasetId`) and chart reflectance spectra (`uniform`, `patches`). Captures without caller spectra keep their digests (the pinned digests in `test/simulate-capture-integration.test.ts` are unchanged); captures with caller spectra get new digests. The images are unchanged.
322
+ - **`simulateCapture` JPEG progress completes (pre-release review).** The `jpeg` stage counted 8 × 8 blocks, but the encoder reads 256 × 32 source tiles, so its last event stopped short (2 of 64 at 64 × 64). The total and the encoder's `maximumProviderReads` budget are now ⌈height/32⌉ × ⌈width/256⌉, and the last event has `completedTileCount === totalTileCount`. The image data is unchanged (identical from the quantization tables on); the JPEG file bytes change only because the embedded XMP `PrintExportPlan` records the corrected read budget, for images larger than 32 rows or 256 columns. The pinned 8 × 8 `jpegAuto` digest is unchanged.
323
+ - Durand–Dorsey tone mapping (`createDurandDorseyToneMappingTask`) no longer lets one black pixel flatten the image. Pixels with luminance ≤ 0 were floored to log₁₀ = −30, which set the base range: one such pixel in a 4-decade ramp moved the compression factor from 0.180 to 0.022 and roughly quadrupled the run time. They are now left out of the bilateral filter and of the base range, stay 0 in the output, and report `baseLog10 = −Infinity`. An all-zero image returns zeros with compression factor 1. Output changes only for images that contain zero-luminance pixels; images without them are byte-identical (`test/processing-tone-mapping.test.ts`).
324
+ - WebGPU accelerator (#277) fixes. GPU output values are unchanged:
325
+ - The `webgpu-f32` error bounds of the convolution and the temporal sum now cover weights below 2^-126. The host can round such a weight to zero and a GPU can flush it, so with samples up to 2^100 the reported bound could be exceeded (for example by 2^-60 against a bound near 2^-125). The bound gains a term 2·S_max × (the at-risk weights), which is 0 when no weight is that small (docs/WEBGPU.md).
326
+ - Convolution readback buffers are released after each band. Before, every band's readback stayed alive until the end, so GPU memory grew with the image instead of the band.
327
+ - A WebGPU device that arrives after acquisition was aborted is now destroyed instead of leaking.
328
+
329
+ ### Performance
330
+
331
+ Unless marked otherwise, output is bit-identical to the code before the change, checked by committed hash and frozen-oracle tests. Timings come from the source PRs, on small fixtures, on a shared 4-vCPU Linux host under Node 24. They are indicative only.
332
+
333
+ - **Native environment RAW (#285, #292, #294).**
334
+ - Changes: one finite-number pre-walk; a cached parse of engine-owned PSF profiles; one PSF parse per event instead of per site; no per-site serialization of shared state; site plans that keep only the frozen request and image-plane point.
335
+ - Native acquisition is 2.2–3.0× faster on the 2×2 workloads.
336
+ - With a large sampled PSF, CPU per site falls by about 30 %, and a site plan shrinks from about 25 to 8 MB.
337
+ - The native RAW identity walk is about 3× faster (73 → 46 µs per site).
338
+ - **Native SDR** uses a typed-array kernel (about 10–13× faster; 24 MP 8-bit 33.9 → 3.3 s) and an exact LUT-based 8-bit sRGB quantization (#286, #295).
339
+ - **RAW development** uses a typed kernel (#295):
340
+ - 10–15× faster at 1 MP; 24 MP in 3.8–4.6 s instead of 33–42 s;
341
+ - creation is O(metadata) (220 → 4 ms at 24 MP);
342
+ - 24 MP peak array memory falls from 389 to 229 MiB.
343
+
344
+ The output changes listed under Breaking changes are intentional and separate from this speed-up.
345
+ - **JPEG (#286, #298):**
346
+ - an exact-order faster DCT and entropy coder (about 1.6–2.2×; #286);
347
+ - a growing output buffer instead of a zero-filled full budget (a 384-byte JPEG at a 256 MB budget: 256 MB / ~130 ms → 64 KiB / 0.02 ms);
348
+ - Print JPEG strip reads with an sRGB LUT (24 MP 1:1: 375,000 → 3,000 provider reads; 4 MP → 0.25 MP: 1,245 → 339 ms) (#298).
349
+ - **Stabilization evaluation** is linear-time (16,000 samples: 3,100 → 222 ms). Native acquisition and development yield to the host about every 8 ms, now also between sites inside a tile, so `cancel()` takes effect after about one site (#287, #292).
350
+ - **Optional optical-stage reuse** re-runs the sensor stage 5.0–11.4× faster than a full recompute (#288).
351
+ - **Lean per-site executor (#305).** Native environment RAW (and so `simulateCapture()`) runs sites that match a self-verified template through a lean per-site executor.
352
+ - Same maths, same floating-point order, but without redundant per-site re-validation and result envelopes.
353
+ - Every data-dependent check remains, and falls back to the full engine functions. RAW, callbacks and errors are byte-identical.
354
+ - `simulateCapture()` 64×64: 6.0 → 0.87 s CPU; 128×128: 20.6 → 2.2 s. RAW stage 0.95 → 0.12 ms per site.
355
+ - Sampled-PSF and lens-mapped sites are lean-eligible too (#275 follow-up). Their kernels, tap points and mapped queries come from the full chain's own functions; the PSF quadrature's checks still run after each instant's callbacks, and the full quadrature decides when one fails. Output is byte-identical (`test/native-environment-lean.test.ts`). `simulateCapture()` 48×48 (`scripts/benchmark-native-environment.mjs`): 3×3 sampled PSF 11.9 → 1.96 s (6.1×); radial distortion 2.63 → 0.59 s (4.4×).
356
+ - Pupil-ray sites compute their rays with `calculateSensorApertureRays`' own core after one validation per template, and copy each ray for the provider key by key instead of with `structuredClone` (#275). Byte-identical (`test/aperture-ray-fast-path.test.ts`, lean tests). `simulateCapture()` 48×48 with 1×4 pupil rays: 2.19 → 1.26 s (1.7×).
357
+ - All #275 follow-ups together, same benchmark and host, main before vs after: sampled PSF 11.2 → 1.60 s (7.0×), radial distortion 2.66 → 0.46 s (5.7×), 1×4 pupil rays 2.32 → 1.15 s (2.0×), default optics unchanged within noise (0.33 vs 0.34 s); RAW and image SHA-256 identical in every case.
358
+ - **CCT/Duv search by Newton root-find (owner approval 2026-10-17).** *Not bit-identical.*
359
+ - Changes: `calculateCorrelatedColorTemperature` solves d(uv distance²)/dT = 0 with the analytic temperature derivative of Planck's law (safeguarded Newton with bisection, bracketed by the cached coarse scan, converged to 1e-10 of T), instead of a golden-section search. Duv and the inverse use the analytic locus normal instead of finite differences.
360
+ - Speed (`scripts/benchmark-planckian-locus.mjs`, medians, same 4-vCPU host): CCT/Duv 366 → 31.3 µs (11.7×); chromaticity from CCT + Duv 22.5 → 16.5 µs; Kelvin white balance 21.3 → 18.6 µs.
361
+ - Results: CCT now agrees with a 50-digit reference root to 3.3e-12 relative. The old search was off by up to 6.0e-3 K below 25000 K and 0.089 K (1.2e-6 relative) above, so CCT changes by those amounts. Duv changes by at most 8.3e-16. The inverse moves xy by at most 9.3e-10 (1.4e-7 at exactly 1000 or 100000 K); at Duv = 0 it is unchanged. No pinned digest changed. Points whose nearest locus point lies just inside a range limit now resolve instead of failing.
362
+ - **`simulateCapture` auto white balance (pre-release review).** `whiteBalance: "auto"` retained the optical stage, which took the first RAW pass off the lean per-site executor, and then re-ran the sensor stage. It now runs the lean RAW task twice: once to measure grey-world AWB, once with the measured intent. Image, RAW, JPEG, PNG, DNG, request and diagnostics are byte-identical to before on seven cases (chart, illuminant, tier, PNG/P3, DNG, rolling-shutter motion, pupil rays, mirror border) and the pinned `jpegAuto` digest. Only the `output.whiteBalance.auto` assumption text and the provenance contract list change: they now say the radiance queries are repeated (`diagnostics.providerEvaluationCount` still counts one pass). 96 × 96 Siemens star, same 4-vCPU host, Node 24.21, medians of 5: auto 12.9 → 3.86 s (3.4×); scene-illuminant 2.20 s before and 2.10 s after (unchanged within noise), so auto now takes about 1.8× a scene-illuminant capture instead of 5.9×.
363
+ - **`simulateCapture` host yields (pre-release review).** The facade yielded with `setTimeout(…, 0)` about every 8 ms. Browsers clamp nested zero-delay timers to at least 4 ms (WHATWG HTML timer nesting rule), so a capture could sit idle for a large share of its run. It now yields with `scheduler.yield()` where available, else a `MessageChannel` message, else `setImmediate`, else `setTimeout` (`src/facade/host-yield.ts`; no import, browser-surface gate unchanged). Output is unchanged (digests identical). A 128 × 128 capture yields about 250 times. Node 24.21 (MessageChannel path, same 4-vCPU host, origin/main vs this change, two alternating rounds, medians of 5 each): sRGB 2.92/2.89 → 2.36/2.59 s, JPEG 2.72/2.80 → 2.62/2.79 s, PNG/P3 2.76/2.87 → 2.57/2.56 s. Node's timer floor is 1 ms, so the expected saving in Node is about 0.25 s per capture; the spread between rounds is of the same size, so treat the Node gain as small and noisy. The larger browser saving is expected from the 4 ms clamp but was not measured here.
364
+ - **PNG encoder.** Bit-reversed fixed-Huffman codes, length and distance codes precomputed once (instead of reversing every symbol bit by bit), a preallocated output buffer, a rolling LZ77 hash, a one-byte check at the current best length before comparing a chain candidate, and one specialised loop per PNG filter (the adaptive heuristic sums costs with a lookup table instead of writing five candidate rows through a closure). Output bytes are unchanged: a SHA-256 over 789 cases (60 images, 8- and 16-bit, every filter and both compression modes, 30 raw zlib streams, 1200×900 images and an iCCP profile) matched before and after, and `test/png-encoder.test.ts` now pins a digest. 4000×3000 RGB, medians of 5 runs, before and after run back to back on the same shared 4-vCPU host, Node 24: 16-bit noise, default settings, 9.8 → 6.1 s; 8-bit gradient 3.3 → 1.0 s; 16-bit noise without filtering 6.8 → 4.3 s; 16-bit noise, stored 4.4 → 2.0 s. On noise the remaining time is mostly the LZ77 match search, which byte identity keeps as it is.
365
+ - **PSF convolution kernels (`resolveLensPsfConvolutionKernels`).** Each patch now accumulates straight into one scratch map sized for the largest allowed radius and keeps a copy cropped to its own reach, instead of holding every tap of every patch and wavelength as a heap object until the end. Every cell receives its weights in the same order as before, so the kernels are bit-identical (21 profile cases and all 15 kernel calls in the existing tests, before/after SHA-256; `test/lens-psf-kernels.test.ts` checks a direct per-tap sum bit for bit). Measured with medians of 3 runs, Node 24, on a shared 4-vCPU host, with a 41×41-tap synthetic Gaussian profile. 384 patches × 8 wavelengths: 5.8 s and 2.06 GB peak RSS → 1.3 s and 111 MB. 1504 patches × 16 wavelengths (2 MB of output): out of memory at a 4 GB heap → 8.0 s and 113 MB.
366
+ - **Sampled-PSF corner lookup.** `resolveLensSampledPsf` finds its interpolation corners by integer grid position instead of building partial coordinate objects and joined-string keys. It selects the same nodes, with the same weights, in the same order. `simulateCapture()` 64×64 with a 3×3×3-node sampled PSF: 6.46 → 4.88 s (medians of 5, interleaved, same host). Corner lookup falls from 1.46 s to 0.10 s of CPU profile. Image, RAW and request digests are identical, and so are 920 random `resolveLensSampledPsf` queries over a 7-axis profile.
367
+ - **WebGPU:** no GPU speed-up is claimed for the WebGPU backend. On the software adapter it was slower than the CPU (#304).
368
+
369
+ ### Tests and tooling
370
+
371
+ - Coverage rose from 92.4 % to 94.4 % of lines and from 88.7 % to 91.0 % of branches. `npm run coverage` scales timeouts under V8 coverage (#299).
372
+ - New independent checks (#299): spot values beside the bit-identity hash locks, an independent camera-equation RAW oracle, a non-linear temporal-quadrature convergence test, and table-driven rejection tests for public parsers.
373
+ - An informational, non-blocking macOS CI job runs the hash-lock tests (#299). `npm run test:webgpu` runs conformance on a real GPU (#304). It now also covers the sensor stage, the temporal sum, luminance tone curves, chart radiance and the per-fixture rollout (89 tests in three files) and passes on SwiftShader (#277). `npm run test:webgpu:hardware` and `npm run bench:webgpu:hardware` run them on a hardware adapter on Linux, macOS or Windows and refuse a software adapter; they have not been run on hardware.
374
+ - Benchmark scripts that import `dist/` fail when the build is missing or stale (#292).
375
+ - `NUMERICAL_CORRECTNESS.md` documents the cross-engine determinism policy and the test hash locks; `API_STYLE.md` documents naming conventions (#293, #299).
376
+ - Plain-language rewrite of the source comments and docs: shorter sentences, jargon defined at first use, internal ticket chatter removed. Comments and prose only; the comment-stripped build is identical (#309–#312).
377
+ - For AI agents: `llms.txt` and `docs/AGENT_GUIDE.md` ship in the package, and the API reference opens with a task-to-function index that its generator checks against the root exports (#313).
378
+ - No CIE table values in tests (owner decision, 2026-10-17). The CMF, illuminant A, daylight and locus tests now check internal consistency, normalization, round trips and values computed from Planck's law and the daylight formula. The CIEDE2000 tests replace the Sharma et al. (2005) published pairs, whose data file carries no licence, with closed-form special cases computed from the formula. `scripts/fit-cie-1931-cmf.mjs` reproduces the CMF fit (it downloads the CIE table at fit time only), and `scripts/benchmark-planckian-locus.mjs` times the locus functions.
379
+ - No unclear-licence test inputs (owner rule, 2026-10-17): the MurmurHash3 vectors copied from a Stack Overflow answer are replaced by the test's own reimplementation of SMHasher's verification procedure (SMHasher is MIT-licensed; no code copied; the expected value 0xB0F57EE3 is a published fact); the Bradford test follows ICC.1:2010 Annex E with computed D65/D50 whites instead of a secondary website's matrix; the CIE94 worked values from the colour-science documentation are replaced by closed-form cases; the longitudinal-chromatic-aberration test uses a synthetic glass (n_d = 1.5, V_d = 60) instead of catalogue values.
380
+ - `docs/licenses/adobe-dng-patent-license-record.txt` records where the Adobe DNG patent licence was read (URL, date, page SHA-256), its exact required notice and a summary. It is not a copy of the licence: Adobe's Terms of Use do not clearly allow copying its website text.
381
+ - Every test and helper file in `test/` now starts with `// SPDX-License-Identifier: Apache-2.0` (117 files that lacked it; all are the project's own work).
382
+ - New CI job `licence scan`: ScanCode Toolkit 32.5.0 (hash-pinned in `.github/scancode-requirements.txt`) scans the repository, and `scripts/check-scancode-policy.mjs` fails on a non-Apache-2.0 licence finding or a foreign copyright holder unless the file and finding are on its reviewed allowlist. See `docs/DEVELOPERS.md`. The pull-request template now asks for the source, licence and patent check of new algorithms, constant sets, datasets and file formats.
383
+ - `AGENTS.md` is reset to a short standard file with three rules: evidence-based changes, free-to-use sources only, and owner approval for anything that goes to production (#308, #313).
384
+
385
+ ## 1.5.0 — published October 7, 2026
386
+
387
+ See [the 1.5.0 release record](https://github.com/Photivra/photivra/blob/main/docs/RELEASE_1_5_0.md) for the candidate review.
4
388
 
5
389
  - Add optional `NativeRawInput.tileWidth` (1–256 native sites) so bounded native RAW acquisition can use smaller execution chunks while preserving the existing 256-site default, physical sampling, absolute CFA coordinates, deterministic noise seeds, shutter timing, output payload and existing whole-event/resource caps.
6
390
  - Preserve the exact acquisition tile width through same-RAW validation and development. Reject invalid widths, inconsistent tile counts and stale plans instead of silently rebuilding a default-width plan.
@@ -10,13 +394,15 @@
10
394
 
11
395
  ## 1.4.0 — published October 4, 2026
12
396
 
397
+ See [the 1.4.0 release record](https://github.com/Photivra/photivra/blob/main/docs/RELEASE_1_4_0.md) for the candidate review.
398
+
13
399
  - Add standalone evidence-bound ideal circular pupil rays and optional origin-aware bounded photo/RAW evaluation. Reuse shared focus and camera rotation, average normalized pupil irradiances before the existing sensor pipeline, and retain exact-once working-f-number throughput. Reject simultaneous sampled PSF, missing callbacks, invalid geometry and excessive budgets before provider work. Production depth/visibility composition remains unsupported. See `docs/SENSOR_APERTURE_RAYS.md`.
14
400
 
15
401
  - Add separate metadata-only packed native RAW, physical source-to-RAW and same-RAW reconstruction/SDR tasks with explicit 24 MP admission, bounded tiles, absolute CFA/seed identities, cancellation and single-transfer ownership. Preserve the reference RAW caps and scalar mathematics.
16
402
  - Add bounded post-SDR Print crop/area downsampling and original baseline JPEG encoding with an original sRGB ICC profile. Explicit source hashes remain caller declarations; platform save/share, printer appearance and physical device acceptance are separate.
17
- - Record complete one-megapixel constructed RAW → SDR → downsampled JPEG execution and independently decoded JPEG/ICC/area-filter controls. See [native RAW and Print contracts](docs/NATIVE_RAW_AND_PRINT.md).
403
+ - Record complete one-megapixel constructed RAW → SDR → downsampled JPEG execution and independently decoded JPEG/ICC/area-filter controls. See [native RAW and Print contracts](https://github.com/Photivra/photivra/blob/main/docs/NATIVE_RAW_AND_PRINT.md).
18
404
 
19
- ## 1.3.0 — published
405
+ ## 1.3.0 — published October 4, 2026
20
406
 
21
407
  - Add evidence-bound radial illumination throughput to bounded environment photo/RAW execution, validating every inverse PSF tap before provider callbacks and applying attenuation once in physical sensor coordinates. Production composition requires explicit vignetting fidelity. Preserve unity arithmetic, resource limits and unverified transport flags.
22
408
 
@@ -27,23 +413,24 @@
27
413
  - Add explicit complex-pupil propagation distance and result binding (model 1.1.0), preserving omitted-input nominal focal-plane kernel values. Finite-focus callers can pass the shared resolved image distance without implying qualified exit-pupil geometry.
28
414
  - Audit #195 planning acceptance across print/viewing scales, retained crops, invalid-input recovery and exact integer alternatives.
29
415
 
30
- ## 1.1.0 — historical preparation notes
416
+ ## 1.1.0 — published October 3, 2026 (historical preparation notes)
31
417
 
32
418
  - Add a bounded regional coherent-sinusoid diagnostic and explicit stage/region/source identity. Independently validate Fourier modulation and angular projection using owned analytic references; preserve acquisition, system MTF, noise/artifact/perception qualification as unassessed. Full #196 acceptance remains blocked. See `docs/PRINT_DETAIL_ASSESSMENT.md` and `docs/PRINT_DETAIL_VALIDATION.md`.
33
419
 
34
420
  - Add native-only Print planning and conditional size queries. Independent viewing distance and explicit pixel/stroke/line-pair conventions derive density; advanced manual PPI creates a distinct plan. Preserve confirmed native crop/orientation and exact-ratio integer output, reconcile declared lab constraints, and return no recommendation for upscale or conflicts. Captured detail and delivery remain unassessed. See `docs/PRINT_PLANNING.md`.
35
421
  - Align package/root creator identity at 1.1.0 for this additive release. Existing APIs, archived records, fixtures and all independent schema/POC/production-plan versions remain unchanged. See `docs/RELEASE_1_1_0.md`.
36
422
 
37
- ## 1.0.1 candidate — publication pending
423
+ ## 1.0.1 — published October 2, 2026
38
424
 
39
425
  - Expand Node support to maintained 22/24 LTS plus 26 Current, with patched-major CI and the existing 22.13 minimum job, reviewed lifecycle windows and updated tooling guidance. Keep Node 24 build/typings baseline.
40
426
  - Align the npm package and `ENGINE_API_VERSION` at 1.0.1 and enforce equality in source metadata, generated references and isolated packed consumers. Schema/model/POC/plan versions and scientific calculations are unchanged. New capture/plan creator identities and hashes can differ; archived records and acceptance artifacts retain their original versions. See `docs/RELEASE_1_0_1.md`.
41
427
 
42
- ## 1.0.0 candidate — publication pending owner tag
428
+ ## 1.0.0 — published October 2, 2026
43
429
 
44
430
  - Prepare the stable public distribution after all 32 V1 feature/science items and defect #178 are reviewed and merged. Package/lock/citation become 1.0.0; root contract 0.116.0 and every independent model/schema/POC/plan identity remain unchanged. No scientific arithmetic, seed, fixture hash, exported signature or accepted execution envelope changes.
45
431
  - Reconcile human/agent/source guidance, actual bounded production integration and closed tier/performance/export/conformance acceptance. Add developer capability navigation, exact root-export reference, packed executable examples, strict documentation/consumer checks and exact owner tag/publish procedure.
46
432
  - Preserve synthetic/calibration/visibility/PSF/resolution limits and the recorded external-editor/hash/build limitations. Review compatibility/migration and owner handoff in `docs/RELEASE_1_0.md`; this entry does not certify npm publication.
433
+ - The preparation evidence is in [the final 1.0.0 preparation audit](https://github.com/Photivra/photivra/blob/main/docs/RELEASE_AUDIT.md).
47
434
 
48
435
  ## Historical development — engine API 0.116.0
49
436
 
package/CITATION.cff CHANGED
@@ -9,7 +9,7 @@ abstract: "An open TypeScript engine for the science and mathematics of photogra
9
9
  repository-code: "https://github.com/photivra/photivra"
10
10
  url: "https://photivra.com"
11
11
  license: "Apache-2.0"
12
- version: "1.5.0"
12
+ version: "2.0.0"
13
13
  keywords:
14
14
  - photography
15
15
  - camera optics