@photivra/engine 1.0.1 → 1.2.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 (244) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/CITATION.cff +1 -1
  3. package/NOTICE +29 -0
  4. package/README.md +8 -6
  5. package/THIRD_PARTY.md +10 -0
  6. package/dist/core/version.d.ts +1 -1
  7. package/dist/core/version.js +1 -1
  8. package/dist/index.d.ts +10 -0
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +5 -0
  11. package/dist/index.js.map +1 -1
  12. package/dist/optics/complex-pupil-psf.d.ts +6 -0
  13. package/dist/optics/complex-pupil-psf.d.ts.map +1 -1
  14. package/dist/optics/complex-pupil-psf.js +10 -7
  15. package/dist/optics/complex-pupil-psf.js.map +1 -1
  16. package/dist/output/native-capture-sdr.d.ts +78 -0
  17. package/dist/output/native-capture-sdr.d.ts.map +1 -0
  18. package/dist/output/native-capture-sdr.js +171 -0
  19. package/dist/output/native-capture-sdr.js.map +1 -0
  20. package/dist/output/print-contrast-reference.d.ts +47 -0
  21. package/dist/output/print-contrast-reference.d.ts.map +1 -0
  22. package/dist/output/print-contrast-reference.js +95 -0
  23. package/dist/output/print-contrast-reference.js.map +1 -0
  24. package/dist/output/print-detail.d.ts +113 -0
  25. package/dist/output/print-detail.d.ts.map +1 -0
  26. package/dist/output/print-detail.js +224 -0
  27. package/dist/output/print-detail.js.map +1 -0
  28. package/dist/output/print-plan.d.ts +138 -0
  29. package/dist/output/print-plan.d.ts.map +1 -0
  30. package/dist/output/print-plan.js +305 -0
  31. package/dist/output/print-plan.js.map +1 -0
  32. package/dist/output/print-region-statistics.d.ts +92 -0
  33. package/dist/output/print-region-statistics.d.ts.map +1 -0
  34. package/dist/output/print-region-statistics.js +300 -0
  35. package/dist/output/print-region-statistics.js.map +1 -0
  36. package/docs/API_REFERENCE.md +89 -1
  37. package/docs/API_STYLE.md +1 -1
  38. package/docs/ARCHITECTURE.md +1 -1
  39. package/docs/AUTOMATION_COORDINATION.md +1 -1
  40. package/docs/CAPTURE_COLOR.md +1 -1
  41. package/docs/CAPTURE_CORRECTED_SDR.md +1 -1
  42. package/docs/CAPTURE_EXPORT_METADATA.md +1 -1
  43. package/docs/CAPTURE_SDR.md +3 -1
  44. package/docs/DEVELOPERS.md +12 -4
  45. package/docs/DIGITAL_OPTICS_FOUNDATION.md +1 -1
  46. package/docs/ENVIRONMENT_RAW_CAPTURE.md +1 -1
  47. package/docs/EXPORT_ACCEPTANCE.md +1 -1
  48. package/docs/GENERIC_TIER_PRESETS.md +1 -1
  49. package/docs/GEOMETRIC_PREPARATION_REUSE.md +1 -1
  50. package/docs/IMAGE_FORMATION.md +1 -1
  51. package/docs/LINEAR_CAPTURE_ENCODING.md +1 -1
  52. package/docs/MOTION_AND_SIGNAL.md +1 -1
  53. package/docs/NATIVE_CAPTURE_SDR.md +70 -0
  54. package/docs/NATIVE_CAPTURE_SDR_REVIEW.md +37 -0
  55. package/docs/NATIVE_CAPTURE_SDR_VALIDATION.md +34 -0
  56. package/docs/NUMERICAL_CORRECTNESS.md +1 -1
  57. package/docs/PERFORMANCE_BASELINE.md +1 -1
  58. package/docs/PHOTOGRAPHIC_EXPORT.md +1 -1
  59. package/docs/PHYSICS_FOUNDATION.md +1 -1
  60. package/docs/POC_API.md +1 -1
  61. package/docs/POC_PROJECTION_PLATFORM_REFERENCE.md +12 -0
  62. package/docs/POC_PROJECTION_REUSE.md +1 -1
  63. package/docs/PRINT_195_196_REVIEW.md +93 -0
  64. package/docs/PRINT_196_ENGINE_ACCEPTANCE.md +45 -0
  65. package/docs/PRINT_CONTRAST_REFERENCE.md +43 -0
  66. package/docs/PRINT_DETAIL_ASSESSMENT.md +81 -0
  67. package/docs/PRINT_DETAIL_JPEG_EVIDENCE.md +36 -0
  68. package/docs/PRINT_DETAIL_SDR_EVIDENCE.md +29 -0
  69. package/docs/PRINT_DETAIL_VALIDATION.md +36 -0
  70. package/docs/PRINT_PLANNING.md +75 -0
  71. package/docs/PRINT_REGION_STATISTICS.md +38 -0
  72. package/docs/PROCESSED_OUTPUT.md +1 -1
  73. package/docs/PRODUCTION_COMPOSITION.md +1 -1
  74. package/docs/PRODUCTION_ENVIRONMENT_CAPTURE.md +1 -1
  75. package/docs/PROVENANCE.md +1 -1
  76. package/docs/PSF_FOUNDATION.md +11 -1
  77. package/docs/RAW_FRAME_ENVELOPE.md +1 -1
  78. package/docs/RAW_FRAME_RECONSTRUCTION.md +1 -1
  79. package/docs/RELEASE_1_1_0.md +25 -0
  80. package/docs/RELEASE_1_2_0.md +51 -0
  81. package/docs/SCENE_RADIANCE_AND_ILLUMINATION.md +1 -1
  82. package/docs/SCENE_SENSOR_QUADRATURE.md +1 -1
  83. package/docs/SCENE_SENSOR_TEMPORAL_EXPOSURE.md +1 -1
  84. package/docs/SCIENTIFIC_ASSURANCE.md +1 -1
  85. package/docs/SCIENTIFIC_CONFORMANCE.md +1 -1
  86. package/docs/SDR_RENDERING.md +1 -1
  87. package/docs/SENSOR_ENVIRONMENT_QUERY.md +1 -1
  88. package/docs/SENSOR_EQE_LOCAL_EXPOSURE.md +1 -1
  89. package/docs/SENSOR_EQE_TEMPORAL_EXPOSURE.md +1 -1
  90. package/docs/SENSOR_PSF_QUADRATURE.md +1 -1
  91. package/docs/SENSOR_RAW_FRAME.md +1 -1
  92. package/docs/SENSOR_RAW_PRODUCER.md +1 -1
  93. package/docs/SIGNAL_CONFORMANCE.md +1 -1
  94. package/docs/SIMULATED_CAPTURE.md +1 -1
  95. package/docs/STABILIZATION.md +1 -1
  96. package/docs/TEMPORAL_PHOTO_RAW.md +1 -1
  97. package/docs/TIER_ACCEPTANCE.md +1 -1
  98. package/docs/TIER_PRESET_ACCEPTANCE.md +1 -1
  99. package/docs/USAGE.md +9 -1
  100. package/docs/V1_COMPOSITION_MAP.md +1 -1
  101. package/docs/V1_HELPER_REUSE_REVIEW.md +1 -1
  102. package/docs/V1_PERFORMANCE_DISPOSITION.md +1 -1
  103. package/docs/api/camera-equivalent-focal-length.md +1 -1
  104. package/docs/api/camera-field-of-view.md +1 -1
  105. package/docs/api/camera-projected-object-size.md +1 -1
  106. package/docs/api/capture-capture-export-metadata.md +1 -1
  107. package/docs/api/capture-environment-raw-producer.md +1 -1
  108. package/docs/api/capture-focus-control.md +1 -1
  109. package/docs/api/capture-linear-encoding.md +1 -1
  110. package/docs/api/capture-photographic-export.md +1 -1
  111. package/docs/api/capture-raw-frame-reconstruction.md +1 -1
  112. package/docs/api/capture-release-sequence.md +1 -1
  113. package/docs/api/capture-sensor-raw-frame.md +1 -1
  114. package/docs/api/capture-sensor-raw-producer.md +1 -1
  115. package/docs/api/capture-simulated-capture.md +1 -1
  116. package/docs/api/color-capture-color.md +1 -1
  117. package/docs/api/color-white-balance.md +1 -1
  118. package/docs/api/composition-image-formation-plan.md +1 -1
  119. package/docs/api/composition-plan-consumer.md +1 -1
  120. package/docs/api/core-calculation-result.md +1 -1
  121. package/docs/api/core-configuration-error.md +1 -1
  122. package/docs/api/core-image-formation.md +1 -1
  123. package/docs/api/core-scientific-assurance.md +1 -1
  124. package/docs/api/core-spectral-composition.md +1 -1
  125. package/docs/api/core-spectral.md +1 -1
  126. package/docs/api/core-validation.md +1 -1
  127. package/docs/api/core-version.md +2 -2
  128. package/docs/api/equipment-exposure-capabilities.md +1 -1
  129. package/docs/api/equipment-generic-tier-assets.md +1 -1
  130. package/docs/api/equipment-generic-tier-presets.md +1 -1
  131. package/docs/api/equipment-iso-capabilities.md +1 -1
  132. package/docs/api/equipment-metering-capabilities.md +1 -1
  133. package/docs/api/equipment-release-capabilities.md +1 -1
  134. package/docs/api/exports.json +267 -2
  135. package/docs/api/exposure-exposure-duration-control.md +1 -1
  136. package/docs/api/exposure-exposure-mode-resolver.md +1 -1
  137. package/docs/api/exposure-exposure.md +1 -1
  138. package/docs/api/exposure-flash.md +1 -1
  139. package/docs/api/exposure-metering-scene-radiance.md +1 -1
  140. package/docs/api/exposure-metering-target.md +1 -1
  141. package/docs/api/exposure-metering-temporal.md +1 -1
  142. package/docs/api/exposure-metering.md +1 -1
  143. package/docs/api/exposure-program-line.md +1 -1
  144. package/docs/api/motion-camera-rotation.md +1 -1
  145. package/docs/api/motion-capture-rotation-inverse-mapping.md +1 -1
  146. package/docs/api/motion-capture-rotation-temporal-quadrature.md +1 -1
  147. package/docs/api/motion-capture-rotation-trajectory.md +1 -1
  148. package/docs/api/motion-capture-translation-parallax-temporal-quadrature.md +1 -1
  149. package/docs/api/motion-extended-object-projection.md +1 -1
  150. package/docs/api/motion-projected-motion.md +1 -1
  151. package/docs/api/optics-aperture.md +1 -1
  152. package/docs/api/optics-circle-of-confusion.md +1 -1
  153. package/docs/api/optics-complex-pupil-psf.md +7 -1
  154. package/docs/api/optics-depth-of-field.md +1 -1
  155. package/docs/api/optics-diffraction.md +1 -1
  156. package/docs/api/optics-focus-breathing.md +1 -1
  157. package/docs/api/optics-focus-state.md +1 -1
  158. package/docs/api/optics-front-of-lens-filter.md +1 -1
  159. package/docs/api/optics-illumination-vignetting.md +1 -1
  160. package/docs/api/optics-lateral-chromatic-aberration.md +1 -1
  161. package/docs/api/optics-lens-psf-profile.md +1 -1
  162. package/docs/api/optics-polygon-diffraction.md +1 -1
  163. package/docs/api/optics-profile-contract.md +1 -1
  164. package/docs/api/optics-psf-foundation.md +1 -1
  165. package/docs/api/optics-radial-distortion.md +1 -1
  166. package/docs/api/optics-scene-to-sensor-irradiance.md +1 -1
  167. package/docs/api/optics-scene-to-sensor-quadrature.md +1 -1
  168. package/docs/api/optics-sensor-environment-query.md +1 -1
  169. package/docs/api/optics-sensor-psf-quadrature.md +1 -1
  170. package/docs/api/optics-stray-light.md +1 -1
  171. package/docs/api/optics-thin-lens.md +1 -1
  172. package/docs/api/output-capture-corrected-sdr.md +1 -1
  173. package/docs/api/output-capture-geometry.md +1 -1
  174. package/docs/api/output-capture-sdr.md +1 -1
  175. package/docs/api/output-crop.md +1 -1
  176. package/docs/api/output-geometric-transforms.md +1 -1
  177. package/docs/api/output-lens-corrections.md +1 -1
  178. package/docs/api/output-native-capture-sdr.md +150 -0
  179. package/docs/api/output-print-contrast-reference.md +82 -0
  180. package/docs/api/output-print-detail.md +147 -0
  181. package/docs/api/output-print-plan.md +165 -0
  182. package/docs/api/output-print-region-statistics.md +165 -0
  183. package/docs/api/output-sdr-rendering.md +1 -1
  184. package/docs/api/output-subject-framing-crop.md +1 -1
  185. package/docs/api/schema-camera.md +1 -1
  186. package/docs/api/schema-illumination-spectral.md +1 -1
  187. package/docs/api/schema-illumination-temporal.md +1 -1
  188. package/docs/api/schema-illumination.md +1 -1
  189. package/docs/api/schema-scene-radiance-temporal.md +1 -1
  190. package/docs/api/schema-scene-radiance.md +1 -1
  191. package/docs/api/schema-scene.md +1 -1
  192. package/docs/api/schema-validation.md +1 -1
  193. package/docs/api/sensor-accumulated-charge.md +1 -1
  194. package/docs/api/sensor-architecture.md +1 -1
  195. package/docs/api/sensor-camera-saturation-capacity.md +1 -1
  196. package/docs/api/sensor-capture-color-sampling-binding.md +1 -1
  197. package/docs/api/sensor-capture-mode-timing.md +1 -1
  198. package/docs/api/sensor-capture-mode.md +1 -1
  199. package/docs/api/sensor-color-sampling.md +1 -1
  200. package/docs/api/sensor-constant-rate-temporal-integration.md +1 -1
  201. package/docs/api/sensor-dark-current.md +1 -1
  202. package/docs/api/sensor-environment-photo-signal.md +1 -1
  203. package/docs/api/sensor-eqe-electron-rate.md +1 -1
  204. package/docs/api/sensor-eqe-local-exposure.md +1 -1
  205. package/docs/api/sensor-eqe-temporal-exposure.md +1 -1
  206. package/docs/api/sensor-exposure-window.md +1 -1
  207. package/docs/api/sensor-iso-signal-chain.md +1 -1
  208. package/docs/api/sensor-local-exposure-binding.md +1 -1
  209. package/docs/api/sensor-optical-stack.md +1 -1
  210. package/docs/api/sensor-photon-energy.md +1 -1
  211. package/docs/api/sensor-physical-charge-capacity.md +1 -1
  212. package/docs/api/sensor-pixel-pitch.md +1 -1
  213. package/docs/api/sensor-radiometry-readiness.md +1 -1
  214. package/docs/api/sensor-raw-readout.md +1 -1
  215. package/docs/api/sensor-raw-reconstruction.md +1 -1
  216. package/docs/api/sensor-readout-exposure-linkage.md +1 -1
  217. package/docs/api/sensor-readout-timing.md +1 -1
  218. package/docs/api/sensor-response-application-compatibility.md +1 -1
  219. package/docs/api/sensor-response-operating-range.md +1 -1
  220. package/docs/api/sensor-responsivity-photocurrent.md +1 -1
  221. package/docs/api/sensor-sampling-aperture.md +1 -1
  222. package/docs/api/sensor-scene-eqe-temporal-exposure.md +1 -1
  223. package/docs/api/sensor-sensor-geometry.md +1 -1
  224. package/docs/api/sensor-signal-noise.md +1 -1
  225. package/docs/api/sensor-spatial-sample-reduction.md +1 -1
  226. package/docs/api/sensor-spatial-sampling-quadrature.md +1 -1
  227. package/docs/api/sensor-spatio-spectral-reduction.md +1 -1
  228. package/docs/api/sensor-spectral-coverage.md +1 -1
  229. package/docs/api/sensor-spectral-quadrature.md +1 -1
  230. package/docs/api/sensor-spectral-response.md +1 -1
  231. package/docs/api/sensor-temporal-photo-signal.md +1 -1
  232. package/docs/api/simulation-poc-simulation.md +1 -1
  233. package/docs/api/stabilization-camera-shake.md +1 -1
  234. package/docs/api/stabilization-system.md +1 -1
  235. package/docs/licenses/castleCSF-MIT.txt +21 -0
  236. package/docs/validation/native-capture-sdr-darwin-arm64-node26-review.jsonl +4 -0
  237. package/docs/validation/native-capture-sdr-darwin-arm64.jsonl +3 -0
  238. package/docs/validation/print-196-candidate-capabilities.json +28 -0
  239. package/docs/validation/print-196-candidate-evidence.json +356 -0
  240. package/docs/validation/print-196-engine-acceptance.json +81 -0
  241. package/docs/validation/print-detail-capabilities.json +103 -0
  242. package/docs/validation/print-detail-jpeg-evidence.json +116 -0
  243. package/docs/validation/print-detail-sdr-evidence.json +81 -0
  244. package/package.json +1 -1
@@ -0,0 +1,36 @@
1
+ # Regional detail paired-export JPEG evidence 0.1.0
2
+
3
+ This addendum to [the regional diagnostic protocol](PRINT_DETAIL_VALIDATION.md) qualifies only a bounded execution test: owned post-ADC RAW codes → public paired-export reconstruction/color/SDR/JPEG → independently recorded JPEG decode → neutral relative-linear luminance → regional fundamental. It extends [the capture-SDR execution evidence](PRINT_DETAIL_SDR_EVIDENCE.md) without changing the metric, public API, dependencies or historical records. Human scientific/source review remains pending; full #196 acceptance remains blocked.
4
+
5
+ ## Owned source and target truth
6
+
7
+ `test/helpers/print-detail-jpeg-fixture.ts` supplies a native 20 × 16 periodic Bayer frame. Every complete 2 × 2 tile has one neutral post-ADC code from repeating `[640,448,256,448]`. Black is 64 and white is 1023, so linear tile levels are `[576,384,192,384]/959`. Source mean is `384/959`; the two-sample-held eight-pixel period has fundamental modulation `0.5 cos(pi/8)`. This follows the discrete hold's half-sample phase and cosine attenuation. The target contains known higher harmonics and is not a pure continuous optical sinusoid. Only its declared coherent Fourier fundamental is assessed; its residual cannot be classified as noise or a compression artifact.
8
+
9
+ This is owned synthetic draft post-ADC data, not a renderer-acquired optical target or noise realization. The existing declared ideal test color profile and tile-average reconstruction are reused. Neither becomes physical calibration. The source's placeholder float plane does not supply JPEG pixels: the public export develops the committed RAW codes. The independent Python check derives expected neutral pre-encode codes from the source codes and explicit orientation permutation, with no engine imports. It separately verifies the source's fundamental identity.
10
+
11
+ ## Exact stage and independent reference
12
+
13
+ Eight committed JPEGs cover all four orientations at constant quantization steps 1 and 32. These are scalar encoder parameters, not manufacturer's quality scores. Each orientation has a distinct capture ID; its quantization variants retain that same capture identity, with unique document/instance IDs for each exported file. The public exporter executes orientation itself, writes already oriented JPEG pixels, and declares EXIF orientation 1. Native 20 × 16 becomes 20 × 16 or 16 × 20. Partial eight-pixel coding blocks exercise the encoder's edge padding without changing the declared raster. The selected off-center half-open ROI begins at `(2,2)` and is 16 × 8 in landscape or 8 × 16 in portrait; it spans two target periods and JPEG block boundaries.
14
+
15
+ `export-manifest.json` records actual source codes, pre-encode RGB, JPEG SHA-256, raster, target and ROI identities. `independent-reference.json` binds to its exact bytes and records installed Pillow/libjpeg/Python versions, independently decoded RGB bytes/hash, ROI float64 little-endian bytes/hash and separately calculated pre-encode/decoded coefficients. The verifier requires neutral equal decoded RGB channels; each inverse-transferred channel is then relative linear luminance. It does not define a colored RGB luminance extractor, ICC transform or generic decoder policy.
16
+
17
+ The independent reference calculates mean, cosine/sine coefficients, amplitude, modulation and residual using Python `math.fsum`, independently of the engine accumulator. Every Node test regenerates actual paired-export JPEG bytes and requires exact agreement with the committed JPEG, manifest hash and independent decoded-byte record. It converts the recorded neutral pixels to linear values, compares each ROI sample within absolute 1e-12, and compares all regional measurements within 1e-10. These are numerical tolerances for 128 positive bounded samples, not perceptual thresholds. Integer bytes, raster identities and hashes are exact checks. Node CI consumes committed independent decode evidence; it does **not** execute Pillow anew.
18
+
19
+ The actual runtime linear luminance plane receives a separate float64 little-endian SHA-256 carried unchanged through the diagnostic input/result. It is linked by the test to the exact JPEG and decoder record. The public diagnostic still returns `caller-declared-unverified`, unknown scientific assurance and `not-offered` overall verdict; it performs no IO or automatic provenance upgrade.
20
+
21
+ ## Reproduction and invalidation
22
+
23
+ ```sh
24
+ node scripts/generate-print-detail-jpeg.mjs /tmp/photivra-print-jpeg-reproduction
25
+ python scripts/verify-print-detail-jpeg.py /tmp/photivra-print-jpeg-reproduction --record
26
+ python scripts/verify-print-detail-jpeg.py test/fixtures/print-detail/jpeg
27
+ npx vitest run test/print-detail-jpeg-integration.test.ts
28
+ ```
29
+
30
+ Generation uses the repository's existing development compiler. Python QA uses an existing installed Pillow; no engine/runtime/development dependency or CI install is added. A missing Pillow fails the independent check rather than silently passing. `--record` writes a new candidate reference for review; verification without it requires the committed decoder versions and results to agree. Preserve old records when the source, reconstruction, color model, renderer, encoder, registration, target, ROI, metric or decoder changes. Regeneration is evidence collection, not human approval. [The separate evidence ledger](validation/print-detail-jpeg-evidence.json) pins source hashes and the finite execution envelope.
31
+
32
+ Fine quantization preserves this target's measured regional modulation within numerical tolerance. Coarse quantization changes it and may increase the fundamental or residual. An increased transfer coefficient does not imply restored detail, improved quality, invisibility or a compression pass. Source RAW, pre-encode RGB and native raster remain unchanged between quantization variants; only the exact encoded representation and its diagnostic differ.
33
+
34
+ ## Remaining qualification
35
+
36
+ This evidence covers one owned neutral stepped grating, one source/processing policy, one selected ROI per orientation and one recorded independent decoder configuration. It does not qualify optical acquisition/MTF, spectral color calibration, other targets/frequencies/depths, noise/aliasing/halos/compression classifiers, generic image codecs or decoder variants, resampling/warp, native-resolution production, UI/GPU/device/display execution, observer perception or printer/substrate response. No JPEG quality verdict is introduced. Full scoped new-UI acceptance remains blocked until the missing evidence and substantive human review are complete.
@@ -0,0 +1,29 @@
1
+ # Regional detail bounded capture-SDR evidence 0.1.0
2
+
3
+ This addendum to [the regional diagnostic protocol](PRINT_DETAIL_VALIDATION.md) records execution through the public `createSimulatedCapture` → `calculateCaptureSdr` → test-only quantized-code readback → `calculatePrintRegionDetail` path. It does not change the metric, public API, or historical mathematical qualification record. Human scientific and source review remains pending. Full #196 acceptance remains blocked.
4
+
5
+ ## Source and independent reference
6
+
7
+ `test/fixtures/print-detail/quarter-grating.json` commits a 16 × 12 neutral linear-sRGB/D65 target. Its repeated values are `[0.6, 0.4, 0.2, 0.4]`: mean 0.4, fundamental amplitude 0.2, modulation 0.5. Values are co-sited neutral RGB, so each equal channel is the relative luminance; this does not qualify colored target luminance extraction. This is owned procedural draft data, with no measured scene or commercial-camera calibration.
8
+
9
+ `generate_reference.py` uses only Python's standard library and no engine imports to reproduce source bytes and `sdr-reference.json`. Run `python test/fixtures/print-detail/generate_reference.py`. The reference independently applies the repository's documented sRGB transfer and nearest-ties-up quantization to the three discrete levels. For decoded levels A, B, C, discrete orthogonality gives mean `(A + 2B + C)/4`, amplitude `abs(A-C)/2`, and modulation amplitude/mean. A remaining second harmonic can occur after quantization; it is not noise, compression or a quality classification.
10
+
11
+ The reference commits SHA-256 for exact source JSON bytes, each registered RGB plane as interleaved float64 little-endian bytes, and each integer output as uint16 little-endian bytes (also for 8-bit codes). Tests verify these hashes against actual source and adapter output. Decoder floating values are checked within absolute 1e-12 of the independent Python reference, since power-function implementations may differ in the last binary64 bit. The actual runtime decoded RGB plane is separately hashed as float64 little-endian bytes and its exact hash carried into the diagnostic input/result; the diagnostic itself remains `caller-declared-unverified` and performs no artifact IO. Hash agreement establishes byte identity within this test path, not acquisition truth or reusable rights.
12
+
13
+ ## Finite execution envelope
14
+
15
+ | Dimension | Evidence envelope |
16
+ | --- | --- |
17
+ | Source | One committed neutral, positive, in-range quarter-cycle target; no stochastic noise |
18
+ | Registration | Owned explicit native-to-oriented discrete permutation; four orientations, no warp or resampling |
19
+ | Raster | Native 16 × 12; oriented 16 × 12 or 12 × 16 |
20
+ | Region | Half-open 8 × 8 region beginning at `(2,2)`; x- or y-directed two cycles, orientation-dependent phase |
21
+ | Capture state | Explicit already-transformed linear-sRGB/D65, declared owned neutral encoding history, WB not required |
22
+ | Adapter | Capture-SDR schema 0.1.0, identity tone, zero rendering EV, reject out-of-range, no dither |
23
+ | Quantization/readback | 8 and 16 bits; test-only inverse transfer of integer codes, no image file codec |
24
+ | Reference checks | Exact source/plane/code hashes; all decoded pixels and independent region mean/modulation/transfer within 1e-12 |
25
+ | Backend | Repository Node execution; CI runtime matrix and exact commit/run recorded in the draft PR |
26
+
27
+ The adapter consumes an already oriented plane; it does not execute the orientation permutation. Tests establish this declared registration independently before execution. They preserve capture identity and source history and assert that rendering does not mutate the capture. Geometry/orientation mathematical tests remain in the original protocol. This evidence does not qualify the UI's active renderer, GPU, native-resolution producer, memory envelope, device display, RAW/environment acquisition, color conversion, clipping accuracy, JPEG compression, physical optical MTF, depth/occlusion, observer perception, or printer/substrate response.
28
+
29
+ The capability record is [print-detail-sdr-evidence.json](validation/print-detail-sdr-evidence.json). Previous records and their hashes remain unchanged. Rerun this evidence when the target, reference, capture adapter, SDR renderer, diagnostic or test registration changes; do not extend the finite envelope from a passing parser or procedural generator. The new UI still requires reviewed actual source/backend evidence for its own execution path and the remaining scoped quality dimensions.
@@ -0,0 +1,36 @@
1
+ # Regional Print detail independent validation protocol 0.1.0
2
+
3
+ This protocol tests the mathematical domain in [the model specification](PRINT_DETAIL_ASSESSMENT.md). Passing does not qualify arbitrary photographed targets, renderers, lenses, printers or perceptual decisions. [The capability ledger](validation/print-196-candidate-capabilities.json) must retain these limits.
4
+
5
+ ## Public analytic evidence
6
+
7
+ Procedural targets are owned test data, with known mean, modulation, integer spatial frequencies and phase. Reference derivations use finite orthogonality and discrete convolution identities, independently of the implementation's coefficient accumulator.
8
+
9
+ | Case | Independent expected behavior |
10
+ | --- | --- |
11
+ | Exact quarter-cycle sequence | Mean 1 and declared fundamental modulation 0.5; derive from explicit repeated values, not engine output |
12
+ | Large signed cancellation | Explicit `(L + 1 - L + 1)/4 = 1/2` DC and amplitude normalized by independently known `L`; no residual/noise accuracy claim under cancellation |
13
+ | DC/gain/phase variants | Gain preserves modulation; changed mean changes relative modulation; arbitrary phase preserves amplitude |
14
+ | Isotropic symmetric filtering | Known separable symmetric kernel attenuates axial x/y targets equally |
15
+ | Directional filtering | Apply owned `[1/4,1/2,1/4]` in x only: response is `(1+cos(2 pi f_x))/2`; orthogonal target is unchanged |
16
+ | Equal-PPI, different detail | Same geometry and raster; independent filtered/unfiltered sample arrays have different coefficients |
17
+ | Subject versus deliberate defocus | Select separate regions/roles; retain each result; no whole-frame minimum or score |
18
+ | Crop and physical enlargement | Actual ROI/retained raster stay explicit; samples/modulation do not change when only print size/distance changes |
19
+ | Four orientations, off-center capture | Existing coordinate transforms predict optical field location; no ad hoc axis conversion |
20
+ | Independent extra harmonic/noise realization | Fundamental/residual responses follow orthogonality; noise/artifact dimensions remain unassessed |
21
+ | Post-resampling versus decoded encoding | Bind actual raster/stage/content/decoder; pre-encode cannot imply JPEG qualification |
22
+ | Invalid/unsupported input | Reject unknown keys/enums/IDs, holes/nonfinite samples and invalid bounds; block identity/domain/registration mismatch and unsupported Nyquist/DC |
23
+
24
+ For normalized analytic coefficients and relative residuals, use an absolute tolerance of 1e-10 for small bounded arrays (up to 4096 samples). This accommodates trigonometric and accumulation error while remaining far below the deliberately tested contrast differences (at least 0.01). Exact identities/integers/statuses are checked exactly. A separate upper-bound sample test verifies the 65,536-sample work cap and documented float range; it does not infer a device performance or memory envelope. Fixed seeds remain committed. Tolerances must be reviewed when algorithm/domain changes, never loosened merely to pass a failure.
25
+
26
+ Run focused tests, then existing full check, coverage, build, package, browser, license/SPDX, identity, documentation and isolated packed-example gates. Record exact metric/protocol/target/test-source/engine versions and commit, test counts and CI head. Preserve previous assessment/evidence records; do not relabel old qualification with a new creator version. A metric or source change invalidates affected downstream evidence until rechecked.
27
+
28
+ ## Uncompleted acquisition and release qualification
29
+
30
+ Before claiming measured regional image detail in the new UI, independently qualify actual target/ROI truth, visible depth/occlusion, source and target licensing, coherent-frequency registration, native/crop/correction mapping, field/phase/orientation coverage, actual renderer/backend and source-stage/processing/decoder identity. Test the active backend against the independent analytic references, not against a second call to this engine. Record supported device/raster limits and source/destination artifacts with verified hashes. Procedural target generation and parser success alone are insufficient.
31
+
32
+ Noise requires separate linear/high-bit and same-realization versus ensemble evidence. Clipping requires explicit stage. Motion requires qualified trajectory/temporal accumulation. Halos, aliasing, compression and color require their own metric/protocol and stage-qualified evidence. Perceived visibility needs a reviewed contrast/perception model, luminance/contrast/observer domain, independently usable evidence and uncertainty treatment. No such capability is qualified by this first diagnostic.
33
+
34
+ For gallery, small-print, poster and distant-sign uses, verify immutable capture, same-scale physical proof geometry and actual output stage. These are scenarios within qualified envelopes, not one new chart per print size. Product accessibility, actual-device evidence and full consumer qualification remain separate. Public engine validation must stay runnable without private scenes.
35
+
36
+ Release remains blocked for every missing scoped capability. Publish the reviewed geometry/diagnostic contract before integration. Keep #196 open until full scoped evidence and human review are complete; this protocol does not close it or silently defer required assessment.
@@ -0,0 +1,75 @@
1
+ # Native-only Print planning
2
+
3
+ Published in package/root API **1.1.0**, Print model **0.1.0**; retained in the **1.2.0** candidate. This standalone browser-safe API answers native sampling sufficiency and the minimum compatible printer-file raster. It generates no pixels or files. See [API conventions](API_STYLE.md), [staged geometry](PHYSICS_FOUNDATION.md), [processed output](PROCESSED_OUTPUT.md) and the [historical 1.1.0 release review](RELEASE_1_1_0.md).
4
+
5
+ ## Authority and units
6
+
7
+ `source.kind: "native-retained"` declares an authoritative native grid and public capture ID. The planner validates geometry, not the truth of that declaration. Callers must bind it to the retained capture, never to a resized preview or processing enlargement. Existing `resolveCaptureGeometry()` owns orientation, native active capture, off-center output crop and optical-axis semantics. Available pixels are its **output crop dimensions**, before `outputRaster` resampling. Print planning changes no captured physics.
8
+
9
+ `printedImage` is the flat physical image area: excludes paper, borders and wrap. Lengths explicitly use mm, cm, inches or metres. An inch is exactly 25.4 mm. PPI counts image samples per printed inch; printer DPI, encoded byte size, JPEG quality, paper and ICC behavior are separate. Actual delivery, resource limits and perceived/source-detail quality remain `unassessed`.
10
+
11
+ ## Angular convention and equation
12
+
13
+ Viewing distance is independent of image size. At normal viewing of a flat image, a centered pixel of physical pitch `p` at distance `d` subtends `theta = 2 atan(p / (2d))`. In radians, `p_max = 2d tan(theta_max/2)` and `derived PPI = 25.4 / p_max` for millimetres. No small-angle approximation is substituted. Positive effective angles below 180 degrees are accepted mathematically; this broad geometry domain does not establish a visual-acuity model or useful guidance for extreme angles.
14
+
15
+ Choose a convention explicitly:
16
+
17
+ | Kind | Maximum effective pixel angle |
18
+ | --- | --- |
19
+ | `angular-pixel-pitch` | `maximumArcminutesPerPixel` |
20
+ | `angular-stroke` | `strokeWidthArcminutes / samplesPerStroke` |
21
+ | `angular-line-pair` | `periodArcminutes / samplesPerPeriod` |
22
+ | `manual-ppi` | No angular criterion; explicit independent density |
23
+
24
+ Stroke/period conventions divide the declared angular budget by the sample count by definition; they do not calculate the exact physical subdivision of a finite optotype on a flat image. That distinction matters for large angular extents. The exact centered-pixel equation then applies to the resulting per-pixel budget. Stroke sampling requires a positive integer sample count. A line-pair period includes a light and a dark stroke and requires at least two samples. A two-arcminute line pair with two samples is one arcminute per pixel; a one-arcminute period with two samples is half that pitch. Two samples are a declared sampling minimum, not a promise of preserved contrast. No acuity, universal 300 PPI, hidden safety multiplier or pixel-invisibility threshold is assumed. At 24 inches, a declared one-arcminute pixel criterion gives approximately 143.239447773 PPI. Angular guidance has `approximation` provenance because its use as a perceptual criterion is uncalibrated; the geometry envelope remains `calculated`. Manual PPI starts a new plan and certifies no previous angular criterion.
25
+
26
+ ## Integer policy, fit and sufficiency
27
+
28
+ The first policy preserves the **exact retained native raster aspect ratio**. Reduce native dimensions `(W,H)` by their greatest common divisor to integer `(a,b)`. For continuous required counts `(Rx,Ry)`, choose `k = max(1, ceil(Rx/a), ceil(Ry/b))`, then output `(ka,kb)`. This is the minimum sufficient integer raster **within the declared exact-ratio family**, not the unconstrained independently rounded pair. Coprime crop dimensions can require retaining the whole native grid even for a low-density request; this limitation is explicit. No search or hidden stretch is performed.
29
+
30
+ The physical printed-image ratio must agree with the confirmed crop within caller-declared `maximumRelativeAspectError` in `[0,0.01]`. Relative error is `abs((imageWidth/imageHeight)/(W/H) - 1)` and is returned. Zero demands exact represented equality. Nonzero tolerance explicitly accepts that small physical pitch difference between axes; per-axis achieved PPI and angular pitch expose it. Output resizing always uses one equal scale on both axes. An aspect mismatch returns `crop-confirmation-required`; choose and confirm a different crop or physical image size before replanning. The engine never silently crops or stretches.
31
+
32
+ Compare the same minimum raster with native retained supply on **both axes**. `sufficient` describes only coverage under the declared criterion. A shortfall yields no recommendation. Never count upsampled pixels as capacity. The recommendation reports integer raster, achieved PPI/angle and equal native resampling scales, all in the same model/API result. Output may only downsample or preserve native resolution.
33
+
34
+ ## Lab constraints, alternatives and bounds
35
+
36
+ Optional lab minimum/exact raster and minimum/exact PPI constrain delivery separately from angular guidance. All declared constraints are reconciled. Exact density must produce integral dimensions; exact raster must preserve native ratio, meet sampling/lab minima and not exceed either native axis. Contradiction or enlargement returns `provider-conflict` and no recommendation, even when native angular sufficiency is `sufficient`. The caller owns factual vendor requirements and downstream file validation; omission means unknown, not a universal lab default. Compatible lab minima may increase the minimum recommendation.
37
+
38
+ Alternatives report an aspect-preserving maximum image size at current distance and, for angular plans, a minimum distance at current image size. They retain the criterion and native supply. These are **sampling alternatives**; lab constraints require a new full plan and may remain conflicting. Manual density has no farther-distance solution. Boundary alternatives round outward by adjacent binary64 values and recheck the integer policy (at most eight steps); unsupported numerical cases return a blocker. This is representational rounding, not relaxed sampling or a safety factor.
39
+
40
+ `calculatePrintSizeLimit()` uses a reference plan and explicit distance policy. Fixed distance gives a finite conditional sampling bound. Proportional scaling of both image axes and distance leaves angular pixel pitch unchanged: the bound is `unbounded` if the reference meets the criterion, otherwise `no-positive-size`. Manual PPI supplies an independent finite bound. Size queries with lab constraints are explicitly `unsupported` in model 0.1.0; evaluate individual plans instead. No infinity sentinel is serialized and no finite printer/substrate bound is invented.
41
+
42
+ Malformed, unknown, zero, nonfinite or invalid inputs throw existing typed configuration/scientific errors. Missing native authority gives `cannot-assess`. Positive finite requests whose converted lengths, pitches, densities, diagnostics or safe-integer output cannot be represented give `unsupported`. Calculations use binary64; conservative ceil can change an exact mathematical angular boundary by a ratio unit. Manual count calculations preserve directly supplied inches rather than round-trip through pitch. No global epsilon turns a failed sampling criterion into success. Results contain only finite numbers and null semantic absences.
43
+
44
+ ## Complete packed example
45
+
46
+ ```ts
47
+ import { calculatePrintPlan, calculatePrintSizeLimit, type PrintPlanInput } from "@photivra/engine";
48
+ const input: PrintPlanInput = {
49
+ source: { kind: "native-retained", captureId: "example-capture", geometry: {
50
+ imagingArea: { widthMm: 32, heightMm: 18 },
51
+ nativeRaster: { pixelWidth: 2560, pixelHeight: 1440 }, orientation: "landscape"
52
+ } },
53
+ printedImage: { width: 16, height: 9, unit: "inches" },
54
+ viewingDistance: { value: 24, unit: "inches" },
55
+ sampling: { kind: "angular-pixel-pitch", maximumArcminutesPerPixel: 1 },
56
+ fit: { kind: "confirmed-native-aspect", maximumRelativeAspectError: 1e-12 }
57
+ };
58
+ const plan = calculatePrintPlan(input).value;
59
+ if (plan.status !== "ready" || plan.recommended?.raster.pixelWidth !== 2304 || plan.recommended.raster.pixelHeight !== 1296) throw new Error("Unexpected print raster");
60
+ const bound = calculatePrintSizeLimit({ plan: input, viewingDistancePolicy: "proportional-to-image-size" }).value;
61
+ if (bound.status !== "unbounded") throw new Error("Unexpected size bound");
62
+ console.log(plan.native?.pixelsPerInch, plan.recommended, bound.status);
63
+ ```
64
+
65
+ For untrusted requests use `parsePrintPlanInput()`. Calculation functions also parse/copy their inputs. No private assets, framework types, runtime dependencies, telemetry or source-plane reads are required. Preserve the returned capture/input/model/API binding when assembling output metadata; this API does not itself invoke the existing image exporter or attach serialization tags.
66
+
67
+ ## References and evidence
68
+
69
+ - [NIST length units](https://www.nist.gov/pml/owm/si-units-length): unit conversion reference.
70
+ - [Adobe image resolution](https://helpx.adobe.com/photoshop/desktop/crop-resize-transform/resize-adjust-resolution/printed-image-resolution.html): physical image dimensions versus pixel density.
71
+ - [University of Iowa acuity testing](https://webeye.ophth.uiowa.edu/eyeforum/video/Refraction/Visual-Acuity-Testing/index.htm): optotype critical stroke detail is distinct from a whole optotype. This motivates explicitly declared conventions; it supplies no universal print sampling/quality guarantee.
72
+
73
+ Implementation, prose and tests are original. References informed terminology and equations; no source tables, calibration, datasets or protected expression were incorporated. Independent tests cover the 160-PPI identity, high-precision angular reference, all orientations/off-center crop, ignored preview enlargement, unit and one-pixel boundaries, exact-ratio minimum search with fixed seed, lab conflicts, manual overrides, semantic bounds and invalid/extreme finite JSON. Human scientific/source/DCO review remains required before release. Advanced captured-detail/quality assessment remains separate (#196).
74
+
75
+ The 1.2.0 acceptance audit additionally exercises stamp, book, home, gallery, billboard and half-mile dimensions/distances through the same source and explicit criterion, plus a heavy retained crop and recovery after invalid edits. These are geometric examples, not claims about eyesight, text readability, substrate or file-export readiness. The core #195 contract was delivered in PR #210 and published in 1.1.0; historical references to an unpublished geometry candidate are superseded. Actual UI/task/device and JPEG-delivery acceptance belongs to the consuming product and its exporter evidence, rather than this pixel-free planning API.
@@ -0,0 +1,38 @@
1
+ # Regional linear Print statistics — model and protocol 0.1.0
2
+
3
+ These additive browser-safe protocols separate a registered processing difference from repeat-capture temporal sample variance. They extend #196's evidence work; they do not complete its acquisition, perception, subject/depth, motion or full release acceptance. The coherent detail diagnostic remains model 0.1.0 with its existing behavior.
4
+
5
+ ## Source and applicability
6
+
7
+ Each frame uses the existing Print source, explicit scalar relative-linear luminance domain, actual represented raster, half-open oriented retained ROI, capture/representation/content/processing identity, evidence and noise-realization identity. Source/ROI parsing shares the coherent diagnostic boundary. Arrays must be dense and finite. The total request contains at most 65,536 scalar samples, including every repeat or both members of a pair. A noise ensemble has 2 to 256 frames. This is a work bound, not a device performance claim.
8
+
9
+ The represented raster must preserve retained native aspect and cannot exceed either native axis. Native-stage rasters must match the retained native crop. Unqualified warps and non-linear/unknown domains are blocked. Registration compares the full parsed geometry, ROI and Print conditions conservatively. It does not resample or invent a correspondence. Different physical units expressing the same conditions must be normalized by the caller for a paired comparison. Insufficient native sampling or conflicting lab conditions remain visible in the returned Print plan; a sample statistic cannot repair delivery.
10
+
11
+ Hashes, numeric provenance, acquisition stationarity and independent repeats remain caller declarations. Successful parsing/calculation never verifies file contents, decoding, a license or physical calibration. Results freeze copied inputs, retain engine/model identity and explicitly return unassessed acquisition, unquantified uncertainty and no overall verdict. Changing any source, ROI, processing, acquisition or viewing condition requires a new assessment identity downstream.
12
+
13
+ ## Paired processing difference
14
+
15
+ `calculatePrintRegionDifference()` compares identical sample sites belonging to one immutable capture. Select either a declared deterministic reference (both noise IDs null) or the same explicitly named non-null noise realization. Distinct or unknown noise draws cannot be compared as processing-only change. No single noisy frame supplies a noise variance. A decoded-file comparison requires the pre-encode `post-resampling-linear` stage and the exact `post-encoding-decoded-linear` stage. The same representation ID with contradictory hash, stage or processing identity is blocked.
16
+
17
+ For differences `d_i = after_i - before_i`, return signed mean, `sqrt(sum(d_i²)/N)` and maximum absolute difference in relative-linear luminance. This measures the net change between supplied representations; it does not automatically attribute it to JPEG compression, classify artifacts or establish visibility. Exact pre/post-encode artifact binding and independent decoder qualification remain external evidence obligations. Comparisons at different rasters require an independently registered reference on identical sample sites; this protocol does no resizing.
18
+
19
+ An optional declared increasing reference signal range supplies below/above-range counts and maximum excursions for both representations separately. It can quantify known step-response undershoot/overshoot in an independently designed experiment. It is not an automatic halo detector. Existing source excursions remain visible. Range endpoints are neither sensor full well nor ADC/render clipping thresholds; boundary contact or excursions cannot establish a clipping mechanism. Color channels, gamut error, printer texture and natural-image quality remain unassessed.
20
+
21
+ ## Temporal repeat statistics
22
+
23
+ `calculatePrintRegionNoise()` consumes a declared stationary scene and independent capture repeats at identical registered sites, geometry and processing stage. Each repeat has its own capture, representation and non-null noise-realization identity. Reused identities, stage/processing differences and missing noise IDs block the calculation. Equal bytes in separate repeats are allowed: zero noise and quantized repeated values are valid observations. IDs cannot themselves prove independence or stationarity.
24
+
25
+ At each sample site compute the temporal mean and sample variance `sum((v_j - mean)²)/(n-1)`. Return those arrays, the mean of per-site temporal variances and its RMS, and the average site mean. The spatial variance of a textured image is deliberately not called temporal noise. Fixed-pattern variation, drift, correlations and nonstationarity need separate models. This protocol reports sample statistics, not an ensemble expectation, sensor SNR, a confidence interval or an uncertainty bound. It makes no Gaussian, Poisson or independent-pixel assumption for the statistic itself.
26
+
27
+ Normalize each site's values by the maximum absolute magnitude. Calculate the mean of offsets from the first repeat and center those offsets before restoring units. A rounded large-DC mean must not add false variance. Compensated accumulation and hypot norms reduce avoidable overflow/cancellation. Reject nonzero inputs/differences lost by normalization, nonfinite restored statistics and nonzero variance/RMS underflow. Supported numeric results are finite; unsupported numeric ranges return no measurement rather than zero or a fabricated uncertainty. No epsilon changes a measurement or sampling verdict.
28
+
29
+ ## Independent qualification protocol and rights
30
+
31
+ 1. Use an independently authored Python standard-library oracle with exact rational arithmetic for finite paired signals and repeat statistics. Commit its inputs, expected values and SHA-256. The reference must not import the engine or compute expected values from runtime outputs.
32
+ 2. Cover positive/signed/zero levels, correlated spatial texture with zero temporal noise, asymmetric/directional step overshoot, tiny values, large DC with representably small fluctuations, same/different realization policies, malformed inputs, missing/mismatched stages and the total work bound. Numeric tolerances qualify arithmetic on that bounded domain only.
33
+ 3. Execute the existing production charge/readout and image-formation functions for additional backend evidence. Preserve raw/linear/SDR/JPEG stage identity. Seed schedules and sample counts must be predeclared. Compare realizations against an independent distribution/processing reference; a synthetic target name alone does not qualify an active backend.
34
+ 4. Measure repeat-count and quadrature convergence independently before any physical or statistical claim. Record reference/backend/analysis versions and hashes, ROI, units, domain, source dimensions, conditions and pass/fail/unassessed state in the capability ledger. Publish observed conformance separately from human scientific/source review.
35
+
36
+ The [candidate review](PRINT_195_196_REVIEW.md#linearhigh-bit-electronic-readout-qualification) records actual public native RAW execution with an independently predicted 12-bit electronic reference. It separates storage/pre-ADC/digital clipping and signed read noise, and bounds decoded quantization effects without treating quantization as independent uniform noise. Its conditional neutral scalar encoding and declared electronic inputs do not establish physical photometry or sensor calibration.
37
+
38
+ All new equations are elementary paired differences and sample statistics, authored independently. New procedural signals and reference code are Photivra draft material under Apache-2.0, subject to human scientific/source and DCO review. No external numeric curve, camera profile, dataset, runtime dependency or private scene is incorporated. The researched [castleCSF primary paper](https://pmc.ncbi.nlm.nih.gov/articles/PMC10996938/) and [upstream repository](https://github.com/gfxdisp/castleCSF) describe a possible later perceptual model; neither its code, coefficients nor observations are included by these protocols. A perceptual application needs its own license/source audit, stimulus/observer/luminance/area/eccentricity matching and independent validation. These statistics cannot supply that qualification.
@@ -1,6 +1,6 @@
1
1
  # Processed camera output
2
2
 
3
- Release context: **package 1.0.1 candidate / root API 1.0.1**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0_1.md).
3
+ Release context: **package 1.2.0 candidate / root API 1.2.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_2_0.md).
4
4
 
5
5
  Root API 0.115.0 completes the bounded SDR post-capture handoff for #112.
6
6
  Production plan 0.6.0 adds explicit committed RAW processing. At introduction, package 0.6.0,
@@ -1,6 +1,6 @@
1
1
  # Production Image-Formation Plan
2
2
 
3
- Release context: **package 1.0.1 candidate / root API 1.0.1**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0_1.md).
3
+ Release context: **package 1.2.0 candidate / root API 1.2.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_2_0.md).
4
4
 
5
5
  Photivra's production composition layer is separate from the legacy
6
6
  `simulatePocCamera()` proof-of-concept API.
@@ -1,6 +1,6 @@
1
1
  # Executed environment production capture
2
2
 
3
- Release context: **package 1.0.1 candidate / root API 1.0.1**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0_1.md).
3
+ Release context: **package 1.2.0 candidate / root API 1.2.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_2_0.md).
4
4
 
5
5
  Introduced at root API 0.116.0 and production plan 0.7.0, this adds a bounded source-to-RAW route
6
6
  inside the existing authoritative image-formation graph. Consumer manifest
@@ -1,6 +1,6 @@
1
1
  # Scientific and Source Provenance
2
2
 
3
- Release context: **package 1.0.1 candidate / root API 1.0.1**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0_1.md).
3
+ Release context: **package 1.2.0 candidate / root API 1.2.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_2_0.md).
4
4
 
5
5
  Every scientific or calculation module in this repository must have a traceable, legally clean origin.
6
6
 
@@ -1,6 +1,6 @@
1
1
  # PSF and Pupil Foundation
2
2
 
3
- Release context: **package 1.0.1 candidate / root API 1.0.1**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0_1.md).
3
+ Release context: **package 1.2.0 candidate / root API 1.2.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_2_0.md).
4
4
 
5
5
  Photivra has two complementary PSF layers.
6
6
 
@@ -98,6 +98,8 @@ It is a focus/PSF quantity. It does not modify geometric distortion, lateral CA,
98
98
 
99
99
  `calculateLensComplexPupilPsf()` performs deterministic scalar Fraunhofer propagation of that complex pupil.
100
100
 
101
+ The optional `propagationDistanceMm` explicitly sets the physical image sample pitch `wavelengthMm * propagationDistanceMm / (pupilSampleCount * pupilPitchMm)` per axis. The result returns the resolved distance and whether it was explicit. Omission preserves the existing nominal focal-plane reference using `focalLengthMm`; finite-focus profile metadata alone does not replace that scale. For an owned ideal thin-lens principal-plane fixture, resolve the finite image distance with `calculateThinLensImageDistance()` and pass it explicitly. A real exit-pupil geometry requires its own qualified distance and applicability evidence. Model 1.1.0 adds this input/result binding without changing the legacy kernel values. Pupil schema remains 0.1.0.
102
+
101
103
  This path evaluates diffraction and aberration in one pupil calculation. Do not stack another independent Airy or diffraction blur over its output.
