@photivra/engine 1.0.1 → 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 (207) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/CITATION.cff +1 -1
  3. package/README.md +8 -6
  4. package/dist/core/version.d.ts +1 -1
  5. package/dist/core/version.js +1 -1
  6. package/dist/index.d.ts +4 -0
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +2 -0
  9. package/dist/index.js.map +1 -1
  10. package/dist/output/print-detail.d.ts +106 -0
  11. package/dist/output/print-detail.d.ts.map +1 -0
  12. package/dist/output/print-detail.js +215 -0
  13. package/dist/output/print-detail.js.map +1 -0
  14. package/dist/output/print-plan.d.ts +138 -0
  15. package/dist/output/print-plan.d.ts.map +1 -0
  16. package/dist/output/print-plan.js +305 -0
  17. package/dist/output/print-plan.js.map +1 -0
  18. package/docs/API_REFERENCE.md +38 -1
  19. package/docs/API_STYLE.md +1 -1
  20. package/docs/ARCHITECTURE.md +1 -1
  21. package/docs/AUTOMATION_COORDINATION.md +1 -1
  22. package/docs/CAPTURE_COLOR.md +1 -1
  23. package/docs/CAPTURE_CORRECTED_SDR.md +1 -1
  24. package/docs/CAPTURE_EXPORT_METADATA.md +1 -1
  25. package/docs/CAPTURE_SDR.md +1 -1
  26. package/docs/DEVELOPERS.md +10 -4
  27. package/docs/DIGITAL_OPTICS_FOUNDATION.md +1 -1
  28. package/docs/ENVIRONMENT_RAW_CAPTURE.md +1 -1
  29. package/docs/EXPORT_ACCEPTANCE.md +1 -1
  30. package/docs/GENERIC_TIER_PRESETS.md +1 -1
  31. package/docs/GEOMETRIC_PREPARATION_REUSE.md +1 -1
  32. package/docs/IMAGE_FORMATION.md +1 -1
  33. package/docs/LINEAR_CAPTURE_ENCODING.md +1 -1
  34. package/docs/MOTION_AND_SIGNAL.md +1 -1
  35. package/docs/NUMERICAL_CORRECTNESS.md +1 -1
  36. package/docs/PERFORMANCE_BASELINE.md +1 -1
  37. package/docs/PHOTOGRAPHIC_EXPORT.md +1 -1
  38. package/docs/PHYSICS_FOUNDATION.md +1 -1
  39. package/docs/POC_API.md +1 -1
  40. package/docs/POC_PROJECTION_PLATFORM_REFERENCE.md +12 -0
  41. package/docs/POC_PROJECTION_REUSE.md +1 -1
  42. package/docs/PRINT_DETAIL_ASSESSMENT.md +81 -0
  43. package/docs/PRINT_DETAIL_SDR_EVIDENCE.md +29 -0
  44. package/docs/PRINT_DETAIL_VALIDATION.md +36 -0
  45. package/docs/PRINT_PLANNING.md +73 -0
  46. package/docs/PROCESSED_OUTPUT.md +1 -1
  47. package/docs/PRODUCTION_COMPOSITION.md +1 -1
  48. package/docs/PRODUCTION_ENVIRONMENT_CAPTURE.md +1 -1
  49. package/docs/PROVENANCE.md +1 -1
  50. package/docs/PSF_FOUNDATION.md +1 -1
  51. package/docs/RAW_FRAME_ENVELOPE.md +1 -1
  52. package/docs/RAW_FRAME_RECONSTRUCTION.md +1 -1
  53. package/docs/RELEASE_1_1_0.md +25 -0
  54. package/docs/SCENE_RADIANCE_AND_ILLUMINATION.md +1 -1
  55. package/docs/SCENE_SENSOR_QUADRATURE.md +1 -1
  56. package/docs/SCENE_SENSOR_TEMPORAL_EXPOSURE.md +1 -1
  57. package/docs/SCIENTIFIC_ASSURANCE.md +1 -1
  58. package/docs/SCIENTIFIC_CONFORMANCE.md +1 -1
  59. package/docs/SDR_RENDERING.md +1 -1
  60. package/docs/SENSOR_ENVIRONMENT_QUERY.md +1 -1
  61. package/docs/SENSOR_EQE_LOCAL_EXPOSURE.md +1 -1
  62. package/docs/SENSOR_EQE_TEMPORAL_EXPOSURE.md +1 -1
  63. package/docs/SENSOR_PSF_QUADRATURE.md +1 -1
  64. package/docs/SENSOR_RAW_FRAME.md +1 -1
  65. package/docs/SENSOR_RAW_PRODUCER.md +1 -1
  66. package/docs/SIGNAL_CONFORMANCE.md +1 -1
  67. package/docs/SIMULATED_CAPTURE.md +1 -1
  68. package/docs/STABILIZATION.md +1 -1
  69. package/docs/TEMPORAL_PHOTO_RAW.md +1 -1
  70. package/docs/TIER_ACCEPTANCE.md +1 -1
  71. package/docs/TIER_PRESET_ACCEPTANCE.md +1 -1
  72. package/docs/USAGE.md +7 -1
  73. package/docs/V1_COMPOSITION_MAP.md +1 -1
  74. package/docs/V1_HELPER_REUSE_REVIEW.md +1 -1
  75. package/docs/V1_PERFORMANCE_DISPOSITION.md +1 -1
  76. package/docs/api/camera-equivalent-focal-length.md +1 -1
  77. package/docs/api/camera-field-of-view.md +1 -1
  78. package/docs/api/camera-projected-object-size.md +1 -1
  79. package/docs/api/capture-capture-export-metadata.md +1 -1
  80. package/docs/api/capture-environment-raw-producer.md +1 -1
  81. package/docs/api/capture-focus-control.md +1 -1
  82. package/docs/api/capture-linear-encoding.md +1 -1
  83. package/docs/api/capture-photographic-export.md +1 -1
  84. package/docs/api/capture-raw-frame-reconstruction.md +1 -1
  85. package/docs/api/capture-release-sequence.md +1 -1
  86. package/docs/api/capture-sensor-raw-frame.md +1 -1
  87. package/docs/api/capture-sensor-raw-producer.md +1 -1
  88. package/docs/api/capture-simulated-capture.md +1 -1
  89. package/docs/api/color-capture-color.md +1 -1
  90. package/docs/api/color-white-balance.md +1 -1
  91. package/docs/api/composition-image-formation-plan.md +1 -1
  92. package/docs/api/composition-plan-consumer.md +1 -1
  93. package/docs/api/core-calculation-result.md +1 -1
  94. package/docs/api/core-configuration-error.md +1 -1
  95. package/docs/api/core-image-formation.md +1 -1
  96. package/docs/api/core-scientific-assurance.md +1 -1
  97. package/docs/api/core-spectral-composition.md +1 -1
  98. package/docs/api/core-spectral.md +1 -1
  99. package/docs/api/core-validation.md +1 -1
  100. package/docs/api/core-version.md +2 -2
  101. package/docs/api/equipment-exposure-capabilities.md +1 -1
  102. package/docs/api/equipment-generic-tier-assets.md +1 -1
  103. package/docs/api/equipment-generic-tier-presets.md +1 -1
  104. package/docs/api/equipment-iso-capabilities.md +1 -1
  105. package/docs/api/equipment-metering-capabilities.md +1 -1
  106. package/docs/api/equipment-release-capabilities.md +1 -1
  107. package/docs/api/exports.json +117 -2
  108. package/docs/api/exposure-exposure-duration-control.md +1 -1
  109. package/docs/api/exposure-exposure-mode-resolver.md +1 -1
  110. package/docs/api/exposure-exposure.md +1 -1
  111. package/docs/api/exposure-flash.md +1 -1
  112. package/docs/api/exposure-metering-scene-radiance.md +1 -1
  113. package/docs/api/exposure-metering-target.md +1 -1
  114. package/docs/api/exposure-metering-temporal.md +1 -1
  115. package/docs/api/exposure-metering.md +1 -1
  116. package/docs/api/exposure-program-line.md +1 -1
  117. package/docs/api/motion-camera-rotation.md +1 -1
  118. package/docs/api/motion-capture-rotation-inverse-mapping.md +1 -1
  119. package/docs/api/motion-capture-rotation-temporal-quadrature.md +1 -1
  120. package/docs/api/motion-capture-rotation-trajectory.md +1 -1
  121. package/docs/api/motion-capture-translation-parallax-temporal-quadrature.md +1 -1
  122. package/docs/api/motion-extended-object-projection.md +1 -1
  123. package/docs/api/motion-projected-motion.md +1 -1
  124. package/docs/api/optics-aperture.md +1 -1
  125. package/docs/api/optics-circle-of-confusion.md +1 -1
  126. package/docs/api/optics-complex-pupil-psf.md +1 -1
  127. package/docs/api/optics-depth-of-field.md +1 -1
  128. package/docs/api/optics-diffraction.md +1 -1
  129. package/docs/api/optics-focus-breathing.md +1 -1
  130. package/docs/api/optics-focus-state.md +1 -1
  131. package/docs/api/optics-front-of-lens-filter.md +1 -1
  132. package/docs/api/optics-illumination-vignetting.md +1 -1
  133. package/docs/api/optics-lateral-chromatic-aberration.md +1 -1
  134. package/docs/api/optics-lens-psf-profile.md +1 -1
  135. package/docs/api/optics-polygon-diffraction.md +1 -1
  136. package/docs/api/optics-profile-contract.md +1 -1
  137. package/docs/api/optics-psf-foundation.md +1 -1
  138. package/docs/api/optics-radial-distortion.md +1 -1
  139. package/docs/api/optics-scene-to-sensor-irradiance.md +1 -1
  140. package/docs/api/optics-scene-to-sensor-quadrature.md +1 -1
  141. package/docs/api/optics-sensor-environment-query.md +1 -1
  142. package/docs/api/optics-sensor-psf-quadrature.md +1 -1
  143. package/docs/api/optics-stray-light.md +1 -1
  144. package/docs/api/optics-thin-lens.md +1 -1
  145. package/docs/api/output-capture-corrected-sdr.md +1 -1
  146. package/docs/api/output-capture-geometry.md +1 -1
  147. package/docs/api/output-capture-sdr.md +1 -1
  148. package/docs/api/output-crop.md +1 -1
  149. package/docs/api/output-geometric-transforms.md +1 -1
  150. package/docs/api/output-lens-corrections.md +1 -1
  151. package/docs/api/output-print-detail.md +147 -0
  152. package/docs/api/output-print-plan.md +165 -0
  153. package/docs/api/output-sdr-rendering.md +1 -1
  154. package/docs/api/output-subject-framing-crop.md +1 -1
  155. package/docs/api/schema-camera.md +1 -1
  156. package/docs/api/schema-illumination-spectral.md +1 -1
  157. package/docs/api/schema-illumination-temporal.md +1 -1
  158. package/docs/api/schema-illumination.md +1 -1
  159. package/docs/api/schema-scene-radiance-temporal.md +1 -1
  160. package/docs/api/schema-scene-radiance.md +1 -1
  161. package/docs/api/schema-scene.md +1 -1
  162. package/docs/api/schema-validation.md +1 -1
  163. package/docs/api/sensor-accumulated-charge.md +1 -1
  164. package/docs/api/sensor-architecture.md +1 -1
  165. package/docs/api/sensor-camera-saturation-capacity.md +1 -1
  166. package/docs/api/sensor-capture-color-sampling-binding.md +1 -1
  167. package/docs/api/sensor-capture-mode-timing.md +1 -1
  168. package/docs/api/sensor-capture-mode.md +1 -1
  169. package/docs/api/sensor-color-sampling.md +1 -1
  170. package/docs/api/sensor-constant-rate-temporal-integration.md +1 -1
  171. package/docs/api/sensor-dark-current.md +1 -1
  172. package/docs/api/sensor-environment-photo-signal.md +1 -1
  173. package/docs/api/sensor-eqe-electron-rate.md +1 -1
  174. package/docs/api/sensor-eqe-local-exposure.md +1 -1
  175. package/docs/api/sensor-eqe-temporal-exposure.md +1 -1
  176. package/docs/api/sensor-exposure-window.md +1 -1
  177. package/docs/api/sensor-iso-signal-chain.md +1 -1
  178. package/docs/api/sensor-local-exposure-binding.md +1 -1
  179. package/docs/api/sensor-optical-stack.md +1 -1
  180. package/docs/api/sensor-photon-energy.md +1 -1
  181. package/docs/api/sensor-physical-charge-capacity.md +1 -1
  182. package/docs/api/sensor-pixel-pitch.md +1 -1
  183. package/docs/api/sensor-radiometry-readiness.md +1 -1
  184. package/docs/api/sensor-raw-readout.md +1 -1
  185. package/docs/api/sensor-raw-reconstruction.md +1 -1
  186. package/docs/api/sensor-readout-exposure-linkage.md +1 -1
  187. package/docs/api/sensor-readout-timing.md +1 -1
  188. package/docs/api/sensor-response-application-compatibility.md +1 -1
  189. package/docs/api/sensor-response-operating-range.md +1 -1
  190. package/docs/api/sensor-responsivity-photocurrent.md +1 -1
  191. package/docs/api/sensor-sampling-aperture.md +1 -1
  192. package/docs/api/sensor-scene-eqe-temporal-exposure.md +1 -1
  193. package/docs/api/sensor-sensor-geometry.md +1 -1
  194. package/docs/api/sensor-signal-noise.md +1 -1
  195. package/docs/api/sensor-spatial-sample-reduction.md +1 -1
  196. package/docs/api/sensor-spatial-sampling-quadrature.md +1 -1
  197. package/docs/api/sensor-spatio-spectral-reduction.md +1 -1
  198. package/docs/api/sensor-spectral-coverage.md +1 -1
  199. package/docs/api/sensor-spectral-quadrature.md +1 -1
  200. package/docs/api/sensor-spectral-response.md +1 -1
  201. package/docs/api/sensor-temporal-photo-signal.md +1 -1
  202. package/docs/api/simulation-poc-simulation.md +1 -1
  203. package/docs/api/stabilization-camera-shake.md +1 -1
  204. package/docs/api/stabilization-system.md +1 -1
  205. package/docs/validation/print-detail-capabilities.json +100 -0
  206. package/docs/validation/print-detail-sdr-evidence.json +81 -0
  207. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  # Capture export metadata foundation (#16B)
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.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
  `createCaptureExportMetadataPair()` is a browser-safe, deterministic **semantic metadata projection**, not an image exporter or proof of RAW/JPEG pixel derivation. Both future writers consume its single shared object; each resource has a distinct caller-owned document UUID and saved-incarnation UUID. `imageDataPairing = "not-verified"` prevents metadata agreement being mistaken for image agreement.
