@photivra/engine 1.0.0 → 1.1.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 (217) hide show
  1. package/AGENTS.md +3 -3
  2. package/CHANGELOG.md +12 -0
  3. package/CITATION.cff +1 -1
  4. package/CONTRIBUTING.md +3 -3
  5. package/NODE_SUPPORT.md +9 -9
  6. package/README.md +9 -7
  7. package/SECURITY.md +1 -1
  8. package/dist/core/version.d.ts +6 -11
  9. package/dist/core/version.d.ts.map +1 -1
  10. package/dist/core/version.js +6 -11
  11. package/dist/core/version.js.map +1 -1
  12. package/dist/index.d.ts +4 -0
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +2 -0
  15. package/dist/index.js.map +1 -1
  16. package/dist/output/print-detail.d.ts +106 -0
  17. package/dist/output/print-detail.d.ts.map +1 -0
  18. package/dist/output/print-detail.js +215 -0
  19. package/dist/output/print-detail.js.map +1 -0
  20. package/dist/output/print-plan.d.ts +138 -0
  21. package/dist/output/print-plan.d.ts.map +1 -0
  22. package/dist/output/print-plan.js +305 -0
  23. package/dist/output/print-plan.js.map +1 -0
  24. package/docs/API_REFERENCE.md +38 -1
  25. package/docs/API_STYLE.md +11 -7
  26. package/docs/ARCHITECTURE.md +1 -1
  27. package/docs/AUTOMATION_COORDINATION.md +1 -1
  28. package/docs/CAPTURE_COLOR.md +1 -1
  29. package/docs/CAPTURE_CORRECTED_SDR.md +1 -1
  30. package/docs/CAPTURE_EXPORT_METADATA.md +1 -1
  31. package/docs/CAPTURE_SDR.md +1 -1
  32. package/docs/DEVELOPERS.md +12 -6
  33. package/docs/DIGITAL_OPTICS_FOUNDATION.md +1 -1
  34. package/docs/ENVIRONMENT_RAW_CAPTURE.md +1 -1
  35. package/docs/EXPORT_ACCEPTANCE.md +1 -1
  36. package/docs/GENERIC_TIER_PRESETS.md +2 -2
  37. package/docs/GEOMETRIC_PREPARATION_REUSE.md +1 -1
  38. package/docs/IMAGE_FORMATION.md +1 -1
  39. package/docs/LINEAR_CAPTURE_ENCODING.md +1 -1
  40. package/docs/MOTION_AND_SIGNAL.md +1 -1
  41. package/docs/NUMERICAL_CORRECTNESS.md +1 -1
  42. package/docs/PERFORMANCE_BASELINE.md +1 -1
  43. package/docs/PHOTOGRAPHIC_EXPORT.md +1 -1
  44. package/docs/PHYSICS_FOUNDATION.md +1 -1
  45. package/docs/POC_API.md +1 -1
  46. package/docs/POC_PROJECTION_PLATFORM_REFERENCE.md +12 -0
  47. package/docs/POC_PROJECTION_REUSE.md +1 -1
  48. package/docs/PRINT_DETAIL_ASSESSMENT.md +81 -0
  49. package/docs/PRINT_DETAIL_SDR_EVIDENCE.md +29 -0
  50. package/docs/PRINT_DETAIL_VALIDATION.md +36 -0
  51. package/docs/PRINT_PLANNING.md +73 -0
  52. package/docs/PROCESSED_OUTPUT.md +1 -1
  53. package/docs/PRODUCTION_COMPOSITION.md +1 -1
  54. package/docs/PRODUCTION_ENVIRONMENT_CAPTURE.md +3 -3
  55. package/docs/PROVENANCE.md +1 -1
  56. package/docs/PSF_FOUNDATION.md +1 -1
  57. package/docs/RAW_FRAME_ENVELOPE.md +1 -1
  58. package/docs/RAW_FRAME_RECONSTRUCTION.md +2 -2
  59. package/docs/RELEASE_1_0.md +1 -0
  60. package/docs/RELEASE_1_0_1.md +61 -0
  61. package/docs/RELEASE_1_1_0.md +25 -0
  62. package/docs/RELEASE_AUDIT.md +1 -0
  63. package/docs/SCENE_RADIANCE_AND_ILLUMINATION.md +1 -1
  64. package/docs/SCENE_SENSOR_QUADRATURE.md +1 -1
  65. package/docs/SCENE_SENSOR_TEMPORAL_EXPOSURE.md +1 -1
  66. package/docs/SCIENTIFIC_ASSURANCE.md +1 -1
  67. package/docs/SCIENTIFIC_CONFORMANCE.md +1 -1
  68. package/docs/SDR_RENDERING.md +2 -2
  69. package/docs/SENSOR_ENVIRONMENT_QUERY.md +1 -1
  70. package/docs/SENSOR_EQE_LOCAL_EXPOSURE.md +1 -1
  71. package/docs/SENSOR_EQE_TEMPORAL_EXPOSURE.md +1 -1
  72. package/docs/SENSOR_PSF_QUADRATURE.md +1 -1
  73. package/docs/SENSOR_RAW_FRAME.md +2 -2
  74. package/docs/SENSOR_RAW_PRODUCER.md +1 -1
  75. package/docs/SIGNAL_CONFORMANCE.md +1 -1
  76. package/docs/SIMULATED_CAPTURE.md +1 -1
  77. package/docs/STABILIZATION.md +1 -1
  78. package/docs/TEMPORAL_PHOTO_RAW.md +1 -1
  79. package/docs/TIER_ACCEPTANCE.md +1 -1
  80. package/docs/TIER_PRESET_ACCEPTANCE.md +2 -2
  81. package/docs/USAGE.md +7 -1
  82. package/docs/V1_COMPOSITION_MAP.md +2 -2
  83. package/docs/V1_HELPER_REUSE_REVIEW.md +1 -1
  84. package/docs/V1_PERFORMANCE_DISPOSITION.md +1 -1
  85. package/docs/api/camera-equivalent-focal-length.md +1 -1
  86. package/docs/api/camera-field-of-view.md +1 -1
  87. package/docs/api/camera-projected-object-size.md +1 -1
  88. package/docs/api/capture-capture-export-metadata.md +1 -1
  89. package/docs/api/capture-environment-raw-producer.md +1 -1
  90. package/docs/api/capture-focus-control.md +1 -1
  91. package/docs/api/capture-linear-encoding.md +1 -1
  92. package/docs/api/capture-photographic-export.md +1 -1
  93. package/docs/api/capture-raw-frame-reconstruction.md +1 -1
  94. package/docs/api/capture-release-sequence.md +1 -1
  95. package/docs/api/capture-sensor-raw-frame.md +1 -1
  96. package/docs/api/capture-sensor-raw-producer.md +1 -1
  97. package/docs/api/capture-simulated-capture.md +1 -1
  98. package/docs/api/color-capture-color.md +1 -1
  99. package/docs/api/color-white-balance.md +1 -1
  100. package/docs/api/composition-image-formation-plan.md +1 -1
  101. package/docs/api/composition-plan-consumer.md +1 -1
  102. package/docs/api/core-calculation-result.md +1 -1
  103. package/docs/api/core-configuration-error.md +1 -1
  104. package/docs/api/core-image-formation.md +1 -1
  105. package/docs/api/core-scientific-assurance.md +1 -1
  106. package/docs/api/core-spectral-composition.md +1 -1
  107. package/docs/api/core-spectral.md +1 -1
  108. package/docs/api/core-validation.md +1 -1
  109. package/docs/api/core-version.md +6 -6
  110. package/docs/api/equipment-exposure-capabilities.md +1 -1
  111. package/docs/api/equipment-generic-tier-assets.md +1 -1
  112. package/docs/api/equipment-generic-tier-presets.md +1 -1
  113. package/docs/api/equipment-iso-capabilities.md +1 -1
  114. package/docs/api/equipment-metering-capabilities.md +1 -1
  115. package/docs/api/equipment-release-capabilities.md +1 -1
  116. package/docs/api/exports.json +117 -2
  117. package/docs/api/exposure-exposure-duration-control.md +1 -1
  118. package/docs/api/exposure-exposure-mode-resolver.md +1 -1
  119. package/docs/api/exposure-exposure.md +1 -1
  120. package/docs/api/exposure-flash.md +1 -1
  121. package/docs/api/exposure-metering-scene-radiance.md +1 -1
  122. package/docs/api/exposure-metering-target.md +1 -1
  123. package/docs/api/exposure-metering-temporal.md +1 -1
  124. package/docs/api/exposure-metering.md +1 -1
  125. package/docs/api/exposure-program-line.md +1 -1
  126. package/docs/api/motion-camera-rotation.md +1 -1
  127. package/docs/api/motion-capture-rotation-inverse-mapping.md +1 -1
  128. package/docs/api/motion-capture-rotation-temporal-quadrature.md +1 -1
  129. package/docs/api/motion-capture-rotation-trajectory.md +1 -1
  130. package/docs/api/motion-capture-translation-parallax-temporal-quadrature.md +1 -1
  131. package/docs/api/motion-extended-object-projection.md +1 -1
  132. package/docs/api/motion-projected-motion.md +1 -1
  133. package/docs/api/optics-aperture.md +1 -1
  134. package/docs/api/optics-circle-of-confusion.md +1 -1
  135. package/docs/api/optics-complex-pupil-psf.md +1 -1
  136. package/docs/api/optics-depth-of-field.md +1 -1
  137. package/docs/api/optics-diffraction.md +1 -1
  138. package/docs/api/optics-focus-breathing.md +1 -1
  139. package/docs/api/optics-focus-state.md +1 -1
  140. package/docs/api/optics-front-of-lens-filter.md +1 -1
  141. package/docs/api/optics-illumination-vignetting.md +1 -1
  142. package/docs/api/optics-lateral-chromatic-aberration.md +1 -1
  143. package/docs/api/optics-lens-psf-profile.md +1 -1
  144. package/docs/api/optics-polygon-diffraction.md +1 -1
  145. package/docs/api/optics-profile-contract.md +1 -1
  146. package/docs/api/optics-psf-foundation.md +1 -1
  147. package/docs/api/optics-radial-distortion.md +1 -1
  148. package/docs/api/optics-scene-to-sensor-irradiance.md +1 -1
  149. package/docs/api/optics-scene-to-sensor-quadrature.md +1 -1
  150. package/docs/api/optics-sensor-environment-query.md +1 -1
  151. package/docs/api/optics-sensor-psf-quadrature.md +1 -1
  152. package/docs/api/optics-stray-light.md +1 -1
  153. package/docs/api/optics-thin-lens.md +1 -1
  154. package/docs/api/output-capture-corrected-sdr.md +1 -1
  155. package/docs/api/output-capture-geometry.md +1 -1
  156. package/docs/api/output-capture-sdr.md +1 -1
  157. package/docs/api/output-crop.md +1 -1
  158. package/docs/api/output-geometric-transforms.md +1 -1
  159. package/docs/api/output-lens-corrections.md +1 -1
  160. package/docs/api/output-print-detail.md +147 -0
  161. package/docs/api/output-print-plan.md +165 -0
  162. package/docs/api/output-sdr-rendering.md +1 -1
  163. package/docs/api/output-subject-framing-crop.md +1 -1
  164. package/docs/api/schema-camera.md +1 -1
  165. package/docs/api/schema-illumination-spectral.md +1 -1
  166. package/docs/api/schema-illumination-temporal.md +1 -1
  167. package/docs/api/schema-illumination.md +1 -1
  168. package/docs/api/schema-scene-radiance-temporal.md +1 -1
  169. package/docs/api/schema-scene-radiance.md +1 -1
  170. package/docs/api/schema-scene.md +1 -1
  171. package/docs/api/schema-validation.md +1 -1
  172. package/docs/api/sensor-accumulated-charge.md +1 -1
  173. package/docs/api/sensor-architecture.md +1 -1
  174. package/docs/api/sensor-camera-saturation-capacity.md +1 -1
  175. package/docs/api/sensor-capture-color-sampling-binding.md +1 -1
  176. package/docs/api/sensor-capture-mode-timing.md +1 -1
  177. package/docs/api/sensor-capture-mode.md +1 -1
  178. package/docs/api/sensor-color-sampling.md +1 -1
  179. package/docs/api/sensor-constant-rate-temporal-integration.md +1 -1
  180. package/docs/api/sensor-dark-current.md +1 -1
  181. package/docs/api/sensor-environment-photo-signal.md +1 -1
  182. package/docs/api/sensor-eqe-electron-rate.md +1 -1
  183. package/docs/api/sensor-eqe-local-exposure.md +1 -1
  184. package/docs/api/sensor-eqe-temporal-exposure.md +1 -1
  185. package/docs/api/sensor-exposure-window.md +1 -1
  186. package/docs/api/sensor-iso-signal-chain.md +1 -1
  187. package/docs/api/sensor-local-exposure-binding.md +1 -1
  188. package/docs/api/sensor-optical-stack.md +1 -1
  189. package/docs/api/sensor-photon-energy.md +1 -1
  190. package/docs/api/sensor-physical-charge-capacity.md +1 -1
  191. package/docs/api/sensor-pixel-pitch.md +1 -1
  192. package/docs/api/sensor-radiometry-readiness.md +1 -1
  193. package/docs/api/sensor-raw-readout.md +1 -1
  194. package/docs/api/sensor-raw-reconstruction.md +1 -1
  195. package/docs/api/sensor-readout-exposure-linkage.md +1 -1
  196. package/docs/api/sensor-readout-timing.md +1 -1
  197. package/docs/api/sensor-response-application-compatibility.md +1 -1
  198. package/docs/api/sensor-response-operating-range.md +1 -1
  199. package/docs/api/sensor-responsivity-photocurrent.md +1 -1
  200. package/docs/api/sensor-sampling-aperture.md +1 -1
  201. package/docs/api/sensor-scene-eqe-temporal-exposure.md +1 -1
  202. package/docs/api/sensor-sensor-geometry.md +1 -1
  203. package/docs/api/sensor-signal-noise.md +1 -1
  204. package/docs/api/sensor-spatial-sample-reduction.md +1 -1
  205. package/docs/api/sensor-spatial-sampling-quadrature.md +1 -1
  206. package/docs/api/sensor-spatio-spectral-reduction.md +1 -1
  207. package/docs/api/sensor-spectral-coverage.md +1 -1
  208. package/docs/api/sensor-spectral-quadrature.md +1 -1
  209. package/docs/api/sensor-spectral-response.md +1 -1
  210. package/docs/api/sensor-temporal-photo-signal.md +1 -1
  211. package/docs/api/simulation-poc-simulation.md +1 -1
  212. package/docs/api/stabilization-camera-shake.md +1 -1
  213. package/docs/api/stabilization-system.md +1 -1
  214. package/docs/examples/quick-start.mjs +1 -1
  215. package/docs/validation/print-detail-capabilities.json +100 -0
  216. package/docs/validation/print-detail-sdr-evidence.json +81 -0
  217. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  # Generic equipment tier reference assets
