Skip to content

EMS-b: the remaining paint seams (empty families, registries, engine paint roots, paint-vectors step); behaviour-preserving - #62

Merged
thejackshelton merged 9 commits into
masterfrom
ems-b-paint-seams
Oct 1, 2026
Merged

thejackshelton merged 9 commits into
masterfrom
ems-b-paint-seams

Conversation

@thejackshelton

@thejackshelton thejackshelton commented Oct 1, 2026 •

Copy link
Copy Markdown
Contributor

EMS-b (T071, part 2 of 2): the remaining paint seams, stacked on EMS-a (#57). See notes/T046-paint-spec.md §3 and notes/T071-ems.md. Nothing changes behaviour: every seam is empty until PNT1, PNT2, BG2 and P6a fill it.

What changed

  • Empty paint families in css/properties: radius, shadow, effects, outline, transform, background-layers and scrollbar. They are spread last into every aggregate. Outline and radius get shorthand stubs.
  • Registries:
    • a paint-values registry, run once after computeLengths;
    • a paint-samples registry. Its modules may add points after the base points, or suppress base points. All of them are stubs for now.
  • Sample-rule kinds: shadow and gradient. Their channel deltas come from allowances/shadow.ts and allowances/gradient.ts, and both equal GATE_CHANNEL_DELTA.
  • Engine roots: engine paint.ts (BoxShape) and six empty paint-<feature>.ts roots. They are translated through generate.ts PAINT_ROOT_FILES, and the harness routes paint:<feature>:<fn> through units mode.
  • Paint vectors: pnpm run layout:paint-vectors writes packages/layout/paint-vectors/<feature>/vectors.json (six empty suites).
  • Merge resolution: generate.ts takes master's rt roots and EMS-b's paint roots in one loop. The loop refuses a missing root file by name.
  • Audit fix: layout:paint-vectors refuses a directory that no paint root names. A new paint-vectors-cli test failed before the fix.

Behaviour-preserving

  • No capture, vector, profile or emitted file moves.
  • The device run (pnpm run parity:devices) records every lane in master's state:
    • device-pixels fails on both targets, as on master;
    • every other lane passes, and lane parity passes;
    • out/device-failures-{ios,android}.json are byte-identical to master's.

What passed

  • pnpm typecheck.
  • pnpm test: 153 files; 3139 tests pass and 1 is skipped. The skipped test is the full pnpm regen --check, which runs only with DRAGON_REGEN_CHECK=1.
  • pnpm regen reached a fixed point in 2 passes.

Changed tests

  • samples.test.ts: SAMPLE_RULES gains shadow and gradient. The :n3 base-sample check excludes them, as it already excludes glyph, because no base point uses them.
  • Pins: the dragon paint-seams and translate paint-roots tests gain their EMS-b pins.

No tolerance, check or test is loosened or removed. The reviewed diff is 83 KB in 75 files.

🤖 Generated with Claude Code

Note

Add empty paint seams, registries, and paint-vectors generation step (EMS-b)

  • Adds empty seam modules for paint features: layout paint roots (paint.ts and six paint-<feature>.ts files), seven empty CSS property-family modules wired into properties.ts, and empty shorthand handler maps for outline and radius
  • Adds ordered registries of stub modules: PAINT_SAMPLES in parity and PAINT_VALUES in dragon, all using shared no-op factories that keep base points and leave computed properties unchanged. computeLengths now calls computePaintValues after length resolution
  • Adds the layout:paint-vectors CLI in paint-vectors.ts that generates committed per-feature vector fixtures (currently empty) from paint roots, wired into regen.ts
  • Translation now treats paint roots as engine roots in generate.ts, and harnesses gained paintResult routing (regenerated Swift/Kotlin outputs updated accordingly)
  • Extensive test coverage added across dragon, parity, layout, and translate packages for registry ordering, base-point preservation, tolerance handling, and vector validation
  • Behavioral Change: pixel comparison in native-compare.ts now selects per-rule channel tolerance via CHANNEL_DELTA_BY_KIND (shadow/gradient currently equal the gate delta), and caseSamples routes through withPaintSamples

Macroscope summarized 6ca5e59.

…T071-ems.md), stacked on EMS-a

