# LAY-1 — Layout uses the product's declared column grid and gutter scale; ad-hoc column counts and off-scale gutters are findings — N/A where no grid is declared

L2 · hybrid · Layout

**Fails when:** a declared grid exists and the layout uses an ad-hoc column count not drawn from it · a declared grid exists and gutters/margins don't match the spacing scale (TOK-2) with no deliberate reason

## Requirement

Where a product **declares a grid**, its layout uses that declared column count and gutter
scale — ad-hoc column counts and off-scale gutters are findings. Where a product declares
**no** grid, this control grades **N/A**, not fail: it never penalises a product for
lacking a declaration it was never asked to write (the same honest v0 pattern as CMP-1's
"asserted, no manifest").

## The declaration

The grid lives in the product repo's `.dx/design.json` under a `layout_system` key
(generated from the human-owned `DESIGN.md`; spec at `docs/DESIGN-CONTEXT.md`):

```json
{
  "layout_system": {
    "columns": 12,
    "gutter": "space-4",
    "margins": "space-6",
    "breakpoints": [360, 768, 1280],
    "maxContentWidth": "1280px"
  }
}
```

- `columns` — integer column count for the product's primary grid.
- `gutter` / `margins` — a TOK-2 spacing-scale **token name**, not a raw value.
- `breakpoints` — widths the grid restructures at; defaults to the portfolio-wide
  `[360, 768, 1280]`, but a product may declare its own.
- `maxContentWidth` — the grid's outer cap; distinct from LAY-4's prose measure (~66ch).

## Rationale

A declared grid turns "does this feel aligned?" into a checkable claim, and lets alignment
(LAY-6) tighten back to referencing the grid once one exists. Until a product declares one,
alignment is judged against the surface's own visible structure. The control stays
honest-but-inert without a declaration, like CMP-1 without a component manifest.

## How to verify

**No script — this control accepts its gap.** No product has yet declared a
`.dx/design.json` `layout_system`, so a column-count check would grade N/A everywhere it
ran, and a scan that guessed at column counts would flag legitimate subdivisions as
violations. Where a declaration does exist, verify by hand that gutter and margin values
resolve to the TOK-2 scale and that the column count matches the declared value.

**Judgment half:** the evaluator confirms the resulting column structure reads as coherent
(a page can use on-scale gutters in an incoherent arrangement).

Say **"N/A — no declared grid"** rather than "pass" when no declaration exists; do not
infer a grid from a page's incidental spacing.

## Passes when

- A declared grid exists and the layout follows its column count and on-scale gutters.
- No grid is declared (grades N/A — not a finding).

## Fails when

- A declared grid exists and the layout uses an ad-hoc column count not drawn from it.
- A declared grid exists and gutters/margins don't match the spacing scale (TOK-2) with no
  deliberate reason.

## Evaluator guidance

**Do not flag:** a product with no declared grid (N/A, not a finding); a deliberate
asymmetric or non-grid layout with a stated reason (the L2 `rationale` waiver covers it).

**Deconfliction.** TOK-2 checks per-element spacing values; this control checks whether the
resulting grid is coherent as a whole. LAY-4 caps prose measure; this caps the grid's outer
edge. LAY-6 requires shared edges to align within whatever structure exists; this requires
that structure be a *declared* grid the layout follows — it sits upstream of LAY-6. SLP-5
bans the cookie-cutter card grid; this requires the declared grid be followed when a grid is
used — complementary.