2
2
 
3
- Release context: **package 1.0.0 candidate / root API 0.116.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0.md).
3
+ Release context: **package 1.1.0 candidate / root API 1.1.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_1_0.md).
4
4
 
5
5
  `resolveGenericEquipmentTierCatalog({ presetVersion: "1.0.0" })` returns immutable
6
6
  Consumer, Prosumer and Professional body/lens reference bundles. These are
@@ -139,7 +139,7 @@ There is no separate tier-specific browser approximation to compare here; the
139
139
  public implementation remains browser-safe and uses the ordinary reference APIs.
140
140
  No private application acceptance is invented.
141
141
 
142
- Initial tier assets landed at root API 0.105.0; the current root API is 0.116.0.
142
+ Initial tier assets landed at root API 0.105.0; the current root API is 1.0.1.
143
143
  This acceptance-only extension does not change runtime/API or asset definitions. Selection schema 0.1.0, asset version 1.0.0, npm package,
144
144
  POC and production contracts remain independent. Human scientific/provenance
145
145
  review and contribution-specific DCO certification are still required.
@@ -1,6 +1,6 @@
1
1
  # Call-local geometry preparation reuse: #43
2
2
 
3
- Release context: **package 1.0.0 candidate / root API 0.116.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0.md).
3
+ Release context: **package 1.1.0 candidate / root API 1.1.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_1_0.md).
4
4
 