- CSS: seven empty paint families (css/properties/{radius,shadow,effects,outline,transform,background-layers,scrollbar}.ts) and two empty shorthand files, spread last in every aggregate.
- analysis/paint-values: one module per paint module, all stubs; computePaintValues is the last statement of computeLengths.
- Engine: packages/layout/src/paint.ts (BoxShape) and empty paint-{radius,shadow,gradient,transform,dash,scrollbar}.ts; translate generate.ts roots them (PAINT_ROOT_FILES) and the harness routes paint:<feature>:<fn> through units mode; layout:paint-vectors writes the six empty suites.
- Parity: paint-samples registry (16 stubs) appended to casePoints, SAMPLE_RULES gain shadow and gradient, checkPixels reads CHANNEL_DELTA_BY_KIND (every kind GATE_CHANNEL_DELTA; shadow and gradient through allowances/), LANE_FILES covers both allowances.
- Tests: the CSS-family and paint-values checks return to dragon/test/paint-seams.test.ts; layout, parity and translate seam tests; samples.test.ts pins retargeted (SAMPLE_RULES appends shadow and gradient; the box generator emits neither).
Split from ems-paint-seams 49a5f8e1: with EMS-a, this tree equals it.
…, profile:rows, parity:capture, profile:rows, layout:vectors, parity:dpr-capture, layout:dpr-vectors, layout:break-vectors, parity:break-capture, parity:pixel-capture, layout:paint-vectors, native:gen, node --conditions=dragon-internal examples/music-player/tools/check.ts, wpt:run --target web, wpt:update-expectations --target web, tw:sweep, parity:glyph-b3 --write-bottom-pins, media-sweep.ts and --check, parity:lanes --run-host): the six empty paint-vector suites, the translated engine and harness (paint roots and routing: digest headers, source line comments, paintResult) and a host-only lanes.json (rule kinds gain shadow and gradient); byte-identical to ems-paint-seams 49a5f8e1's outputs apart from lanes.json run fields
… earlier) into ems-b-paint-seams: generate.ts takes master's rt roots (ANIM-a2) and EMS-b's paint roots in one loop that refuses a missing root file by name (master's rt loop cast it); paint-roots.test pins both refusals; generated engine and harness files taken from master, regenerated next
…(PASSES=1 /tmp/emsb-regen2.sh: grammar:gen, ua:capture, parity:capture, profile:rows, parity:capture, profile:rows, layout:vectors, parity:dpr-capture, layout:dpr-vectors, layout:break-vectors, parity:break-capture, parity:pixel-capture, layout:paint-vectors, native:gen, node --conditions=dragon-internal examples/music-player/tools/check.ts, wpt:run --target web, wpt:update-expectations --target web, tw:sweep, parity:glyph-b3 --write-bottom-pins, media-sweep.ts and --check, parity:lanes --run-host): the translated engine and harness (master's rt roots plus EMS-b's paint roots and harness routing) and a host-only lanes.json; no capture, vector, profile or emitted file moves
…ory under packages/layout/paint-vectors that no paint-<feature>.ts root names (strayEntries), so a removed or misspelt feature's suite cannot linger unchecked; paint-vectors-cli.test pins the features, the not-ok refusal, the stray check and that the committed directory holds exactly the features (layout:paint-vectors --check passes)
…:devices): every lane in the same state as origin/master's (device-pixels fail on both targets as on master, all else pass, lane parity passes); device-failures-ios.json and device-failures-android.json byte-identical to master's. A first run hit a 180 s timeout in android layout-vectors-host under machine load and was rerun
…o ems-b-paint-seams: no source conflict; generated files kept from this side for pnpm regen to rebuild. scripts/regen.ts gains the paint-vectors step (pnpm run layout:paint-vectors, outputs packages/layout/paint-vectors/*/vectors.json, after pixel-capture and before native-gen; no earlier step reads them, so no readsLater), .gitattributes lists its output, and .macroscope/ignore.md covers it as generated output (the merge policy requires both)
…(/tmp/heavy-lease.sh pnpm regen: fixed point after 2 passes): the translated engine (master's T123 linebreak and EMS-b's paint roots and harness routing); lanes.json follows from the device run
…igin/master 9f1166d (/tmp/device-lease.sh pnpm run parity:devices): every lane in the same state as master's (device-pixels fail on both targets as on master, all else pass, lane parity passes); device-failures-ios.json and device-failures-android.json byte-identical to master's
@macroscopeapp

macroscopeapp Bot commented Oct 1, 2026

Copy link
Copy Markdown

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This is a broad cross-package paint-seam and tooling change with new registry hooks, parity sampling paths, translation roots, and regenerated outputs. It also modifies .macroscope/ignore.md, a Macroscope configuration file that requires human review.

You can add or adjust custom eligibility rules. Learn more.

@thejackshelton
thejackshelton merged commit 0ee050a into master Oct 1, 2026
4 checks passed
thejackshelton added a commit that referenced this pull request Oct 1, 2026
…tHub cannot apply the dragon-generated merge driver, so the PR was conflicting on generated files; no source conflicts; generated outputs keep this side and pnpm regen rebuilds them next
thejackshelton added a commit that referenced this pull request Oct 1, 2026
…s again, before the first regen: no source conflicts; generated outputs keep this side (merge=dragon-generated) and pnpm regen rebuilds them next
thejackshelton added a commit that referenced this pull request Oct 2, 2026
…und again, before the first regen: no source conflicts; generated outputs keep this side (merge=dragon-generated) and pnpm regen rebuilds them next
thejackshelton added a commit that referenced this pull request Oct 2, 2026
…onflict (the previous merge left this branch at master plus SIZE-ar, so EMS-b's paint seams merge cleanly); generated outputs keep this side and pnpm regen rebuilds them
thejackshelton added a commit that referenced this pull request Oct 2, 2026
…tmp/heavy-lease.sh pnpm regen (fixed point after 2 passes): only native:gen (the translated engine gains EMS-b's paint roots beside SIZE-ar's ratio code) and the host lanes in lanes.json change; node scripts/check-aspect-ratio-migration.ts origin/master exits 0 with the same counts
thejackshelton added a commit that referenced this pull request Oct 2, 2026
…in again, before the first regen: no source conflicts; generated outputs keep this side (merge=dragon-generated) and pnpm regen rebuilds them next
thejackshelton added a commit that referenced this pull request Oct 2, 2026
…, before the first regen: properties.ts keeps SELD-R1b's pointer-events family right after grid and master's paint families after it, in LONGHANDS, INHERITED and PROPERTY_ASPECTS; seams.test.ts (EMS-b's paint-family order check) expects POINTER between GRID and the paint families in those three tables (intent kept: the paint families go last, after grid); generated outputs keep this side and pnpm regen rebuilds them next
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant