Darkroom-session umbrella — capture-and-verify checklist
One place to look when you sit down with darktable's GUI open. Each item below is a discrete capture or verification task that needs a real raw photograph, the GUI module configured a specific way, and the resulting .dtstyle (or rendered output) byte-compared / visually inspected against what chemigram emits.
Estimated total session: ~3-4 hours if running all open items end-to-end. Items can run independently, in any order. Stop after any item — partial-session progress is a partial close on this umbrella.
Setup (~5 min)
Sub-task A — Tone curve baselines (#94) — ~45 min
Why: the tonecurve mv5 decoder is blocked on empirical baselines. The struct has 60 spline-node slots (480 bytes of curves), per-channel active-node counts, interpolation-type enums, autoscale enum, preset enum — every one needs a verified value.
What to capture: four reference dtstyles, one per curve:
Where the exports go: drop into vocabulary/packs/expressive-baseline/layers/L3/tonecurve/ (create the dir; mkdir if it doesn't exist).
Verification before closing #94:
Sub-task B — Lens lensfun baseline diff (#95 verification) — ~20 min
Status: implementation shipped in commit 0d2e97d (RFC-039 #136). EXIF auto-binding populates camera[128] / lens[128] / focal at apply time. The verification step that remains:
Sub-task C — Denoise wavelet-curve baseline verification (#96) — ~15 min
Why: the denoise decoder ships x[6][7] and y[6][7] curve bytes constructed from source defaults (x = j/6 evenly-spaced, y = 0.5). The parameterized strength axes work regardless, but the curve bytes might disagree with what darktable's GUI emits — risking sub-mode mismatches.
Sub-task D — Colorzones HSL precision presets (#98) — ~1 hour
Why: RFC-023 / colorequal covers 95% of HSL work; the 5% case needs explicit per-zone spline curves (sharp blue desat at exact hue, orange-skin protection curve, etc.). These ship as discrete entries only — no decoder, no parameterization.
Capture 4-8 reference curves from darktable's colorzones GUI:
Where the exports go: vocabulary/packs/expressive-baseline/layers/L3/colorzones/ (create dir).
Verification before closing #98:
After the session
For each sub-task touched:
References
Darkroom-session umbrella — capture-and-verify checklist
One place to look when you sit down with darktable's GUI open. Each item below is a discrete capture or verification task that needs a real raw photograph, the GUI module configured a specific way, and the resulting
.dtstyle(or rendered output) byte-compared / visually inspected against what chemigram emits.Estimated total session: ~3-4 hours if running all open items end-to-end. Items can run independently, in any order. Stop after any item — partial-session progress is a partial close on this umbrella.
Setup (~5 min)
mainso you have all the parameterize decoders + camera-aware apply paths (RFC-039 / commits29995b8/e30a931/0d2e97d)git lfs pulltests/fixtures/raws/landscape.ARW,tests/fixtures/raws/portrait.ARW) are CC BY-SA and known-good; or use your own. Item D (colorzones) needs a raw with vivid color content — landscape with sky + foliage works best.xxd/hex/python3 -c '...'to byte-compare exports.Sub-task A — Tone curve baselines (#94) — ~45 min
Why: the tonecurve mv5 decoder is blocked on empirical baselines. The struct has 60 spline-node slots (480 bytes of curves), per-channel active-node counts, interpolation-type enums, autoscale enum, preset enum — every one needs a verified value.
What to capture: four reference dtstyles, one per curve:
tone_identity— apply the tonecurve module in default state (no edits). Export as.dtstyle. This gives the "identity curve" baseline — what darktable encodes for a no-op pass-through.curve_filmic_subtle— apply a gentle S-curve via the GUI (drag the curve so blacks lift slightly, whites compress slightly). Export.curve_filmic_strong— same shape but more aggressive. Export.curve_lifted_shadows— drag the shadow region up significantly, leave highlights at default. Export.Where the exports go: drop into
vocabulary/packs/expressive-baseline/layers/L3/tonecurve/(create the dir; mkdir if it doesn't exist).Verification before closing #94:
tone_identity.dtstyleagainstchemigram.core.parameterize.tonecurve's expected identity output (decoder needs to be implemented; the byte capture comes first)uv run pytest tests/unit/core/parameterize/test_tonecurve.py— at minimum, every captured blob should decode + re-encode round-tripSub-task B — Lens lensfun baseline diff (#95 verification) — ~20 min
Status: implementation shipped in commit
0d2e97d(RFC-039 #136). EXIF auto-binding populatescamera[128]/lens[128]/focalat apply time. The verification step that remains:.dtstyle. Inspect the camera/lens char arrays:python3 -c "import struct; d=open('exported.dtstyle').read(); ..."lens_correctionentry withraw_pathsupplied — confirm the visible lens correction matches darktable's GUI render.Sub-task C — Denoise wavelet-curve baseline verification (#96) — ~15 min
Why: the denoise decoder ships
x[6][7]andy[6][7]curve bytes constructed from source defaults (x = j/6evenly-spaced,y = 0.5). The parameterized strength axes work regardless, but the curve bytes might disagree with what darktable's GUI emits — risking sub-mode mismatches..dtstyle. Byte-diff bytes 60..395 (84 floats = 336 bytes of curve data) against the shipped baseline atvocabulary/packs/expressive-baseline/layers/L3/denoiseprofile/denoise.dtstyle.237b451) and confirm the visual character matches darktable's GUI default-denoise output.Sub-task D — Colorzones HSL precision presets (#98) — ~1 hour
Why: RFC-023 / colorequal covers 95% of HSL work; the 5% case needs explicit per-zone spline curves (sharp blue desat at exact hue, orange-skin protection curve, etc.). These ship as discrete entries only — no decoder, no parameterization.
Capture 4-8 reference curves from darktable's colorzones GUI:
hsl_blue_sky_steep— a sharp blue-desaturation curve targeting deep sky (around 215° hue). Drag the saturation curve down hard at blue, leave other hues alone.hsl_orange_skin_protect— preserves orange at the central skin-tone hue (~30°), attenuates at the edges. Curve shape: peak at center, falloff at boundaries.hsl_green_foliage_warm_curve— curve-based green→yellow shift (warm foliage). Hue curve pulled toward yellow in the green band.hsl_red_pop(red saturation lift),hsl_cyan_tame(reduces cyan in pale skies),hsl_purple_separate(lavender/purple hue separation).Where the exports go:
vocabulary/packs/expressive-baseline/layers/L3/colorzones/(create dir).Verification before closing #98:
parametersblock — these are discrete; modversion 5 per ADR-082 drift coverage)After the session
For each sub-task touched:
.dtstylefiles into the repodenoiseprofile.py,lens.py, futuretonecurve.py)uv run pytest tests/unit/ tests/integration/uv run python scripts/generate-visual-proofs.py --markdown-only(regenerate gallery to reflect changes)vocab(#94): tonecurve baseline captures + decoderso the umbrella close traces back cleanlygit pushthen check CI per AGENTS.md post-push ruleReferences
0d2e97d; only verification (sub-task B above) remainse2f6ce4, verification is here)