brand-kit-as-code

One config in.
Seventeen artifacts out.

Byte-identical every run, because the logo geometry is computed — never drawn, never generated by a model. A brand that diffs like any other build output.

4 real projects ingested 3 regenerate clean 1 refused
$ assay gen   --config brand.config.json --out brand/
$ assay proof --config brand.config.json --out proof.png
$ assay diff  --config brand.config.json --against brand/
                 # exit 1 on any drift
kit console live artifacts
input — brand.config.json
output

Every mark, favicon and ratio above is read from a committed artifact or computed by validateConfig() at build time. npm test re-generates all three working kits and fails on a single changed byte.

the interesting result

A generator that says no is worth more than one that always says yes.

1.85:1

measured contrast, shipgauge's real accent on its real ink

3:1

the minimum assay requires for non-text UI (WCAG SC 1.4.11)

0

artifacts written — the run exits 1 before anything is emitted

every run

a test asserts the refusal still happens, with the same sentence

Why this is the finding and not a bug

shipgauge is a real sibling project with a real dark palette, ingested from its live stylesheet rather than invented for a demo. Routing around the gate would have made assay a tool that ships inaccessible brands quietly. Refusing makes it a tool with a contract.

Read the full account, including the exact line of shipgauge's stylesheet each colour was taken from.

geometry families

Four pure functions. No image model anywhere in the pipeline.

stroke-grid-monogram

Strokes woven on an N×N point grid, mirrored for balance.

stroke-grid-monogram rendered in the warm paper sample palette warm paper
stroke-grid-monogram rendered in the cool slate sample palette cool slate
stroke-grid-monogram rendered in the mono contrast sample palette mono contrast

orbital-mark

A core with one to three partial-arc orbit rings, each ending in a node.

orbital-mark rendered in the warm paper sample palette warm paper
orbital-mark rendered in the cool slate sample palette cool slate
orbital-mark rendered in the mono contrast sample palette mono contrast

cut-square

A square with chamfered corners and an optional inner accent notch.

cut-square rendered in the warm paper sample palette warm paper
cut-square rendered in the cool slate sample palette cool slate
cut-square rendered in the mono contrast sample palette mono contrast

lattice-crucible

Every coordinate on a 4-unit lattice, every shape filled rather than stroked — so it rasterises to whole pixels at 16px instead of dissolving.

lattice-crucible drawn for assay, on paper on paper
lattice-crucible drawn for assay, reversed for a dark surface reverse
assay's 16-pixel favicon magnified six times, one square per rendered pixel 16px raster, 6×
measured, not claimed

What a run actually produces.

17

files per kit — four SVGs, eight PNGs, an ICO, tokens in CSS and JSON, the bundled font, BRAND.md. The console lists them by name.

159

tests across 16 files, including exact path-string assertions on every geometry family

4

geometry families, each a pure function of its params and a seed

0

image-model calls in the pipeline — geometry is computed, so it can be diffed

What assay deliberately does not claim

It does not judge whether a mark is good, and it will happily generate a forgettable one from a forgettable config. It checks contrast, determinism and 16px legibility — three things a machine can actually decide.

The full list is on the limitations page.