5
5
  `calculateGeometricSamplingPlan()` already parses and copies a complete transform
6
6
  list at its public boundary. It previously called the public scalar mapping API
@@ -1,6 +1,6 @@
1
1
  # Image-Formation Contract
2
2
 
3
- Release context: **package 1.0.0 candidate / root API 0.116.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0.md).
3
+ Release context: **package 1.1.0 candidate / root API 1.1.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_1_0.md).
4
4
 
5
5
  Photivra's image-formation contract defines **scientific ownership, coordinate semantics, and dependency/coupling boundaries** for current and future camera effects.
6
6
 
@@ -1,6 +1,6 @@
1
1
  # Deterministic linear capture encoding: #15C
2
2
 
3
- Release context: **package 1.0.0 candidate / root API 0.116.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0.md).
3
+ Release context: **package 1.1.0 candidate / root API 1.1.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_1_0.md).
4
4
 
5
5
  `calculateLinearCaptureEncoding()` produces format-neutral unsigned 16-bit linear codes from one bounded inline `SimulatedCapture` plane. The exact plane/image-state identity is mandatory. The master stays unchanged; color, WB application, source reference value and upstream capture-saturation history accompany the encoded data. It neither chooses a file format nor invents a color conversion.
6
6
 
@@ -1,6 +1,6 @@
1
1
  # Motion and Signal Foundation
2
2
 
3
- Release context: **package 1.0.0 candidate / root API 0.116.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0.md).
3
+ Release context: **package 1.1.0 candidate / root API 1.1.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_1_0.md).
4
4
 
5
5
  ## Projected subject motion
6
6
 
@@ -1,6 +1,6 @@
1
1
  # Numerical Correctness and Physical Units
2
2
 
3
- Release context: **package 1.0.0 candidate / root API 0.116.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0.md).
3
+ Release context: **package 1.1.0 candidate / root API 1.1.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_1_0.md).
4
4
 
5
5
  Photivra is a scientific engine. Numerical behavior and physical-unit meaning are public-contract concerns, not implementation details.
6
6
 
@@ -1,6 +1,6 @@
1
1
  # Measured-performance baseline: #43 / #45
2
2
 
3
- Release context: **package 1.0.0 candidate / root API 0.116.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0.md).
3
+ Release context: **package 1.1.0 candidate / root API 1.1.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_1_0.md).
4
4
 
5
5
  This independent first slice records merged main `83a99a4c1ec525fd1add7cccff134fcee0f5159b`, root API 0.93.0, POC API 0.20.0, in `docs/benchmarks/2026-10-01-main-baseline.json`. No pending capture/output/correction/preset implementation is consumed. It does not close either issue or justify an optimization by itself.
6
6
 
@@ -1,6 +1,6 @@
1
1
  # Simulated Sensor RAW DNG / JPEG export
2
2
 
3
- Release context: **package 1.0.0 candidate / root API 0.116.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0.md).
3
+ Release context: **package 1.1.0 candidate / root API 1.1.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_1_0.md).
4
4
 
5
5
  Current producer-derived files and external closure gates are recorded in
6
6
  [Export acceptance](EXPORT_ACCEPTANCE.md). The new reproducible generator uses
@@ -1,6 +1,6 @@
1
1
  # Physics Foundation
2
2
 
3
- Release context: **package 1.0.0 candidate / root API 0.116.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0.md).
3
+ Release context: **package 1.1.0 candidate / root API 1.1.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_1_0.md).
4
4
 
5
5
  Photivra starts with analytical models that can be independently tested and whose assumptions can be stated explicitly.
6
6
 
package/docs/POC_API.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Local POC Simulation API
2
2
 
3
- Release context: **package 1.0.0 candidate / root API 0.116.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0.md).
3
+ Release context: **package 1.1.0 candidate / root API 1.1.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_1_0.md).
4
4
 
5
5
  Photivra includes a minimal Node HTTP transport for proof-of-concept development and integration testing.
6
6
 
@@ -0,0 +1,12 @@
1
+ # POC projection reference on macOS ARM64
2
+
3
+ The unchanged historical 64-case response-hash corpus has one mismatch on macOS ARM64 with Node 24.19.0 and 26.8.1: `equivalence-38`. This mismatch also occurs when executing the original pre-optimization source at `c1374c31473f893310d1ce4f0d5a737aaba43ab5`. All 64 serialized responses are byte-for-byte identical between that original source, the released 1.0.1 baseline `c89e6e83eb7d4b625e12d496bcd51c58d6c7447b`, and the Print candidate `12f304f087d5cbe41266e2a81be2d6a1d521e692` on the verified host. The difference is therefore present in the archived reference on this platform; it is not introduced by projection reuse or the Print changes. The specific floating-point operation responsible has not been isolated.
4
+
5
+ The separate `test/fixtures/poc-projection-reuse-darwin-arm64-reference.json` records the original executable's one differing SHA-256. The test selects this exact reference only for darwin/arm64 on the verified Node major lines 24 and 26. All other cases and environments retain the historical hashes. No tolerance, ignored field, regenerated candidate oracle, scientific implementation change, or historical fixture edit is introduced. A new mismatch still fails the test.
6
+
7
+ To independently reproduce the reference, check out the original commit in an isolated directory, compile its original source with TypeScript 6.0.3, and run its built `simulatePocCamera()` over the unchanged inputs in `test/fixtures/poc-projection-reuse-reference.json` under each recorded Node runtime. Compute SHA-256 over `JSON.stringify(response)` using Node crypto. Compare all outputs with the baseline and candidate on the same host. The original build used the reviewed 1.0.1 development dependency set; no runtime dependencies are added. Only `equivalence-38` differs from the historical corpus:
8
+
9
+ - Historical hash: `1135d7b57b528cbba1c1af98cd09de94d3b2dc3251ed66dcb62ea7ea8d3d32af`.
10
+ - Original-source macOS hash: `02688bd713afea5ae82da9d53675a4e63738aa45bb5f33abca1b2cfeade3d52c`.
11
+
12
+ This is test equivalence evidence, not renewed optical calibration or physical accuracy evidence. Other macOS architectures and Node lines have not been qualified by this record. Human source/scientific review and DCO certification remain pending for this AI-assisted corrective draft.
@@ -1,6 +1,6 @@
1
1
  # Request-local defocus projection reuse: #45
2
2
 
3
- Release context: **package 1.0.0 candidate / root API 0.116.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0.md).
3
+ Release context: **package 1.1.0 candidate / root API 1.1.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_1_0.md).
4
4
 
5
5
  The measured candidate reuses the focus-plane image distance already calculated
6
6
  inside `simulatePocCamera()` for its subject and defocus sweep. It is a small
@@ -0,0 +1,81 @@
1
+ # Regional Print detail diagnostic — model specification 0.1.0
2
+
3
+ This is the bounded mathematical first slice of #196, stacked on the unpublished [Print geometry candidate](PRINT_PLANNING.md). Geometry must be reviewed and published before downstream integration. This diagnostic is not full #196 acceptance, a natural-image sharpness evaluator, a visibility threshold or an overall print pass. The [validation protocol](PRINT_DETAIL_VALIDATION.md) and [capability ledger](validation/print-detail-capabilities.json) identify what is tested and what remains blocked.
4
+
5
+ ## Supported model and domain
6
+
7
+ Measure one declared coherent sinusoidal fundamental in one explicitly selected rectangular region of a scalar **relative linear luminance** raster. The target declares integral signed cycle counts `(kx,ky)` across region dimensions `(W,H)` and positive reference modulation at most one. Pixel index `(0,0)` is the first region sample center. The target phase is arbitrary. At least one cycle count must be nonzero and both component frequencies must lie strictly inside the per-axis Nyquist interval. DC and self-conjugate/Nyquist bins are unsupported; two equal samples at Nyquist cannot establish phase-independent fundamental amplitude.
8
+
9
+ The caller supplies a dense row-major sample array for that region, at most 65,536 finite values. Signed values are retained; capture noise and processing can produce negatives. Successful parsing does not establish that a photograph actually depicts the declared target or that an acquisition is qualified. A positive numerically supported DC mean is required for relative modulation. Arbitrary photographs, nonperiodic windows, automatic target detection, gamma-encoded luma, unknown luminance extraction, correction/warp registration and mixed/nonuniform target frequencies are outside this first model.
10
+
11
+ ## Mathematical quantity
12
+
13
+ Let `phi(x,y) = 2 pi (kx x/W + ky y/H)`, `m = mean(samples)`, `a = 2 mean(samples cos(phi))` and `b = 2 mean(samples sin(phi))`. Then fundamental amplitude is `sqrt(a²+b²)`, fundamental modulation is amplitude divided by positive `m`, and the reported transfer of the **declared input grating** is modulation divided by reference modulation. Values above one remain above one; they do not establish quality uplift or a qualified MTF. A single frequency does not determine a full response, MTF50, PSF, effective megapixels, perceived sharpness or resolution limit. No defocus/diffraction/motion equation or blur-diameter conversion is added.
14
+
15
+ Return the residual RMS after the fitted mean/fundamental, relative to DC. It is unexplained residual energy, not a noise variance, halo classifier, compression measure or model-accuracy bound. Realization noise can project into the fundamental and bias amplitude. No ensemble estimate, confidence or combined uncertainty is fabricated.
16
+
17
+ Normalize samples by their maximum absolute magnitude before coefficient accumulation, and use compensated summation that retains corrections when large signed terms cancel. Reject any nonzero sample that underflows to zero during normalization. Accumulate the residual norm with stable hypot operations rather than squaring tiny/large residuals directly. Reduce phase modulo one cycle before trigonometry. Restore units only for mean/amplitude. Nonpositive DC, nonfinite/underflowed restored quantities or nonfinite derived ratios produce an unsupported numeric/domain state; do not clamp tiny nonzero energy into identity or loosen tolerances to manufacture a pass. Transcendental conformance tolerances belong to the independent protocol, not to a quality decision.
18
+
19
+ ## Region, stage and identity
20
+
21
+ The input records an assessment ID, immutable capture ID, exact representation ID and declared SHA-256, actual raster, source stage, processing/decoder ID and version, optional noise-realization ID, reusable sample provenance, region ID/rectangle/role, declared subject/focus distances (or explicit null), and target identity/version. SHA-256 and provenance are caller declarations; the engine neither fetches the artifact nor verifies full-file decoding from an ROI array. Retain this distinction in downstream evidence. The returned frozen owned input includes the exact ROI samples. New region, content, processing, target or print/viewing conditions require a new assessment ID; labels alone do not prove equality.
22
+
23
+ Coordinates are oriented retained-image raster coordinates, top-left, +X right, +Y down. Source stages are native-retained linear, post-resampling linear, and post-encoding decoded linear. Native stage must match the authoritative retained native dimensions from existing capture geometry. Later stages must preserve that exact aspect ratio and must not enlarge either native axis. The first registration is oriented retained, unwarped; correction/warp requires an independently supported coordinate registration. Existing geometry maps ROI center to the optical image plane (+Y up), preserving off-center capture/crop and all four orientations. Field position is descriptive and does not create a field-dependent optical model. Only the explicitly selected region is measured; an intentionally defocused background is never aggregated into a frame verdict.
24
+
25
+ Printed dimensions/viewing distance come from `calculatePrintPlan()`; no consumer equation is introduced. The regional fundamental vector converts to cycles/mm using ROI's physical span within the declared represented image. Report its physical period and the exact angular period **at the normal viewing reference at image center**: `2 atan(period/(2 distance))`. This is a reference-period angle, not a spatially uniform cycles/degree grid, an off-center retinal calculation or perceptual threshold. Retain field and ROI location separately. Changing viewing conditions changes angular projection, not measured captured samples/modulation.
26
+
27
+ A result also states whether the assessed actual raster equals the current recommendation. A pre-encoding diagnostic never certifies JPEG compression. A post-encoding declared source records the exact artifact/decoder identity but still does not qualify compression, decoding, color or overall quality. Actual delivery remains independent of native sufficiency.
28
+
29
+ ## Assurance and explicit exclusions
30
+
31
+ Use existing calculation envelopes, finite-number validation, strict allowlists, public-ID grammar, shared owned-data freezing, evidence provenance and composed scientific assurance. Mathematical coefficients are calculated. Acquisition/registration/target truth remain scientifically unknown in this contract; evidence metadata never promotes them to calibration. Result capabilities for captured MTF, optical attribution, visibility/perceived quality, noise, aliasing, halos, compression and color remain unassessed. No automatic print pass is exposed.
32
+
33
+ Malformed structural/numeric data throw typed existing errors. Well-formed incompatible identities, aspect, stage or registration return blockers; unsupported frequency/domain/numeric cases return explicit unsupported status. Missing authoritative native geometry remains a blocker. Provider shortfalls and sampling shortfalls do not disappear when a regional contrast coefficient exists.
34
+
35
+ ## References and reuse review
36
+
37
+ - [Boone, Yu and Seibert (1996), sinusoidal modulation measurement](https://pubmed.ncbi.nlm.nih.gov/8994160/), DOI 10.1118/1.597840: primary research motivating explicit sinusoidal input, processing and sampling context. No commercial target, numeric table, PIRT code or procedure is copied or implemented.
38
+ - [Campbell and Robson (1968), grating visibility](https://physoc.onlinelibrary.wiley.com/doi/10.1113/jphysiol.1968.sp008574): primary research motivating the separation of a Fourier coefficient from a qualified perceptual model. No observer thresholds/curves/data are incorporated.
39
+ - The issue's Imatest sharpness guide is background terminology only. No proprietary algorithm, chart or source expression is used. [Westheimer (1977), acuity and hyperacuity](https://pubmed.ncbi.nlm.nih.gov/839301/), DOI 10.1364/josa.67.000207, distinguishes resolution and localization tasks; it supplies no universal print visibility threshold. No psychophysical thresholds or observer data are incorporated.
40
+
41
+ All specification, code and analytic targets/reference calculations are independently authored. Mathematical identities and self-owned procedural targets are the numeric evidence; public references are factual-reference-only. Actual supplied sample arrays require Photivra ownership or declared reusable-data licensing. No third-party numeric material, private assets or runtime dependencies are incorporated. Human scientific/source, licensing and DCO review remains required; AI declarations alone do not certify provenance or patent clearance.
42
+
43
+ ## Complete packed mathematical example
44
+
45
+ This self-owned procedural target validates the coefficient path; it is not acquired-image or renderer evidence.
46
+
47
+ ```ts
48
+ import { calculatePrintRegionDetail, type PrintRegionDetailInput } from "@photivra/engine";
49
+ const input: PrintRegionDetailInput = {
50
+ assessmentId: "example-diagnostic",
51
+ print: {
52
+ source: { kind: "native-retained", captureId: "owned-example", geometry: {
53
+ imagingArea: { widthMm: 32, heightMm: 32 },
54
+ nativeRaster: { pixelWidth: 8, pixelHeight: 8 }, orientation: "landscape"
55
+ } },
56
+ printedImage: { width: 8, height: 8, unit: "inches" },
57
+ viewingDistance: { value: 24, unit: "inches" },
58
+ sampling: { kind: "manual-ppi", pixelsPerInch: 1 },
59
+ fit: { kind: "confirmed-native-aspect", maximumRelativeAspectError: 0 }
60
+ },
61
+ source: {
62
+ captureId: "owned-example", representationId: "owned-analytic-array",
63
+ contentSha256: "a".repeat(64), raster: { pixelWidth: 8, pixelHeight: 8 },
64
+ stage: "native-retained-linear", domain: "relative-linear-luminance",
65
+ registration: "oriented-retained-unwarped",
66
+ processing: { id: "owned-example", version: "0.1.0" }, noiseRealizationId: null,
67
+ evidence: [{ sourceOrigin: "photivra", sourceReference: "owned-procedural-example", reuseStatus: "photivra-owned" }]
68
+ },
69
+ region: { id: "example-region", rect: { x: 0, y: 0, width: 8, height: 8 },
70
+ role: "field-diagnostic", subjectDistanceM: null, focusDistanceM: null },
71
+ target: { id: "quarter-period", version: "0.1.0", kind: "coherent-sinusoid",
72
+ cyclesAcrossRegion: { x: 2, y: 0 }, referenceModulation: 0.5 },
73
+ samples: Array.from({ length: 64 }, (_, i) => [1.5, 1, 0.5, 1][i % 4]!)
74
+ };
75
+ const assessment = calculatePrintRegionDetail(input).value;
76
+ if (assessment.status !== "diagnostic-only" || Math.abs(assessment.measurement!.fundamentalModulation - 0.5) > 1e-10) throw new Error("Unexpected analytic coefficient");
77
+ if (assessment.assurance.scientificStatus !== "unknown" || assessment.overallPrintVerdict !== "not-offered") throw new Error("Unexpected qualification");
78
+ console.log(assessment.measurement, assessment.unassessed);
79
+ ```
80
+
81
+ The repeated `a` hash is an explicit placeholder declaration, not a verified digest. Real acquired evidence must replace it with a verified exact representation hash and qualify the target/ROI, processing and active backend independently.
@@ -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-detail-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,73 @@
1
+ # Native-only Print planning
2
+
3
+ Release candidate: package/root API **1.1.0**, Print model **0.1.0**. 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 [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).
@@ -1,6 +1,6 @@
1
1
  # Processed camera output
2
2
 
3
- Release context: **package 1.0.0 candidate / root API 0.116.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0.md).
3
+ Release context: **package 1.1.0 candidate / root API 1.1.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_1_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.0 candidate / root API 0.116.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0.md).
3
+ Release context: **package 1.1.0 candidate / root API 1.1.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_1_0.md).
4
4
 
5
5
  Photivra's production composition layer is separate from the legacy
6
6
  `simulatePocCamera()` proof-of-concept API.
@@ -1,8 +1,8 @@
1
1
  # Executed environment production capture
2
2
 
3
- Release context: **package 1.0.0 candidate / root API 0.116.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0.md).
3
+ Release context: **package 1.1.0 candidate / root API 1.1.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_1_0.md).
4
4
 
5
- Root API 0.116.0 and production plan 0.7.0 add a bounded source-to-RAW route
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
7
7
  0.2.0 exposes the same immutable executed capture and processed-output results.
8
8
  At introduction, package 0.6.0, POC 0.20.0, capture snapshot 0.3.0 and the image-formation
@@ -118,7 +118,7 @@ audit is #180. #165 C2PA remains post-V1.
118
118
 
119
119
  Consumers of serialized plans must recognize plan 0.7.0 and consumer manifest
120
120
  0.2.0. New fields are optional; existing attached-RAW and sample-only callers
121
- need no input migration. Root API 0.116.0 exposes the additive
121
+ need no input migration. The current root API retains the additive
122
122
  `ProductionEnvironmentCaptureInput` type. The standalone environment producer
123
123
  and processed-output model versions, hashes and seed schedule are unchanged.
124
124
 
@@ -1,6 +1,6 @@
1
1
  # Scientific and Source Provenance
2
2
 
3
- Release context: **package 1.0.0 candidate / root API 0.116.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0.md).
3
+ Release context: **package 1.1.0 candidate / root API 1.1.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_1_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.0 candidate / root API 0.116.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0.md).
3
+ Release context: **package 1.1.0 candidate / root API 1.1.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_1_0.md).
4
4
 
5
5
  Photivra has two complementary PSF layers.
6
6
 
@@ -1,6 +1,6 @@
1
1
  # Reference RAW frame compatibility
2
2
 
3
- Release context: **package 1.0.0 candidate / root API 0.116.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0.md).
3
+ Release context: **package 1.1.0 candidate / root API 1.1.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_1_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,13 +1,13 @@
1
1
  # Same-RAW reconstruction handoff (#16C)
2
2
 
3
- Release context: **package 1.0.0 candidate / root API 0.116.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0.md).
3
+ Release context: **package 1.1.0 candidate / root API 1.1.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_1_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.
7
7
 
8
8
  `resolveRawFrameReconstruction()` derives a bounded contiguous native-region virtual-sensor-channel plane from a committed `SensorRawFrame`. It delegates every output pixel to the existing #14 `resolveSensorRawReconstruction()`, using only exact attached RAW samples. Independent float planes in the attached capture are retained as history/metadata and **never provide reconstructed values**.
9
9
 
10
- This adapter and its RAW attachment predecessor are merged. Handoff schema 0.1.0 is retained; root API 0.99.0 was its historical introduction identity. Package 1.0.0 retains current root 0.116.0 and independent capture/production/POC contracts.
10
+ This adapter and its RAW attachment predecessor are merged. Handoff schema 0.1.0 is retained; root API 0.99.0 was its historical introduction identity. Package/root API 1.0.1 uses aligned release identity; capture/production/POC contracts remain independent.
11
11
 
12
12
  Inputs are `rawFrame`, `region: { x, y, width, height }`, and `phaseProfiles: [{ phaseX, phaseY, profile }]`. A region is a positive integer half-open rectangle in the full native raster, not crop-local or oriented output coordinates. RAW-frame flags, dimensions, full native coverage, exact site/channel/code normalization and IDs are revalidated through #166.
13
13
 
@@ -1,5 +1,6 @@
1
1
  # 1.0.0 release contract and owner handoff
2
2
 