102
104
 
103
105
  The output intensity PSF is normalized to unit energy.
@@ -148,6 +150,14 @@ The sampled-profile contract can be consumed by both preview and reference paths
148
150
 
149
151
  The complex-pupil scalar Fraunhofer evaluator is a deterministic reference calculation. A preview implementation may use a validated approximation, but it must preserve the same profile semantics, field orientation, throughput ownership and limitations.
150
152
 
153
+ ## Independent pupil sampling pilot
154
+
155
+ The candidate Print qualification includes `test/print-depth-pupil-convergence.test.ts`. A separately authored factored finite DFT and continuous shifted-complex-pupil overlap integral compare the actual public backend at 25 cycles/mm, 500 nm, focus 5 m, subject distances 2/5/10 m and f/8,16,32. The focused continuous integral also agrees with the analytic ideal circular-pupil transfer. Independent Simpson evaluations at 4,096 and 16,384 intervals differ by less than `1e-11` for this domain.
156
+
157
+ An unpadded pupil grid can sample intensity too coarsely even when amplitude propagation is numerically correct. Increasing pupil resolution without expanding the zero-padded grid does not necessarily converge to continuous intensity transfer. The historical 9×9 finite reference has absolute transfer errors exceeding 0.14 in the f/32 cases. Those finite reference outputs remain unchanged and are not physical convergence evidence.
158
+
159
+ The pilot separately varies pupil resolution and padding: padded grids 9/17/33/61 with pupil-radius samples 2/4/8/15. Errors need not decrease monotonically at each finite circular-boundary raster. The final 61×61 grid has absolute transfer error below 0.01 at the tested frequency for all nine combinations. This is a candidate computational criterion informed by the pilot, not a predeclared physical calibration tolerance, quality threshold, all-frequency certificate, support-truncation guarantee for other stimuli, or real-lens validation. The declared finite pupil contract and its bounds remain unchanged. New frequencies, source support, fields, profiles or imaging domains require their own independent evidence.
160
+
151
161
  ## No scalar lens quality
152
162
 
153
163
  Photivra does not produce a universal lens sharpness or bokeh-quality score.
@@ -1,6 +1,6 @@
1
1
  # Reference RAW frame compatibility
2
2
 
3
- Release context: **package 1.0.1 candidate / root API 1.0.1**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0_1.md).
3
+ Release context: **package 1.2.0 candidate / root API 1.2.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_2_0.md).
4
4
 
5
5
  A valid RAW attachment does not establish readiness for reconstruction or paired
6
6
  export. The limits below apply to the current browser-safe reference adapters,
@@ -1,6 +1,6 @@
1
1
  # Same-RAW reconstruction handoff (#16C)
2
2
 
3
- Release context: **package 1.0.1 candidate / root API 1.0.1**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0_1.md).
3
+ Release context: **package 1.2.0 candidate / root API 1.2.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_2_0.md).
4
4
 
5
5
  See [Reference RAW frame compatibility](RAW_FRAME_ENVELOPE.md) for stage-specific
6
6
  limits, full-native counting and parser preflight behavior.
@@ -0,0 +1,25 @@
1
+ # 1.1.0 candidate review and migration
2
+
3
+ This is an additive, unpublished candidate after the 1.0.1 baseline. Package version and root `ENGINE_API_VERSION` are both 1.1.0. New standalone Print APIs are documented in [Print planning](PRINT_PLANNING.md). No existing scientific API is removed or reinterpreted; POC, capture schemas, formation graph and production-plan versions remain unchanged.
4
+
5
+ New capture/plan records created by this candidate carry root creator identity 1.1.0 and their hashes may change. Historical captures, qualified fixture files, measured artifacts and earlier release documents retain their original identities. A version bump is not renewed scientific qualification or printer-quality evidence. Use the exact reviewed release and its packaged documentation; this candidate is not yet available on npm.
6
+
7
+ Required review: public contract and exact-ratio policy, angular convention, independent numerical/geometry evidence, source/reuse rights, native-authority binding, no-upscale provider conflicts, backward compatibility and substantive human review of AI-assisted draft material. Review all DCO sign-offs before inclusion. Print planning does not activate exporting, perceived-quality assessment or production rendering.
8
+
9
+ Run the existing release gates without weakening them:
10
+
11
+ ```sh
12
+ npm ci
13
+ npm run check
14
+ npm run coverage
15
+ npm run build
16
+ npm run pack:check
17
+ npm run docs:check
18
+ npm run release:consumer-check
19
+ ```
20
+
21
+ Regenerate the root reference with `node scripts/generate-api-reference.mjs`. Strict examples run from an isolated packed ESM consumer with no source deep imports or runtime dependencies. Review CI across supported Node versions and inspect the actual package before owner tag/publication. The prior [1.0.1 procedure](RELEASE_1_0_1.md) remains historical; use 1.1.0 identities for this candidate and do not republish an existing version. Merge, tag and npm publication are separate owner decisions. No such action is performed by preparing this draft.
22
+
23
+ ## Bounded diagnostic extension
24
+
25
+ The stacked #196 first slice adds the [regional coherent-grating diagnostic](PRINT_DETAIL_ASSESSMENT.md) and [independent protocol](PRINT_DETAIL_VALIDATION.md) to this unpublished candidate without changing Print model 0.1.0 or existing contracts. It validates mathematical coefficients and reference geometry only; acquired-image/backend, noise/artifact/perception and full scoped Print-release acceptance remain blocked in the ledger. Preparing or publishing the diagnostic must not imply those qualifications are complete. Reconcile candidate contents and human review before tagging; no 1.1.0 distribution has been published by this work.
@@ -0,0 +1,51 @@
1
+ # 1.2.0 candidate review and migration
2
+
3
+ The additive package/root candidate is `@photivra/engine@1.2.0`. npm registry verification on 2026-10-03 found published 1.1.0 as the baseline; 1.2.0 was absent. This change prepares an unused minor release, without moving an existing tag or overwriting a distribution. Review the [native SDR contract](NATIVE_CAPTURE_SDR.md) and [validation evidence](NATIVE_CAPTURE_SDR_VALIDATION.md).
4
+
5
+ ## Compatibility
6
+
7
+ Existing public APIs, small inline reference guards and scientific equations remain unchanged. The new metadata-only tiled executor supports explicitly resolved external linear-sRGB/D65 masters up to 24 MP, with bounded tile storage and single-transfer 8/16-bit output. It is not general scalable XYZ/WB/RAW/correction/resampling/JPEG execution. It does not activate production-plan stages, qualify producers/devices or complete Print quality acceptance. Existing post-1.1.0 bounded regional Print diagnostic work on main retains its stated limits and separate #196 qualification gates.
8
+
9
+ Package version, lock root, citation and `ENGINE_API_VERSION` are aligned at 1.2.0. Newly created capture/plan records carry this creator identity and their serialized identities/fingerprints/hashes may change. Archived captures retain the original creator identity, and historical fixtures/hashes/measurement records remain unchanged. Native SDR schema 0.1.0, capture/model/POC/production-plan versions remain independent. JPEG golden regression replays the manifest-recorded creator version through the existing archive parser; it also verifies current exports record the actual current creator and preserve integer pixels. Historical JPEG bytes/hashes and independent decoder records are not regenerated. Old consumers continue using their existing APIs; new consumers must import the reviewed 1.2.0 root surface rather than deep imports.
10
+
11
+ ## Review and checks
12
+
13
+ Substantive human scientific/source review must cover supported color/WB states, source authentication/provider restrictions, geometry identity, typed-buffer ownership, cancellation/draining, measured resource limits, unchanged reference arithmetic and compatibility. Review contribution-specific DCO certification. An AI draft does not certify reusable source rights, device performance or calibration.
14
+
15
+ PR #216 received human scientific/source and contribution-specific DCO approval and was squash merged as `5dfb9a24c683dad5529cbd579ffecf2baeec2c27`. Its reviewed tree and supported Node CI were verified. The [technical review record](NATIVE_CAPTURE_SDR_REVIEW.md) preserves the evidence history. The follow-up strengthened float32/float64 policy parity, orientation pixels, pending WB/shared-buffer rejection, host-yield cancellation and maximum 24 MP/16-bit measurements. No tag or package was published.
16
+
17
+ The subsequent combined #195/#196 work received separate owner scientific/source and DCO approval at head `43e4e9e4baac90f7b16c6e068b7964c0546a8134` and was squash merged as `c58d9eb9dcba807f020df45be1ed5ec4f6c081e4` in [PR #217](https://github.com/Photivra/photivra/pull/217). The approved tree is preserved, all 2,065 tests pass and post-merge CI is green on all four supported Node versions. #195 is complete. The old [candidate review record](PRINT_195_196_REVIEW.md) preserves its pre-approval evidence. The follow-up [engine #196 acceptance audit](PRINT_196_ENGINE_ACCEPTANCE.md) adds patterned-source native-capture qualification and separates engine acceptance from the still-required app acquisition/proof/accessibility/device gates. That additional scientific/source material needs review and DCO certification before #196 engine acceptance; the requested engine release remains held for that acceptance and explicit publication approval. Full new-UI qualification remains outstanding in its app owners.
18
+
19
+ Run from the exact candidate tree, then require green supported Node 22.13/22/24/26 CI:
20
+
21
+ ```sh
22
+ npm ci --ignore-scripts
23
+ npm run check
24
+ npm run coverage
25
+ npm run build
26
+ node scripts/generate-api-reference.mjs --check
27
+ npm run docs:check
28
+ npm run release:consumer-check
29
+ npm run pack:check
30
+ npm run bench:image-formation:built
31
+ node --expose-gc scripts/benchmark-native-capture-sdr.mjs
32
+ ```
33
+
34
+ No gates or thresholds are weakened. Benchmark results are host-specific observations; device/provider/master/encoder memory must be measured separately before app activation.
35
+
36
+ ## Owner publication
37
+
38
+ After human review and merge, verify final-main CI and the approved candidate tree. Confirm protected main/tag rules and npm trusted publishing are configured. Replace `FINAL_MAIN_SHA` below with the verified final merged commit. Recheck that 1.2.0 remains unused. This PR creates no tag and publishes no package.
39
+
40
+ ```sh
41
+ git fetch origin main --tags
42
+ git switch main
43
+ git pull --ff-only origin main
44
+ test "$(git rev-parse HEAD)" = "FINAL_MAIN_SHA"
45
+ test "$(git rev-parse origin/main)" = "FINAL_MAIN_SHA"
46
+ test "$(node -p "require('./package.json').version")" = "1.2.0"
47
+ git tag -a v1.2.0 FINAL_MAIN_SHA -m "Photivra engine 1.2.0"
48
+ git push origin refs/tags/v1.2.0
49
+ ```
50
+
51
+ The existing protected workflow verifies tag/main/version and release gates, produces the verified tarball, checks its SHA-256 and uses OIDC to publish only an absent version. Observe completion, verify npm 1.2.0 metadata/tarball integrity, then create the matching GitHub release with the approved changes and evidence. Preserve publication failures for investigation; do not bypass gates, move tags or mutate a published version. #215's publication acceptance remains pending until the reviewed distribution exists.
@@ -1,6 +1,6 @@
1
1
  # Scene Radiance and Illumination
2
2
 
3
- Release context: **package 1.0.1 candidate / root API 1.0.1**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0_1.md).
3
+ Release context: **package 1.2.0 candidate / root API 1.2.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_2_0.md).
4
4
 
5
5
  Photivra separates **illumination-source metadata** from **outgoing scene spectral radiance**.
6
6
 
@@ -1,6 +1,6 @@
1
1
  # Declared scene radiance to sensor irradiance nodes
2
2
 
3
- Release context: **package 1.0.1 candidate / root API 1.0.1**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0_1.md).
3
+ Release context: **package 1.2.0 candidate / root API 1.2.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_2_0.md).
4
4
 
5
5
  `calculateSceneToSensorIrradianceQuadrature()` connects the existing #85 scene
6
6
  request/result boundary and #110 paraxial optical bridge to the Cartesian nodes
@@ -1,6 +1,6 @@
1
1
  # Declared temporal scene radiance to sensor EQE
2
2
 
3
- Release context: **package 1.0.1 candidate / root API 1.0.1**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0_1.md).
3
+ Release context: **package 1.2.0 candidate / root API 1.2.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_2_0.md).
4
4
 
5
5
  `calculateSceneSensorEqeTemporalExposure()` composes the existing scene-to-sensor
6
6
  optical quadrature and temporal EQE calculation. It evaluates optics, response
@@ -1,6 +1,6 @@
1
1
  # Scientific Assurance and Uncertainty Composition
2
2
 
3
- Release context: **package 1.0.1 candidate / root API 1.0.1**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0_1.md).
3
+ Release context: **package 1.2.0 candidate / root API 1.2.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_2_0.md).
4
4
 
5
5
  Photivra keeps **scientific status**, **source evidence**, **uncertainty**, **limitations**, and **reproducibility identity** as related but distinct concepts.
6
6
 
@@ -1,6 +1,6 @@
1
1
  # Scientific conformance: final V1 disposition (#131)
2
2
 
3
- Release context: **package 1.0.1 candidate / root API 1.0.1**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0_1.md).
3
+ Release context: **package 1.2.0 candidate / root API 1.2.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_2_0.md).
4
4
 
5
5
  The cross-stage conformance layer complements, rather than replaces, narrow unit tests. `test/cross-stage-conformance.test.ts` consumes #130's canonical owned fixture and merged public APIs only. It checks a coherent ideal-focus/projection→FOV/object-size→pixel-motion/defocus path, then controlled one-stop shutter and aperture variants across exposure, motion and diffraction.
6
6
 
@@ -1,6 +1,6 @@
1
1
  # Standalone SDR rendering primitives: #112A
2
2
 
