THE REVIEWABLE VARIATION
What this lab is for
It gives a review conversation a stable starting point. A team can call out a particular form, preserve the seed and generator revision it used, then decide whether the actual exported asset meets its own requirements.
Choose
Pick a form, palette, and seed—then see a concrete variation.
Identify
The structural identifier is stable for a form and seed, independent of its palette.
Review
Carry the selected inputs into a project’s own review and export checks.
PUBLIC TYPESCRIPT SPECIMEN
A review key is not a generator.
This intentionally small TypeScript example records the inputs around a generated candidate. It does not create geometry, call a model, or represent GenATK product code. Its point is to make a review reference stable when settings arrive in a different order.
Inspect the standalone example
/**
* A deliberately small public example for recording a generated variation.
* It is independent of GenATK product code and does not generate geometry.
*/
export interface PublicReviewStateInput {
assetId: string;
generatorRevision: string;
seed: number;
settings: Record<string, string | number | boolean>;
exportTarget: string;
}
export interface PublicReviewState {
assetId: string;
generatorRevision: string;
seed: number;
settings: Record<string, string | number | boolean>;
exportTarget: string;
reviewKey: string;
}
function normalizeSeed(seed: number) {
return Number.isFinite(seed) ? (Math.trunc(seed) >>> 0) : 0;
}
function stableSettings(settings: PublicReviewStateInput['settings']) {
return Object.fromEntries(Object.entries(settings).sort(([left], [right]) => left.localeCompare(right)));
}
function smallHash(value: string) {
let state = 2166136261;
for (const character of value) {
state ^= character.charCodeAt(0);
state = Math.imul(state, 16777619);
}
return (state >>> 0).toString(36).padStart(7, '0');
}
export function createPublicReviewState(input: PublicReviewStateInput): PublicReviewState {
const seed = normalizeSeed(input.seed);
const settings = stableSettings(input.settings);
const identity = JSON.stringify({
assetId: input.assetId.trim(),
generatorRevision: input.generatorRevision.trim(),
seed,
settings,
exportTarget: input.exportTarget.trim(),
});
return {
assetId: input.assetId.trim(),
generatorRevision: input.generatorRevision.trim(),
seed,
settings,
exportTarget: input.exportTarget.trim(),
reviewKey: `review-${smallHash(identity)}`,
};
}
It is intentionally not a product demo
The geometry, materials, seeded generator, and IDs here were written solely for this page. They do not measure rendering quality, asset compatibility, file size, runtime performance, or unreleased GenATK capabilities.
For the tool-agnostic next step, use the asset review record. For the underlying idea, read why reproducible procedural assets are easier to review.
Early access
Follow the build, not the hype.
Occasional notes on experiments, public labs, and the eventual toolkit. No launch-date promise and no spam.