3
+ **Historical 1.0.0 record.** The 1.0.0 release is published. This document preserves its preparation evidence and original policy snapshot. For current Node support, aligned package/root versions and the next owner release procedure, use [1.0.1 release preparation](RELEASE_1_0_1.md) and [NODE_SUPPORT.md](../NODE_SUPPORT.md).
3
4
  **Distribution:** `@photivra/engine@1.0.0` candidate. **Root API identity:** `0.116.0`. **Feature/science predecessor:** reviewed/signed main `34c6d9aca1c2e365b253c1562734d11bc8e0235f` (PR #206), tree `fa74373967843a1942206c26f5baa004e9a466fd`. Its post-merge CI 37032338620 passed Node 22.13.0/24 with 1,598 tests / 142 files. The release-preparation PR/CI identifies the exact new candidate; after signed squash merge, verify its tree equality and record final main SHA in the issue/PR handoff. A commit cannot contain its own cryptographic commit/tree identifier without a circular dependency.
4
5
 
5
6
  ## What 1.0 contains
@@ -0,0 +1,61 @@
1
+ # 1.0.1 release preparation and migration
2
+
3
+ **Candidate distribution and root API:** `@photivra/engine@1.0.1` and `ENGINE_API_VERSION = "1.0.1"`. The published predecessor is [1.0.0](https://github.com/Photivra/photivra/releases/tag/v1.0.0), whose root API identity was 0.116.0. This change prepares the next release; 1.0.1 installation becomes available only after owner publication.
4
+
5
+ ## Changes
6
+
7
+ - Support all upstream-supported Active LTS and Maintenance LTS Node.js lines plus Current. The reviewed 2026-10-02 set is maintained Node 22 (minimum 22.13), maintained Node 24 and Node 26 Current.
8
+ - Test patched 22/24/26 and minimum 22.13.0 in CI. Every matrix job runs lifecycle checks, locked installation, static/scientific tests, build, documentation, isolated packed consumers and package checks. Node 24 also runs coverage and the informational benchmark.
9
+ - Align the full package and root API version at 1.0.1. Automated checks prevent drift between source, package/lock/citation metadata, generated reference and the real packed consumer.
10
+
11
+ The preferred build/development baseline and pinned Node typings remain 24. The manifest minimum remains >=22.13.0; this broad range is not a qualification of unknown or EOL majors. Use current patches in ordinary development. See [the runtime policy](../NODE_SUPPORT.md) for Current-to-LTS and EOL boundaries, snapshot review and future-major maintenance.
12
+
13
+ ## Migration and preserved contracts
14
+
15
+ No exported operation shape, scientific equation, default, seed schedule, dependency or accepted processing envelope changes. Schema/model/POC/production-plan contracts retain their independent versions; POC remains 0.20.0 and the production plan remains 0.7.0.
16
+
17
+ Starting with this release, `ENGINE_API_VERSION` identifies the same release as the npm package. Consumers that compared it with the literal 0.116.0 must update that comparison or use the exported constant. Do not equate this root release identity with an independent schema/model version.
18
+
19
+ Newly created captures and plans record creator root API 1.0.1. That metadata can change serialized bytes, plan fingerprints and capture/export identity hashes even when scientific values are equal. Archive parsers retain the creator identity recorded by earlier releases; they do not relabel an existing capture as 1.0.1. Historical fixtures, checksums, benchmark reports and introduction-time versions remain historical evidence. Any deliberate recomputation must create new artifacts with their actual creator/version identity.
20
+
21
+ The bounded V1 capabilities and scientific limitations are unchanged. See [developer navigation](DEVELOPERS.md), [the original 1.0 release contract](RELEASE_1_0.md), and each domain's current guidance. Node compatibility does not establish calibrated physics, browser performance or megapixel processing.
22
+
23
+ ## Candidate validation
24
+
25
+ Use patched Node 24 for ordinary release preparation, then require green CI for all supported majors:
26
+
27
+ ```sh
28
+ npm ci --ignore-scripts
29
+ node --test .github/test-node-lts-policy.mjs
30
+ node .github/node-lts-policy.mjs
31
+ npm run check
32
+ npm run coverage
33
+ npm run build
34
+ npm run docs:check
35
+ npm run release:consumer-check
36
+ npm run pack:check
37
+ npm run bench:image-formation:built
38
+ ```
39
+
40
+ The exact submitted commit and CI outcome are recorded in the review PR. The known unchanged-main Mac `equivalence-38` hash difference remains explicit; Linux CI is the full-suite authority. No golden/assertion or scientific tolerance is relaxed for this release.
41
+
42
+ ## Owner release procedure
43
+
44
+ After substantive human review, contribution-specific DCO certification and merge of the tested candidate, require green final-main CI and verify that its tree matches the approved candidate. Confirm npm trusted publishing and protected main/tag rules remain configured. This preparation performs no tag, npm publication or GitHub release.
45
+
46
+ From a clean owner checkout, replace `FINAL_MAIN_SHA` with that verified merged commit:
47
+
48
+ ```sh
49
+ git fetch origin main --tags
50
+ git switch main
51
+ git pull --ff-only origin main
52
+ test "$(git rev-parse HEAD)" = "FINAL_MAIN_SHA"
53
+ test "$(git rev-parse origin/main)" = "FINAL_MAIN_SHA"
54
+ test "$(node -p "require('./package.json').version")" = "1.0.1"
55
+ git tag -a v1.0.1 FINAL_MAIN_SHA -m "Photivra engine 1.0.1"
56
+ git push origin refs/tags/v1.0.1
57
+ ```
58
+
59
+ The tag push starts the existing protected publish workflow. Its verification job uses Node 24 and the Node support guard before dependency installation, checks tag/version/current-main identity and all existing release gates, and creates the verified tarball. The separate OIDC publication job checks that artifact's SHA-256 and publishes only if the exact version is absent. Do not change the published 1.0.0 release or move an existing protected tag.
60
+
61
+ Watch the workflow to completion, verify public npm exposes 1.0.1 and record tarball integrity, then create the GitHub release at v1.0.1 using the final commit and check evidence. Report any failure and investigate rather than bypassing a gate.
@@ -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.
@@ -1,5 +1,6 @@
1
1
  # Final 1.0.0 preparation audit
2
2
 
3
+ **Historical 1.0.0 record.** The 1.0.0 release is published. This document preserves its preparation evidence and original policy snapshot. For current Node support, aligned package/root versions and the next owner release procedure, use [1.0.1 release preparation](RELEASE_1_0_1.md) and [NODE_SUPPORT.md](../NODE_SUPPORT.md).
3
4
  Package **1.0.0 candidate**, root API **0.116.0**, based on reviewed/signed main **34c6d9aca1c2e365b253c1562734d11bc8e0235f**. No tag, npm publication or GitHub release is performed by this contribution. The review PR and exact-head CI identify the candidate; the final signed squash commit/tree and post-merge CI belong in the issue/PR handoff after owner approval. [Owner release steps](RELEASE_1_0.md) specify that boundary.
4
5
 
5
6
  ## Inventory and corrections
@@ -1,6 +1,6 @@
1
1
  # Scene Radiance and Illumination
2
2
 
3
- Release context: **package 1.0.0 candidate / root API 0.116.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0.md).
3
+ Release context: **package 1.1.0 candidate / root API 1.1.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_1_0.md).
4
4
 
5
5
  Photivra separates **illumination-source metadata** from **outgoing scene spectral radiance**.
6
6