@photivra/engine 0.6.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +674 -0
- package/CHANGELOG.md +186 -0
- package/CITATION.cff +1 -1
- package/CONTRIBUTING.md +76 -0
- package/DCO +33 -0
- package/NODE_SUPPORT.md +37 -0
- package/NOTICE +2 -0
- package/README.md +138 -71
- package/SECURITY.md +55 -0
- package/THIRD_PARTY.md +63 -0
- package/dist/camera/equivalent-focal-length.d.ts +9 -0
- package/dist/camera/equivalent-focal-length.d.ts.map +1 -1
- package/dist/camera/equivalent-focal-length.js +9 -0
- package/dist/camera/equivalent-focal-length.js.map +1 -1
- package/dist/camera/field-of-view.d.ts +13 -0
- package/dist/camera/field-of-view.d.ts.map +1 -1
- package/dist/camera/field-of-view.js +13 -0
- package/dist/camera/field-of-view.js.map +1 -1
- package/dist/camera/projected-object-size.d.ts +8 -0
- package/dist/camera/projected-object-size.d.ts.map +1 -1
- package/dist/camera/projected-object-size.js +8 -0
- package/dist/camera/projected-object-size.js.map +1 -1
- package/dist/capture/capture-export-metadata.d.ts +60 -0
- package/dist/capture/capture-export-metadata.d.ts.map +1 -0
- package/dist/capture/capture-export-metadata.js +62 -0
- package/dist/capture/capture-export-metadata.js.map +1 -0
- package/dist/capture/environment-raw-producer.d.ts +55 -0
- package/dist/capture/environment-raw-producer.d.ts.map +1 -0
- package/dist/capture/environment-raw-producer.js +88 -0
- package/dist/capture/environment-raw-producer.js.map +1 -0
- package/dist/capture/export-jpeg.d.ts +12 -0
- package/dist/capture/export-jpeg.d.ts.map +1 -0
- package/dist/capture/export-jpeg.js +126 -0
- package/dist/capture/export-jpeg.js.map +1 -0
- package/dist/capture/export-tiff.d.ts +45 -0
- package/dist/capture/export-tiff.d.ts.map +1 -0
- package/dist/capture/export-tiff.js +129 -0
- package/dist/capture/export-tiff.js.map +1 -0
- package/dist/capture/focus-control.d.ts +210 -0
- package/dist/capture/focus-control.d.ts.map +1 -0
- package/dist/capture/focus-control.js +664 -0
- package/dist/capture/focus-control.js.map +1 -0
- package/dist/capture/linear-encoding.d.ts +59 -0
- package/dist/capture/linear-encoding.d.ts.map +1 -0
- package/dist/capture/linear-encoding.js +98 -0
- package/dist/capture/linear-encoding.js.map +1 -0
- package/dist/capture/photographic-export.d.ts +135 -0
- package/dist/capture/photographic-export.d.ts.map +1 -0
- package/dist/capture/photographic-export.js +273 -0
- package/dist/capture/photographic-export.js.map +1 -0
- package/dist/capture/raw-frame-limits.d.ts +12 -0
- package/dist/capture/raw-frame-limits.d.ts.map +1 -0
- package/dist/capture/raw-frame-limits.js +13 -0
- package/dist/capture/raw-frame-limits.js.map +1 -0
- package/dist/capture/raw-frame-reconstruction.d.ts +48 -0
- package/dist/capture/raw-frame-reconstruction.d.ts.map +1 -0
- package/dist/capture/raw-frame-reconstruction.js +146 -0
- package/dist/capture/raw-frame-reconstruction.js.map +1 -0
- package/dist/capture/release-sequence.d.ts +120 -0
- package/dist/capture/release-sequence.d.ts.map +1 -0
- package/dist/capture/release-sequence.js +446 -0
- package/dist/capture/release-sequence.js.map +1 -0
- package/dist/capture/sensor-raw-frame.d.ts +34 -0
- package/dist/capture/sensor-raw-frame.d.ts.map +1 -0
- package/dist/capture/sensor-raw-frame.js +106 -0
- package/dist/capture/sensor-raw-frame.js.map +1 -0
- package/dist/capture/sensor-raw-producer.d.ts +51 -0
- package/dist/capture/sensor-raw-producer.d.ts.map +1 -0
- package/dist/capture/sensor-raw-producer.js +235 -0
- package/dist/capture/sensor-raw-producer.js.map +1 -0
- package/dist/capture/simulated-capture.d.ts +125 -0
- package/dist/capture/simulated-capture.d.ts.map +1 -0
- package/dist/capture/simulated-capture.js +248 -0
- package/dist/capture/simulated-capture.js.map +1 -0
- package/dist/color/capture-color.d.ts +73 -0
- package/dist/color/capture-color.d.ts.map +1 -0
- package/dist/color/capture-color.js +145 -0
- package/dist/color/capture-color.js.map +1 -0
- package/dist/color/sensor-color-development.d.ts +23 -0
- package/dist/color/sensor-color-development.d.ts.map +1 -0
- package/dist/color/sensor-color-development.js +56 -0
- package/dist/color/sensor-color-development.js.map +1 -0
- package/dist/color/white-balance.d.ts +175 -0
- package/dist/color/white-balance.d.ts.map +1 -0
- package/dist/color/white-balance.js +606 -0
- package/dist/color/white-balance.js.map +1 -0
- package/dist/composition/image-formation-plan.d.ts +481 -0
- package/dist/composition/image-formation-plan.d.ts.map +1 -0
- package/dist/composition/image-formation-plan.js +2499 -0
- package/dist/composition/image-formation-plan.js.map +1 -0
- package/dist/composition/plan-consumer.d.ts +53 -0
- package/dist/composition/plan-consumer.d.ts.map +1 -0
- package/dist/composition/plan-consumer.js +119 -0
- package/dist/composition/plan-consumer.js.map +1 -0
- package/dist/core/calculation-result.d.ts.map +1 -1
- package/dist/core/calculation-result.js +6 -0
- package/dist/core/calculation-result.js.map +1 -1
- package/dist/core/canonical-json.d.ts +18 -0
- package/dist/core/canonical-json.d.ts.map +1 -0
- package/dist/core/canonical-json.js +44 -0
- package/dist/core/canonical-json.js.map +1 -0
- package/dist/core/configuration-error.d.ts +6 -0
- package/dist/core/configuration-error.d.ts.map +1 -1
- package/dist/core/configuration-error.js +6 -0
- package/dist/core/configuration-error.js.map +1 -1
- package/dist/core/evidence-provenance.d.ts +6 -0
- package/dist/core/evidence-provenance.d.ts.map +1 -1
- package/dist/core/evidence-provenance.js +7 -0
- package/dist/core/evidence-provenance.js.map +1 -1
- package/dist/core/image-formation.d.ts +9 -3
- package/dist/core/image-formation.d.ts.map +1 -1
- package/dist/core/image-formation.js +29 -5
- package/dist/core/image-formation.js.map +1 -1
- package/dist/core/owned-data.d.ts +25 -0
- package/dist/core/owned-data.d.ts.map +1 -0
- package/dist/core/owned-data.js +34 -0
- package/dist/core/owned-data.js.map +1 -0
- package/dist/core/record-validation.d.ts +17 -0
- package/dist/core/record-validation.d.ts.map +1 -0
- package/dist/core/record-validation.js +44 -0
- package/dist/core/record-validation.js.map +1 -0
- package/dist/core/scientific-assurance.d.ts +101 -0
- package/dist/core/scientific-assurance.d.ts.map +1 -0
- package/dist/core/scientific-assurance.js +301 -0
- package/dist/core/scientific-assurance.js.map +1 -0
- package/dist/core/spectral-composition.d.ts +106 -0
- package/dist/core/spectral-composition.d.ts.map +1 -0
- package/dist/core/spectral-composition.js +334 -0
- package/dist/core/spectral-composition.js.map +1 -0
- package/dist/core/spectral.d.ts +34 -0
- package/dist/core/spectral.d.ts.map +1 -0
- package/dist/core/spectral.js +57 -0
- package/dist/core/spectral.js.map +1 -0
- package/dist/core/validation.d.ts +6 -0
- package/dist/core/validation.d.ts.map +1 -1
- package/dist/core/validation.js +6 -0
- package/dist/core/validation.js.map +1 -1
- package/dist/core/version.d.ts +14 -0
- package/dist/core/version.d.ts.map +1 -0
- package/dist/core/version.js +15 -0
- package/dist/core/version.js.map +1 -0
- package/dist/equipment/exposure-capabilities.d.ts +125 -0
- package/dist/equipment/exposure-capabilities.d.ts.map +1 -0
- package/dist/equipment/exposure-capabilities.js +391 -0
- package/dist/equipment/exposure-capabilities.js.map +1 -0
- package/dist/equipment/generic-tier-assets.d.ts +82 -0
- package/dist/equipment/generic-tier-assets.d.ts.map +1 -0
- package/dist/equipment/generic-tier-assets.js +119 -0
- package/dist/equipment/generic-tier-assets.js.map +1 -0
- package/dist/equipment/generic-tier-presets.d.ts +57 -0
- package/dist/equipment/generic-tier-presets.d.ts.map +1 -0
- package/dist/equipment/generic-tier-presets.js +122 -0
- package/dist/equipment/generic-tier-presets.js.map +1 -0
- package/dist/equipment/iso-capabilities.d.ts +143 -0
- package/dist/equipment/iso-capabilities.d.ts.map +1 -0
- package/dist/equipment/iso-capabilities.js +578 -0
- package/dist/equipment/iso-capabilities.js.map +1 -0
- package/dist/equipment/metering-capabilities.d.ts +58 -0
- package/dist/equipment/metering-capabilities.d.ts.map +1 -0
- package/dist/equipment/metering-capabilities.js +151 -0
- package/dist/equipment/metering-capabilities.js.map +1 -0
- package/dist/equipment/release-capabilities.d.ts +33 -0
- package/dist/equipment/release-capabilities.d.ts.map +1 -0
- package/dist/equipment/release-capabilities.js +176 -0
- package/dist/equipment/release-capabilities.js.map +1 -0
- package/dist/exposure/exposure-duration-control.d.ts +72 -0
- package/dist/exposure/exposure-duration-control.d.ts.map +1 -0
- package/dist/exposure/exposure-duration-control.js +161 -0
- package/dist/exposure/exposure-duration-control.js.map +1 -0
- package/dist/exposure/exposure-mode-resolver.d.ts +637 -0
- package/dist/exposure/exposure-mode-resolver.d.ts.map +1 -0
- package/dist/exposure/exposure-mode-resolver.js +1905 -0
- package/dist/exposure/exposure-mode-resolver.js.map +1 -0
- package/dist/exposure/exposure.d.ts +8 -0
- package/dist/exposure/exposure.d.ts.map +1 -1
- package/dist/exposure/exposure.js +8 -0
- package/dist/exposure/exposure.js.map +1 -1
- package/dist/exposure/flash.d.ts +179 -0
- package/dist/exposure/flash.d.ts.map +1 -0
- package/dist/exposure/flash.js +644 -0
- package/dist/exposure/flash.js.map +1 -0
- package/dist/exposure/metering-scene-radiance.d.ts +72 -0
- package/dist/exposure/metering-scene-radiance.d.ts.map +1 -0
- package/dist/exposure/metering-scene-radiance.js +222 -0
- package/dist/exposure/metering-scene-radiance.js.map +1 -0
- package/dist/exposure/metering-target.d.ts +67 -0
- package/dist/exposure/metering-target.d.ts.map +1 -0
- package/dist/exposure/metering-target.js +265 -0
- package/dist/exposure/metering-target.js.map +1 -0
- package/dist/exposure/metering-temporal.d.ts +76 -0
- package/dist/exposure/metering-temporal.d.ts.map +1 -0
- package/dist/exposure/metering-temporal.js +210 -0
- package/dist/exposure/metering-temporal.js.map +1 -0
- package/dist/exposure/metering.d.ts +124 -0
- package/dist/exposure/metering.d.ts.map +1 -0
- package/dist/exposure/metering.js +422 -0
- package/dist/exposure/metering.js.map +1 -0
- package/dist/exposure/program-line.d.ts +29 -0
- package/dist/exposure/program-line.d.ts.map +1 -0
- package/dist/exposure/program-line.js +126 -0
- package/dist/exposure/program-line.js.map +1 -0
- package/dist/index.d.ts +87 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +85 -6
- package/dist/index.js.map +1 -1
- package/dist/motion/camera-rotation.d.ts +16 -0
- package/dist/motion/camera-rotation.d.ts.map +1 -1
- package/dist/motion/camera-rotation.js +16 -0
- package/dist/motion/camera-rotation.js.map +1 -1
- package/dist/motion/capture-rotation-inverse-mapping.d.ts +13 -0
- package/dist/motion/capture-rotation-inverse-mapping.d.ts.map +1 -1
- package/dist/motion/capture-rotation-inverse-mapping.js +13 -0
- package/dist/motion/capture-rotation-inverse-mapping.js.map +1 -1
- package/dist/motion/capture-rotation-temporal-quadrature.d.ts +15 -0
- package/dist/motion/capture-rotation-temporal-quadrature.d.ts.map +1 -1
- package/dist/motion/capture-rotation-temporal-quadrature.js +15 -0
- package/dist/motion/capture-rotation-temporal-quadrature.js.map +1 -1
- package/dist/motion/capture-rotation-trajectory.d.ts +15 -0
- package/dist/motion/capture-rotation-trajectory.d.ts.map +1 -1
- package/dist/motion/capture-rotation-trajectory.js +15 -0
- package/dist/motion/capture-rotation-trajectory.js.map +1 -1
- package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts +119 -0
- package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts.map +1 -0
- package/dist/motion/capture-translation-parallax-temporal-quadrature.js +263 -0
- package/dist/motion/capture-translation-parallax-temporal-quadrature.js.map +1 -0
- package/dist/motion/extended-object-projection.d.ts +175 -0
- package/dist/motion/extended-object-projection.d.ts.map +1 -0
- package/dist/motion/extended-object-projection.js +402 -0
- package/dist/motion/extended-object-projection.js.map +1 -0
- package/dist/motion/projected-motion.d.ts +11 -0
- package/dist/motion/projected-motion.d.ts.map +1 -1
- package/dist/motion/projected-motion.js +11 -0
- package/dist/motion/projected-motion.js.map +1 -1
- package/dist/optics/aperture.d.ts +9 -0
- package/dist/optics/aperture.d.ts.map +1 -1
- package/dist/optics/aperture.js +9 -0
- package/dist/optics/aperture.js.map +1 -1
- package/dist/optics/circle-of-confusion.d.ts +8 -0
- package/dist/optics/circle-of-confusion.d.ts.map +1 -1
- package/dist/optics/circle-of-confusion.js +8 -0
- package/dist/optics/circle-of-confusion.js.map +1 -1
- package/dist/optics/complex-pupil-psf.d.ts +128 -0
- package/dist/optics/complex-pupil-psf.d.ts.map +1 -0
- package/dist/optics/complex-pupil-psf.js +462 -0
- package/dist/optics/complex-pupil-psf.js.map +1 -0
- package/dist/optics/depth-of-field.d.ts +18 -0
- package/dist/optics/depth-of-field.d.ts.map +1 -1
- package/dist/optics/depth-of-field.js +29 -4
- package/dist/optics/depth-of-field.js.map +1 -1
- package/dist/optics/diffraction.d.ts +8 -0
- package/dist/optics/diffraction.d.ts.map +1 -1
- package/dist/optics/diffraction.js +8 -0
- package/dist/optics/diffraction.js.map +1 -1
- package/dist/optics/focus-breathing.d.ts +13 -0
- package/dist/optics/focus-breathing.d.ts.map +1 -1
- package/dist/optics/focus-breathing.js +13 -0
- package/dist/optics/focus-breathing.js.map +1 -1
- package/dist/optics/focus-state.d.ts +47 -0
- package/dist/optics/focus-state.d.ts.map +1 -0
- package/dist/optics/focus-state.js +78 -0
- package/dist/optics/focus-state.js.map +1 -0
- package/dist/optics/front-of-lens-filter.d.ts +114 -0
- package/dist/optics/front-of-lens-filter.d.ts.map +1 -0
- package/dist/optics/front-of-lens-filter.js +468 -0
- package/dist/optics/front-of-lens-filter.js.map +1 -0
- package/dist/optics/illumination-vignetting.d.ts +9 -0
- package/dist/optics/illumination-vignetting.d.ts.map +1 -1
- package/dist/optics/illumination-vignetting.js +9 -0
- package/dist/optics/illumination-vignetting.js.map +1 -1
- package/dist/optics/lateral-chromatic-aberration.d.ts +11 -0
- package/dist/optics/lateral-chromatic-aberration.d.ts.map +1 -1
- package/dist/optics/lateral-chromatic-aberration.js +11 -0
- package/dist/optics/lateral-chromatic-aberration.js.map +1 -1
- package/dist/optics/lens-psf-profile.d.ts +217 -0
- package/dist/optics/lens-psf-profile.d.ts.map +1 -0
- package/dist/optics/lens-psf-profile.js +823 -0
- package/dist/optics/lens-psf-profile.js.map +1 -0
- package/dist/optics/polygon-diffraction.d.ts +67 -0
- package/dist/optics/polygon-diffraction.d.ts.map +1 -0
- package/dist/optics/polygon-diffraction.js +145 -0
- package/dist/optics/polygon-diffraction.js.map +1 -0
- package/dist/optics/profile-contract.d.ts +42 -0
- package/dist/optics/profile-contract.d.ts.map +1 -0
- package/dist/optics/profile-contract.js +92 -0
- package/dist/optics/profile-contract.js.map +1 -0
- package/dist/optics/psf-foundation.d.ts +16 -3
- package/dist/optics/psf-foundation.d.ts.map +1 -1
- package/dist/optics/psf-foundation.js +28 -15
- package/dist/optics/psf-foundation.js.map +1 -1
- package/dist/optics/radial-distortion.d.ts +18 -0
- package/dist/optics/radial-distortion.d.ts.map +1 -1
- package/dist/optics/radial-distortion.js +18 -0
- package/dist/optics/radial-distortion.js.map +1 -1
- package/dist/optics/scene-to-sensor-irradiance.d.ts +213 -0
- package/dist/optics/scene-to-sensor-irradiance.d.ts.map +1 -0
- package/dist/optics/scene-to-sensor-irradiance.js +662 -0
- package/dist/optics/scene-to-sensor-irradiance.js.map +1 -0
- package/dist/optics/scene-to-sensor-quadrature.d.ts +63 -0
- package/dist/optics/scene-to-sensor-quadrature.d.ts.map +1 -0
- package/dist/optics/scene-to-sensor-quadrature.js +82 -0
- package/dist/optics/scene-to-sensor-quadrature.js.map +1 -0
- package/dist/optics/sensor-environment-query.d.ts +60 -0
- package/dist/optics/sensor-environment-query.d.ts.map +1 -0
- package/dist/optics/sensor-environment-query.js +50 -0
- package/dist/optics/sensor-environment-query.js.map +1 -0
- package/dist/optics/sensor-psf-quadrature.d.ts +70 -0
- package/dist/optics/sensor-psf-quadrature.d.ts.map +1 -0
- package/dist/optics/sensor-psf-quadrature.js +101 -0
- package/dist/optics/sensor-psf-quadrature.js.map +1 -0
- package/dist/optics/sensor-psf-support.d.ts +20 -0
- package/dist/optics/sensor-psf-support.d.ts.map +1 -0
- package/dist/optics/sensor-psf-support.js +13 -0
- package/dist/optics/sensor-psf-support.js.map +1 -0
- package/dist/optics/stray-light.d.ts +91 -0
- package/dist/optics/stray-light.d.ts.map +1 -0
- package/dist/optics/stray-light.js +110 -0
- package/dist/optics/stray-light.js.map +1 -0
- package/dist/optics/thin-lens.d.ts +8 -0
- package/dist/optics/thin-lens.d.ts.map +1 -1
- package/dist/optics/thin-lens.js +8 -0
- package/dist/optics/thin-lens.js.map +1 -1
- package/dist/output/capture-corrected-sdr.d.ts +49 -0
- package/dist/output/capture-corrected-sdr.d.ts.map +1 -0
- package/dist/output/capture-corrected-sdr.js +149 -0
- package/dist/output/capture-corrected-sdr.js.map +1 -0
- package/dist/output/capture-geometry.d.ts.map +1 -1
- package/dist/output/capture-geometry.js +8 -0
- package/dist/output/capture-geometry.js.map +1 -1
- package/dist/output/capture-sdr.d.ts +49 -0
- package/dist/output/capture-sdr.d.ts.map +1 -0
- package/dist/output/capture-sdr.js +90 -0
- package/dist/output/capture-sdr.js.map +1 -0
- package/dist/output/crop.d.ts +6 -0
- package/dist/output/crop.d.ts.map +1 -1
- package/dist/output/crop.js +6 -0
- package/dist/output/crop.js.map +1 -1
- package/dist/output/geometric-transforms.d.ts +137 -0
- package/dist/output/geometric-transforms.d.ts.map +1 -0
- package/dist/output/geometric-transforms.js +225 -0
- package/dist/output/geometric-transforms.js.map +1 -0
- package/dist/output/lens-corrections.d.ts +121 -0
- package/dist/output/lens-corrections.d.ts.map +1 -0
- package/dist/output/lens-corrections.js +210 -0
- package/dist/output/lens-corrections.js.map +1 -0
- package/dist/output/sdr-rendering.d.ts +81 -0
- package/dist/output/sdr-rendering.d.ts.map +1 -0
- package/dist/output/sdr-rendering.js +106 -0
- package/dist/output/sdr-rendering.js.map +1 -0
- package/dist/output/subject-framing-crop.d.ts +8 -0
- package/dist/output/subject-framing-crop.d.ts.map +1 -1
- package/dist/output/subject-framing-crop.js +8 -0
- package/dist/output/subject-framing-crop.js.map +1 -1
- package/dist/schema/camera.d.ts +6 -0
- package/dist/schema/camera.d.ts.map +1 -1
- package/dist/schema/illumination-spectral.d.ts +51 -0
- package/dist/schema/illumination-spectral.d.ts.map +1 -0
- package/dist/schema/illumination-spectral.js +132 -0
- package/dist/schema/illumination-spectral.js.map +1 -0
- package/dist/schema/illumination-temporal.d.ts +156 -0
- package/dist/schema/illumination-temporal.d.ts.map +1 -0
- package/dist/schema/illumination-temporal.js +554 -0
- package/dist/schema/illumination-temporal.js.map +1 -0
- package/dist/schema/illumination.d.ts +138 -0
- package/dist/schema/illumination.d.ts.map +1 -0
- package/dist/schema/illumination.js +483 -0
- package/dist/schema/illumination.js.map +1 -0
- package/dist/schema/scene-radiance-temporal.d.ts +107 -0
- package/dist/schema/scene-radiance-temporal.d.ts.map +1 -0
- package/dist/schema/scene-radiance-temporal.js +259 -0
- package/dist/schema/scene-radiance-temporal.js.map +1 -0
- package/dist/schema/scene-radiance.d.ts +185 -0
- package/dist/schema/scene-radiance.d.ts.map +1 -0
- package/dist/schema/scene-radiance.js +535 -0
- package/dist/schema/scene-radiance.js.map +1 -0
- package/dist/schema/scene.d.ts +7 -0
- package/dist/schema/scene.d.ts.map +1 -1
- package/dist/schema/validation.d.ts.map +1 -1
- package/dist/schema/validation.js +7 -0
- package/dist/schema/validation.js.map +1 -1
- package/dist/sensor/accumulated-charge.d.ts +199 -0
- package/dist/sensor/accumulated-charge.d.ts.map +1 -0
- package/dist/sensor/accumulated-charge.js +450 -0
- package/dist/sensor/accumulated-charge.js.map +1 -0
- package/dist/sensor/architecture.d.ts +48 -13
- package/dist/sensor/architecture.d.ts.map +1 -1
- package/dist/sensor/architecture.js +58 -16
- package/dist/sensor/architecture.js.map +1 -1
- package/dist/sensor/camera-saturation-capacity.d.ts +138 -0
- package/dist/sensor/camera-saturation-capacity.d.ts.map +1 -0
- package/dist/sensor/camera-saturation-capacity.js +356 -0
- package/dist/sensor/camera-saturation-capacity.js.map +1 -0
- package/dist/sensor/capture-color-sampling-binding.d.ts +1 -0
- package/dist/sensor/capture-color-sampling-binding.d.ts.map +1 -1
- package/dist/sensor/capture-color-sampling-binding.js +14 -0
- package/dist/sensor/capture-color-sampling-binding.js.map +1 -1
- package/dist/sensor/capture-mode-timing.d.ts +63 -0
- package/dist/sensor/capture-mode-timing.d.ts.map +1 -0
- package/dist/sensor/capture-mode-timing.js +270 -0
- package/dist/sensor/capture-mode-timing.js.map +1 -0
- package/dist/sensor/capture-mode.d.ts.map +1 -1
- package/dist/sensor/capture-mode.js +13 -0
- package/dist/sensor/capture-mode.js.map +1 -1
- package/dist/sensor/color-sampling.d.ts.map +1 -1
- package/dist/sensor/color-sampling.js +19 -0
- package/dist/sensor/color-sampling.js.map +1 -1
- package/dist/sensor/constant-rate-temporal-integration.d.ts +126 -0
- package/dist/sensor/constant-rate-temporal-integration.d.ts.map +1 -0
- package/dist/sensor/constant-rate-temporal-integration.js +382 -0
- package/dist/sensor/constant-rate-temporal-integration.js.map +1 -0
- package/dist/sensor/dark-current.d.ts +169 -0
- package/dist/sensor/dark-current.d.ts.map +1 -0
- package/dist/sensor/dark-current.js +427 -0
- package/dist/sensor/dark-current.js.map +1 -0
- package/dist/sensor/environment-photo-signal.d.ts +123 -0
- package/dist/sensor/environment-photo-signal.d.ts.map +1 -0
- package/dist/sensor/environment-photo-signal.js +186 -0
- package/dist/sensor/environment-photo-signal.js.map +1 -0
- package/dist/sensor/eqe-electron-rate.d.ts +107 -0
- package/dist/sensor/eqe-electron-rate.d.ts.map +1 -0
- package/dist/sensor/eqe-electron-rate.js +561 -0
- package/dist/sensor/eqe-electron-rate.js.map +1 -0
- package/dist/sensor/eqe-local-exposure.d.ts +65 -0
- package/dist/sensor/eqe-local-exposure.d.ts.map +1 -0
- package/dist/sensor/eqe-local-exposure.js +84 -0
- package/dist/sensor/eqe-local-exposure.js.map +1 -0
- package/dist/sensor/eqe-temporal-exposure.d.ts +55 -0
- package/dist/sensor/eqe-temporal-exposure.d.ts.map +1 -0
- package/dist/sensor/eqe-temporal-exposure.js +62 -0
- package/dist/sensor/eqe-temporal-exposure.js.map +1 -0
- package/dist/sensor/exposure-window.d.ts +14 -0
- package/dist/sensor/exposure-window.d.ts.map +1 -1
- package/dist/sensor/exposure-window.js +14 -0
- package/dist/sensor/exposure-window.js.map +1 -1
- package/dist/sensor/iso-signal-chain.d.ts +148 -0
- package/dist/sensor/iso-signal-chain.d.ts.map +1 -0
- package/dist/sensor/iso-signal-chain.js +411 -0
- package/dist/sensor/iso-signal-chain.js.map +1 -0
- package/dist/sensor/local-exposure-binding.d.ts +87 -0
- package/dist/sensor/local-exposure-binding.d.ts.map +1 -0
- package/dist/sensor/local-exposure-binding.js +214 -0
- package/dist/sensor/local-exposure-binding.js.map +1 -0
- package/dist/sensor/optical-stack.d.ts.map +1 -1
- package/dist/sensor/optical-stack.js +17 -0
- package/dist/sensor/optical-stack.js.map +1 -1
- package/dist/sensor/photon-energy.d.ts +97 -0
- package/dist/sensor/photon-energy.d.ts.map +1 -0
- package/dist/sensor/photon-energy.js +390 -0
- package/dist/sensor/photon-energy.js.map +1 -0
- package/dist/sensor/physical-charge-capacity.d.ts +130 -0
- package/dist/sensor/physical-charge-capacity.d.ts.map +1 -0
- package/dist/sensor/physical-charge-capacity.js +345 -0
- package/dist/sensor/physical-charge-capacity.js.map +1 -0
- package/dist/sensor/pixel-pitch.d.ts +6 -0
- package/dist/sensor/pixel-pitch.d.ts.map +1 -1
- package/dist/sensor/pixel-pitch.js +6 -0
- package/dist/sensor/pixel-pitch.js.map +1 -1
- package/dist/sensor/radiometry-readiness.d.ts +10 -0
- package/dist/sensor/radiometry-readiness.d.ts.map +1 -1
- package/dist/sensor/radiometry-readiness.js +10 -0
- package/dist/sensor/radiometry-readiness.js.map +1 -1
- package/dist/sensor/raw-readout.d.ts +314 -0
- package/dist/sensor/raw-readout.d.ts.map +1 -0
- package/dist/sensor/raw-readout.js +914 -0
- package/dist/sensor/raw-readout.js.map +1 -0
- package/dist/sensor/raw-reconstruction.d.ts +170 -0
- package/dist/sensor/raw-reconstruction.d.ts.map +1 -0
- package/dist/sensor/raw-reconstruction.js +424 -0
- package/dist/sensor/raw-reconstruction.js.map +1 -0
- package/dist/sensor/readout-exposure-linkage.d.ts +12 -0
- package/dist/sensor/readout-exposure-linkage.d.ts.map +1 -1
- package/dist/sensor/readout-exposure-linkage.js +12 -0
- package/dist/sensor/readout-exposure-linkage.js.map +1 -1
- package/dist/sensor/readout-timing.d.ts +13 -0
- package/dist/sensor/readout-timing.d.ts.map +1 -1
- package/dist/sensor/readout-timing.js +13 -0
- package/dist/sensor/readout-timing.js.map +1 -1
- package/dist/sensor/response-application-compatibility.d.ts +136 -0
- package/dist/sensor/response-application-compatibility.d.ts.map +1 -0
- package/dist/sensor/response-application-compatibility.js +408 -0
- package/dist/sensor/response-application-compatibility.js.map +1 -0
- package/dist/sensor/response-operating-range.d.ts +173 -0
- package/dist/sensor/response-operating-range.d.ts.map +1 -0
- package/dist/sensor/response-operating-range.js +672 -0
- package/dist/sensor/response-operating-range.js.map +1 -0
- package/dist/sensor/responsivity-photocurrent.d.ts +158 -0
- package/dist/sensor/responsivity-photocurrent.d.ts.map +1 -0
- package/dist/sensor/responsivity-photocurrent.js +644 -0
- package/dist/sensor/responsivity-photocurrent.js.map +1 -0
- package/dist/sensor/sampling-aperture.d.ts.map +1 -1
- package/dist/sensor/sampling-aperture.js +14 -0
- package/dist/sensor/sampling-aperture.js.map +1 -1
- package/dist/sensor/scene-eqe-temporal-exposure.d.ts +45 -0
- package/dist/sensor/scene-eqe-temporal-exposure.d.ts.map +1 -0
- package/dist/sensor/scene-eqe-temporal-exposure.js +64 -0
- package/dist/sensor/scene-eqe-temporal-exposure.js.map +1 -0
- package/dist/sensor/sensor-geometry.d.ts +12 -0
- package/dist/sensor/sensor-geometry.d.ts.map +1 -1
- package/dist/sensor/sensor-geometry.js +12 -0
- package/dist/sensor/sensor-geometry.js.map +1 -1
- package/dist/sensor/signal-noise.d.ts +10 -0
- package/dist/sensor/signal-noise.d.ts.map +1 -1
- package/dist/sensor/signal-noise.js +10 -0
- package/dist/sensor/signal-noise.js.map +1 -1
- package/dist/sensor/spatial-sample-reduction.d.ts +44 -1
- package/dist/sensor/spatial-sample-reduction.d.ts.map +1 -1
- package/dist/sensor/spatial-sample-reduction.js +51 -5
- package/dist/sensor/spatial-sample-reduction.js.map +1 -1
- package/dist/sensor/spatial-sampling-quadrature.d.ts +24 -0
- package/dist/sensor/spatial-sampling-quadrature.d.ts.map +1 -1
- package/dist/sensor/spatial-sampling-quadrature.js +27 -0
- package/dist/sensor/spatial-sampling-quadrature.js.map +1 -1
- package/dist/sensor/spatio-spectral-reduction.d.ts +187 -0
- package/dist/sensor/spatio-spectral-reduction.d.ts.map +1 -0
- package/dist/sensor/spatio-spectral-reduction.js +373 -0
- package/dist/sensor/spatio-spectral-reduction.js.map +1 -0
- package/dist/sensor/spectral-coverage.d.ts +24 -0
- package/dist/sensor/spectral-coverage.d.ts.map +1 -0
- package/dist/sensor/spectral-coverage.js +86 -0
- package/dist/sensor/spectral-coverage.js.map +1 -0
- package/dist/sensor/spectral-quadrature.d.ts +169 -0
- package/dist/sensor/spectral-quadrature.d.ts.map +1 -0
- package/dist/sensor/spectral-quadrature.js +542 -0
- package/dist/sensor/spectral-quadrature.js.map +1 -0
- package/dist/sensor/spectral-response.d.ts +192 -0
- package/dist/sensor/spectral-response.d.ts.map +1 -0
- package/dist/sensor/spectral-response.js +664 -0
- package/dist/sensor/spectral-response.js.map +1 -0
- package/dist/sensor/temporal-eqe-sum.d.ts +15 -0
- package/dist/sensor/temporal-eqe-sum.d.ts.map +1 -0
- package/dist/sensor/temporal-eqe-sum.js +30 -0
- package/dist/sensor/temporal-eqe-sum.js.map +1 -0
- package/dist/sensor/temporal-photo-signal.d.ts +38 -0
- package/dist/sensor/temporal-photo-signal.d.ts.map +1 -0
- package/dist/sensor/temporal-photo-signal.js +110 -0
- package/dist/sensor/temporal-photo-signal.js.map +1 -0
- package/dist/sensor/temporal-sample-binding.d.ts +6 -0
- package/dist/sensor/temporal-sample-binding.d.ts.map +1 -0
- package/dist/sensor/temporal-sample-binding.js +32 -0
- package/dist/sensor/temporal-sample-binding.js.map +1 -0
- package/dist/simulation/poc-simulation.d.ts.map +1 -1
- package/dist/simulation/poc-simulation.js +34 -11
- package/dist/simulation/poc-simulation.js.map +1 -1
- package/dist/stabilization/camera-shake.d.ts +11 -0
- package/dist/stabilization/camera-shake.d.ts.map +1 -1
- package/dist/stabilization/camera-shake.js +11 -0
- package/dist/stabilization/camera-shake.js.map +1 -1
- package/dist/stabilization/system.d.ts +218 -0
- package/dist/stabilization/system.d.ts.map +1 -0
- package/dist/stabilization/system.js +695 -0
- package/dist/stabilization/system.js.map +1 -0
- package/docs/API_REFERENCE.md +2017 -0
- package/docs/API_STYLE.md +132 -0
- package/docs/ARCHITECTURE.md +134 -24
- package/docs/AUTOMATION_COORDINATION.md +2 -0
- package/docs/CAPTURE_COLOR.md +25 -0
- package/docs/CAPTURE_CORRECTED_SDR.md +25 -0
- package/docs/CAPTURE_EXPORT_METADATA.md +27 -0
- package/docs/CAPTURE_SDR.md +20 -0
- package/docs/DEVELOPERS.md +60 -0
- package/docs/DIGITAL_OPTICS_FOUNDATION.md +69 -0
- package/docs/ENVIRONMENT_RAW_CAPTURE.md +187 -0
- package/docs/EXPORT_ACCEPTANCE.md +133 -0
- package/docs/GENERIC_TIER_PRESETS.md +269 -0
- package/docs/GEOMETRIC_PREPARATION_REUSE.md +141 -0
- package/docs/IMAGE_FORMATION.md +80 -10
- package/docs/LINEAR_CAPTURE_ENCODING.md +25 -0
- package/docs/MOTION_AND_SIGNAL.md +5 -3
- package/docs/NUMERICAL_CORRECTNESS.md +191 -0
- package/docs/PERFORMANCE_BASELINE.md +56 -0
- package/docs/PHOTOGRAPHIC_EXPORT.md +206 -0
- package/docs/PHYSICS_FOUNDATION.md +152 -5
- package/docs/POC_API.md +2 -0
- package/docs/POC_PROJECTION_REUSE.md +124 -0
- package/docs/PROCESSED_OUTPUT.md +157 -0
- package/docs/PRODUCTION_COMPOSITION.md +373 -0
- package/docs/PRODUCTION_ENVIRONMENT_CAPTURE.md +131 -0
- package/docs/PROVENANCE.md +4 -0
- package/docs/PSF_FOUNDATION.md +110 -88
- package/docs/RAW_FRAME_ENVELOPE.md +56 -0
- package/docs/RAW_FRAME_RECONSTRUCTION.md +30 -0
- package/docs/RELEASE_1_0.md +65 -0
- package/docs/RELEASE_AUDIT.md +38 -0
- package/docs/SCENE_RADIANCE_AND_ILLUMINATION.md +298 -0
- package/docs/SCENE_SENSOR_QUADRATURE.md +98 -0
- package/docs/SCENE_SENSOR_TEMPORAL_EXPOSURE.md +86 -0
- package/docs/SCIENTIFIC_ASSURANCE.md +280 -0
- package/docs/SCIENTIFIC_CONFORMANCE.md +83 -0
- package/docs/SDR_RENDERING.md +33 -0
- package/docs/SENSOR_ENVIRONMENT_QUERY.md +86 -0
- package/docs/SENSOR_EQE_LOCAL_EXPOSURE.md +104 -0
- package/docs/SENSOR_EQE_TEMPORAL_EXPOSURE.md +74 -0
- package/docs/SENSOR_PSF_QUADRATURE.md +90 -0
- package/docs/SENSOR_RAW_FRAME.md +20 -0
- package/docs/SENSOR_RAW_PRODUCER.md +77 -0
- package/docs/SIGNAL_CONFORMANCE.md +23 -0
- package/docs/SIMULATED_CAPTURE.md +65 -0
- package/docs/STABILIZATION.md +160 -17
- package/docs/TEMPORAL_PHOTO_RAW.md +83 -0
- package/docs/TIER_ACCEPTANCE.md +129 -0
- package/docs/TIER_PRESET_ACCEPTANCE.md +59 -0
- package/docs/USAGE.md +5050 -1047
- package/docs/V1_COMPOSITION_MAP.md +123 -0
- package/docs/V1_HELPER_REUSE_REVIEW.md +60 -0
- package/docs/V1_PERFORMANCE_DISPOSITION.md +88 -0
- package/docs/api/camera-equivalent-focal-length.md +53 -0
- package/docs/api/camera-field-of-view.md +119 -0
- package/docs/api/camera-projected-object-size.md +54 -0
- package/docs/api/capture-capture-export-metadata.md +107 -0
- package/docs/api/capture-environment-raw-producer.md +56 -0
- package/docs/api/capture-focus-control.md +419 -0
- package/docs/api/capture-linear-encoding.md +99 -0
- package/docs/api/capture-photographic-export.md +172 -0
- package/docs/api/capture-raw-frame-reconstruction.md +87 -0
- package/docs/api/capture-release-sequence.md +252 -0
- package/docs/api/capture-sensor-raw-frame.md +66 -0
- package/docs/api/capture-sensor-raw-producer.md +98 -0
- package/docs/api/capture-simulated-capture.md +179 -0
- package/docs/api/color-capture-color.md +122 -0
- package/docs/api/color-white-balance.md +386 -0
- package/docs/api/composition-image-formation-plan.md +825 -0
- package/docs/api/composition-plan-consumer.md +98 -0
- package/docs/api/core-calculation-result.md +220 -0
- package/docs/api/core-configuration-error.md +19 -0
- package/docs/api/core-image-formation.md +204 -0
- package/docs/api/core-scientific-assurance.md +214 -0
- package/docs/api/core-spectral-composition.md +268 -0
- package/docs/api/core-spectral.md +78 -0
- package/docs/api/core-validation.md +34 -0
- package/docs/api/core-version.md +14 -0
- package/docs/api/equipment-exposure-capabilities.md +270 -0
- package/docs/api/equipment-generic-tier-assets.md +82 -0
- package/docs/api/equipment-generic-tier-presets.md +103 -0
- package/docs/api/equipment-iso-capabilities.md +295 -0
- package/docs/api/equipment-metering-capabilities.md +126 -0
- package/docs/api/equipment-release-capabilities.md +91 -0
- package/docs/api/exports.json +5656 -0
- package/docs/api/exposure-exposure-duration-control.md +115 -0
- package/docs/api/exposure-exposure-mode-resolver.md +966 -0
- package/docs/api/exposure-exposure.md +150 -0
- package/docs/api/exposure-flash.md +327 -0
- package/docs/api/exposure-metering-scene-radiance.md +154 -0
- package/docs/api/exposure-metering-target.md +134 -0
- package/docs/api/exposure-metering-temporal.md +77 -0
- package/docs/api/exposure-metering.md +172 -0
- package/docs/api/exposure-program-line.md +64 -0
- package/docs/api/motion-camera-rotation.md +215 -0
- package/docs/api/motion-capture-rotation-inverse-mapping.md +128 -0
- package/docs/api/motion-capture-rotation-temporal-quadrature.md +127 -0
- package/docs/api/motion-capture-rotation-trajectory.md +132 -0
- package/docs/api/motion-capture-translation-parallax-temporal-quadrature.md +171 -0
- package/docs/api/motion-extended-object-projection.md +312 -0
- package/docs/api/motion-projected-motion.md +60 -0
- package/docs/api/optics-aperture.md +69 -0
- package/docs/api/optics-circle-of-confusion.md +46 -0
- package/docs/api/optics-complex-pupil-psf.md +193 -0
- package/docs/api/optics-depth-of-field.md +92 -0
- package/docs/api/optics-diffraction.md +46 -0
- package/docs/api/optics-focus-breathing.md +119 -0
- package/docs/api/optics-focus-state.md +64 -0
- package/docs/api/optics-front-of-lens-filter.md +263 -0
- package/docs/api/optics-illumination-vignetting.md +95 -0
- package/docs/api/optics-lateral-chromatic-aberration.md +225 -0
- package/docs/api/optics-lens-psf-profile.md +380 -0
- package/docs/api/optics-polygon-diffraction.md +68 -0
- package/docs/api/optics-profile-contract.md +47 -0
- package/docs/api/optics-psf-foundation.md +181 -0
- package/docs/api/optics-radial-distortion.md +194 -0
- package/docs/api/optics-scene-to-sensor-irradiance.md +371 -0
- package/docs/api/optics-scene-to-sensor-quadrature.md +78 -0
- package/docs/api/optics-sensor-environment-query.md +58 -0
- package/docs/api/optics-sensor-psf-quadrature.md +81 -0
- package/docs/api/optics-stray-light.md +109 -0
- package/docs/api/optics-thin-lens.md +53 -0
- package/docs/api/output-capture-corrected-sdr.md +71 -0
- package/docs/api/output-capture-geometry.md +500 -0
- package/docs/api/output-capture-sdr.md +69 -0
- package/docs/api/output-crop.md +47 -0
- package/docs/api/output-geometric-transforms.md +199 -0
- package/docs/api/output-lens-corrections.md +162 -0
- package/docs/api/output-sdr-rendering.md +122 -0
- package/docs/api/output-subject-framing-crop.md +59 -0
- package/docs/api/schema-camera.md +84 -0
- package/docs/api/schema-illumination-spectral.md +77 -0
- package/docs/api/schema-illumination-temporal.md +289 -0
- package/docs/api/schema-illumination.md +246 -0
- package/docs/api/schema-scene-radiance-temporal.md +215 -0
- package/docs/api/schema-scene-radiance.md +415 -0
- package/docs/api/schema-scene.md +105 -0
- package/docs/api/schema-validation.md +25 -0
- package/docs/api/sensor-accumulated-charge.md +273 -0
- package/docs/api/sensor-architecture.md +155 -0
- package/docs/api/sensor-camera-saturation-capacity.md +215 -0
- package/docs/api/sensor-capture-color-sampling-binding.md +323 -0
- package/docs/api/sensor-capture-mode-timing.md +123 -0
- package/docs/api/sensor-capture-mode.md +321 -0
- package/docs/api/sensor-color-sampling.md +228 -0
- package/docs/api/sensor-constant-rate-temporal-integration.md +152 -0
- package/docs/api/sensor-dark-current.md +227 -0
- package/docs/api/sensor-environment-photo-signal.md +77 -0
- package/docs/api/sensor-eqe-electron-rate.md +166 -0
- package/docs/api/sensor-eqe-local-exposure.md +68 -0
- package/docs/api/sensor-eqe-temporal-exposure.md +73 -0
- package/docs/api/sensor-exposure-window.md +183 -0
- package/docs/api/sensor-iso-signal-chain.md +264 -0
- package/docs/api/sensor-local-exposure-binding.md +126 -0
- package/docs/api/sensor-optical-stack.md +211 -0
- package/docs/api/sensor-photon-energy.md +149 -0
- package/docs/api/sensor-physical-charge-capacity.md +196 -0
- package/docs/api/sensor-pixel-pitch.md +41 -0
- package/docs/api/sensor-radiometry-readiness.md +240 -0
- package/docs/api/sensor-raw-readout.md +499 -0
- package/docs/api/sensor-raw-reconstruction.md +260 -0
- package/docs/api/sensor-readout-exposure-linkage.md +172 -0
- package/docs/api/sensor-readout-timing.md +209 -0
- package/docs/api/sensor-response-application-compatibility.md +256 -0
- package/docs/api/sensor-response-operating-range.md +293 -0
- package/docs/api/sensor-responsivity-photocurrent.md +245 -0
- package/docs/api/sensor-sampling-aperture.md +221 -0
- package/docs/api/sensor-scene-eqe-temporal-exposure.md +56 -0
- package/docs/api/sensor-sensor-geometry.md +143 -0
- package/docs/api/sensor-signal-noise.md +75 -0
- package/docs/api/sensor-spatial-sample-reduction.md +186 -0
- package/docs/api/sensor-spatial-sampling-quadrature.md +188 -0
- package/docs/api/sensor-spatio-spectral-reduction.md +217 -0
- package/docs/api/sensor-spectral-coverage.md +33 -0
- package/docs/api/sensor-spectral-quadrature.md +183 -0
- package/docs/api/sensor-spectral-response.md +291 -0
- package/docs/api/sensor-temporal-photo-signal.md +62 -0
- package/docs/api/simulation-poc-simulation.md +364 -0
- package/docs/api/stabilization-camera-shake.md +71 -0
- package/docs/api/stabilization-system.md +442 -0
- package/docs/benchmarks/2026-10-01-main-baseline.json +694 -0
- package/docs/benchmarks/2026-10-02-geometric-preparation-reuse.json +2190 -0
- package/docs/benchmarks/2026-10-02-poc-projection-reuse.json +2423 -0
- package/docs/benchmarks/2026-10-02-v1-environment-gc-profile.json +210 -0
- package/docs/benchmarks/2026-10-02-v1-environment-ordinary.json +187 -0
- package/docs/benchmarks/2026-10-02-v1-geometry-gc-profile.json +756 -0
- package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-1.json +711 -0
- package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-2.json +711 -0
- package/docs/benchmarks/2026-10-02-v1-poc-gc-profile.json +885 -0
- package/docs/benchmarks/2026-10-02-v1-poc-ordinary-1.json +868 -0
- package/docs/benchmarks/2026-10-02-v1-poc-ordinary-2.json +868 -0
- package/docs/examples/production-capture.mjs +34 -0
- package/docs/examples/production-request.json +4613 -0
- package/docs/examples/quick-start.mjs +12 -0
- package/docs/validation/documentation-fragments.json +212 -0
- package/docs/validation/release-audit-inventory.json +1306 -0
- package/docs/validation/tier-acceptance-report-v1.json +2538 -0
- package/package.json +15 -3
package/AGENTS.md
ADDED
|
@@ -0,0 +1,674 @@
|
|
|
1
|
+
# AGENTS.md
|
|
2
|
+
|
|
3
|
+
These instructions apply to the entire Photivra engine repository.
|
|
4
|
+
|
|
5
|
+
## Project identity
|
|
6
|
+
|
|
7
|
+
- Project: **Photivra**
|
|
8
|
+
- Pronunciation (IPA): /foʊˈtɪvɹə/
|
|
9
|
+
- Package: `@photivra/engine`
|
|
10
|
+
- License: Apache-2.0
|
|
11
|
+
|
|
12
|
+
Treat this repository as a complete, standalone open-source scientific/business-logic project. Do not add references or dependencies that require access to private repositories or private product code.
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
## Non-negotiable rules
|
|
16
|
+
|
|
17
|
+
1. Never introduce copied, restricted, or ambiguously licensed source code, data, calibration material, model weights, or protected expression.
|
|
18
|
+
2. Never fabricate scientific accuracy, calibration, uncertainty, confidence, or physical-performance claims.
|
|
19
|
+
3. Preserve backward compatibility of public APIs and schemas unless an explicit breaking change is approved.
|
|
20
|
+
4. Keep the root public package browser-safe and keep Node-only tooling out of the published package surface.
|
|
21
|
+
5. Never weaken CI, security, provenance, licensing, SPDX, identity, browser-surface, or package-surface gates to make a change pass.
|
|
22
|
+
6. Never commit secrets, credentials, private keys, private datasets, or restricted material.
|
|
23
|
+
7. Call out any new monetary cost before adopting a paid service, dependency, dataset, or infrastructure component.
|
|
24
|
+
|
|
25
|
+
## Repository map
|
|
26
|
+
|
|
27
|
+
- `src/` — scientific implementation, schemas, validation, and composed engine logic.
|
|
28
|
+
- `src/camera/` — projection, field-of-view, and equivalent-focal-length primitives.
|
|
29
|
+
- `src/sensor/` — sensor geometry, architecture metadata, radiometry readiness, sampling, and signal/noise primitives.
|
|
30
|
+
- `src/output/` — capture/orientation/output geometry and crop/framing calculations.
|
|
31
|
+
- `src/core/` — shared result metadata, errors, and evidence/provenance contracts; lower layers must not depend on schema/UI code.
|
|
32
|
+
- `src/api/` — repository-only local Node transport; not a public package surface.
|
|
33
|
+
- `test/` — deterministic unit, regression, invariant, fuzz/property, parser, and integration tests.
|
|
34
|
+
- `docs/USAGE.md` — canonical public API examples.
|
|
35
|
+
- `docs/PHYSICS_FOUNDATION.md` — geometry/optics model assumptions and coordinate conventions.
|
|
36
|
+
- `docs/MOTION_AND_SIGNAL.md` — motion/exposure/signal boundaries, including radiometry gating.
|
|
37
|
+
- `docs/PROVENANCE.md` — scientific/source evidence and reuse-rights rules.
|
|
38
|
+
- `docs/SCIENTIFIC_ASSURANCE.md` — cross-engine status/evidence/uncertainty composition rules.
|
|
39
|
+
- `docs/API_STYLE.md` — public API and versioning conventions.
|
|
40
|
+
- `docs/NUMERICAL_CORRECTNESS.md` — physical-unit, finite-number, tolerance, rounding, and numerical-determinism rules.
|
|
41
|
+
- `scripts/` — CI, package-surface, license, identity, and browser-boundary gates.
|
|
42
|
+
|
|
43
|
+
## Sources of truth
|
|
44
|
+
|
|
45
|
+
- Scientific equations and behavior are defined by implementation plus tests; documentation must agree with them.
|
|
46
|
+
- Public API shape and semantics are defined by exported TypeScript contracts, tests, and `docs/API_STYLE.md`.
|
|
47
|
+
- Root engine compatibility is versioned by `ENGINE_API_VERSION`; the composed `simulatePocCamera()` request/response contract is separately versioned by `POC_SIMULATION_API_VERSION`. Never conflate either with the npm package version.
|
|
48
|
+
- If documentation, tests, and implementation disagree, do not guess. Determine the intended contract, fix the stale source, and add a regression test when behavior is involved.
|
|
49
|
+
- UI or downstream clients are never authoritative sources for camera science.
|
|
50
|
+
|
|
51
|
+
## Priorities
|
|
52
|
+
|
|
53
|
+
In descending order:
|
|
54
|
+
|
|
55
|
+
1. Scientific correctness and explicit assumptions.
|
|
56
|
+
2. Legal/source provenance and license cleanliness.
|
|
57
|
+
3. Security, privacy, and package-boundary integrity.
|
|
58
|
+
4. Backward compatibility of public APIs and schemas.
|
|
59
|
+
5. Deterministic tests and reproducibility.
|
|
60
|
+
6. Minimal, maintainable implementation.
|
|
61
|
+
7. Performance where measurements show material value.
|
|
62
|
+
8. Documentation that is complete, concise, and current.
|
|
63
|
+
|
|
64
|
+
Do not weaken an existing release, provenance, licensing, browser-surface, or package-surface gate to make a change pass.
|
|
65
|
+
|
|
66
|
+
## Scientific integrity
|
|
67
|
+
|
|
68
|
+
- Use explicit physical units in names and contracts.
|
|
69
|
+
- Keep equations, coordinate conventions, assumptions, and valid ranges documented.
|
|
70
|
+
- Prefer established analytical relations and independently derived tests.
|
|
71
|
+
- Never fabricate calibration values, uncertainty, confidence, error bars, or physical accuracy claims.
|
|
72
|
+
- Label results honestly as calculated, calibrated, estimated, or approximation.
|
|
73
|
+
- Keep independent physical effects separate unless a documented model justifies combining them.
|
|
74
|
+
- Do not claim performance for named commercial cameras, lenses, stabilization systems, or sensors without defensible licensed calibration data.
|
|
75
|
+
- Treat public standards, papers, patents, and web references as references, not permission to copy protected expression or data.
|
|
76
|
+
|
|
77
|
+
## Sensor, capture, and coordinate-system rules
|
|
78
|
+
|
|
79
|
+
The sensor/capture foundation has explicit semantics. Preserve them.
|
|
80
|
+
|
|
81
|
+
- `SensorImagingArea` is the physical photosensitive imaging area used for image formation, not die/package dimensions.
|
|
82
|
+
- `NativeImageRaster` describes the effective native image-sampling grid. It does not assert one image sample equals one physical photodiode.
|
|
83
|
+
- Exact color-sampling topology must not be indexed directly by `NativeImageRaster` unless a separate explicit binding establishes that relationship. The color-sampling-site lattice is a distinct native sensor coordinate contract.
|
|
84
|
+
- Periodic color-sampling phase is anchored to absolute native sensor site indices; active crop, physical orientation, and output crop/resampling must never silently reset the repeat phase.
|
|
85
|
+
- Color-sampling channel IDs are semantic identifiers only. They do not establish wavelength response, quantum efficiency, colorimetry, or calibrated sensor primaries.
|
|
86
|
+
- Do not infer an exact CFA tile from descriptive `SensorArchitectureProfile.colorSamplingFamily`; exact layouts require their own evidence-backed topology profile.
|
|
87
|
+
- Layered-color schema 0.1.0 uses a separate unresolved spatial-reference marker and is structural-only. Do not expose per-site layered mapping until per-layer spatial sampling density/registration is explicit.
|
|
88
|
+
- Periodic mosaic schema 0.1.0 does not model sparse overrides such as phase-detect sites, masked pixels, defects, or other non-periodic exceptions.
|
|
89
|
+
- A native-effective-raster ↔ color-site-grid binding is a separate evidence-backed contract. Never infer 1:1 correspondence from matching dimensions, aspect ratio, CFA family, or output megapixels.
|
|
90
|
+
- Bindings apply only to the exact native effective raster dimensions they were evidenced for; do not reuse a binding against another sensor/grid silently.
|
|
91
|
+
- Grouped capture-mode phase/origin is separate evidence. Do not assume grouped samples begin at native `(0,0)` merely because grouping factors divide the raster.
|
|
92
|
+
- Capture/color structural-source resolution uses absolute full-frame mode-sample indices. Do not pass crop-local coordinates without an explicit translation back to the full-frame mode grid.
|
|
93
|
+
- Sensor-shift/pixel-shift offsets move the sensor and CFA together relative to the optical image; do not change CFA channel assignment or convert those offsets into CFA-phase shifts in the binding layer.
|
|
94
|
+
- Structural source rectangles/channel counts are pre-reconstruction topology only. Do not treat them as signal-combination weights, a complete downstream reconstructed-pixel dependency graph, spectral response, photon/electron values, or physical photodiode counts.
|
|
95
|
+
- `declared-effective-raster` capture modes and layered color remain unbound until separate mode/layer-specific spatial mappings are explicitly modeled.
|
|
96
|
+
- Sensor optical-stack physical component metadata and effective anti-aliasing spatial response are separate facts; do not infer one from the other.
|
|
97
|
+
- Omitted effective AA response means unknown/unasserted. Explicit `absent` means no intentional AA point-splitting term in this model, not that the whole stack is optically identity or that aliasing cannot occur.
|
|
98
|
+
- Do not model OLPF behavior as a universal Gaussian or fixed four-ray kernel. A declared point-splitting kernel may have arbitrary component count/geometry and must use normalized spatial weights in native sensor physical coordinates.
|
|
99
|
+
- AA point-splitting weights are spatial redistribution only, not optical throughput or photon efficiency. Keep spectral transmission, cover/filter attenuation, microlens collection, QE, fill factor, and radiometry separate.
|
|
100
|
+
- Physical low-pass-related elements may coexist with an effectively absent/cancelled AA response; do not reject that combination as contradictory.
|
|
101
|
+
- Microlens presence/absence and cover/filter-stack component roles remain descriptive until explicit angular/spectral/refraction models exist.
|
|
102
|
+
- Color-site physical pitch/origin is a separate evidence-backed registration contract; never derive it from `NativeImageRaster`, raster megapixels, aspect ratio, or CFA family.
|
|
103
|
+
- Geometric sensitive-aperture dimensions/offset are separate from site pitch. Do not infer aperture shape from fill fraction or derive fill fraction as a substitute for exact footprint geometry.
|
|
104
|
+
- Schema 0.1.0 rectangular geometric sensitive apertures must remain within one regular lattice cell. Charge diffusion, optical/electrical crosstalk, and overlapping effective response require later explicit models rather than widening this geometric rectangle.
|
|
105
|
+
- A geometric sensitive-area fraction is not QE, effective radiometric collection area, throughput, spectral response, or physical photodiode truth. Do not use it to enable calibrated photon/noise claims automatically.
|
|
106
|
+
- Microlens spatial redistribution and AA point splitting are upstream/separate from the geometric aperture; do not fold them into site aperture dimensions unless a later versioned effective-response contract explicitly says so.
|
|
107
|
+
- Spatial sensor quadrature composes AA point splitting with geometric aperture integration by inverse sampling: a +delta AA displacement reads pre-AA optical field at destination - delta.
|
|
108
|
+
- The destination site's CFA channel applies to every spatial quadrature node. Never reassign CFA channel from the pre-AA source coordinate.
|
|
109
|
+
- Preserve both dimensionless normalized spatial-average weights and square-micrometre geometric area measures; do not reinterpret either as throughput, QE, photon count, or calibrated collection area.
|
|
110
|
+
- Pre-AA source points may validly lie outside the active imaging area near edges. Do not clamp, drop, or renormalize them; downstream optical-source coverage owns that policy.
|
|
111
|
+
- Spatial quadrature and temporal quadrature remain separate until an explicit versioned composition multiplies their measures and evaluates a downstream optical/radiometric field.
|
|
112
|
+
- Do not call generic spatial-reduction inputs an optical field amplitude. The current AA/aperture model consumes nonnegative additive irradiance-like scalars only; coherent complex field/phase interference is outside scope.
|
|
113
|
+
- Physical spatial reduction uses sensor-plane irradiance in W/m². Radiance, RGB renderer values, gamma-encoded values, spectral irradiance, exposure, photons/electrons, and RAW code values are different domains and must not be substituted silently.
|
|
114
|
+
- A destination CFA channel ID is metadata until an explicit spectral filter/sensor-response model is applied; channel tagging alone is not mosaiced color measurement.
|
|
115
|
+
- Spatial node values must be matched by explicit quadrature-node identity. Do not rely on array position, auto-fill missing edge support, or renormalize away unsupplied nodes.
|
|
116
|
+
- CFA/color channel IDs are semantic labels, not spectral curves. Never infer wavelength response from names such as red, green, blue, clear, Bayer, Quad Bayer, or X-Trans-like family metadata.
|
|
117
|
+
- Embedded multi-point spectral curve data requires reusable-data or Photivra-owned provenance. Factual-reference-only sources may inform research/metadata but do not authorize copying numeric curves into the public engine.
|
|
118
|
+
- Direct effective spectral response and separable channel-filter × detector response are different evidence models. Do not force decomposition when only combined response is established, and do not multiply a combined effective response by the same upstream components again.
|
|
119
|
+
- External QE and spectral responsivity (A/W) are distinct physical representations. Never convert between them implicitly or treat equal numeric values as equivalent.
|
|
120
|
+
- Spectral wavelength basis is explicit. Air, vacuum, and unspecified wavelength coordinates must not be silently converted or mixed; calibrated curves cannot use an unspecified basis.
|
|
121
|
+
- Spectral response is valid only over its declared sampled wavelength interval in schema 0.1.0. Do not extrapolate or assume response is zero outside that interval.
|
|
122
|
+
- First spectral-response profiles are single-condition only. Optional reference temperature/incidence/polarization metadata does not create field-angle, temperature, or polarization dependence models.
|
|
123
|
+
- Spectral-quadrature wavelength measures are explicit d-lambda in nanometres, not response, throughput, probability, photon, electron, or current weights. A later integrand must use compatible per-nanometre spectral-density units or perform an explicit unit conversion first.
|
|
124
|
+
- A spectral-quadrature requested range must remain wholly inside the selected sensor-response support. Do not clip, extrapolate, or zero-fill response support, and do not treat sensor-response coverage as proof that scene-spectrum or optical-transmission data cover the same interval.
|
|
125
|
+
- Response knots plus explicit caller-supplied continuous-spectrum/optics breakpoints may partition spectral quadrature, and a maximum subinterval width may bound node spacing. Neither breakpoint alignment nor bounded spacing proves convergence or supplies an integration-error estimate.
|
|
126
|
+
- Spectral quadrature is a wavelength-measure plan only. Do not apply sensor response in the planner or collapse EQE and A/W responsivity into one downstream signal formula.
|
|
127
|
+
- Future spectral signal composition must match responseScope to the source plane and collection-area semantics so upstream transmission is neither omitted nor double-counted.
|
|
128
|
+
- The first spectral-quadrature contract is for continuous spectral densities. Discrete/delta-like line spectra require a separate explicit representation rather than hidden point-mass approximations.
|
|
129
|
+
- Spatio-spectral reduction requires exact colorSamplingProfileId and channelId agreement between spatial and spectral plans. Never compose plans merely because their channel labels happen to match.
|
|
130
|
+
- Spatio-spectral source values use W/m^2/nm at every explicit spatial × spectral node. Multiply by d-lambda in nm directly; do not introduce a 1e-9 factor unless the spectral-density wavelength unit is also converted from per-nanometre to per-metre.
|
|
131
|
+
- The spatial × spectral Cartesian product has its own safety bound. Individual spatial/spectral plans being below their own caps does not make their product safe to materialize.
|
|
132
|
+
- Spatio-spectral geometric aperture integration remains a geometric incident-flux calculation. Do not relabel geometric aperture area as effective radiometric collection area.
|
|
133
|
+
- The first spatio-spectral reducer stops before response application. It may consume a response-derived wavelength plan, but must not apply QE, A/W responsivity, channel-filter transmission, temporal exposure, photons/electrons, current, noise, ADC, or RAW conversion.
|
|
134
|
+
- Response scope/source-plane matching remains an explicit gate. Do not infer that a pre-AA source field automatically satisfies site-incident or sensor-package-incident response scope.
|
|
135
|
+
- A wavelength-only sensor response may be applied after spatial reduction only when its spatial response is explicitly established or declared as uniform/separable over the integrated aperture. Otherwise response must remain spatially varying and be applied before spatial reduction.
|
|
136
|
+
- Response incident-area normalization is part of the physical contract. Geometric-sensitive-aperture, full-site-cell, and effective-collection-area bases are not interchangeable.
|
|
137
|
+
- Total-pixel QE definitions that include fill factor or microlens behavior must not be applied to geometric-sensitive-aperture flux unless the calibration's area basis explicitly matches that geometric aperture.
|
|
138
|
+
- Exact sampling-aperture profile, optical-stack profile, color-sampling profile, channel, response profile, response reference plane, and area basis must be linked before response application.
|
|
139
|
+
- Reference temperature/incidence-angle/polarization conditions must either match exactly when required or be covered by an explicit approximation/limitation; omitted condition dependence is not invariance.
|
|
140
|
+
- The response-application compatibility assessment is structural only. Even a compatible result does not authorize signal conversion; operating-range/linearity validity and the typed EQE-vs-A/W conversion path remain separate gates.
|
|
141
|
+
- Instantaneous detector-response linearity and exposure-domain/full-well saturation are different validity domains. Do not use an optical-input linearity range as evidence that accumulated charge, conversion gain, readout electronics, ADC, or RAW output remain linear after temporal integration.
|
|
142
|
+
- Operating-range applicability must preserve the calibration's optical input quantity (radiant power vs irradiance), wavelength basis/range, reference conditions, uncertainty, and stated nonlinearity criterion. Do not substitute power for irradiance or generalize a calibration outside its supported wavelength range.
|
|
143
|
+
- Broadband-integrated operating-range evidence cannot authorize wavelength-dependent response conversion by itself. EQE/A-W paths require explicit per-spectral-bin applicability, including a supported maximum bin width, and every spectral bin must remain inside the calibrated input range.
|
|
144
|
+
- Post-spatial response conversion requires both response spatial uniformity/separability and operating-range linear superposition over the integrated geometric aperture. A valid total input level must not hide a locally nonlinear sub-aperture distribution.
|
|
145
|
+
- A successful operating-range assessment may authorize only an instantaneous response-rate conversion. It does not authorize temporal integration, saturation/full-well claims, noise, ADC, or RAW processing.
|
|
146
|
+
- Sensor-signal ordering is strict: per-bin response validity → typed response-rate conversion → temporal integration → accumulated-charge/full-well validity → stochastic signal/noise → analog/digital conversion → RAW. Do not skip a stage or reinterpret an upstream authorization as satisfying a downstream one.
|
|
147
|
+
- Photon energy is computed from optical frequency/vacuum wavelength using exact SI h and c. Never substitute an air wavelength directly into hc/lambda as though it were a vacuum wavelength.
|
|
148
|
+
- Air-basis wavelength conversion requires an explicit sourced phase refractive index at that exact wavelength, using n = lambda_vacuum / lambda_air. Do not silently assume n = 1.
|
|
149
|
+
- Air refractive-index reference atmosphere matters. Require either exact matching of temperature/pressure and any declared humidity/CO2 conditions, or an explicit evidence-backed compatibility approximation.
|
|
150
|
+
- Refractive-index uncertainty must remain visible; do not claim photon-energy uncertainty has been propagated unless a future explicit uncertainty model actually performs that propagation.
|
|
151
|
+
- Post-spatial EQE application additionally requires the operating-range model to establish linear superposition over the same geometric aperture; otherwise arbitrary sub-aperture illumination may hide local nonlinear behavior.
|
|
152
|
+
- EQE must be applied per wavelength quadrature node to spectral radiant-power contributions after photon-energy conversion. Never multiply broadband integrated power by an average QE.
|
|
153
|
+
- Direct effective EQE and explicitly separable channel-filter × detector-EQE remain distinct provenance/composition cases; only the existing spectral-response resolver may compose the separable case.
|
|
154
|
+
- Response application must bind to the exact parsed response-channel data carried forward from spectral planning, not merely matching profile IDs, channel names, or evidence references. Same provenance with changed numeric curve samples must fail closed.
|
|
155
|
+
- The response-channel binding is an exact canonical-data identity, not a cryptographic integrity claim; it prevents accidental/stale calibration substitution but does not replace source-file checksums where adversarial integrity matters.
|
|
156
|
+
- A response-rate authorization must bind its evaluated per-bin identities and values back to the exact reduction; stale authorization must fail after spectral power, wavelength, bin width, or identity changes.
|
|
157
|
+
- EQE conversion at this stage produces photon/electron rates only. Do not multiply by exposure duration, label rates as counts, apply shot noise, test full-well saturation, or generate RAW values until the temporal/saturation stages are explicitly composed.
|
|
158
|
+
- Dark current is a separate pre-compensation thermal electron-rate contract in e-/s. Do not fold dark offset, compensation, defects/hot pixels, leakage, injection, or photo-signal into that rate.
|
|
159
|
+
- Do not impose a universal exponential/doubling-temperature law on dark current. Exact-temperature data or explicitly sampled temperature curves may be used; interpolation must fail closed outside the measured range.
|
|
160
|
+
- A population-mean dark current must remain labeled approximation and must not claim dark-current nonuniformity is modeled.
|
|
161
|
+
- Dark-current accumulation currently composes only with the EQE electron-count path. A/W photocharge must not be reinterpreted as stored electrons without a separate carrier/storage mapping.
|
|
162
|
+
- A/W responsivity must never enter the EQE photon-rate→electron-rate path; it remains a separate radiant-power→current path.
|
|
163
|
+
- A/W photocurrent conversion is quasi-static/steady-state only until a detector temporal-response/bandwidth model exists. Do not use the spectral A/W curve as an impulse/frequency-response model.
|
|
164
|
+
- Stored-charge completeness is exposure-event specific. Photo, dark, and every additional stored-electron component must bind to the same color site, channel, local-exposure binding ID, and exact start/end window; equal duration is not enough.
|
|
165
|
+
- Additional stored-electron components must be explicitly incremental beyond both modeled photo signal and modeled dark current. Never double-count hot-pixel/leakage terms already represented by the dark-current model.
|
|
166
|
+
- An empty list of additional charge components is not proof of completeness. Physical full-well assessment may be authorized only by an explicit evidence-backed completeness declaration that all material stored-electron contributors are accounted for.
|
|
167
|
+
- A/W integrated charge is not stored-electron count and must remain outside the physical full-well electron-storage path until an explicit carrier/storage mapping exists.
|
|
168
|
+
- Physical charge-storage capacity is a source-specific electrons limit and must never be substituted with EMVA camera saturation capacity, analog clipping, ADC clipping, or RAW-code maximum.
|
|
169
|
+
- Physical capacity assessment compares total expected stored electrons to capacity. Expected charge below capacity does not prove a stochastic realization avoided saturation; expected charge above capacity means only that the unsaturated linear expectation exceeds the declared capacity.
|
|
170
|
+
- Do not clamp at physical capacity or invent overflow/blooming charge without a separate nonlinear storage/overflow/neighbor-transfer model.
|
|
171
|
+
- Physical capacity must be bound to exact sensor site/applicability, operating state and temperature applicability. Do not infer capacity from ISO, gain labels, capture mode names, pixel pitch, or nearby specifications.
|
|
172
|
+
- Camera saturation capacity is a dark-corrected photo-signal electron-equivalent response-chain quantity, not total stored charge and not physical full-well capacity.
|
|
173
|
+
- When assessing camera saturation capacity, compare only the calibrated signal domain. Dark/other stored electrons may be relevant to physical storage accounting but must not be silently added to a dark-corrected camera-signal capacity.
|
|
174
|
+
- Camera saturation capacity alone does not identify the limiting stage. Do not infer analog clipping, ADC clipping, bit-depth ceiling, or physical-well limitation unless separate evidence establishes that mechanism.
|
|
175
|
+
- Camera saturation assessment is also expectation-domain only until stochastic/noise behavior is composed; do not clamp or invent post-saturation output codes.
|
|
176
|
+
- `reverse-biased` electrical applicability requires a strictly positive reverse-bias magnitude; zero bias belongs to `zero-bias-photovoltaic`. `finite-input-impedance` likewise requires a strictly positive impedance; zero-ohm semantics must not be smuggled into that category.
|
|
177
|
+
- Temporal integration must bind a response-rate result to its exact color-sampling site and then through an explicit color-site ↔ native-effective-raster relationship before selecting a local exposure window. Never assume site indices are native-raster coordinates.
|
|
178
|
+
- The first local-exposure binding supports only one-to-one color-site/native-effective-sample registration. Multi-site blocks establish contributor membership but not sub-sample timing position; fail closed for spatially varying timing until that registration is explicitly modeled.
|
|
179
|
+
- A local exposure window does not establish time-stationary signal. Do not multiply a rate by duration until a separate temporal-stationarity contract explicitly authorizes the constant-rate approximation.
|
|
180
|
+
- Constant-rate temporal integration must bind stationarity evidence to the exact rate domain, site, binding ID, and local start/end offsets; do not reuse a stationarity declaration across a different shutter window.
|
|
181
|
+
- Nonstationary EQE handoff uses the explicit validated temporal photo-signal record. Preserve midpoint-rate/count agreement and exact temporal event identity through dark/charge/RAW; never fabricate stationarity. Dark rate remains evaluated at one supplied operating temperature, without intra-exposure heating. Source truth and convergence remain unverified.
|
|
182
|
+
- EQE temporal integration produces expected photon/electron counts and must preserve fractional expectation values; do not round or sample shot noise at this stage.
|
|
183
|
+
- A/W temporal integration produces photocurrent charge magnitude in coulombs only. Do not infer electron/carrier count or circuit polarity from A/W current integration.
|
|
184
|
+
- Photo-signal accumulation is not total sensor charge. Dark current, leakage/defect/injection terms and other accumulated contributors remain separate, so photo-signal-only results cannot authorize physical full-well assessment.
|
|
185
|
+
- Physical full-well capacity and camera/digital saturation capacity are distinct concepts. Do not collapse them into one clamp or infer one from the other.
|
|
186
|
+
- Local exposure binding represents one capture/exposure event. Multi-frame, pixel-shift, HDR-bracket and computational sequence timing/combination remain separate.
|
|
187
|
+
- A/W conversion yields detector-terminal photocurrent magnitude only. Do not infer circuit polarity/sign, electron rate, accumulated charge, transimpedance voltage, conversion gain, ADC code, or RAW value from A/W alone.
|
|
188
|
+
- A/W calibration applicability must bind explicit detector electrical conditions. Preserve zero-bias vs reverse-bias state and current-readout load semantics; exact-match mode must fail on differences, while any compatibility approximation must carry evidence and a limitation.
|
|
189
|
+
- Current-to-voltage conversion is downstream of detector photocurrent. Transimpedance gain, offset, input impedance, electronics linearity, and ADC behavior require their own contracts and must not be folded into spectral responsivity.
|
|
190
|
+
- Capture-mode profiles must preserve that distinction: do not relabel `NativeImageRaster` as a photosite raster or infer physical photosite count from native, processed, or final output megapixels.
|
|
191
|
+
- Model capture modes on orthogonal axes (acquisition sequence, per-frame sampling, optional inter-frame sensor offsets, reconstruction stages, processed raster, dependencies) rather than one mutually exclusive marketing-style mode enum.
|
|
192
|
+
- Grouped sampling does not establish charge-domain binning; the combination domain stays unknown unless separately evidenced as charge-domain, pre-conversion analog, or post-conversion digital.
|
|
193
|
+
- Inter-frame sensor offsets use units of native effective sampling pitch, not asserted photodiode pitch.
|
|
194
|
+
- Capture-mode processed-image raster is pre-output and does not redefine physical active area, crop factor, field of view, or final output raster semantics.
|
|
195
|
+
- `RasterDimensions` is the generic raster-size type for active/output rasters; do not misuse `NativeImageRaster` for non-native outputs.
|
|
196
|
+
- Geometric sampling pitch has separate X/Y values. Do not silently collapse materially non-square sampling to one pitch.
|
|
197
|
+
- Native raster coordinates use top-left origin, +X right, +Y down, with integer half-open rectangles.
|
|
198
|
+
- Native coordinates remain invariant under physical camera rotation. Use the exported point/vector/rectangle transforms rather than ad-hoc width/height swaps.
|
|
199
|
+
- Active capture and digital/output crop are different stages. Do not treat a later output crop as a smaller physical sensor.
|
|
200
|
+
- Off-center active capture must preserve its optical-axis offset and asymmetric angular bounds; do not recenter it for convenience.
|
|
201
|
+
- Output resampling must not imply geometric stretching unless a future explicit pixel-aspect/transform contract supports it.
|
|
202
|
+
- 35 mm-equivalent focal length is diagonal-based from the active physical capture area. Physical focal length remains authoritative and digital output crop does not redefine it.
|
|
203
|
+
|
|
204
|
+
## Image-formation contract rules
|
|
205
|
+
|
|
206
|
+
Cross-cutting optics, motion, sensor, and output work must follow `getImageFormationContract()` and `docs/IMAGE_FORMATION.md`.
|
|
207
|
+
|
|
208
|
+
- Do not implement future lens/sensor effects as arbitrary renderer post-processes when the contract assigns them to another scientific domain.
|
|
209
|
+
- Hard upstream dependencies and coupled-stage relationships are different concepts.
|
|
210
|
+
- Focus breathing is projection/lens mapping.
|
|
211
|
+
- Lateral CA is wavelength/channel-dependent field mapping.
|
|
212
|
+
- Illumination vignetting is throughput-only; mechanical/pupil vignetting can also modify PSF/bokeh.
|
|
213
|
+
- Diffraction belongs to the pupil/PSF domain.
|
|
214
|
+
- Time-dependent camera mapping uses seconds from exposure start; normalized shutter time is derived convenience only.
|
|
215
|
+
- Exposure duration and readout timing remain independent.
|
|
216
|
+
- Capture exposure-window opening/closing timing remains independent from sensor data-readout timing; never equate a readout phase with an exposure boundary without an explicit integration model.
|
|
217
|
+
- An explicit readout/exposure link may establish normalized native spatial phase/order only unless separate evidence establishes absolute temporal synchronization; equal direction, equal timing span, or shutter mechanism alone are never sufficient.
|
|
218
|
+
- `unlinked` means no relationship is asserted by Photivra, not that physical independence has been proven.
|
|
219
|
+
- Preserve units/evidence for readout duration, rolling spatial skew, exposure-boundary traversal, and the relationship itself; derived cadence ratios must not upgrade provenance or calibration status.
|
|
220
|
+
- When local exposure start varies spatially, use the exposure-window contract's explicit first-opening-boundary reference rather than silently redefining the existing camera-rotation `timeSecondsFromExposureStart` semantic.
|
|
221
|
+
- Camera rotation should be time-parameterized before rolling-readout integration; do not fold depth-dependent translation into a depth-independent screen flow.
|
|
222
|
+
- Geometric renderer warps use inverse sampling, premultiplied alpha, and must preserve scene occlusion order.
|
|
223
|
+
- Static reserved-stage metadata alone is not an implemented capability. Plan 0.7.0 explicitly executes bounded declared environment sampling/charge/noise/ADC/reconstruction; preserve its per-route blockers rather than widening support from a registry label.
|
|
224
|
+
|
|
225
|
+
## Scene-radiance provider boundary
|
|
226
|
+
|
|
227
|
+
- `SceneMaterialResponseProfile` is metadata for provider inputs, not a rendered material result. RGB/PBR representations are approximation-only and must never be described as measured spectral reflectance.
|
|
228
|
+
- Spectral material data in schema 0.1.0 is wavelength-preserving provider input. Fluorescence/wavelength-changing behavior and material emission remain explicitly unmodeled.
|
|
229
|
+
- Provider output is outgoing spectral radiance in W/m²/sr/nm. Do not substitute source irradiance, luminance, RGB values, or sensor-plane irradiance.
|
|
230
|
+
- Scene-radiance provider/result schema 0.1.0 is approximation-only even when some input artifacts are calibrated. Do not promote provider output to calibrated radiometry.
|
|
231
|
+
- Provider fidelity must keep spectral, material, visibility, direct-transport, and indirect-transport axes separate. Do not collapse them into one vague quality level.
|
|
232
|
+
- Evaluation requests use scene targets, unit outgoing directions, seconds from exposure start, and explicit air/vacuum wavelength basis. Do not use display/raster coordinates as the scene-radiance reference frame.
|
|
233
|
+
- Surface requests must bind a declared materialResponseId. Result sample/provider/scene/wavelength identity must match the request exactly.
|
|
234
|
+
- `validateSceneRadianceEvaluationBindings()` validates identities and declared fidelity only. It does not verify the renderer's numerical transport result.
|
|
235
|
+
- The scene-radiance provider boundary remains upstream of optics. It must not calculate or claim sensor-plane irradiance, photon/electron values, or sensor response.
|
|
236
|
+
- Renderer implementation remains external. Browser preview, Blender reference, or future spectral renderers may differ in computation while preserving the same engine-owned request/result semantics.
|
|
237
|
+
|
|
238
|
+
## Shared spectral composition boundary
|
|
239
|
+
|
|
240
|
+
- Continuous spectral coverage and discrete line spectra are different mathematical representations. Never broaden a discrete/delta-like line into an arbitrary continuous bump merely to reuse continuous quadrature.
|
|
241
|
+
- Continuous spectral-coverage participants must use one explicit resolved air/vacuum wavelength basis. Do not silently convert or mix bases.
|
|
242
|
+
- Continuous composition intersects participant wavelength support and unions interpolation breakpoints only. It does not apply response/transmission/radiance values and does not prove numerical convergence.
|
|
243
|
+
- Breakpoints are interpolation structure, not quadrature weights, spectral values, uncertainty, or evidence of physical significance.
|
|
244
|
+
- A discrete line weight is a wavelength-integrated fraction. It is not a per-nanometre spectral-density sample.
|
|
245
|
+
- Discrete line integration sums already wavelength-integrated line quantities. Never multiply a discrete line by d-lambda or invent a line width unless a separate physical line-shape model explicitly requires it.
|
|
246
|
+
- Discrete line IDs and wavelengths must be unique/ordered, weights must be positive and normalized to one, and wavelength basis must be resolved.
|
|
247
|
+
- A broadband physical illumination magnitude may be distributed across normalized line fractions in the same source quantity domain. Do not reinterpret point W/sr, area W/m²/sr, directional W/m², or relative magnitude as one another.
|
|
248
|
+
- Calibrated source magnitude plus calibrated relative line weights still does not automatically authorize calibrated outgoing scene radiance. Material/visibility/transport fidelity and combined uncertainty remain separate.
|
|
249
|
+
- Sensor-response spectral coverage exposes support/knots only. It must not be treated as response application, photon conversion, or proof that scene/optics share the same coverage.
|
|
250
|
+
- RGB, blackbody approximations, unresolved spectra, and discrete lines must not enter the continuous-coverage adapter by silent conversion.
|
|
251
|
+
|
|
252
|
+
## Temporal illumination boundary
|
|
253
|
+
|
|
254
|
+
- The existing `SceneIlluminationProfile` remains the static/base source definition. Time-varying emission is an additive temporal overlay; do not mutate base source magnitude/spectrum to encode flash or flicker.
|
|
255
|
+
- Source waveforms use physical seconds and relative non-negative magnitude multipliers. Do not encode display brightness, EV compensation, ISO, aperture, or shutter-setting policy into a waveform.
|
|
256
|
+
- A time-varying source must have an explicit source↔waveform registration to the capture `first-opening-boundary-phase` reference. Do not infer synchronization from readout direction, shutter mechanism, waveform frequency, or timestamps from another clock.
|
|
257
|
+
- Sensor data-readout timing is not exposure timing. Never use total readout duration as a flash/flicker phase proxy.
|
|
258
|
+
- Aperiodic waveforms are zero outside declared support in schema 0.1.0. Periodic waveforms must close continuously at exactly one declared period.
|
|
259
|
+
- Numeric waveform samples require reusable-data or Photivra-owned evidence. Calibrated waveforms require quantified relative uncertainty; calibrated registration requires quantified absolute timing uncertainty in seconds.
|
|
260
|
+
- Local exposure integration consumes authoritative `CaptureExposureWindows` samples and uses deterministic midpoint quadrature. It integrates relative modulation only; source magnitude, material/visibility transport, optics, sensor response, and photon/electron formation remain separate.
|
|
261
|
+
- Source enabled/disabled state is separate from waveform value. Do not use zero waveform magnitude as the only representation of a disabled source.
|
|
262
|
+
- Temporal quadrature convergence/error is a downstream radiance-domain question. Do not invent a waveform-only error bound for the final image.
|
|
263
|
+
- Temporal illumination must not choose ISO/aperture/shutter or implement metering/automatic-exposure policy. It supplies upstream light-state evidence only.
|
|
264
|
+
- A scene-radiance provider that declares `illuminationTemporalProfileId` must bind the matching temporal profile; a provider without that declaration must not silently consume one.
|
|
265
|
+
|
|
266
|
+
## Exposure metering boundary
|
|
267
|
+
|
|
268
|
+
- Exposure metering must consume a declared pre-exposure domain. Schema 0.1.0 supports only `relative-pre-exposure-linear-signal` and is approximation-only; never relabel it calibrated luminance, scene spectral radiance, or sensor-plane irradiance.
|
|
269
|
+
- Metering coordinates are normalized over the physically oriented **active capture** frame. Final output crop/CSS/display geometry must not silently redefine the metering frame.
|
|
270
|
+
- Sample `areaWeight` is producer-supplied spatial measure; metering policy weights multiply it rather than replace it.
|
|
271
|
+
- Multi-zone, center-weighted, spot, and highlight-weighted profiles are generic explicit policies. Do not use manufacturer names or claim they reproduce a specific camera without calibration/evidence.
|
|
272
|
+
- A relative target value is profile policy. Do not hard-code or describe one target (including 18% gray) as universal camera truth.
|
|
273
|
+
- Metering must occur before exposure settings, white balance, tone mapping, display gamma, sharpening, and final-display brightness. Never feed final preview brightness back into the authoritative meter.
|
|
274
|
+
- Exposure compensation is downstream of the base meter result. Do not mutate sampled scene measurements when compensation changes.
|
|
275
|
+
- #100 metering does not choose aperture, shutter or ISO. #99 owns exposure-mode/control resolution.
|
|
276
|
+
- A zero-signal meter result must remain an explicit no-signal state; do not emit infinity/NaN or fabricate a reachable exposure.
|
|
277
|
+
- `measurementId` and `sceneStateId` are stable identity seams for future AE lock and stale-result rejection. Do not overwrite a newer scene-light result with an older meter result merely because it completed later.
|
|
278
|
+
- Controlled relative-light invariant: uniform 0.5× scene signal must shift the meter by exactly +1 stop to the same declared target.
|
|
279
|
+
- Flash/TTL metering remains separate from ambient exposure metering. Time-varying ambient inputs require an explicit temporal sampling policy rather than silent averaging.
|
|
280
|
+
|
|
281
|
+
## Scene-radiance metering bridge
|
|
282
|
+
|
|
283
|
+
- Spectral scene radiance does not become a scalar exposure-meter signal by type conversion. A scalar relative reduction must declare an explicit approximation derivation; schema 0.1.0 does not authorize calibrated spectral weighting, photopic luminance, or camera-specific meter response.
|
|
284
|
+
- Scene-radiance-derived meter samples must bind one exact provider, scene, illumination profile, material-response profile and derivation profile. Provider material fidelity must match the supplied material profile.
|
|
285
|
+
- If a provider declares `illuminationTemporalProfileId`, a metering sample must supply the matching temporal profile and an explicit finite capture time on `first-opening-boundary-phase`. Static providers must not silently consume temporal profiles/timestamps.
|
|
286
|
+
- Temporal source bindings referenced by the temporal profile must exist in the supplied base illumination profile.
|
|
287
|
+
- Time-varying metering must not silently average snapshots. Use an explicit temporal policy.
|
|
288
|
+
- The first temporal policy is a positive normalized weighted average of **linear pre-exposure meter signals**. Average signals first; do not average EV/stop offsets.
|
|
289
|
+
- All samples in one temporal average must share the same committed `sceneStateId`, provider/material/derivation context, temporal profile, and active-capture geometry. This is also the stale-result boundary.
|
|
290
|
+
- Temporal sample weights are caller-declared measurement policy. Do not infer them from flicker frequency, source waveform shape, shutter/readout duration, or renderer frame cadence.
|
|
291
|
+
- Flash/TTL metering remains separate from ambient/time-varying exposure metering.
|
|
292
|
+
- Calibrated meter spectral weighting remains future work and requires an explicit spectral-response/photometric model plus evidence; do not infer it from RGB or scene-radiance wavelength samples.
|
|
293
|
+
|
|
294
|
+
## Generic equipment exposure-capability boundary
|
|
295
|
+
|
|
296
|
+
- Keep equipment **capability** separate from selected camera state and from #99 exposure-control resolution. Capability profiles describe what settings are available; they do not choose a setting.
|
|
297
|
+
- Do not repurpose or silently reinterpret the legacy `CameraConfiguration` / `parseCameraConfiguration()` contract. New #109 profiles are additive and versioned.
|
|
298
|
+
- Normal product body/lens profiles are generic Photivra identities, not named commercial equipment emulations. Real-world evidence may inform profile design, but named manufacturer/model identity is not required for the engine contract.
|
|
299
|
+
- Body exposure capability owns shutter-duration capability and ISO capability. ISO range/grid does not imply noise, analog gain topology, photon count, conversion gain, or sensor performance.
|
|
300
|
+
- Auto ISO availability must preserve `supported`, `unsupported`, and `unknown` as distinct states. Unknown must not be treated as supported.
|
|
301
|
+
- Shutter-duration capability does not imply shutter mechanism, rolling/global readout, exposure-boundary schedule, or flash-sync behavior.
|
|
302
|
+
- Lens aperture capability uses **widest available f-number** (smallest f-number) and **narrowest available f-number** (largest f-number) to avoid ambiguous max/min-aperture language.
|
|
303
|
+
- Focal-dependent widest f-number is an explicit capability curve. Do not infer it from zoom range, focal length, or lens class.
|
|
304
|
+
- Discrete setting grids must be strictly increasing and stay inside the declared capability range. Continuous grids mean the downstream resolver may choose any finite value within the range; they do not imply a physical infinitely precise control mechanism.
|
|
305
|
+
- Resolve aperture capability at the selected focal length before #99 validates/quantizes settings. A discrete aperture grid may be filtered by the resolved wide-open limit.
|
|
306
|
+
- Source equipment profiles are immutable inputs. Resolvers must not mutate them when focal length or selected state changes.
|
|
307
|
+
- #109 capability resolution does not select aperture/shutter/ISO. #99 consumes the resolved envelope and owns manual/automatic axis policy, quantization choice, clamping, and residual exposure diagnostics.
|
|
308
|
+
|
|
309
|
+
## Manual / Auto ISO exposure-control boundary
|
|
310
|
+
|
|
311
|
+
- #99 exposure modes are control policy over the existing aperture/shutter/ISO exposure variables; do not add a second exposure equation per named mode.
|
|
312
|
+
- In the first Manual slice, aperture and shutter are always manual axes and must never be changed, clamped, or safety-shifted by the resolver. Unsupported manual settings fail closed.
|
|
313
|
+
- Manual ISO is likewise preserved exactly after #109 capability validation. A changed meter target or exposure compensation may change the residual diagnostic but must not change the manual ISO value.
|
|
314
|
+
- Auto ISO may change only ISO. It must consume the typed #100 meter target and the resolved #109 ISO capability; it must not re-meter the scene or reapply exposure compensation.
|
|
315
|
+
- The relative meter target does not define an absolute ISO. Require an explicit reference exposure anchor `(aperture, shutter, ISO)`; do not assume ISO 100, a universal gray calibration, or any hidden camera baseline.
|
|
316
|
+
- Reference-anchor aperture/shutter/ISO must themselves be valid settings in the same resolved equipment capability envelope.
|
|
317
|
+
- Auto ISO ideal value is solved from target exposure scale divided by the manual optical-exposure factor relative to the reference anchor. ISO does not create photons and this resolver must not infer noise, conversion gain, or sensor topology.
|
|
318
|
+
- For discrete ISO grids, quantize in log2 exposure space. The first policy is nearest value with lower ISO on an exact tie; do not silently use a universal 1/3-EV or 1/2-EV grid.
|
|
319
|
+
- Auto ISO limit/quantization diagnostics must preserve signed residual stops: positive residual means the resolved settings are still under target and need more exposure; negative means over target.
|
|
320
|
+
- `unsupported` and `unknown` Auto ISO capability both block automatic ISO; unknown must never be treated as supported.
|
|
321
|
+
- A no-signal meter target blocks Auto ISO rather than selecting maximum ISO or infinity. Manual settings may still be returned with an unresolved target diagnostic.
|
|
322
|
+
- Flash behavior, minimum-shutter Auto ISO policy for modes with automatic shutter, safety shift, Program lines, aperture priority, shutter priority, and Full Auto remain outside this first resolver slice.
|
|
323
|
+
|
|
324
|
+
## Aperture Priority exposure-control boundary
|
|
325
|
+
|
|
326
|
+
- In the first Aperture Priority slice, aperture and ISO are manual axes and must never be changed, clamped, or safety-shifted by the resolver. Unsupported manual settings fail closed.
|
|
327
|
+
- Shutter is the only automatic axis. Reuse the same relative target/reference exposure model as Manual + Auto ISO; do not add a mode-specific exposure equation.
|
|
328
|
+
- The resolver consumes exposure compensation only through the already-compensated #100 target. Never apply compensation a second time.
|
|
329
|
+
- Continuous shutter capability returns the ideal finite duration when it lies inside the #109 range.
|
|
330
|
+
- Discrete shutter grids quantize in log2 duration/exposure space. The first policy is nearest duration with the **shorter shutter on an exact tie**.
|
|
331
|
+
- Shutter residual diagnostics use the same sign convention as ISO: positive residual means still under target / needs more exposure; negative residual means over target.
|
|
332
|
+
- A required shutter shorter than the minimum duration clamps to the shortest available duration and reports `shutter-minimum`; longer than maximum clamps to the longest duration and reports `shutter-maximum`.
|
|
333
|
+
- A no-signal meter target blocks automatic shutter rather than selecting the longest shutter or infinity.
|
|
334
|
+
- Aperture Priority + Auto ISO is a separate later policy because two automatic axes require an explicit minimum-shutter/selection rule. Do not assume ISO always moves first.
|
|
335
|
+
|
|
336
|
+
## Multi-axis priority-mode boundary
|
|
337
|
+
|
|
338
|
+
- When two exposure axes are automatic, require an explicit versioned selection policy. Do not hide axis order inside a mode name.
|
|
339
|
+
- Aperture Priority + Auto ISO first uses minimum selectable ISO. Shutter may lengthen only to the declared `slowestPreferredShutterSeconds`; after that ISO fills exposure. Behavior after ISO maximum must be explicit: either allow slower shutter or hold the preferred shutter and report residual underexposure.
|
|
340
|
+
- A+Auto ISO discrete shutter selection before ISO fill must not choose a shutter longer than the target/preferred duration, because that would require ISO below the declared minimum to undo overexposure.
|
|
341
|
+
- Shutter Priority + manual ISO keeps shutter and ISO fixed and resolves only aperture.
|
|
342
|
+
- Shutter Priority + Auto ISO first uses minimum selectable ISO and resolves aperture. For discrete aperture grids, choose an aperture no wider than the ideal so Auto ISO can add remaining exposure instead of requiring ISO below minimum.
|
|
343
|
+
- Automatic aperture limits use `aperture-widest`, `aperture-narrowest`, or `aperture-grid-quantization` diagnostics; do not infer lens behavior beyond #109.
|
|
344
|
+
- These policies are generic product/control approximations, not optical laws and not emulations of named manufacturers.
|
|
345
|
+
- All priority modes must reuse the typed #100 target, explicit reference exposure anchor, and #109 resolved capability envelope; never re-meter or reapply compensation.
|
|
346
|
+
- Flash policy, safety shift, Program lines, Full Auto policy, Bulb/Time, and manufacturer-specific mode behavior remain separate.
|
|
347
|
+
|
|
348
|
+
## Program / Full Auto exposure boundary
|
|
349
|
+
|
|
350
|
+
- Program Auto and Full Auto require an explicit versioned program-line policy. There is no unique physically correct aperture/shutter pair for a target exposure.
|
|
351
|
+
- Program-line nodes declare optical exposure stops relative to the same explicit reference exposure anchor used by other #99 modes. Validate every node's aperture/shutter pair against its declared stop coordinate and the current #109 capability envelope.
|
|
352
|
+
- Interpolate program-line aperture and shutter in log2 space so intermediate optical exposure stops remain mathematically consistent before equipment quantization.
|
|
353
|
+
- Program-line nodes may describe ideal continuous policy points; downstream #109 grids still own actual selectable settings. Quantization/clamping must remain visible in diagnostics.
|
|
354
|
+
- Program Auto with manual ISO resolves aperture+shutter only. Program Auto with Auto ISO and Full Auto exposure start from minimum selectable ISO and let Auto ISO absorb program-line endpoint/quantization residual when possible.
|
|
355
|
+
- A program line is generic product/control policy labeled approximation. Do not describe it as a scientific law or a named manufacturer's program behavior without evidence for that exact profile.
|
|
356
|
+
- Full Auto **exposure** means automatic aperture+shutter+ISO only. It must not imply or report autofocus, white balance, flash, drive, scene recognition, or stabilization resolution.
|
|
357
|
+
- Program/Full Auto must consume the already-compensated #100 target and must not re-meter or reapply exposure compensation.
|
|
358
|
+
- Identical resolved aperture/shutter/ISO values must feed identical downstream physics regardless of whether they came from Program or Full Auto.
|
|
359
|
+
- Flash-aware program shifts, safety shift, and broader application Full Auto behavior remain separate.
|
|
360
|
+
|
|
361
|
+
## Bulb / Time and long-exposure boundary
|
|
362
|
+
|
|
363
|
+
- Bulb and Time are shutter-duration **control behaviors**, not alternate exposure equations and not shutter mechanisms.
|
|
364
|
+
- A physical exposure calculation must receive a concrete positive elapsed duration. An active Bulb/Time control with no terminating release/stop event is not authorized for image-formation integration.
|
|
365
|
+
- Bulb duration is release time minus press/start time; Time duration is stop action minus start action. Control timestamps use one explicit monotonic-seconds reference and must be finite/ordered.
|
|
366
|
+
- Do not encode Bulb as an arbitrary enormous fixed shutter speed and do not impose a universal 30 s limit on Bulb/Time.
|
|
367
|
+
- Binding a resolved duration into #12 may set only the nominal seconds-valued exposure duration. Preserve the independently supplied shutter mechanism and opening/closing boundary schedules.
|
|
368
|
+
- Bulb/Time must not imply mechanical shutter, focal-plane curtains, tripod support, stabilization off, long-exposure noise reduction, sensor heating/temperature, or flash behavior.
|
|
369
|
+
- Once resolved, long duration flows through the same existing/future local exposure-window, temporal motion/radiance, electron accumulation, dark-current, saturation, and downstream models. Do not create Bulb-specific physics shortcuts.
|
|
370
|
+
- Equal elapsed durations with equal physical camera/scene inputs must produce equal downstream timing/physics regardless of fixed/Bulb/Time control vocabulary.
|
|
371
|
+
- More generally, shooting-mode names are control policy only: identical resolved aperture/shutter/ISO values must produce identical downstream physical exposure results.
|
|
372
|
+
|
|
373
|
+
## Meter target / compensation boundary
|
|
374
|
+
|
|
375
|
+
- Freeze meter results into a separate target object before #99 control resolution; do not pass mutable renderer/app state as the authoritative exposure target.
|
|
376
|
+
- Preserve source measurement ID, scene-state ID, and metering-profile ID by value so AE lock can intentionally reuse a prior meter snapshot after recomposition or scene-light changes.
|
|
377
|
+
- Exposure compensation is downstream of the base meter measurement. Never mutate `meteredRelativeSignal` or the source meter result when compensation changes.
|
|
378
|
+
- Compensation is an absolute control setting, not an incremental delta accumulator. Re-derive from the uncompensated base target on every update.
|
|
379
|
+
- Positive compensation means **more requested exposure**; negative compensation means less.
|
|
380
|
+
- A compensation change must receive a new target ID so changed control state cannot hide behind the same identity.
|
|
381
|
+
- No-signal remains unresolved under compensation; do not manufacture infinity/NaN or a fake reachable target.
|
|
382
|
+
- #100 target/compensation code must not choose aperture, shutter, or ISO. #99 owns axis resolution and capability constraints.
|
|
383
|
+
|
|
384
|
+
## Scene-radiance → sensor-irradiance optical bridge
|
|
385
|
+
|
|
386
|
+
- #110 owns the primary intended optical-radiometry path from outgoing scene spectral radiance to **pre-sensor-stack sensor-plane spectral irradiance**. Do not reinterpret relative RGB preview values as this physical quantity.
|
|
387
|
+
- The first model is a declared paraxial circular-pupil approximation. Its geometric acceptance is `pi / (4 * N_working^2)`; keep this labeled approximation and do not promote it to a full ray-traced pupil solution.
|
|
388
|
+
- Nominal f-number, working f-number, optical transmission, and T-stop are distinct. Do not infer real transmission from f-number.
|
|
389
|
+
- Wavelength-resolved transmission and effective working-T-stop approximation are mutually exclusive input paths. Never apply both.
|
|
390
|
+
- An effective **working** T-stop must not be smaller than the geometric working f-number in this passive-optics approximation.
|
|
391
|
+
- At finite focus, do not silently use infinity-focus f-number. The ideal symmetric thin-lens path may use `N(1+m)` only with unity pupil magnification explicitly declared; otherwise consume an evidence-backed supplied working f-number/profile.
|
|
392
|
+
- Optical spectral curves are numeric reusable data. Their provenance must be reusable-data or Photivra-owned; factual-reference-only evidence is insufficient for copied numeric curves.
|
|
393
|
+
- Preserve the exact wavelength basis. Do not implicitly convert air ↔ vacuum coordinates.
|
|
394
|
+
- Field throughput/vignetting is applied at most once. The bridge does not add a universal `cos^4(theta)` term on top of a supplied field-throughput result.
|
|
395
|
+
- Geometric distortion area/Jacobian radiometry is not silently corrected here. A later composition must own it exactly once.
|
|
396
|
+
- PSF/diffraction redistributes energy downstream; do not use a non-normalized PSF as an extra throughput scalar after #110 transmission/vignetting.
|
|
397
|
+
- The bridge stops before sensor cover glass/OLPF/microlens/CFA/QE/responsivity. Sensor optical-stack collection remains #14 ownership.
|
|
398
|
+
- Flare, ghosts, veiling glare and scatter are stray-light contributions, not primary transmission; keep them outside #110.
|
|
399
|
+
- Current #85 scene-radiance results remain approximation-only, so even calibrated lens-transmission data cannot authorize a calibrated final sensor-plane irradiance claim yet.
|
|
400
|
+
- Identical physical/time/wavelength inputs must produce deterministic output. Do not time-average time-varying radiance inside this static sample bridge.
|
|
401
|
+
|
|
402
|
+
## Radiometry and sensor-metadata rules
|
|
403
|
+
|
|
404
|
+
- Sensor architecture metadata is descriptive and scientifically inert until a separate downstream model consumes it.
|
|
405
|
+
- Unknown sensor facts must remain unknown; do not infer BSI, stacking, CFA, readout, or performance from adjacent marketing claims.
|
|
406
|
+
- Evidence source origin and reuse rights are separate concepts. Public availability is not reuse permission.
|
|
407
|
+
- Multi-valued capabilities must carry evidence per value when sources differ.
|
|
408
|
+
- Geometric sample pitch is not photosite photon-collection area. Radiometry requires explicit collection-area semantics.
|
|
409
|
+
- `assessRadiometryReadiness()` is a gate, not a photon model. `calibrated-ready` does not prove the calibration is factually correct and never enables composed photon/noise output by itself.
|
|
410
|
+
- Approximate representations must remain labeled approximation; never upgrade them to calibrated merely because all prerequisite categories are present.
|
|
411
|
+
- Calibration/data artifacts must retain stable identifiers, hashes, evidence, reuse status, and uncertainty/limitation metadata.
|
|
412
|
+
|
|
413
|
+
## Public API and compatibility
|
|
414
|
+
|
|
415
|
+
Backward compatibility matters.
|
|
416
|
+
|
|
417
|
+
- Preserve existing public exports, argument semantics, units, return shapes, error behavior, and schema meaning unless an explicit breaking change is approved.
|
|
418
|
+
- Prefer typed/config-object inputs for multi-parameter functions.
|
|
419
|
+
- Follow the conventions in `docs/API_STYLE.md`.
|
|
420
|
+
- Keep result/provenance structures consistent across modules.
|
|
421
|
+
- Keep `ENGINE_API_VERSION`, `POC_SIMULATION_API_VERSION`, package version, and any schema version semantically distinct.
|
|
422
|
+
- Runtime parsers must fail closed on unknown enum/string values; TypeScript unions are not validation.
|
|
423
|
+
- Do not silently reinterpret an existing field or unit.
|
|
424
|
+
- If behavior must change, add regression tests and document compatibility impact.
|
|
425
|
+
|
|
426
|
+
## Production image-formation plan boundary
|
|
427
|
+
|
|
428
|
+
- The production plan is additive and separate from `simulatePocCamera()`. Do not widen POC behavior merely because a stage becomes available to the production composer.
|
|
429
|
+
- `getImageFormationContract()` remains the authoritative stage/dependency/coupling graph. The production planner may expand that graph; it must not invent a second hidden ordering.
|
|
430
|
+
- Separate prepared static context from immutable per-capture state. Do not reparse/rebind unchanged equipment/renderer/fidelity profiles for every capture.
|
|
431
|
+
- Capture snapshots are committed values: copy/freeze them so later UI changes cannot mutate capture identity or plan results.
|
|
432
|
+
- Fidelity profiles are defined by required stage/effect capabilities and renderer requirements, never vague `low/medium/high` labels.
|
|
433
|
+
- Every requested stage/effect must be explicit as active, modeled-zero, omitted-by-fidelity, unsupported, or blocked. Numerically zero is not the same as absent.
|
|
434
|
+
- Unsupported composer stages and renderer capability mismatches must return structured blockers. Do not silently skip requested effects or fall back to renderer/app glue.
|
|
435
|
+
- Renderer capability declarations are semantic metadata only. Do not place React, Three.js, WebGPU, DOM, server, or transport objects in the public scientific plan.
|
|
436
|
+
- The first physical production path consumes #85 + #110 spectral quantities. Do not substitute RGB preview values for a physical sensor-irradiance request.
|
|
437
|
+
- A non-unity field-throughput input must correspond to an explicitly requested illumination-vignetting effect; hidden active effects are blockers.
|
|
438
|
+
- Requesting downstream sensor/RAW stages before they are intentionally composed must block rather than synthesize a shortcut.
|
|
439
|
+
- Preserve static/capture/model/version identities in the plan for reproducibility.
|
|
440
|
+
- Canonical FNV-1a plan fingerprints are deterministic non-cryptographic reproducibility keys only; never present them as cryptographic integrity hashes.
|
|
441
|
+
- Capture stochastic seed ownership is explicit. Backend randomness must not silently change scientific results.
|
|
442
|
+
- Performance caching/preparation (#43/#45) may optimize execution but must preserve exact semantic plan identity.
|
|
443
|
+
|
|
444
|
+
## Production processed-output boundary
|
|
445
|
+
|
|
446
|
+
- Plan 0.7.0 may execute reconstruction, physical orientation, output crop and display processing only from explicit `processedOutput` attachment/state and declared renderer support. See `docs/PROCESSED_OUTPUT.md`.
|
|
447
|
+
- Share `calculateProcessedSensorRaw()` between RAW preview and paired JPEG; file metadata/packing and platform viewing adaptation remain separate.
|
|
448
|
+
- Retain the authoritative RAW, explicit color/WB/tone/gamut/transfer/quantization identities, child correction costs and distinct clipping domains. Rendering changes cannot mutate capture, noise or upstream metering.
|
|
449
|
+
- An attached RAW identity is not verification of its physical origin. Preserve every missing upstream-stage blocker; downstream execution does not make the full production plan ready.
|
|
450
|
+
- Preserve legacy no-attachment unsupported behavior and fail closed on unsupported HDR/correction domains or source prefilter claims.
|
|
451
|
+
|
|
452
|
+
## Production temporal-composition boundary
|
|
453
|
+
|
|
454
|
+
- Temporal capture input is immutable capture state, not renderer state. Preserve native raster, exposure boundaries, shutter mechanism, readout declaration, orientation, imaging area, rotation model and committed temporal sample count.
|
|
455
|
+
- The committed shutter duration and temporal-capture nominal exposure duration must match exactly enough for the shared setting tolerance; do not let temporal timing drift from resolved exposure control.
|
|
456
|
+
- Sensor data-readout timing and exposure-window timing remain separate contracts. The production plan must report synchronization as not assumed unless an explicit linkage model establishes it.
|
|
457
|
+
- Pure-camera-rotation temporal sampling delegates to the existing deterministic midpoint quadrature. Do not create a second motion equation or silently reduce the committed sample count for preview performance.
|
|
458
|
+
- A zero angular-velocity model is `modeled-zero`, not omitted. Global/no-spatial-skew readout requested through rolling-readout semantics is likewise modeled-zero.
|
|
459
|
+
- Renderer temporal-sampling limits are capability gates. Insufficient capacity blocks the renderer path but does not mutate the committed scientific quadrature.
|
|
460
|
+
- The authoritative image-formation graph still applies. Computing mature temporal timing results does not authorize bypassing an uncomposed PSF dependency.
|
|
461
|
+
- Production-plan consumer manifests may label an execution role `interactive-optimized` or `reference`, but both consume the same finalized scientific plan. Consumer role cannot reorder stages, change seeds, alter physical results, or reduce committed temporal samples.
|
|
462
|
+
|
|
463
|
+
## Composition boundary
|
|
464
|
+
|
|
465
|
+
Do not assume every public root-engine foundation is already part of the composed POC.
|
|
466
|
+
|
|
467
|
+
As of POC simulation API 0.20:
|
|
468
|
+
|
|
469
|
+
- `simulatePocCamera()` preserves the legacy sensor + centered `crop.factor` request and adds an opt-in staged `capture` request for physical orientation, native active-capture rectangle, oriented output crop, and final output raster.
|
|
470
|
+
- The POC staged `capture` geometry request must not silently stack legacy crop semantics: `crop.factor` must remain `1` when `capture` is present.
|
|
471
|
+
- The POC staged `capture` geometry request owns final output/viewing semantics: output physical bounds/FOV, post-output subject framing, and equivalent-viewing CoC against the final retained physical image region. Do not confuse this geometry object with the separate sensor/capture-mode profile contract.
|
|
472
|
+
- The response exposes shared sensor-geometry metrics plus an optional capture block with active/output FOV, active-capture 35 mm-equivalent focal length, output sampling scale, subject framing, and oriented/output motion diagnostics.
|
|
473
|
+
- Equivalent focal length remains informational and never replaces physical focal length inside POC physics; final digital/output crop does not redefine it.
|
|
474
|
+
- Existing motion/camera-shake X/Y fields retain their legacy image-plane meaning (+X right, +Y up). Capture raster coordinates are +X right, +Y down; additive diagnostics must expose the explicit basis conversion before orientation/output scaling.
|
|
475
|
+
- Sensor-architecture metadata, color-sampling topology profiles, native-effective-raster/color-site bindings, sensor optical-stack profiles, sensor sampling-aperture profiles, capture-mode profiles, sensor readout timing, capture exposure-window timing, and radiometry-readiness profiles remain standalone and are not composed unless an explicit versioned integration is added.
|
|
476
|
+
- The POC reports X/Y pitch diagnostics but still uses one representative horizontal pitch internally and fails closed above a 1% axis difference.
|
|
477
|
+
- Radiometry readiness never enables photon/noise output by itself.
|
|
478
|
+
|
|
479
|
+
Any further foundation composition still requires an explicit `POC_SIMULATION_API_VERSION` review/change, migration analysis, regression tests, and documentation. Do not silently reinterpret existing POC fields.
|
|
480
|
+
|
|
481
|
+
## PSF/pupil foundation rules
|
|
482
|
+
|
|
483
|
+
`getPsfFoundationContract()` and `calculatePsfFoundationComponents()` define the current PSF contribution boundary.
|
|
484
|
+
|
|
485
|
+
- Keep geometric defocus and circular diffraction separately named; do not add their diameters or convert them into one undocumented blur/sharpness scalar.
|
|
486
|
+
- Do not call the current diagnostics a complete PSF or MTF.
|
|
487
|
+
- Field position, focus/subject depth, wavelength basis, and pupil semantics are explicit context.
|
|
488
|
+
- The current field position is context only for defocus/Airy; do not invent field dependence until a corresponding model is implemented.
|
|
489
|
+
- Ideal regular-polygon non-circular diffraction is implemented only through its explicit equal-area, on-axis, zero-phase scalar API. Arbitrary non-circular real diaphragms are not inferred. Mechanical pupil clipping, field curvature, field-dependent aberration and bokeh require explicit #113 profile/evaluator semantics; never infer them from blade count or legacy diagnostics.
|
|
490
|
+
- Illumination vignetting remains throughput-only and outside the PSF contribution list.
|
|
491
|
+
- Polygon aperture geometry does not by itself implement non-circular diffraction.
|
|
492
|
+
- Preview/reference renderers may differ in bounded fidelity but must preserve engine-owned contribution semantics.
|
|
493
|
+
- Test Fixture optics/highlight targets are regression evidence, not calibrated MTF or real-lens PSF data.
|
|
494
|
+
- Real-lens PSF profiles require defensible provenance, compatible reuse rights, and explicit limitations/uncertainty.
|
|
495
|
+
|
|
496
|
+
## Illumination-vignetting boundary
|
|
497
|
+
|
|
498
|
+
`calculateIlluminationVignetting()` is the engine-owned generic field-throughput model.
|
|
499
|
+
|
|
500
|
+
- Apply `linearThroughputFactor` only in scene-linear/channel-linear space, before display/gamma encoding.
|
|
501
|
+
- Optical-axis throughput is normalized to 1; generic illumination vignetting may attenuate but must not amplify above that reference.
|
|
502
|
+
- Respect `maximumNormalizedRadius` and the full-envelope validity gate.
|
|
503
|
+
- Do not use this model to warp coordinates, change focus, clip the pupil, alter PSF shape, or synthesize cat's-eye bokeh.
|
|
504
|
+
- Mechanical/pupil vignetting belongs to the separate pupil/PSF foundation.
|
|
505
|
+
- Test Fixture neutral patches provide regression evidence only; they are not calibrated radiometry.
|
|
506
|
+
- Do not infer named-lens coefficients or calibrated transmission from public images/specs.
|
|
507
|
+
- Do not compose this standalone model into the POC/app without an explicit contract/version review.
|
|
508
|
+
|
|
509
|
+
## Lateral-CA boundary
|
|
510
|
+
|
|
511
|
+
`calculateLateralChromaticAberrationMapping()` and its inverse are engine-owned channel field mappings.
|
|
512
|
+
|
|
513
|
+
- Treat red/green/blue as representative renderer channels, not wavelengths or CFA calibration.
|
|
514
|
+
- Green is the reference/common base distortion. Red and blue use coefficient offsets added to that base.
|
|
515
|
+
- Do not apply the same base distortion again as a separate renderer pass.
|
|
516
|
+
- All combined channel profiles share one physical normalization radius/operating envelope and must satisfy the radial invertibility contract.
|
|
517
|
+
- Renderers should inverse-map each destination channel to the engine-derived source coordinate; do not substitute an RGB blur or arbitrary post-output pixel offset.
|
|
518
|
+
- Longitudinal CA, spectral PSFs, sensor color response, and named-lens calibration are outside this model.
|
|
519
|
+
- Test Fixture RGB edges can verify renderer behavior but are not spectral calibration evidence.
|
|
520
|
+
- Do not compose this standalone model into the POC/app without an explicit contract/version review.
|
|
521
|
+
|
|
522
|
+
## Radial-distortion boundary
|
|
523
|
+
|
|
524
|
+
`calculateRadialDistortionMapping()` and `calculateInverseRadialDistortionMapping()` are the engine-owned generic radial field-mapping primitives.
|
|
525
|
+
|
|
526
|
+
- Coefficients are meaningful only with the declared `normalizationRadiusMm`; never copy coefficients into a different normalization silently.
|
|
527
|
+
- Respect `maximumNormalizedRadius` as the profile operating envelope.
|
|
528
|
+
- Profiles must remain strictly monotonic over the declared envelope so inverse mapping stays single-valued.
|
|
529
|
+
- Renderers should consume the inverse mapping semantics for destination-to-source sampling; do not define backend-specific distortion equations.
|
|
530
|
+
- This slice is optical-axis-centered and radial-only. Do not pretend it includes tangential/decentering, anamorphic, CA, or calibrated named-lens behavior.
|
|
531
|
+
- Test Fixture visual grids are regression evidence, not calibration data.
|
|
532
|
+
- Do not compose distortion into the POC or app camera science without an explicit contract/version review.
|
|
533
|
+
|
|
534
|
+
## Focus-breathing boundary
|
|
535
|
+
|
|
536
|
+
`calculateFocusBreathingProjection()` and `calculateFocusBreathingFieldOfView()` are generic declared-scale approximations.
|
|
537
|
+
|
|
538
|
+
- Never infer `breathingProjectionScale` from focal length, focus distance, sensor crop, lens brand/model, or adjacent metadata.
|
|
539
|
+
- Scale `1` must reproduce the existing focus-aware thin-lens projection exactly.
|
|
540
|
+
- Physical focal length remains authoritative; do not relabel effective projection distance as focal length.
|
|
541
|
+
- Digital/output crop must remain downstream and must not be folded into the breathing scale.
|
|
542
|
+
- A real-lens breathing profile requires defensible provenance, compatible reuse rights, and explicit limitations/uncertainty.
|
|
543
|
+
- Keep distortion, CA, pupil magnification, vignetting, and PSF effects separate unless a later documented model couples them.
|
|
544
|
+
- Do not compose this standalone model into the POC without a POC API/version review.
|
|
545
|
+
|
|
546
|
+
## Spatial camera-rotation boundary
|
|
547
|
+
|
|
548
|
+
`calculateCameraRotationImageMapping()` is the engine-owned low-level model for pure rotational field flow.
|
|
549
|
+
|
|
550
|
+
- It uses physical camera rotation signs (right-hand pitch/yaw/roll about +X/+Y/+Z at exposure start).
|
|
551
|
+
- It returns image-plane +Y-up displacement; do not treat optional sample displacement as native-raster +Y-down without an explicit transform.
|
|
552
|
+
- It is time-parameterized in seconds from exposure start.
|
|
553
|
+
- It integrates simultaneous angular velocity as one axis-angle vector rather than ordered Euler steps.
|
|
554
|
+
- Do not add translation to this depth-independent primitive; translation/parallax requires scene depth.
|
|
555
|
+
- Do not silently replace `estimateCameraShakeBlur()`; that older function keeps its legacy global-vector/stabilization approximation and sign semantics.
|
|
556
|
+
- Do not add stabilization stops to the pure rotation primitive without a separate documented control/stabilization model.
|
|
557
|
+
- Rolling readout must consume the same time-parameterized rotation semantics rather than defining another camera-motion equation.
|
|
558
|
+
- Capture rotation trajectories may bind the exposure-window `first-opening-boundary-phase` to the existing rotation model's t=0 only inside an explicit integration layer; do not silently redefine the low-level time origin.
|
|
559
|
+
- Do not call forward local-exposure trajectory endpoints a rolling-shutter warp or blur kernel. Renderer-ready rolling-shutter geometry must solve capture-location-dependent timing consistently and exposure blur requires integration over the local interval.
|
|
560
|
+
- Sensor data-readout timing must not enter capture-motion geometry unless a separate explicit capture-mode/link contract establishes that relationship.
|
|
561
|
+
- For the current constant-axis pure-rotation model, prefer the analytic inverse mapping over an iterative/fixed-point solver; do not introduce numerical convergence machinery when the inverse is closed-form.
|
|
562
|
+
- Any instantaneous capture-scan mapping must require an explicit local-exposure phase. Never silently choose midpoint/start/end and present it as the finite-exposure result.
|
|
563
|
+
- Finite-exposure temporal geometry must preserve separate dimensionless time-average weights and seconds-valued integration measures; do not conflate either with shutter transmission, radiometric throughput, photon count, or sensor response.
|
|
564
|
+
- The first finite-exposure rotation model uses deterministic uniform midpoint quadrature and must reuse the existing instantaneous inverse mapping rather than copy camera-motion equations.
|
|
565
|
+
- Do not average geometric coordinates and call the result motion blur. Blur/radiance accumulation belongs to downstream scene sampling and must account for visibility/radiance over time.
|
|
566
|
+
- Do not invent a geometry-only quadrature error bound; convergence evidence must be measured in the downstream quantity being integrated.
|
|
567
|
+
- Do not clamp reference rays that leave the active source frame under motion; expose the geometry and let renderer/source-coverage policy handle missing samples.
|
|
568
|
+
|
|
569
|
+
## Runtime and package boundary
|
|
570
|
+
|
|
571
|
+
### Standalone stray light and digital corrections
|
|
572
|
+
|
|
573
|
+
- Consume `docs/DIGITAL_OPTICS_FOUNDATION.md` for #114/#118/#117. These primitives do not activate production-plan stages or change POC behavior.
|
|
574
|
+
- Ghost/veil contributions are additive spectral irradiance before exposure/sensor processing. Keep diffraction, primary PSF, contamination and display effects separate.
|
|
575
|
+
- Profiles require exact generic system/acquisition binding and explicit generic evidence. Do not promote synthetic coefficients to calibration or extrapolate.
|
|
576
|
+
- Preserve full destination-to-source Jacobians, compatible-domain groups, resampler identity, prefilter requirements and valid-source masks/joint crops. Invalid support remains unavailable.
|
|
577
|
+
- Corrections warp already-sampled blur/noise; gain changes downstream signal/variance without rewriting photons. RAW metadata intent, camera mandatory settings and educational reference bypass are separate states.
|
|
578
|
+
- The bounded RGB executor accepts reconstructed-linear geometry/CA followed by gain only. Reject incompatible-domain or geometry-across-gain execution rather than reorder it. Production #111/#112 require their own explicit composition.
|
|
579
|
+
- Reconcile root API versions against other pending API branches before merge; schemas and package/POC versions remain independent.
|
|
580
|
+
### Authoritative linear capture container
|
|
581
|
+
|
|
582
|
+
- #15A `SimulatedCapture` is a standalone immutable data commitment, not a radiance generator, virtual-camera color transform, quantizer, file serializer or production-stage activation.
|
|
583
|
+
- Follow `docs/SIMULATED_CAPTURE.md`. Preserve distinct image states, float headroom/negative values, source dynamic-range history, capture saturation, reference white, adopted white and resolved WB intent/application.
|
|
584
|
+
- Reuse geometry/focal/focus/WB contracts. Digital/output crop never changes active-capture focal equivalence. External plane references are public IDs plus SHA-256 and declared IEEE float layout; no runtime file/network access is introduced.
|
|
585
|
+
- Allowlist public metadata; reject paths, URLs, private/debug fields and LDR/tonemapped state declarations. Producer IDs must remain public and non-personal. An ID grammar is not a provenance/privacy audit.
|
|
586
|
+
- #15B owns actual color transforms/validity; #15C owns total quantization behavior; #112 owns rendering and #16 file mapping. Do not infer serializer readiness from container validity. #15 and its prerequisites are merged. Container validity alone still does not establish serializer or calibration readiness.
|
|
587
|
+
- Follow `docs/CAPTURE_COLOR.md` for #15B. The ideal colorimetric virtual RGB profile is an explicit XYZ encoding, never inferred for arbitrary spectral/commercial sensor channels. Resolved RGB gains require the exact camera-basis binding; adopted-white XYZ scaling is a separately selected approximation. Preserve float range and source capture history; reject double application and do not claim a physically unique global white under mixed illumination.
|
|
588
|
+
- Follow `docs/LINEAR_CAPTURE_ENCODING.md` for #15C. Linear uint16 encoding requires explicit black/reference codes, negative and range policies and nearest-ties-up rounding. Use the plane's reference value; preserve float source data and color/WB/capture-saturation identity. Integer code limits never redefine capture saturation or display white. No serializer tags, gamma/tone mapping or implicit color conversion belongs here.
|
|
589
|
+
|
|
590
|
+
### Standalone SDR rendering primitives
|
|
591
|
+
|
|
592
|
+
- Follow `docs/SDR_RENDERING.md` for #112A. Accept only explicitly color-transformed linear-sRGB/D65 input with completed/not-required WB; unresolved scene/sensor/WB states fail closed. This low-level primitive does not itself activate production display-processing. The merged capture/RAW adapters and plan 0.7.0 own explicit integration.
|
|
593
|
+
- Rendering exposure is post-capture relative scaling. Keep tone, gamut handling, transfer encoding, quantization and external display adaptation separately inspectable; no processing result rewrites metering, noise, physical exposure or upstream saturation.
|
|
594
|
+
- Positive per-channel Reinhard is a named generic rendering choice that can change chromaticity. Component clipping is explicit, not perceptual gamut mapping. SDR source headroom never establishes HDR output or actual display capability.
|
|
595
|
+
- #112 integration is merged. Preserve its shared processed-RAW/paired-JPEG path, #111 ordering and #108/#15 WB; do not introduce a second estimator/composer.
|
|
596
|
+
|
|
597
|
+
- The root package must remain browser-safe and ESM-only.
|
|
598
|
+
- Node-only code must not become reachable from the root public export.
|
|
599
|
+
- The repository-local POC HTTP code under `src/api` is contributor tooling, not a supported package subpath or production architecture.
|
|
600
|
+
- Keep the published npm tarball limited to the intended root scientific surface.
|
|
601
|
+
- Do not add runtime dependencies without a concrete need, provenance/license review, and explicit approval.
|
|
602
|
+
- Reuse existing helpers/modules before adding parallel abstractions.
|
|
603
|
+
|
|
604
|
+
## Security and privacy
|
|
605
|
+
|
|
606
|
+
- Never commit credentials, API keys, tokens, private keys, secrets, private datasets, or restricted calibration material.
|
|
607
|
+
- Treat external JSON and other untrusted inputs as untrusted at runtime; TypeScript types are not validation.
|
|
608
|
+
- Keep the local POC server loopback-oriented and unauthenticated-development-only.
|
|
609
|
+
- Do not introduce persistence, telemetry, external network calls, uploads, accounts, remote code, or hosted-service dependencies without an explicit design/security review.
|
|
610
|
+
- Fail safely on malformed or non-finite scientific inputs.
|
|
611
|
+
|
|
612
|
+
## Legal, IP, and provenance
|
|
613
|
+
|
|
614
|
+
- Maintain Apache-2.0 and SPDX requirements.
|
|
615
|
+
- Follow `DCO`, `docs/PROVENANCE.md`, and `THIRD_PARTY.md`.
|
|
616
|
+
- Do not copy or adapt third-party code, prose, tables, diagrams, datasets, model weights, calibration files, waveform files, or protected technical expression without explicit compatible rights.
|
|
617
|
+
- Record third-party material and licenses when incorporated.
|
|
618
|
+
- Do not use third-party logos, trademarks, trade dress, or source-identifying branded designs except where a narrow factual/nominative reference is necessary and reviewed.
|
|
619
|
+
- AI-assisted work is draft material until substantively human-reviewed; an AI claim of originality or license compatibility is not provenance evidence.
|
|
620
|
+
|
|
621
|
+
## Testing and verification
|
|
622
|
+
|
|
623
|
+
For meaningful changes, run the smallest relevant tests first, then the full release checks before merge:
|
|
624
|
+
|
|
625
|
+
```sh
|
|
626
|
+
npm ci
|
|
627
|
+
npm run check
|
|
628
|
+
npm run coverage
|
|
629
|
+
npm run build
|
|
630
|
+
npm run pack:check
|
|
631
|
+
```
|
|
632
|
+
|
|
633
|
+
Requirements:
|
|
634
|
+
|
|
635
|
+
- Add deterministic tests for equations, invariants, parsing, edge cases, and regressions where they materially increase confidence.
|
|
636
|
+
- For coordinate/geometry changes, include round-trip/invariance tests for all four orientations and off-center cases where applicable.
|
|
637
|
+
- For provenance/readiness parsers, test malformed input, contradictory claims, duplicate facts, missing evidence, and approximation/calibration boundaries.
|
|
638
|
+
- Preserve fixed seeds for fuzz/property tests.
|
|
639
|
+
- Do not reduce coverage thresholds to land a change.
|
|
640
|
+
- Keep browser-surface, dependency-license, SPDX, identity, and package-surface gates green.
|
|
641
|
+
|
|
642
|
+
## Documentation
|
|
643
|
+
|
|
644
|
+
Update documentation in the same change when public behavior, equations, assumptions, limitations, schemas, APIs, provenance, or release requirements change.
|
|
645
|
+
|
|
646
|
+
Documentation must:
|
|
647
|
+
|
|
648
|
+
- match actual code;
|
|
649
|
+
- distinguish exact calculations from approximations;
|
|
650
|
+
- use concise examples that compile against the public API;
|
|
651
|
+
- avoid marketing claims unsupported by the model;
|
|
652
|
+
- preserve the canonical Photivra identity and pronunciation.
|
|
653
|
+
|
|
654
|
+
## Change discipline
|
|
655
|
+
|
|
656
|
+
- After a pull request is merged, delete its source branch promptly. Do not delete the default branch, protected/release branches, or a branch that is still required by another open PR or documented active dependency. Any retained merged-PR branch must have the reason documented and must be deleted when that dependency ends.
|
|
657
|
+
- Prefer the smallest change that fully solves the problem.
|
|
658
|
+
- Avoid unrelated refactors, formatting churn, dependency upgrades, and file movement.
|
|
659
|
+
- Preserve existing architecture unless there is evidence that changing it materially improves correctness, safety, maintainability, or performance.
|
|
660
|
+
- Investigate root causes rather than masking failing tests.
|
|
661
|
+
- Review the final diff for accidental API, security, licensing, or package-surface changes.
|
|
662
|
+
- Treat material scientific, security, licensing, provenance, trademark, package-boundary, and unsupported-claim findings as release blockers.
|
|
663
|
+
|
|
664
|
+
## Cost control
|
|
665
|
+
|
|
666
|
+
Cost is a project constraint.
|
|
667
|
+
|
|
668
|
+
Before introducing anything that may cost money—paid APIs, hosted services, storage, CDN features, SaaS, licensed datasets, commercial dependencies, or recurring infrastructure—explicitly call out:
|
|
669
|
+
|
|
670
|
+
- what would cost money;
|
|
671
|
+
- expected fixed and usage-based cost at realistic usage;
|
|
672
|
+
- a no-cost or lower-cost alternative when practical.
|
|
673
|
+
|
|
674
|
+
Do not commit the project to a paid service without explicit approval.
|