@photivra/engine 1.3.0 → 1.5.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/CHANGELOG.md +17 -1
- package/CITATION.cff +1 -1
- package/dist/capture/environment-raw-producer.d.ts +6 -3
- package/dist/capture/environment-raw-producer.d.ts.map +1 -1
- package/dist/capture/environment-raw-producer.js +26 -15
- package/dist/capture/environment-raw-producer.js.map +1 -1
- package/dist/capture/export-jpeg.d.ts +9 -0
- package/dist/capture/export-jpeg.d.ts.map +1 -1
- package/dist/capture/export-jpeg.js +51 -12
- package/dist/capture/export-jpeg.js.map +1 -1
- package/dist/capture/native-environment-raw.d.ts +43 -0
- package/dist/capture/native-environment-raw.d.ts.map +1 -0
- package/dist/capture/native-environment-raw.js +81 -0
- package/dist/capture/native-environment-raw.js.map +1 -0
- package/dist/capture/native-raw-development.d.ts +45 -0
- package/dist/capture/native-raw-development.d.ts.map +1 -0
- package/dist/capture/native-raw-development.js +159 -0
- package/dist/capture/native-raw-development.js.map +1 -0
- package/dist/capture/native-raw.d.ts +83 -0
- package/dist/capture/native-raw.d.ts.map +1 -0
- package/dist/capture/native-raw.js +146 -0
- package/dist/capture/native-raw.js.map +1 -0
- package/dist/capture/raw-frame-reconstruction.d.ts +2 -0
- package/dist/capture/raw-frame-reconstruction.d.ts.map +1 -1
- package/dist/capture/raw-frame-reconstruction.js +18 -13
- package/dist/capture/raw-frame-reconstruction.js.map +1 -1
- package/dist/capture/sensor-raw-producer.d.ts +8 -0
- package/dist/capture/sensor-raw-producer.d.ts.map +1 -1
- package/dist/capture/sensor-raw-producer.js +43 -38
- package/dist/capture/sensor-raw-producer.js.map +1 -1
- package/dist/capture/simulated-capture.d.ts +8 -0
- package/dist/capture/simulated-capture.d.ts.map +1 -1
- package/dist/capture/simulated-capture.js +24 -13
- package/dist/capture/simulated-capture.js.map +1 -1
- package/dist/color/srgb-icc.d.ts +8 -0
- package/dist/color/srgb-icc.d.ts.map +1 -0
- package/dist/color/srgb-icc.js +67 -0
- package/dist/color/srgb-icc.js.map +1 -0
- package/dist/color/srgb-transfer.d.ts +4 -0
- package/dist/color/srgb-transfer.d.ts.map +1 -0
- package/dist/color/srgb-transfer.js +9 -0
- package/dist/color/srgb-transfer.js.map +1 -0
- package/dist/composition/image-formation-plan.d.ts.map +1 -1
- package/dist/composition/image-formation-plan.js +4 -1
- package/dist/composition/image-formation-plan.js.map +1 -1
- package/dist/core/version.d.ts +1 -1
- package/dist/core/version.js +1 -1
- package/dist/index.d.ts +12 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/motion/camera-rotation.d.ts +8 -0
- package/dist/motion/camera-rotation.d.ts.map +1 -1
- package/dist/motion/camera-rotation.js +2 -1
- package/dist/motion/camera-rotation.js.map +1 -1
- package/dist/optics/sensor-aperture-rays.d.ts +56 -0
- package/dist/optics/sensor-aperture-rays.d.ts.map +1 -0
- package/dist/optics/sensor-aperture-rays.js +55 -0
- package/dist/optics/sensor-aperture-rays.js.map +1 -0
- package/dist/output/print-jpeg.d.ts +63 -0
- package/dist/output/print-jpeg.d.ts.map +1 -0
- package/dist/output/print-jpeg.js +141 -0
- package/dist/output/print-jpeg.js.map +1 -0
- package/dist/output/sdr-rendering.d.ts.map +1 -1
- package/dist/output/sdr-rendering.js +2 -1
- package/dist/output/sdr-rendering.js.map +1 -1
- package/dist/sensor/environment-photo-signal.d.ts +15 -4
- package/dist/sensor/environment-photo-signal.d.ts.map +1 -1
- package/dist/sensor/environment-photo-signal.js +39 -15
- package/dist/sensor/environment-photo-signal.js.map +1 -1
- package/dist/sensor/raw-reconstruction.d.ts +5 -0
- package/dist/sensor/raw-reconstruction.d.ts.map +1 -1
- package/dist/sensor/raw-reconstruction.js +21 -47
- package/dist/sensor/raw-reconstruction.js.map +1 -1
- package/docs/API_REFERENCE.md +87 -1
- package/docs/DENSE_PUPIL_QUALIFICATION.md +121 -0
- package/docs/ENVIRONMENT_RAW_CAPTURE.md +2 -0
- package/docs/NATIVE_RAW_AND_PRINT.md +54 -0
- package/docs/RELEASE_1_4_0.md +23 -0
- package/docs/RELEASE_1_5_0.md +105 -0
- package/docs/SENSOR_APERTURE_RAYS.md +23 -0
- package/docs/SEPARABLE_EMISSION_DRAFT.md +103 -0
- package/docs/api/camera-equivalent-focal-length.md +1 -1
- package/docs/api/camera-field-of-view.md +1 -1
- package/docs/api/camera-projected-object-size.md +1 -1
- package/docs/api/capture-capture-export-metadata.md +1 -1
- package/docs/api/capture-environment-raw-producer.md +3 -2
- package/docs/api/capture-focus-control.md +1 -1
- package/docs/api/capture-linear-encoding.md +1 -1
- package/docs/api/capture-native-environment-raw.md +88 -0
- package/docs/api/capture-native-raw-development.md +70 -0
- package/docs/api/capture-native-raw.md +161 -0
- package/docs/api/capture-photographic-export.md +1 -1
- package/docs/api/capture-raw-frame-reconstruction.md +1 -1
- package/docs/api/capture-release-sequence.md +1 -1
- package/docs/api/capture-sensor-raw-frame.md +1 -1
- package/docs/api/capture-sensor-raw-producer.md +1 -1
- package/docs/api/capture-simulated-capture.md +9 -1
- package/docs/api/color-capture-color.md +1 -1
- package/docs/api/color-srgb-icc.md +23 -0
- package/docs/api/color-white-balance.md +1 -1
- package/docs/api/composition-image-formation-plan.md +1 -1
- package/docs/api/composition-plan-consumer.md +1 -1
- package/docs/api/core-calculation-result.md +1 -1
- package/docs/api/core-configuration-error.md +1 -1
- package/docs/api/core-image-formation.md +1 -1
- package/docs/api/core-scientific-assurance.md +1 -1
- package/docs/api/core-spectral-composition.md +1 -1
- package/docs/api/core-spectral.md +1 -1
- package/docs/api/core-validation.md +1 -1
- package/docs/api/core-version.md +2 -2
- package/docs/api/equipment-exposure-capabilities.md +1 -1
- package/docs/api/equipment-generic-tier-assets.md +1 -1
- package/docs/api/equipment-generic-tier-presets.md +1 -1
- package/docs/api/equipment-iso-capabilities.md +1 -1
- package/docs/api/equipment-metering-capabilities.md +1 -1
- package/docs/api/equipment-release-capabilities.md +1 -1
- package/docs/api/exports.json +222 -2
- package/docs/api/exposure-exposure-duration-control.md +1 -1
- package/docs/api/exposure-exposure-mode-resolver.md +1 -1
- package/docs/api/exposure-exposure.md +1 -1
- package/docs/api/exposure-flash.md +1 -1
- package/docs/api/exposure-metering-scene-radiance.md +1 -1
- package/docs/api/exposure-metering-target.md +1 -1
- package/docs/api/exposure-metering-temporal.md +1 -1
- package/docs/api/exposure-metering.md +1 -1
- package/docs/api/exposure-program-line.md +1 -1
- package/docs/api/motion-camera-rotation.md +1 -1
- package/docs/api/motion-capture-rotation-inverse-mapping.md +1 -1
- package/docs/api/motion-capture-rotation-temporal-quadrature.md +1 -1
- package/docs/api/motion-capture-rotation-trajectory.md +1 -1
- package/docs/api/motion-capture-translation-parallax-temporal-quadrature.md +1 -1
- package/docs/api/motion-extended-object-projection.md +1 -1
- package/docs/api/motion-projected-motion.md +1 -1
- package/docs/api/optics-aperture.md +1 -1
- package/docs/api/optics-circle-of-confusion.md +1 -1
- package/docs/api/optics-complex-pupil-psf.md +1 -1
- package/docs/api/optics-depth-of-field.md +1 -1
- package/docs/api/optics-diffraction.md +1 -1
- package/docs/api/optics-focus-breathing.md +1 -1
- package/docs/api/optics-focus-state.md +1 -1
- package/docs/api/optics-front-of-lens-filter.md +1 -1
- package/docs/api/optics-illumination-vignetting.md +1 -1
- package/docs/api/optics-lateral-chromatic-aberration.md +1 -1
- package/docs/api/optics-lens-psf-profile.md +1 -1
- package/docs/api/optics-polygon-diffraction.md +1 -1
- package/docs/api/optics-profile-contract.md +1 -1
- package/docs/api/optics-psf-foundation.md +1 -1
- package/docs/api/optics-radial-distortion.md +1 -1
- package/docs/api/optics-scene-to-sensor-irradiance.md +1 -1
- package/docs/api/optics-scene-to-sensor-quadrature.md +1 -1
- package/docs/api/optics-sensor-aperture-rays.md +75 -0
- package/docs/api/optics-sensor-environment-query.md +1 -1
- package/docs/api/optics-sensor-psf-quadrature.md +1 -1
- package/docs/api/optics-stray-light.md +1 -1
- package/docs/api/optics-thin-lens.md +1 -1
- package/docs/api/output-capture-corrected-sdr.md +1 -1
- package/docs/api/output-capture-geometry.md +1 -1
- package/docs/api/output-capture-sdr.md +1 -1
- package/docs/api/output-crop.md +1 -1
- package/docs/api/output-geometric-transforms.md +1 -1
- package/docs/api/output-lens-corrections.md +1 -1
- package/docs/api/output-native-capture-sdr.md +1 -1
- package/docs/api/output-print-contrast-reference.md +1 -1
- package/docs/api/output-print-detail.md +1 -1
- package/docs/api/output-print-jpeg.md +117 -0
- package/docs/api/output-print-plan.md +1 -1
- package/docs/api/output-print-region-statistics.md +1 -1
- package/docs/api/output-sdr-rendering.md +1 -1
- package/docs/api/output-subject-framing-crop.md +1 -1
- package/docs/api/schema-camera.md +1 -1
- package/docs/api/schema-illumination-spectral.md +1 -1
- package/docs/api/schema-illumination-temporal.md +1 -1
- package/docs/api/schema-illumination.md +1 -1
- package/docs/api/schema-scene-radiance-temporal.md +1 -1
- package/docs/api/schema-scene-radiance.md +1 -1
- package/docs/api/schema-scene.md +1 -1
- package/docs/api/schema-validation.md +1 -1
- package/docs/api/sensor-accumulated-charge.md +1 -1
- package/docs/api/sensor-architecture.md +1 -1
- package/docs/api/sensor-camera-saturation-capacity.md +1 -1
- package/docs/api/sensor-capture-color-sampling-binding.md +1 -1
- package/docs/api/sensor-capture-mode-timing.md +1 -1
- package/docs/api/sensor-capture-mode.md +1 -1
- package/docs/api/sensor-color-sampling.md +1 -1
- package/docs/api/sensor-constant-rate-temporal-integration.md +1 -1
- package/docs/api/sensor-dark-current.md +1 -1
- package/docs/api/sensor-environment-photo-signal.md +17 -1
- package/docs/api/sensor-eqe-electron-rate.md +1 -1
- package/docs/api/sensor-eqe-local-exposure.md +1 -1
- package/docs/api/sensor-eqe-temporal-exposure.md +1 -1
- package/docs/api/sensor-exposure-window.md +1 -1
- package/docs/api/sensor-iso-signal-chain.md +1 -1
- package/docs/api/sensor-local-exposure-binding.md +1 -1
- package/docs/api/sensor-optical-stack.md +1 -1
- package/docs/api/sensor-photon-energy.md +1 -1
- package/docs/api/sensor-physical-charge-capacity.md +1 -1
- package/docs/api/sensor-pixel-pitch.md +1 -1
- package/docs/api/sensor-radiometry-readiness.md +1 -1
- package/docs/api/sensor-raw-readout.md +1 -1
- package/docs/api/sensor-raw-reconstruction.md +1 -1
- package/docs/api/sensor-readout-exposure-linkage.md +1 -1
- package/docs/api/sensor-readout-timing.md +1 -1
- package/docs/api/sensor-response-application-compatibility.md +1 -1
- package/docs/api/sensor-response-operating-range.md +1 -1
- package/docs/api/sensor-responsivity-photocurrent.md +1 -1
- package/docs/api/sensor-sampling-aperture.md +1 -1
- package/docs/api/sensor-scene-eqe-temporal-exposure.md +1 -1
- package/docs/api/sensor-sensor-geometry.md +1 -1
- package/docs/api/sensor-signal-noise.md +1 -1
- package/docs/api/sensor-spatial-sample-reduction.md +1 -1
- package/docs/api/sensor-spatial-sampling-quadrature.md +1 -1
- package/docs/api/sensor-spatio-spectral-reduction.md +1 -1
- package/docs/api/sensor-spectral-coverage.md +1 -1
- package/docs/api/sensor-spectral-quadrature.md +1 -1
- package/docs/api/sensor-spectral-response.md +1 -1
- package/docs/api/sensor-temporal-photo-signal.md +1 -1
- package/docs/api/simulation-poc-simulation.md +1 -1
- package/docs/api/stabilization-camera-shake.md +1 -1
- package/docs/api/stabilization-system.md +1 -1
- package/docs/validation/dense-pupil-2026-10-06/pilot.jsonl +6 -0
- package/docs/validation/native-raw-print-2026-10-04/fractional-asymmetric-crop.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/gray-ramp.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/linear-area-checker.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/manifest.json +218 -0
- package/docs/validation/native-raw-print-2026-10-04/megapixel-native.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/native-color.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel-validation.json +9 -0
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json +29 -0
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.codes.u16le.gz +0 -0
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.rgb.gz +0 -0
- package/docs/validation/native-raw-print-2026-10-04/srgb.icc +0 -0
- package/docs/validation/native-raw-print-2026-10-04/validation.json +41 -0
- package/package.json +1 -1
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# Native RAW and Print candidate contracts
|
|
2
|
+
|
|
3
|
+
These native RAW and Print contracts are part of version 1.4.0. The optional execution chunk control described below is an unreleased additive change and is not available in the published 1.4.0 package. Production adoption requires separate downstream qualification.
|
|
4
|
+
|
|
5
|
+
The separate `createNativeRawTask` contract accepts metadata without an inline image plane, then produces exact owned native codes, black levels, digital saturation codes and independent physical/pre-ADC/digital flags. Admission is limited to 24 million sites, 16,384 pixels per dimension, 256 sites per tile, and an explicitly admitted seven-byte-per-site payload. The reference 4,096-site RAW path is unchanged. Absolute CFA coordinates and absolute-index charge/read-noise seeds preserve reference arithmetic across tile boundaries.
|
|
6
|
+
|
|
7
|
+
`createNativeEnvironmentRawTask` invokes actual source radiance callbacks through shared projection, shutter, optical throughput, pupil/PSF and EQE calculations. It admits no more than 100,000 source evaluations per tile and requires a whole-event budget no greater than two billion. Source visibility, measured radiometry, convergence and physical transport remain provider responsibilities. The optional immutable photo-tile observer exposes bounded expectation values before noise or clipping. Observers receive the event AbortSignal for pending resource work. Source callbacks stop immediately when the event is aborted; observer failures and cancellation withhold output. `productionPlanActivated` and transport verification remain false.
|
|
8
|
+
|
|
9
|
+
`createNativeRawDevelopmentTask` snapshots one exact packed RAW and applies the shared reconstruction kernels, declared camera RGB-to-XYZ approximation, white balance exactly once, and shared SDR rendering. Every used phase and kernel halo must lie inside actual native support: no padding or weight renormalization. Output crop and orientation are bound to the capture geometry; this stage supports 1:1 output sampling. Retained payload admission counts the owned RAW copy and integer output, not caller buffers, JavaScript heap or GPU storage.
|
|
10
|
+
|
|
11
|
+
All tasks require host yields, publish only whole successful outputs, distinguish failure/cancellation/disposal, and transfer output ownership once. Typed storage must have an exact owned ArrayBuffer; shared buffers and hidden larger parent allocations are rejected. Metadata provenance and declared hashes do not establish producer authenticity.
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
### Optional smaller execution chunks (unreleased)
|
|
15
|
+
|
|
16
|
+
`NativeRawInput.tileWidth` may explicitly select an integer from 1 through 256 native sites. Omission retains the original 256-site execution and original plan shape. An explicit width is copied into the immutable plan and changes only tile count, provider request widths and yield frequency. Absolute native CFA coordinates, noise seeds, rolling exposure windows and all output codes/flags are unchanged. This control does not change physical sampling or quadrature.
|
|
17
|
+
|
|
18
|
+
Smaller chunks can admit an unchanged high-query-per-site optical event under the existing 100,000-query tile cap. The two-billion whole-event cap and 24-million-site/output-byte limits remain unchanged; a smaller tile never establishes convergence, qualified source transport or production activation. For example, 64 sites with 1,024 source queries per site need 65,536 queries in a tile, while 256 sites would exceed the tile cap. The caller must still satisfy the full-event budget and qualify the source and result independently.
|
|
19
|
+
|
|
20
|
+
## Print stage
|
|
21
|
+
|
|
22
|
+
`createPrintJpegTask` accepts explicitly encoded sRGB 8-bit RGB in an already oriented output raster. It crops only within actual source support and rejects enlargement, stretching and unsupported aspect ratios. Original area filtering decodes this declared post-SDR stage to linear values, integrates exact pixel overlap, then encodes and quantizes sRGB. This does not recover sensor headroom or reprocess RAW. Source reads are bounded to 256 × 32 pixels; JPEG coding uses 8 × 8 blocks. Edge replication is restricted to final JPEG coding blocks, not reconstruction or crop support.
|
|
23
|
+
|
|
24
|
+
The original baseline JPEG encoder embeds an original ICC v4.3 sRGB matrix/TRC profile, EXIF orientation 1, sRGB ColorSpace and final pixel dimensions. Its XMP records the immutable Print plan and declares source bytes unverified. Encoded output is explicitly budgeted to at most 256 MB and provider reads to one million. The caller owns the final file and must separately qualify browser save/share, byte-size requirements and printer/substrate appearance.
|
|
25
|
+
|
|
26
|
+
The ICC serializer uses the existing engine sRGB primaries and transfer function, standard numerical Bradford adaptation to D50 PCS and original ICC tag serialization. This profile adaptation does not introduce a shooting white-balance model. Numerical facts and format references: [ICC sRGB interpretation](https://registry.color.org/rgb-registry/files/sRGB.pdf), [ICC profile specification](https://www.color.org/icc34.pdf). No third-party ICC profile bytes or implementation were redistributed.
|
|
27
|
+
|
|
28
|
+
## Reproducible validation
|
|
29
|
+
|
|
30
|
+
`test/native-raw.test.ts`, `test/native-environment-raw.test.ts`, `test/native-raw-development.test.ts` and `test/print-jpeg.test.ts` cover small-reference parity, absolute odd-width phase/seed boundaries, orientation, signed below-black noise, whole-output budgets, corrupt providers, support halos and cancellation/ownership.
|
|
31
|
+
|
|
32
|
+
Run the optional actual megapixel test with `PHOTIVRA_VALIDATE_MEGAPIXEL_RAW=1 PHOTIVRA_RAW_REPORT=/tmp/native-raw-report.json npx vitest run test/native-raw-megapixel.test.ts`. It executes every one of a million native sites, develops that exact RAW and downsamples to a 500 × 500 ICC JPEG. The constructed count inputs are not a qualified megapixel scene-radiance capture.
|
|
33
|
+
|
|
34
|
+
Generate the separate original color, checker, asymmetric fractional crop, gray ramp and one-megapixel JPEG controls with `node scripts/generate-native-print-jpeg.mjs /tmp/native-print`. Validate actual bytes using `python scripts/verify-native-print-jpeg.py /tmp/native-print /tmp/native-print/validation.json` in an environment with NumPy and Pillow/LittleCMS. The independent area oracle expects 188 for a half-black/half-white sRGB checker reduction, rather than an encoded-value average. JPEG tolerance is four encoded codes; the original ICC is compared against LittleCMS sRGB over a 17³ color cube with a one-code budget.
|
|
35
|
+
|
|
36
|
+
These controls do not qualify all product fixtures, calibrated sensor/lens behavior, diffraction, full production depth composition, physical phone/tablet resources, printer appearance, platform save/share or substantive human review. See the application qualification record for its separate source and deployment gates.
|
|
37
|
+
|
|
38
|
+
## Standalone bounded Print example
|
|
39
|
+
|
|
40
|
+
This executable control declares a constant encoded RGB source. The zero digest is a placeholder declaration and is not authenticated by the engine; a product should bind its actual retained artifact and enforce qualification before offering export.
|
|
41
|
+
|
|
42
|
+
```ts
|
|
43
|
+
import { createPrintJpegTask, createSrgbIccProfile } from '@photivra/engine';
|
|
44
|
+
const source = { captureId: 'owned-control', imageStateId: 'encoded-control', artifactId: 'constant-gray',
|
|
45
|
+
sha256: '0'.repeat(64), width: 16, height: 16, encoding: 'encoded-srgb-8-rgb' as const };
|
|
46
|
+
const task = createPrintJpegTask({ source, crop: { x: 0, y: 0, width: 16, height: 16 },
|
|
47
|
+
outputWidth: 8, outputHeight: 8, quantizationStep: 1, maximumEncodedBytes: 16000, maximumProviderReads: 100 }, {
|
|
48
|
+
readTile: async request => ({ ...request, samples: new Uint8Array(request.width * request.height * 3).fill(128) }),
|
|
49
|
+
yieldControl: async () => { await new Promise<void>(resolve => setTimeout(resolve, 0)); }
|
|
50
|
+
});
|
|
51
|
+
await task.run();
|
|
52
|
+
const jpeg = task.takeOutput();
|
|
53
|
+
if (jpeg.bytes.length === 0 || jpeg.width !== 8 || createSrgbIccProfile().length === 0) throw new Error('Control failed');
|
|
54
|
+
```
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Engine 1.4.0 candidate release review
|
|
2
|
+
|
|
3
|
+
This additive candidate aligns package, lockfile, citation and root engine identity at 1.4.0. It is not tagged or published. The application's production dependency remains the published 1.2.0 package until an approved release and explicit consumer migration.
|
|
4
|
+
|
|
5
|
+
Changes include the previously merged ideal pupil support and the separate metadata-only packed native RAW, source-to-RAW, same-RAW development and bounded post-SDR Print JPEG/ICC APIs. Independent schema versions remain 0.1.0. Reference inline plane, RAW and photographic export caps remain unchanged. Shared scalar helpers preserve the existing charge/noise/ADC, reconstruction, color and SDR equations. Reference JPEG byte controls cover eighteen original encoder cases including odd padding, three quantization steps and empty metadata.
|
|
6
|
+
|
|
7
|
+
See [native contracts and reproducible evidence](NATIVE_RAW_AND_PRINT.md), [pupil contract](SENSOR_APERTURE_RAYS.md), and [recorded controls](validation/native-raw-print-2026-10-04/validation.json).
|
|
8
|
+
|
|
9
|
+
## Review boundaries
|
|
10
|
+
|
|
11
|
+
The new tasks execute complete constructed capture inputs; they do not authenticate caller-owned artifact hashes or calibrate arbitrary source callbacks. Source radiometry/visibility, quadrature convergence, device resources, production stage composition, printer appearance and platform delivery remain separate contracts. Full production depth composition remains closed. The new native event records are deliberately separate from bounded `SensorRawFrame` and cannot be inserted into it as fabricated small frames.
|
|
12
|
+
|
|
13
|
+
The public engine contains original Apache-licensed math, serialization and synthetic controls only. Private application scene sources, fixture assets and proprietary adapters are retained in the application repository. The original ICC profile uses standard format/color facts, not a redistributed profile or encoder implementation.
|
|
14
|
+
|
|
15
|
+
## Owner handoff
|
|
16
|
+
|
|
17
|
+
1. Review the exact candidate code and public source provenance, scientific domains, unit/frame/phase/seed binding, resource limits and disposal behavior. AI-assisted changes remain draft until substantive human review under AGENTS.md.
|
|
18
|
+
2. Require green exact-head CI on Node 22.13, 22, 24 and 26, plus the package, documentation and isolated consumer gates. The optional actual megapixel run is separately recorded; its ordinary-suite skip is explicit.
|
|
19
|
+
3. Approve merge and the concrete 1.4.0 release only after review. Merge must not silently publish a tag. Check final main/commit/version identity and unchanged package consumer acceptance.
|
|
20
|
+
4. With explicit publication approval, use the repository release procedure/workflow for GitHub and npm. Confirm the published tarball, root export, version and provenance before migrating the application. Do not treat local candidate tooling as a published production import.
|
|
21
|
+
5. Finish the application’s independently retained source, output, platform and human/device acceptance at the adopted published version, then approve the concrete production deployment.
|
|
22
|
+
|
|
23
|
+
No tag, publication, production activation, credential change or deployment is authorized by this document.
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# 1.5.0 release candidate
|
|
2
|
+
|
|
3
|
+
Review snapshot: 2026-10-05. This document records the 1.5.0 engine release candidate. It does not tag, publish or activate a downstream application.
|
|
4
|
+
|
|
5
|
+
**Proposed version:** `@photivra/engine@1.5.0`, with `ENGINE_API_VERSION = "1.5.0"`. The backward-compatible public `NativeRawInput.tileWidth` option warrants a minor release rather than describing the entire change as a patch-only fix. This is an engine release identity, not the separate application's public Beta label.
|
|
6
|
+
|
|
7
|
+
**Candidate metadata is aligned to 1.5.0 on the release branch.** Generated references, exact-candidate CI/package validation, final review and owner publication authorization remain gates below.
|
|
8
|
+
|
|
9
|
+
## Current integration and owner review — 2026-10-06
|
|
10
|
+
|
|
11
|
+
The owner substantively reviewed and approved PRs #230 and #232, certified DCO 1.1 for those contributions and authorized contributor sign-off and merge after remaining checks. #232 merged with authorized sign-off as `7106fb90d8351cb769c2c01b0f10ebf1a437aea8`; its reviewed head `0d414b3f942c65f42a1a86f26c073a83093cd004` passed exact-head CI. The 1.5.0 candidate includes that bounded qualification checkpoint and preserves the reviewed #230 release changes at `7f33e4e39f94893ee93f87d90e7153d80ebd6f08`.
|
|
12
|
+
|
|
13
|
+
The checkpoint adds independent SI photon/electron tests and complete 2×2 resource pilots, not complete native Focus qualification or a public experimental API. #224 remains open. Historical draft/input-review statements below describe the October 5 preparation snapshot; they do not reopen completed contribution review/DCO. Generated API references were regenerated on the combined candidate with no file drift. Combined-candidate local validation passed: 2,184 tests / one existing skip, existing coverage thresholds, build, docs, packed consumers, package surface and configured image-formation benchmark. The actual 1.5.0 archive was inspected: 867 entries, root-only export, matching emitted version declarations and no repository-only API implementation/test/source/script/workflow tree. Final combined-candidate GitHub CI remains required before merge; publication remains separately authorized.
|
|
14
|
+
|
|
15
|
+
## Published baseline and exact candidate inputs
|
|
16
|
+
|
|
17
|
+
- Published GitHub release: [v1.4.0](https://github.com/Photivra/photivra/releases/tag/v1.4.0), published on 2026-10-04.
|
|
18
|
+
- At this review, `main` and `v1.4.0` both identify commit `240340ec9e23ef79b6a0d729f494b2a531dd6df4`; their comparison contains no new commits or changed files.
|
|
19
|
+
- [PR #223](https://github.com/Photivra/photivra/pull/223), head `04baece1a8d1a133db3e7a2f0c9daa0d662bb826`: optional native RAW execution chunks and preservation of the exact acquisition plan during same-RAW development.
|
|
20
|
+
- [PR #225](https://github.com/Photivra/photivra/pull/225), head `70f55f5e27795d2fa51d112fbee1b14ee097b6ce`: experimental separable ideal-emission work, stacked on #223.
|
|
21
|
+
- This preparation branch starts at the #225 snapshot so neither draft is silently omitted from the review. That ancestry is not approval to ship either change. Reconcile this document whenever a source PR changes, is excluded, or is rebased.
|
|
22
|
+
|
|
23
|
+
The v1.4.0 GitHub release is verified here. A fresh direct npm-registry check was unavailable in this review; do not infer current registry dist-tags or integrity values from the GitHub release alone.
|
|
24
|
+
|
|
25
|
+
## Proposed release notes, subject to the gates below
|
|
26
|
+
|
|
27
|
+
### Bounded native RAW execution and development
|
|
28
|
+
|
|
29
|
+
Add an explicit integer `NativeRawInput.tileWidth` from 1 through 256 native sites. Omission preserves the existing 256-site execution and the original plan shape. The option controls provider request width, tile count and host-yield frequency; it is not a physical sampling or quality control.
|
|
30
|
+
|
|
31
|
+
Preserve that acquisition width when validating and developing an owned native RAW result. Reject invalid widths, inconsistent tile counts and stale plans rather than silently reconstructing the default-width plan. Existing CFA coordinates, absolute-index noise seeds, shutter timing and RAW/developed values remain the intended invariant.
|
|
32
|
+
|
|
33
|
+
The existing 100,000 logical-query tile bound, two-billion arbitrary-provider event bound and native raster/output-byte limits remain in force. Smaller chunks can solve a tile-admission problem; they do not solve an over-budget whole event or establish optical convergence.
|
|
34
|
+
|
|
35
|
+
### Experimental source work is not a supported release feature
|
|
36
|
+
|
|
37
|
+
#225 explores an explicit uniform-spectrum, achromatic ideal-emission factorization with separately counted geometry evaluations and spectral compositions. It does not establish that an external source satisfies separability, that a full native fixture is qualified, or that a device meets time/memory requirements. See [the draft contract](SEPARABLE_EMISSION_DRAFT.md).
|
|
38
|
+
|
|
39
|
+
Do not advertise or expose this as a supported public API. At the current #225 head the prototype lives under `src/api/`, which is built for repository checks but excluded by the npm package manifest and unreachable from the root browser/package graph. Promotion out of that repository-only boundary would be a separate reviewed public-contract change. A successful test suite alone remains insufficient for scientific or production qualification.
|
|
40
|
+
|
|
41
|
+
## Blocking findings
|
|
42
|
+
|
|
43
|
+
### Resolved prerequisite: experimental distribution boundary
|
|
44
|
+
|
|
45
|
+
#225 now restores the published `src/capture/native-environment-raw.ts` implementation unchanged and moves the separable-emission prototype under `src/api/`. The repository's existing package-surface check excludes `dist/api/`, and the browser/root reachability check does not traverse the prototype. The 128-ray correctness regression also carries an explicit 15-second test budget so Node 24 timing variance is not misreported as a scientific failure.
|
|
46
|
+
|
|
47
|
+
This boundary must remain verified on the final candidate. Moving the prototype into a published module or root dependency graph would reopen the release blocker.
|
|
48
|
+
|
|
49
|
+
### 1. Scientific/source and resource qualification remain unresolved
|
|
50
|
+
|
|
51
|
+
[Issue #224](https://github.com/Photivra/photivra/issues/224) requires bounded full-event evidence and no hidden source assumption or raised safety ceiling. #225 proposes a distinct, four-billion scalar spectral-composition ceiling while preserving the two-billion legacy provider ceiling. Review whether this new source/work domain satisfies the approved scope; do not treat preserving the old ceiling as automatic approval of the new one.
|
|
52
|
+
|
|
53
|
+
Full-native depth/visibility/refinement results, independently checked output and measured resource evidence remain prerequisites for any newly claimed full-native capability. Keep source separability and transport unverified until evidence establishes them. Excluding the prototype from this release is valid; silently presenting partial-tile or synthetic controls as full-event qualification is not.
|
|
54
|
+
|
|
55
|
+
### 2. Substantive human review and contribution-specific DCO
|
|
56
|
+
|
|
57
|
+
The input PRs #223/#225/#226 received substantive human review and DCO approval before candidate preparation. The owner subsequently reviewed and certified #230/#232 on 2026-10-06, as recorded above. Follow [CONTRIBUTING](../CONTRIBUTING.md); use the authorized contributor sign-off for inclusion. This review does not establish the unresolved full-native/source/resource qualification under #224 or authorize public promotion of the experimental API.
|
|
58
|
+
|
|
59
|
+
## Validation already available for the code snapshots
|
|
60
|
+
|
|
61
|
+
- #223 records 2,151 passing tests and one existing skip at `04baece`, with CI [37216829043](https://github.com/Photivra/photivra/actions/runs/37216829043).
|
|
62
|
+
- #225's corrected package-isolated head `70f55f5` passed CI [37384286949](https://github.com/Photivra/photivra/actions/runs/37384286949). The prior Node 24 timeout was addressed by an explicit correctness-test budget rather than changing scientific assertions or resource limits.
|
|
63
|
+
- The test counts above are taken from the source PR records, not a new local test execution. The inspected CI job outcomes establish those jobs' success, not review approval or scientific qualification.
|
|
64
|
+
- Neither snapshot is the final version-bumped release candidate. These results must not be reported as final 1.5.0 release verification. This preparation branch must rerun the matrix after every stacked-base or release-document change.
|
|
65
|
+
|
|
66
|
+
## Remaining release checklist
|
|
67
|
+
|
|
68
|
+
- [x] Isolate the experimental implementation from the published package/root dependency graph; keep package/browser-surface checks green on the final candidate.
|
|
69
|
+
- [x] Keep #225 experimental source/work-budget behavior repository-only and outside the public 1.5.0 package/API; #224 retains scientific qualification ownership.
|
|
70
|
+
- [x] #223/#225/#226 inclusion, substantive human review and DCO are recorded complete on engine main before this candidate branch; release-candidate changes still require final owner review.
|
|
71
|
+
- [x] Reconcile included stacked PRs in dependency order on engine main; retain any branches still needed by open work.
|
|
72
|
+
- [x] Set `package.json`, both root version fields in `package-lock.json`, `src/core/version.ts` and `CITATION.cff` to 1.5.0. No citation release date is asserted before publication.
|
|
73
|
+
- [x] Add the 1.5.0 changelog/release-context entry while preserving historical release records and independently versioned POC/schema/model identities.
|
|
74
|
+
- [x] Regenerate API documentation/`docs/api/exports.json` on the combined candidate; no generated drift.
|
|
75
|
+
- [x] Run local checks/coverage/build/docs/packed consumers/package gate/image-formation benchmark on the combined candidate and inspect the actual npm tarball and emitted root/declaration import graph. Final remote CI and final-main CI remain separate gates.
|
|
76
|
+
- [x] Owner scientific/source review and contribution-specific DCO certification cover the included contributions; final integration diff preserves the approved scope.
|
|
77
|
+
- [ ] Require green final-candidate CI before the signed merge and verify final-main CI before separate publication authorization.
|
|
78
|
+
- [ ] Verify protected main/tag configuration and trusted publishing, confirm the next npm version is absent, then authorize the separate tag/publish step. Never move v1.4.0 or attempt to overwrite its package.
|
|
79
|
+
- [ ] After publication, independently verify the npm version, dist-tag, tarball integrity and provenance, and publish matching GitHub release notes. Downstream dependency adoption and application qualification remain separate.
|
|
80
|
+
|
|
81
|
+
## Candidate preparation and verification
|
|
82
|
+
|
|
83
|
+
After resolving the inclusion/review decisions, use a clean checkout of the approved candidate. The existing release contract remains authoritative for guarded owner publication; see [release procedure](RELEASE_1_0_1.md#owner-release-procedure). The commands below perform preparation and checks only, not a tag or publication:
|
|
84
|
+
|
|
85
|
+
```sh
|
|
86
|
+
npm version 1.5.0 --no-git-tag-version --ignore-scripts
|
|
87
|
+
# Align src/core/version.ts and CITATION.cff, finalize CHANGELOG.md and
|
|
88
|
+
# current release-context prose; do not rewrite historical evidence.
|
|
89
|
+
npm ci --ignore-scripts
|
|
90
|
+
node scripts/generate-api-reference.mjs
|
|
91
|
+
node --test .github/test-node-lts-policy.mjs
|
|
92
|
+
node .github/node-lts-policy.mjs
|
|
93
|
+
npm run check
|
|
94
|
+
npm run coverage
|
|
95
|
+
npm run build
|
|
96
|
+
npm run docs:check
|
|
97
|
+
npm run release:consumer-check
|
|
98
|
+
npm run pack:check
|
|
99
|
+
npm run bench:image-formation:built
|
|
100
|
+
npm pack --ignore-scripts --json
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Inspect the resulting tarball, its emitted declarations/imports and its recorded hashes. Keep temporary archives/build evidence untracked unless an existing evidence policy explicitly requires them. Review current [Node support](../NODE_SUPPORT.md); do not reuse a dated runtime snapshot as proof of future support. Any source, version, documentation, exclusion or generated-file change requires checks against that changed candidate.
|
|
104
|
+
|
|
105
|
+
**Stop before tagging or publishing until exact-candidate CI/package/tarball verification and owner authorization are complete.** No release tag, npm publication, GitHub release, application dependency change, automation or safety-cap change is performed by this preparation.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Ideal pupil rays for bounded capture
|
|
2
|
+
|
|
3
|
+
`calculateSensorApertureRays()` generates origin-aware rays for an explicitly declared ideal symmetric thin lens. Native sensor coordinates use +Y down; camera look directions use +Y up and +Z forward. Origins lie in the lens principal plane and use metres. Pupil sample points use millimetres.
|
|
4
|
+
|
|
5
|
+
For focal length f and nominal f-number N, the circular pupil radius is f/(2N). The shared focus contract determines image distance v. For finite object-plane distance D, every unrotated ray intersects (xD/v, -yD/v, D). At infinity the rays remain parallel. The existing constant-axis camera rotation rotates both origin and direction about the principal-plane origin at the actual local shutter time.
|
|
6
|
+
|
|
7
|
+
Uniform-area polar midpoints use r = R sqrt((i + 1/2)/Nr) and theta = 2 pi (j + 1/2)/Na. Each ray has normalized weight 1/(Nr Na). Counts are bounded to 1..32 radial and 4..64 angular samples, with at most 256 rays. These are integration samples, not a convergence guarantee.
|
|
8
|
+
|
|
9
|
+
## Capture integration
|
|
10
|
+
|
|
11
|
+
A caller may supply `pupil` and the separate `evaluateApertureRadiance(request, ray)` callback to `calculateEnvironmentSensorPhotoSignal()` or `simulateEnvironmentSensorRawFrame()`. The callback receives the actual pupil origin and look direction. It owns scene intersection, visibility and emitted/transported wavelength-resolved radiance; the engine owns focus, rotation, local shutter timing, sensor response and RAW production. The old single-argument environment callback remains compatible and unchanged when pupil sampling is omitted.
|
|
12
|
+
|
|
13
|
+
The engine averages physical irradiances over normalized pupil weights before sensor integration. The existing working-f-number radiometric factor is applied once. Pupil area is not multiplied again. A sampled local PSF and pupil integration are rejected together: neither an implicit second defocus nor an unreviewed optical composition is permitted. Every ray and the total provider budget are preflighted before provider execution. Full-frame site completeness, seeds and 4,096-site/100,000-query limits remain unchanged.
|
|
14
|
+
|
|
15
|
+
Diagnostics retain the original central `query`, plus `apertureRequest` and `apertureRay` for the actual evaluated ray. `pupilIntegrationApplied` and `pupilIntegrationProfile` report the declared integration. Provider transport and scene visibility remain unverified. The production composer rejects this standalone route until depth/visibility fidelity has an explicit composition contract; this API does not activate a production stage.
|
|
16
|
+
|
|
17
|
+
## Limits and evidence
|
|
18
|
+
|
|
19
|
+
This is an ideal paraxial approximation with unity pupil magnification. It does not model diffraction, aberrations, pupil clipping, lens housing, calibrated lens transmission, camera translation, scattering or physically measured sensor response. Existing separately declared field and spectral transmission remain separate. No megapixel RAW capability or physical device acceptance is established.
|
|
20
|
+
|
|
21
|
+
Tests independently intersect finite rays with the focus plane, check pupil moments, through-focus footprints, infinity parallelism, coordinate signs and camera rotation. Capture tests check uniform radiance against the unchanged no-pupil path, origin-dependent visibility averages, exact seeded replay, callback ownership and rejection before provider work. These synthetic controls do not qualify arbitrary scene providers.
|
|
22
|
+
|
|
23
|
+
Conceptual references: [PBRT projective camera models](https://www.pbr-book.org/4ed/Cameras_and_Film/Projective_Camera_Models) describes ideal lens sampling; [PBRT realistic cameras](https://www.pbr-book.org/3ed-2018/Camera_Models/Realistic_Cameras) distinguishes full lens geometry. Implementation and tests are original Photivra work using existing engine helpers; no reference code, data or prose is incorporated. AI-assisted work remains draft pending substantive human scientific/source review.
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# Explicit separable ideal emission — draft for issue #224
|
|
2
|
+
|
|
3
|
+
This repository-only prototype is AI-assisted draft material requiring substantive
|
|
4
|
+
human scientific/source review and contributor certification. Its implementation
|
|
5
|
+
lives under `src/api/`, the repository-only boundary that is built for contributor
|
|
6
|
+
checks but excluded from the npm package and unreachable from the public root API.
|
|
7
|
+
The published `src/capture` and `src/sensor` modules are unchanged by this draft.
|
|
8
|
+
It includes an experimental native task, not a qualified release or production plan.
|
|
9
|
+
No private scene geometry, assets or provider implementation are included.
|
|
10
|
+
|
|
11
|
+
`calculateSeparableEmissionPhotoSignal` composes the existing bounded single-site
|
|
12
|
+
optical/EQE executor with an explicit `uniform-spectrum-achromatic-ideal-emission`
|
|
13
|
+
contract. Outgoing spectral radiance is `G(origin, direction, time) × S(wavelength)`.
|
|
14
|
+
`G` is a finite nonnegative dimensionless multiplier supplied by caller-owned
|
|
15
|
+
ideal-emission geometry. `S` is an explicit, uniform, linear-interpolated spectrum
|
|
16
|
+
in W/m²/sr/nm. This declaration excludes wavelength-dependent visibility, surface
|
|
17
|
+
spectra and material transport. It does not establish that an external source
|
|
18
|
+
actually satisfies those assumptions. Source separability remains unverified.
|
|
19
|
+
|
|
20
|
+
The geometry callback receives no wavelength or spectral sample identity. All
|
|
21
|
+
scene/provider/illumination/material IDs, opening-reference time, outgoing
|
|
22
|
+
query direction, pupil origin and ray remain exact. The contract is owned before
|
|
23
|
+
callbacks. All original spatial, pupil, temporal and wavelength nodes, normalized
|
|
24
|
+
weights, optical throughput, spectral response and photon/EQE calculations execute
|
|
25
|
+
unchanged. Only identical geometry requests are reused across wavelengths. No
|
|
26
|
+
cross-site/event cache persists. This cache is bounded by the existing 100,000
|
|
27
|
+
single-site work cap, and checks cancellation before every spectral composition
|
|
28
|
+
and after each caller callback. A synchronous callback cannot be forcibly
|
|
29
|
+
interrupted; the host still owns its responsiveness.
|
|
30
|
+
|
|
31
|
+
The prototype records actual `geometryEvaluationCount` separately from
|
|
32
|
+
`spectralCompositionCount`. The existing photo output's `providerEvaluationCount`
|
|
33
|
+
continues to mean original logical wavelength/ray evaluations. It must never be
|
|
34
|
+
presented as the geometry callback count, or as evidence of calibrated transport.
|
|
35
|
+
|
|
36
|
+
## Experimental native task and proposed budgets
|
|
37
|
+
|
|
38
|
+
`createExperimentalNativeSeparableEmissionTask` is a repository-only additive
|
|
39
|
+
route. It shares the original native RAW scheduler, noise/ADC executor and photo
|
|
40
|
+
observer. The original public task still applies its two-billion provider-event
|
|
41
|
+
and 100,000 logical tile limits unchanged. The experimental route separately
|
|
42
|
+
requires caller-supplied `maximumGeometryEvaluations` (at most two billion) and
|
|
43
|
+
`maximumSpectralCompositions` (draft ceiling four billion). These names are not
|
|
44
|
+
interchangeable; the output omits the legacy provider count and records both
|
|
45
|
+
actual attempted geometry calls and executed spectral compositions. Failure or
|
|
46
|
+
cancellation exposes no partial RAW output. Conservative per-tile geometric
|
|
47
|
+
support and complete scalar spectral support are admission-checked before any
|
|
48
|
+
geometry callback. The 100,000 logical spectral/ray tile-work cap still applies.
|
|
49
|
+
All sites in a tile preflight binding and complete original wavelength coverage
|
|
50
|
+
before execution. The host yields at existing RAW tile boundaries; each site's
|
|
51
|
+
cache is released before the next site rather than retained for the event.
|
|
52
|
+
|
|
53
|
+
Full 2048 × 1366 Focus with four spatial nodes, two spectral nodes and 128 pupil
|
|
54
|
+
rays has 2,864,709,632 spectral compositions and at most 1,432,354,816 geometry
|
|
55
|
+
calls under this exact declaration. A 32-site tile has 32,768 logical spectral
|
|
56
|
+
compositions and at most 16,384 geometry calls. The draft four-billion scalar
|
|
57
|
+
ceiling is a finite separately named admission bound above that specific event;
|
|
58
|
+
it is **not** a measured performance/memory policy or scientific convergence
|
|
59
|
+
claim. Callers should declare the tighter exact projected budget, rather than
|
|
60
|
+
use the ceiling by default. It adds no nodes, hides no scalar optical/sensor work
|
|
61
|
+
and does not widen arbitrary-provider support. A source with wavelength-dependent
|
|
62
|
+
visibility or materials remains incompatible. The source owner must establish
|
|
63
|
+
this declaration; runtime typing cannot prove an external callback is truthful.
|
|
64
|
+
|
|
65
|
+
This draft proposes different work domains for a new source model, rather than
|
|
66
|
+
raising the existing legacy provider cap. Human review must decide whether this
|
|
67
|
+
source assumption and the new spectral budget are appropriate before root API
|
|
68
|
+
export, adoption or a full-native fixture qualification run. Current app source
|
|
69
|
+
and acquisition queues continue using their recorded legacy/candidate paths.
|
|
70
|
+
|
|
71
|
+
Tests compare original photon/electron results and every pupil ray at 32/64/128
|
|
72
|
+
support using a synthetic origin-dependent occlusion edge. They reject malformed
|
|
73
|
+
contract, identity, basis, insufficient spectral coverage, unsupported PSF,
|
|
74
|
+
missing pupil, invalid callback factors and cancellation. A wavelength-dependent
|
|
75
|
+
visibility negative control deliberately disagrees with this separable source;
|
|
76
|
+
it demonstrates why declaration is a scientific requirement rather than proof.
|
|
77
|
+
It cannot detect a dishonest or mistaken caller declaration automatically.
|
|
78
|
+
|
|
79
|
+
Package-boundary acceptance is explicit: `npm pack` must exclude `dist/api/`,
|
|
80
|
+
and the browser/root reachability check must not traverse this prototype. Promotion
|
|
81
|
+
out of `src/api/` would therefore be a separate reviewed public-contract change.
|
|
82
|
+
|
|
83
|
+
Still required: independently decoded full-native depth/visibility/refinement,
|
|
84
|
+
measured memory/time evidence, a deliberate public API/version decision if this
|
|
85
|
+
prototype is ever promoted, and substantive human source/scientific review. No
|
|
86
|
+
production admission flag, native fixture qualification or DCO is cleared here.
|
|
87
|
+
|
|
88
|
+
Native regression tests additionally compare seeded RAW and independently computed
|
|
89
|
+
legacy per-site photons/electrons for global and rolling shutters at 32/64/128
|
|
90
|
+
pupil support, test separate budgets, unchanged tile/legacy caps, attempted failing
|
|
91
|
+
work counts, immutable contract ownership and cancellation at a host yield.
|
|
92
|
+
No full native source/event results or physical-device memory evidence are claimed.
|
|
93
|
+
|
|
94
|
+
## Qualification checkpoint — 2026-10-06
|
|
95
|
+
|
|
96
|
+
[DENSE_PUPIL_QUALIFICATION.md](DENSE_PUPIL_QUALIFICATION.md) records independent
|
|
97
|
+
SI photon/electron checks and complete-small-event resource pilots. It supersedes
|
|
98
|
+
any inference that the proposed four-billion scalar ceiling alone resolves #224:
|
|
99
|
+
base native spectral work remains above two billion, simple pupil/time refinement
|
|
100
|
+
exceeds both prototype ceilings, and no complete native/depth/device event is
|
|
101
|
+
qualified. The recorded elapsed-time extrapolation is not native measurement.
|
|
102
|
+
The prototype remains repository-only; exact work reduction and full-native
|
|
103
|
+
scientific/resource evidence are still required before public promotion.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# camera/equivalent-focal-length.ts public contracts
|
|
2
2
|
|
|
3
|
-
Package **1.
|
|
3
|
+
Package **1.5.0**, root API **1.5.0**. [Navigation](../API_REFERENCE.md) · [Developer guide](../DEVELOPERS.md). Generated signatures retain independent schema/model versions. Only the exports listed here are root-package contracts; module-local helpers are not supported deep imports.
|
|
4
4
|
|
|
5
5
|
## calculateEquivalentFocalLength35Mm
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# camera/field-of-view.ts public contracts
|
|
2
2
|
|
|
3
|
-
Package **1.
|
|
3
|
+
Package **1.5.0**, root API **1.5.0**. [Navigation](../API_REFERENCE.md) · [Developer guide](../DEVELOPERS.md). Generated signatures retain independent schema/model versions. Only the exports listed here are root-package contracts; module-local helpers are not supported deep imports.
|
|
4
4
|
|
|
5
5
|
## calculateFieldOfView
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# camera/projected-object-size.ts public contracts
|
|
2
2
|
|
|
3
|
-
Package **1.
|
|
3
|
+
Package **1.5.0**, root API **1.5.0**. [Navigation](../API_REFERENCE.md) · [Developer guide](../DEVELOPERS.md). Generated signatures retain independent schema/model versions. Only the exports listed here are root-package contracts; module-local helpers are not supported deep imports.
|
|
4
4
|
|
|
5
5
|
## calculateProjectedObjectSize
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# capture/capture-export-metadata.ts public contracts
|
|
2
2
|
|
|
3
|
-
Package **1.
|
|
3
|
+
Package **1.5.0**, root API **1.5.0**. [Navigation](../API_REFERENCE.md) · [Developer guide](../DEVELOPERS.md). Generated signatures retain independent schema/model versions. Only the exports listed here are root-package contracts; module-local helpers are not supported deep imports.
|
|
4
4
|
|
|
5
5
|
## CAPTURE_EXPORT_METADATA_SCHEMA_VERSION
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# capture/environment-raw-producer.ts public contracts
|
|
2
2
|
|
|
3
|
-
Package **1.
|
|
3
|
+
Package **1.5.0**, root API **1.5.0**. [Navigation](../API_REFERENCE.md) · [Developer guide](../DEVELOPERS.md). Generated signatures retain independent schema/model versions. Only the exports listed here are root-package contracts; module-local helpers are not supported deep imports.
|
|
4
4
|
|
|
5
5
|
## EnvironmentSensorRawFrame
|
|
6
6
|
|
|
@@ -45,12 +45,13 @@ export interface SimulateEnvironmentSensorRawFrameInput {
|
|
|
45
45
|
/** Shared shutter schedule is bound to the committed frame duration. */
|
|
46
46
|
exposureWindow: NonNullable<SensorRawProducerInput["exposureWindow"]>;
|
|
47
47
|
sites: readonly {
|
|
48
|
-
environment: Omit<CalculateEnvironmentSensorPhotoSignalInput, "evaluateRadiance">;
|
|
48
|
+
environment: Omit<CalculateEnvironmentSensorPhotoSignalInput, "evaluateRadiance" | "evaluateApertureRadiance">;
|
|
49
49
|
darkCurrentProfile: SensorDarkCurrentProfile;
|
|
50
50
|
operatingTemperatureC: number;
|
|
51
51
|
charge: Omit<SensorRawProducerSiteInput["charge"], "photoSignal" | "darkCharge">;
|
|
52
52
|
readout: Omit<SensorRawProducerSiteInput, "charge">;
|
|
53
53
|
}[];
|
|
54
54
|
evaluateRadiance: EnvironmentRadianceEvaluator;
|
|
55
|
+
evaluateApertureRadiance?: EnvironmentApertureRadianceEvaluator;
|
|
55
56
|
}
|
|
56
57
|
```
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# capture/focus-control.ts public contracts
|
|
2
2
|
|
|
3
|
-
Package **1.
|
|
3
|
+
Package **1.5.0**, root API **1.5.0**. [Navigation](../API_REFERENCE.md) · [Developer guide](../DEVELOPERS.md). Generated signatures retain independent schema/model versions. Only the exports listed here are root-package contracts; module-local helpers are not supported deep imports.
|
|
4
4
|
|
|
5
5
|
## assessFocusReleaseGate
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# capture/linear-encoding.ts public contracts
|
|
2
2
|
|
|
3
|
-
Package **1.
|
|
3
|
+
Package **1.5.0**, root API **1.5.0**. [Navigation](../API_REFERENCE.md) · [Developer guide](../DEVELOPERS.md). Generated signatures retain independent schema/model versions. Only the exports listed here are root-package contracts; module-local helpers are not supported deep imports.
|
|
4
4
|
|
|
5
5
|
## calculateLinearCaptureEncoding
|
|
6
6
|
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# capture/native-environment-raw.ts public contracts
|
|
2
|
+
|
|
3
|
+
Package **1.5.0**, root API **1.5.0**. [Navigation](../API_REFERENCE.md) · [Developer guide](../DEVELOPERS.md). Generated signatures retain independent schema/model versions. Only the exports listed here are root-package contracts; module-local helpers are not supported deep imports.
|
|
4
|
+
|
|
5
|
+
## createNativeEnvironmentRawTask
|
|
6
|
+
|
|
7
|
+
Every tile is planned and admission-checked before its radiance callbacks; no partial output escapes.
|
|
8
|
+
|
|
9
|
+
```ts
|
|
10
|
+
export function createNativeEnvironmentRawTask(input:NativeEnvironmentRawInput,provider:NativeEnvironmentRawProvider):NativeEnvironmentRawTask;
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
This call is synchronous; any supplied provider must follow its explicit synchronous contract.
|
|
14
|
+
|
|
15
|
+
## NativeEnvironmentPhotoTile
|
|
16
|
+
|
|
17
|
+
The exact contract is declared below; use the domain guide for assumptions and staged integration.
|
|
18
|
+
|
|
19
|
+
```ts
|
|
20
|
+
export interface NativeEnvironmentPhotoTile extends NativeRawTileRequest {
|
|
21
|
+
sites:readonly {nativeIndex:number;expectedIncidentPhotonCount:number;expectedGeneratedElectronCount:number}[];
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## NativeEnvironmentRawInput
|
|
26
|
+
|
|
27
|
+
The exact contract is declared below; use the domain guide for assumptions and staged integration.
|
|
28
|
+
|
|
29
|
+
```ts
|
|
30
|
+
export interface NativeEnvironmentRawInput {
|
|
31
|
+
raw: NativeRawInput;
|
|
32
|
+
sceneBinding: SimulateEnvironmentSensorRawFrameInput["sceneBinding"];
|
|
33
|
+
/** Full-event admission budget; maximum 2 billion calls. No convergence is inferred. */
|
|
34
|
+
maximumProviderEvaluations: number;
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## NativeEnvironmentRawOutput
|
|
39
|
+
|
|
40
|
+
The exact contract is declared below; use the domain guide for assumptions and staged integration.
|
|
41
|
+
|
|
42
|
+
```ts
|
|
43
|
+
export interface NativeEnvironmentRawOutput {
|
|
44
|
+
raw: NativeRawOutput;
|
|
45
|
+
sceneBinding: NativeEnvironmentRawInput["sceneBinding"];
|
|
46
|
+
providerEvaluationCount: number;
|
|
47
|
+
upstreamOrigin: "executed-environment-query-provider-optics-psf-eqe";
|
|
48
|
+
providerTransportVerified: false;
|
|
49
|
+
productionPlanActivated: false;
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## NativeEnvironmentRawProvider
|
|
54
|
+
|
|
55
|
+
The exact contract is declared below; use the domain guide for assumptions and staged integration.
|
|
56
|
+
|
|
57
|
+
```ts
|
|
58
|
+
export interface NativeEnvironmentRawProvider {
|
|
59
|
+
/** Supplies physical site profiles, not photo counts or precomputed RAW codes. */
|
|
60
|
+
readTile(request: Readonly<NativeRawTileRequest>,signal:AbortSignal):Promise<NativeEnvironmentRawTile>;
|
|
61
|
+
evaluateRadiance: SimulateEnvironmentSensorRawFrameInput["evaluateRadiance"];
|
|
62
|
+
evaluateApertureRadiance?: SimulateEnvironmentSensorRawFrameInput["evaluateApertureRadiance"];
|
|
63
|
+
/** Optional bounded diagnostic observer; counts are expectation values before any noise/clamp/ADC. */
|
|
64
|
+
observePhotoTile?(tile:Readonly<NativeEnvironmentPhotoTile>,signal:AbortSignal):void|Promise<void>;
|
|
65
|
+
yieldControl(signal:AbortSignal):Promise<void>;
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## NativeEnvironmentRawTask
|
|
70
|
+
|
|
71
|
+
The exact contract is declared below; use the domain guide for assumptions and staged integration.
|
|
72
|
+
|
|
73
|
+
```ts
|
|
74
|
+
export interface NativeEnvironmentRawTask extends Omit<NativeRawTask,"takeOutput"> {
|
|
75
|
+
readonly providerEvaluationCount: number;
|
|
76
|
+
takeOutput(): NativeEnvironmentRawOutput;
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## NativeEnvironmentRawTile
|
|
81
|
+
|
|
82
|
+
The exact contract is declared below; use the domain guide for assumptions and staged integration.
|
|
83
|
+
|
|
84
|
+
```ts
|
|
85
|
+
export interface NativeEnvironmentRawTile extends NativeRawTileRequest {
|
|
86
|
+
sites: SimulateEnvironmentSensorRawFrameInput["sites"];
|
|
87
|
+
}
|
|
88
|
+
```
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# capture/native-raw-development.ts public contracts
|
|
2
|
+
|
|
3
|
+
Package **1.5.0**, root API **1.5.0**. [Navigation](../API_REFERENCE.md) · [Developer guide](../DEVELOPERS.md). Generated signatures retain independent schema/model versions. Only the exports listed here are root-package contracts; module-local helpers are not supported deep imports.
|
|
4
|
+
|
|
5
|
+
## createNativeRawDevelopmentTask
|
|
6
|
+
|
|
7
|
+
Validates complete phase/halo support, snapshots RAW once, and yields between 256-pixel output tiles.
|
|
8
|
+
Retains explicit acquisition tile width when reconstructing the exact packed plan. Omitted width
|
|
9
|
+
preserves legacy plan shape; inconsistent tile counts or unsupported widths fail validation.
|
|
10
|
+
Acquisition chunk width changes neither CFA/seed coordinates nor development pixels, and does
|
|
11
|
+
not establish transport or device-resource qualification.
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
export function createNativeRawDevelopmentTask(input: NativeRawDevelopmentInput,
|
|
15
|
+
yieldControl: (signal:AbortSignal)=>Promise<void>): NativeRawDevelopmentTask;
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
This call is synchronous; any supplied provider must follow its explicit synchronous contract.
|
|
19
|
+
|
|
20
|
+
## NativeRawDevelopmentInput
|
|
21
|
+
|
|
22
|
+
The exact contract is declared below; use the domain guide for assumptions and staged integration.
|
|
23
|
+
|
|
24
|
+
```ts
|
|
25
|
+
export interface NativeRawDevelopmentInput {
|
|
26
|
+
raw: NativeRawOutput;
|
|
27
|
+
phaseProfiles: readonly RawFrameReconstructionPhaseProfile[];
|
|
28
|
+
colorProfile: ExportSensorColorProfile;
|
|
29
|
+
whiteBalance: "not-required" | "apply-resolved-sensor-gains";
|
|
30
|
+
rendering: SdrRenderingProfile;
|
|
31
|
+
/** Includes one owned packed RAW copy plus integer output; not caller buffers, process heap or GPU. */
|
|
32
|
+
maximumRetainedPayloadBytes: number;
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## NativeRawDevelopmentOutput
|
|
37
|
+
|
|
38
|
+
The exact contract is declared below; use the domain guide for assumptions and staged integration.
|
|
39
|
+
|
|
40
|
+
```ts
|
|
41
|
+
export interface NativeRawDevelopmentOutput {
|
|
42
|
+
raw: NativeRawOutput;
|
|
43
|
+
phaseProfiles: readonly RawFrameReconstructionPhaseProfile[];
|
|
44
|
+
colorProfile: ExportSensorColorProfile;
|
|
45
|
+
whiteBalance: NativeRawDevelopmentInput["whiteBalance"];
|
|
46
|
+
width: number;
|
|
47
|
+
height: number;
|
|
48
|
+
integerSamples: Uint8Array | Uint16Array;
|
|
49
|
+
diagnostics: SdrRenderingResult["diagnostics"];
|
|
50
|
+
outputEncoding: SdrRenderingResult["outputEncoding"];
|
|
51
|
+
rendering: SdrRenderingProfile;
|
|
52
|
+
displayAdaptation: SdrRenderingResult["displayAdaptation"];
|
|
53
|
+
imageDataPairing: "derived-from-exact-packed-native-raw";
|
|
54
|
+
producerOriginVerified: false;
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## NativeRawDevelopmentTask
|
|
59
|
+
|
|
60
|
+
The exact contract is declared below; use the domain guide for assumptions and staged integration.
|
|
61
|
+
|
|
62
|
+
```ts
|
|
63
|
+
export interface NativeRawDevelopmentTask {
|
|
64
|
+
readonly state: NativeRawTaskState;
|
|
65
|
+
run(): Promise<void>;
|
|
66
|
+
cancel(): void;
|
|
67
|
+
dispose(): void;
|
|
68
|
+
takeOutput(): NativeRawDevelopmentOutput;
|
|
69
|
+
}
|
|
70
|
+
```
|