3
- Release context: **package 1.0.1 candidate / root API 1.0.1**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0_1.md).
3
+ Release context: **package 1.2.0 candidate / root API 1.2.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_2_0.md).
4
4
 
5
5
  Current integration: [processed camera output](PROCESSED_OUTPUT.md) documents
6
6
  the shared preview/export path and explicit plan 0.6.0 post-RAW activation.
@@ -1,6 +1,6 @@
1
1
  # Sensor support to environment radiance query
2
2
 
3
- Release context: **package 1.0.1 candidate / root API 1.0.1**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0_1.md).
3
+ Release context: **package 1.2.0 candidate / root API 1.2.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_2_0.md).
4
4
 
5
5
  `calculateSensorEnvironmentRadianceQuery()` derives a renderer-neutral environment
6
6
  radiance request from an explicitly supplied physical sensor support point. It
@@ -1,6 +1,6 @@
1
1
  # Irradiance to stationary EQE local exposure
2
2
 
3
- Release context: **package 1.0.1 candidate / root API 1.0.1**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0_1.md).
3
+ Release context: **package 1.2.0 candidate / root API 1.2.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_2_0.md).
4
4
 
5
5
  `calculateSensorEqeLocalExposure()` is a bounded sensor-layer composition. It
6
6
  accepts explicit physical spectral irradiance samples in **W/m²/nm**, not RGB,
@@ -1,6 +1,6 @@
1
1
  # Nonstationary EQE exposure quadrature
2
2
 
3
- Release context: **package 1.0.1 candidate / root API 1.0.1**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0_1.md).
3
+ Release context: **package 1.2.0 candidate / root API 1.2.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_2_0.md).
4
4
 
5
5
  `calculateSensorEqeTemporalExposure()` evaluates physical spectral irradiance at
6
6
  explicit local shutter midpoints, validates sensor response at every instant,
@@ -1,6 +1,6 @@
1
1
  # Local sampled-PSF sensor quadrature
2
2
 
3
- Release context: **package 1.0.1 candidate / root API 1.0.1**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0_1.md).
3
+ Release context: **package 1.2.0 candidate / root API 1.2.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_2_0.md).
4
4
 
5
5
  `calculateSensorPsfIrradianceQuadrature()` applies the existing #113 sampled PSF
6
6
  resolver to incident spectral irradiance at each pre-AA sensor quadrature point.
@@ -1,6 +1,6 @@
1
1
  # Native sensor RAW frame attachment
2
2
 
3
- Release context: **package 1.0.1 candidate / root API 1.0.1**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0_1.md).
3
+ Release context: **package 1.2.0 candidate / root API 1.2.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_2_0.md).
4
4
 
5
5
  See [Reference RAW frame compatibility](RAW_FRAME_ENVELOPE.md) for stage-specific
6
6
  limits, full-native counting and parser preflight behavior.
@@ -1,6 +1,6 @@
1
1
  # Capture-owned native sensor RAW producer
2
2
 
3
- Release context: **package 1.0.1 candidate / root API 1.0.1**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0_1.md).
3
+ Release context: **package 1.2.0 candidate / root API 1.2.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_2_0.md).
4
4
 
5
5
  See [Reference RAW frame compatibility](RAW_FRAME_ENVELOPE.md) for stage-specific
6
6
  limits, full-native counting and parser preflight behavior.
@@ -1,6 +1,6 @@
1
1
  # Signal cross-domain conformance (#131B)
2
2
 
3
- Release context: **package 1.0.1 candidate / root API 1.0.1**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0_1.md).
3
+ Release context: **package 1.2.0 candidate / root API 1.2.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_2_0.md).
4
4
 
5
5
  `test/signal-conformance.test.ts` independently covers merged public APIs without consuming unmerged capture, output, optics or tier work. It complements the geometric conformance draft rather than depending on it. The canonical #130 fixture supplies wavelength and reference aperture/shutter/ISO settings; its source irradiance is **not** silently treated as detector energy.
6
6
 
@@ -1,6 +1,6 @@
1
1
  # Authoritative simulated capture: #15A/#15B
2
2
 
3
- Release context: **package 1.0.1 candidate / root API 1.0.1**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0_1.md).
3
+ Release context: **package 1.2.0 candidate / root API 1.2.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_2_0.md).
4
4
 
5
5
  The container commits a format-neutral float master manifest before tone mapping/LDR conversion. It does not itself generate or convert pixels. The separate [#15B color API](CAPTURE_COLOR.md) converts supported planes and [#15C encoding API](LINEAR_CAPTURE_ENCODING.md) quantizes them without mutating the master. TIFF/DNG serialization and production-stage activation remain separate. #15, #112 and #16 are merged. Their explicit adapters own rendering and paired export; the container alone performs neither.
6
6
 
@@ -1,6 +1,6 @@
1
1
  # Camera Shake and Stabilization
2
2
 
3
- Release context: **package 1.0.1 candidate / root API 1.0.1**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0_1.md).
3
+ Release context: **package 1.2.0 candidate / root API 1.2.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_2_0.md).
4
4
 
5
5
  Photivra separates deterministic projection geometry from a deliberately simplified educational stabilization model.
6
6
 
@@ -1,6 +1,6 @@
1
1
  # Temporal EQE photo signal to native RAW
2
2
 
3
- Release context: **package 1.0.1 candidate / root API 1.0.1**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0_1.md).
3
+ Release context: **package 1.2.0 candidate / root API 1.2.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_2_0.md).
4
4
 
5
5
  Root API **0.110.0** adds `createSensorEqeTemporalPhotoSignal()` and
6
6
  `parseSensorEqeTemporalPhotoSignal()`. RAW producer result schema is **0.3.0**.