Open the source inventory
Every candidate starts with a named family, access path, and acquisition policy. Nothing enters from an unknown origin.
An interpreter reads the request into a measured AttributeSpec; a generator turns that spec plus the image into a 64-token LUT. Follow the corpus from source registration to verified shards, then watch one frozen row move through deterministic evaluation and a ship decision.
A 3D LUT remaps every color in an image. Drag to compare. Illustrative grade.
Watch 7,760 real color transforms move through provenance, deduplication, canonicalization, quality gates, leakage-safe splits, AttributeSpec + captioning, selection, and verified delivery.
Scroll from source inventory to verified shards. Every count matches the current corpus manifests.
Every candidate starts with a named family, access path, and acquisition policy. Nothing enters from an unknown origin.
Raw material enters wide and messy. Each stage removes what a single global LUT cannot faithfully represent, then certifies what remains. Nothing is kept on trust alone.
Bars are proportional to the 7,760 candidates that entered. Gate survivors span the gold and diagnostic tiers; the active set is the curated, deduplicated selection.
Every candidate comes from a declared source with recorded provenance. Seven sources feed the corpus, from curated expert photo sets to a broad web discovery sweep, plus a controlled procedural generator for coverage gaps.
Content-hash matching drops exact duplicates before anything reaches the gates.
Whole families are excluded up front, because no single global LUT can reproduce them.
Curated expert corpora (PPR10K, MIT-Adobe FiveK) anchor the set. Community and film-simulation sources add breadth. The expert share is later capped so no single family dominates.
Sources arrive in different formats, grid sizes, and color spaces. Before any comparison is meaningful, everything is resampled to a single representation so that a difference in the data means a difference in the color, not the container.
Some sources are not LUTs at all. Expert photo pairs are turned into a LUT by fitting a global transform to the source-and-target images, then validating the fit against held-out pixels. Only fits that hold up are kept.
Two gate layers run on the canonical LUT. Representability asks whether a global transform can faithfully reproduce the look. Safety and quality ask whether the result is well behaved: no clipping, no folding, no skin-tone damage. The verdict is a tier.
ΔE00 (CIEDE2000) is a perceptual color-difference metric. Lower means closer to the intended look. A dedicated skin-locus gate protects skin tones, which the eye judges harshly.
Survivors are grouped into split units by how similar their color transforms are, so near-identical LUTs cannot land on both sides of the train and evaluation boundary. Without this, scores look better than the model really is.
Grouping runs on the color-transform geometry itself, using near-neighbor analysis of the LUT tensor. The split is frozen under a fixed seed and a recorded policy version, so the exact same rows recur on every run. The identifier split_43e6cd41 pins it.
Each kept LUT is probed into a behavior_v2 measurement, then serialized into one AttributeSpec. Captioning writes many phrasings — literal, metaphor, mood, concept, slang — that all map back to that single spec, so language is diverse but never ungrounded. At run time an interpreter turns free text into the same AttributeSpec plus a route; the generator is conditioned on the serialized spec, not the raw words. The measurement, not the caption, is the authority for every color claim.
Pick a request. A single global LUT can shift color everywhere at once, but it cannot target a region, change content, or relight a scene — and a few global looks fall outside what the frozen tokenizer can represent.
The corpus carries 272 refuse, clarify, and mixed prompts. Refusals split into out_of_scope (11 categories a global LUT cannot do) and out_of_gamut (3 global looks the tokenizer cannot represent); mixed prompts pair a valid global change with an impossible one, and the whole request is still declined.
A selector assembles the final training rows with quotas on source, style, and scene, so the set is diverse rather than merely large. The result is scored against twelve acceptance criteria before it can be frozen.
Largest single family is 32% of the full 3,033-row active set, under the 50% dominance cap. Expert sources combined (PPR10K + FiveK) sit at 49%, under their own 50% cap. Both fractions are measured over the whole active set.
All twelve criteria pass on the post-audit, materialized active set — acceptance.overall = pass in the corpus active_manifest.json on the private dataset root, with every one of the 2,761 supported rows carrying a representability tier, 64 materialized tokens, and a paired input image. Acceptance is evaluated at freeze; the active-set version is still active_set_pending_freeze.
A vector-quantized encoder is frozen and shared across the set. It reconstructs the held-out LUTs at a mean ΔE00 of 1.31 and mean PSNR near 37 dB, so the compact target loses almost nothing the eye can see.
The finished corpus is packed into verifiable shards and published to a durable, private dataset root, then pulled down and checked byte for byte wherever training runs.
Raw LUTs, canonical residuals, registries, splits, and the frozen tokenizer are bundled into structure-preserving tar shards, each with a manifest listing member counts, bytes, and hashes.
Shards sync to a private Hugging Face dataset root as the durable source of truth. Packing is idempotent by content, so re-runs never duplicate work.
On the training machine, every shard is pulled, checked against its sha256, and extracted with resume markers. A corrupted or partial shard cannot slip into a run.
The two-stage design and the methodology are fixed, the corpus is assembled, and every supported row now carries a behavior_v2 AttributeSpec. The generator is still migrating from the free-text checkpoint onto the spec, so the honest state is below.
The same row, contract, and thresholds follow every checkpoint. Scroll to scrub the run, select a stage, or replay it end to end. Values shown in the run are illustrative; the contracts and artifacts match the implementation.
Scroll to scrub the full run. Values are illustrative; the flow and artifacts match the implementation.
A run starts from frozen rows, a pinned checkpoint, two decode modes, and recorded seeds. No threshold moves after seeing an output.
The terms used throughout, defined the way they are used in this project.