Color antialiased half-edges by ray outcome with configurable Catppuccin colors and default opacity 0.5.
Rasterize premultiplied RGBA8 overlays on the producer and composite in place after writing the clean image. Keep single-frame, movie, and replay output consistent.
Add overlay, CLI, and queue ownership regressions and document the final output architecture.
Add error-controlled DP5(4) integration and trusted first-crossing localization, including non-monotonic energy thresholds and representable-time stepping.
Preserve adaptive state and independent step/time retry grants across RayPool, refinement and movie scheduling. Expose numerical controls, record actual persistent-sample costs, and add v3 lens-map provenance with legacy v2 RK4 import.
Use DP54 by default and select an 8M Schwarzschild maximum step from bounded scans and a two-run 4K comparison. Retain the conservative minimum-step guard and document critical-ray and backend capability limits. Archive self-contained benchmark inputs and raw output; keep fixed RK4 HDR references explicit.
Validation: make -B -j4 BUILD_TYPE=Debug test passed; explicit RK4 HDR references have zero differences. Bounded convergence checks, benchmark reproduction, Release build and focused reviews passed. No numerical-relativity backend is added.
Replace the position capture cutoff with a camera-relative dark threshold
shared by every backend, and carry explicit outcome/reason provenance
through the ray, RayPool, adaptive mesh, lens-map and replay paths.
- eval/eval_slab return SpacetimePointStatus; remove SPACETIME_RAY_CAPTURED
and the Schwarzschild capture radius; decouple observer construction from
ray position.
- RayEndpoint stores RayOutcome/RayReason plus the last trusted state;
budget exhaustion is retryable UNRESOLVED, data/integration failures are
INCOMPLETE.
- Normal dark terminal is L - L0 >= --dark-threshold (default 8), with L0
taken at the camera event and kept distinct from the worldtube entry
energy; photon energy and frequency ratio are never reset.
- Implement E/D/U triangle decisions with merged budget retries, persistent
probe witnesses promoted in place by vertex identity, conformity settling,
and approximate-black boundary provenance with achieved-scale statistics.
- Add RayPool continuation state and per-ray step budgets.
- Bump lens-map to v2 with explicit end/outcome/reason, approx_black,
threshold/retry/geometry provenance and per-frame retry counts; reject v1.
- Gate production output on incomplete/error results, overridable with
--allow-incomplete.
- Update AGENTS.md, the design document and usage docs; add the termination
oracle and regression coverage.
make -B -j4 BUILD_TYPE=Debug test passes with bit-identical reference HDRs.
- Gather the union of every movie frame's all-sky tiles once and read them in bounded batches, replacing the per-frame prefetch scan and log.
- Fuse the fast supersampled-buffer clear into the FFTW pack pass so a resolved frame starts clean with no serial memset.
- Split parallel HDR->RGB8 tone mapping from PNG encoding.
- Add a bounded single-producer/single-writer movie output queue used by both observer movies and multi-frame imported lens maps, with writer timing and error propagation.
- Add --png-compression-level and --movie-output-workers shared|reserve-one.
- Add --fast-fftw-plan estimate|measure|wisdom|wisdom-update with strict wisdom identity sidecars.
- Add staged movie timing, regression tests, and docs.
Add an optional CPU preview path that deposits each point-source image as a
supersampled delta and resolves the whole frame with one global Moffat
convolution plus an N x N box average, instead of splatting a per-event PSF.
- optics: FastPsfAccumulator builds the pixel-area-integral kernel of the
target Moffat at the supersampled scale (width N*alpha, same beta). The
1/N^2 box average then reproduces the final pixel-area integral, so the
requested FWHM and beta are preserved without renormalisation. Deposits are
per-cell atomic adds; resolve accumulates into the caller's HDR buffer.
- frame: fast branch in frame_splat_catalog with one shared supersampled
buffer and a single resolve per frame; the accumulator is reused across
movie frames and built from the map dimensions on lens-map import.
- main: --fast-mode, --fast-supersample N (1..8, default 2) and
--fast-deposit nearest|bilinear (default nearest). CPU-only and rejected in
the HIP/dummy backends; --psf-min-y still applies per event while
--max-cache-psf-flux does not.
- The deposition scheme was chosen by scripts/fast_mode_deposit_error.py:
nearest keeps the PSF shape exactly with <= 0.5/N px position quantization;
bilinear keeps the exact centroid but broadens FWHM and beta. Recorded in
benchmarks/fast_mode_deposit_2026-09-18.md.
- tests/test_frame.c covers fast nearest vs the direct evaluator at the snapped
centre, flux conservation, bilinear centroid, min-Y discard, frame plumbing,
and HDR accumulation onto a non-zero background.
- benchmarks/fast_mode_cpu_2026-09-18.md records a ~10x speedup on the 2MASS
galactic-centre field with small tone-mapped differences.
Replace the in-tree Wyman analytic CIE fit with a repository CIE 1931
2-degree LUT derived from the 360-830 nm, 1 nm-linear CSV reference. The
GRBBLUT3 table stores 1024 uniform log(T) XYZ nodes over
[670.146556, 101408.88] K with four-point cubic Lagrange interpolation, and
the same CSV reference supplies a three-term Rayleigh-Jeans form above the
table and an inverse-temperature/log-XYZ crossover with channel-specific
endpoint forms below it. The loader validates the header and payload
checksum and rejects legacy formats and runtime generation.
Initialize the backend in the renderer, frame test, and PSF capture tool so
the new default is active wherever colors are produced.
Check spherical area weight sums against a fixed 1e-8 tolerance and normalize accepted weights before interpolation. Skip invalid images in both catalog paths.
Add a thin-triangle regression for both parities, document the measured tolerance margin, and refresh HDR fixtures with strict comparisons restored.