6
6
 
@@ -1,6 +1,6 @@
1
1
  # Capture-to-SDR adapter
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.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 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,18 +1,18 @@
1
1
  # Developer guide
2
2
 
3
- This is the entry point for **@photivra/engine 1.0.1 candidate**, root API contract **1.0.1**. The candidate becomes an installable 1.0.1 distribution only after the owner tags and publishes it. Repository `main` may later describe newer development; use a published release's packaged docs or its exact tag for the stable contract. [Release notes and migration](RELEASE_1_0_1.md) explain the transition to aligned package/root versions.
3
+ This is the entry point for **@photivra/engine 1.1.0 candidate**, root API contract **1.1.0**. The candidate becomes an installable 1.1.0 distribution only after the owner tags and publishes it. Repository `main` may later describe newer development; use a published release's packaged docs or its exact tag for the stable contract. [Release notes and migration](RELEASE_1_1_0.md) explain the transition to aligned package/root versions.
4
4
 
5
5
  Photivra is an Apache-2.0 ESM TypeScript calculation library with no runtime npm dependencies. It exposes explicit units, deterministic data, provenance and bounded scientific approximations. The package supplies no hosted API, renderer installation, UI, commercial camera calibration or automatic agent service. [Photivra's public site](https://photivra.com) is separate from the engine's license; public engine documentation is available here without an application account.
6
6
 
7
7
  ## Install and calculate
8
8
 
9
- After publication, install `npm install @photivra/engine@1.0.1`. During candidate review, use the verified tarball described in [release preparation](RELEASE_1_0_1.md).
9
+ After publication, install `npm install @photivra/engine@1.1.0`. During candidate review, use the verified tarball described in [release preparation](RELEASE_1_1_0.md).
10
10
 
11
11
  ```ts
12
12
  import { calculateFieldOfView, ENGINE_API_VERSION } from "@photivra/engine";
13
13
 
14
14
  const horizontal = calculateFieldOfView({ focalLengthMm: 50, sensorDimensionMm: 36 });
15
- console.log(ENGINE_API_VERSION); // 1.0.1: matches the package version
15
+ console.log(ENGINE_API_VERSION); // 1.1.0: matches the package version
16
16
  console.log(horizontal.value.degrees); // approximately 39.60, ideal infinity-focus geometry
17
17
  console.log(horizontal.provenance); // read assumptions/status with the value
18
18
  ```
@@ -23,7 +23,7 @@ Primitive calculations normally return `CalculationResult<T>` with `value`, `pro
23
23
 
24
24
  ## Find the operation by scientific task
25
25
 
26
- Every row applies to package/root API 1.0.1. Direct calculations are synchronous/browser-safe unless the row says otherwise. A listed primitive is not automatically an app feature or supported in every production combination. The [API reference](API_REFERENCE.md) resolves all root exports and exact signatures; the linked guides own equations, inputs, defaults, errors and limits.
26
+ Every row applies to package/root API 1.1.0. Direct calculations are synchronous/browser-safe unless the row says otherwise. A listed primitive is not automatically an app feature or supported in every production combination. The [API reference](API_REFERENCE.md) resolves all root exports and exact signatures; the linked guides own equations, inputs, defaults, errors and limits.
27
27
 
28
28
  | Task | Start here / executable evidence | Qualified boundary |
29
29
  | --- | --- | --- |
@@ -58,3 +58,9 @@ Malformed configurations/non-finite values throw the established domain errors.
58
58
  See [provenance](PROVENANCE.md), [license](../LICENSE), [NOTICE](../NOTICE), [third-party inventory](../THIRD_PARTY.md), [contributing](../CONTRIBUTING.md) and [security reporting](../SECURITY.md). Engine code/docs do not license the commercial application or its private assets. Report reproducible engine defects through [public issues](https://github.com/Photivra/photivra/issues).
59
59
 
60
60
  Website navigation/documentation hosting belongs to [the app-side discovery ticket #45](https://github.com/Photivra/photivra-apps/issues/45), with navigation #298 and environments #300. Handoff: link the public engine repository, this developer guide, the verified npm release package and capability examples from the public site. No unpublished `/developers` destination is linked here. Website launch is not an engine release prerequisite; access to the site returned HTTP 403 during this audit, so its content/navigation was not verified.
61
+
62
+ ## Print planning
63
+
64
+ Use [native-only Print planning](PRINT_PLANNING.md) for independently specified image size/viewing distance, explicit angular conventions, confirmed native crop and lab constraints. It returns no upscale recommendation and does not certify perceived quality or activate an exporter.
65
+
66
+ The [regional Print detail diagnostic](PRINT_DETAIL_ASSESSMENT.md) measures one declared coherent sinusoidal fundamental in a selected linear-luminance ROI and records its exact source stage. Its [validation protocol](PRINT_DETAIL_VALIDATION.md) and [capability ledger](validation/print-detail-capabilities.json) distinguish mathematical conformance from blocked acquired-image, renderer and perceived-quality qualification.
@@ -1,6 +1,6 @@
1
1
  # Stray light and digital lens correction foundations
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.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
  Issues #114, #118 and #117 add standalone browser-safe primitives. They do not enable a production-plan stage, change the POC, or supply a calibrated camera/lens preset. The public root API advances from 0.94.0 to 0.95.0; each new profile/prepared-map schema is 0.1.0. Package, POC, production-plan and PSF versions are unchanged. This branch incorporates merged polygon-diffraction PR #157 and reconciles the root API increment with that predecessor.
6
6
 
@@ -1,6 +1,6 @@
1
1
  # Executed environment capture 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.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
  `calculateEnvironmentSensorPhotoSignal()` executes one destination site's
6
6
  bounded environment exposure. `simulateEnvironmentSensorRawFrame()` applies that
@@ -1,6 +1,6 @@
1
1
  # Simulated Sensor RAW DNG / JPEG acceptance
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.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 record separates implemented export behavior, reproducible independent
6
6
  checks and external application acceptance for #16. The files are synthetic
@@ -1,6 +1,6 @@
1
1
  # Generic equipment tier reference assets
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.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
@@ -1,6 +1,6 @@
1
1
  # Call-local geometry preparation reuse: #43
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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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,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.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
  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.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.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.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.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.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,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.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.
@@ -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,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.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
 
@@ -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.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
  `calculateSceneToSensorIrradianceQuadrature()` connects the existing #85 scene
6
6
  request/result boundary and #110 paraxial optical bridge to the Cartesian nodes