Skip to content

Commit aa724c2

Browse files
docs(consolidation): record the use/defs rung in the D-N register
The dated addendum records the rung's shape: the expansion-before- cascade architecture the probe matrix forced, the totally-scoped selector boundary that pairs author CSS and <use> in one named refusal until a shadow-matching rung, the resolution mechanics that landed as law and cell, and the register's movement. Current-state bullets move to 139 cells and add the id-resolution table to the slice.
1 parent 690bb9e commit aa724c2

1 file changed

Lines changed: 52 additions & 1 deletion

File tree

docs/wg/consolidation/svg-engine-of-record.md

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,12 @@ from eight addenda:
4444
`<line>`, `<polygon>` and `<polyline>`, filled and stroked; `<g>` and
4545
`<a>` containers and the whole `transform` grammar in both spellings (the
4646
attribute is a presentation hint of the CSS `transform` property);
47+
`<use>`/`<defs>` same-document references (the id-resolution table);
4748
viewBox-only root sizing with the full
4849
`preserveAspectRatio` grammar; and one exact-time
4950
`<animate attributeName="x">` on a top-level `<rect>`.
5051
`crates/n0_cli/README.md` is the statement of record.
51-
- **The corpus** is 119 Chromium-baked primitive cells plus 10 sampled frames.
52+
- **The corpus** is 139 Chromium-baked primitive cells plus 10 sampled frames.
5253
All byte-exact except six curved cells carrying a declared, geometrically
5354
confined tolerance; the departure is the weighted rational conic alone.
5455
- **Not claimed:** no conformance score exists or may be computed — FLIP is
@@ -1056,3 +1057,53 @@ patrol closed the stylesheet route to the root that the scan's graduation
10561057
would have opened. `BadTransform` retired with the drop-semantics flip;
10571058
its overflow half lives on as `NonFiniteTransform`, still named at the
10581059
element.
1060+
1061+
## Addendum — the use/defs rung (2026-07-31)
1062+
1063+
The engine's first id-resolution table, and with it `<use>` and `<defs>`.
1064+
The architecture is the one the probe matrix forced: the referenced
1065+
subtree is **physically cloned under the `<use>` before the one cascade
1066+
runs** (csscascade's `svg_use`, at DOM freeze), so the instance is styled
1067+
by the same single pass — presentation attributes and `style` clone with
1068+
it, and inheritance flows from the use site, which is exactly Chromium's
1069+
measured behavior (`fill` on the use colors a clone that authors none;
1070+
the clone's own attribute beats it; `currentColor` resolves against the
1071+
use site's `color` — and `color` joined the admitted hint set for it).
1072+
websem renders `<use>` as a container of its shadow content and skips
1073+
`<defs>` by name; the walk, the paths, the patrols and the animation
1074+
inventory all see the expanded tree, so a beyond-slice construct inside
1075+
an instance is a declared hole at the clone's real path, and a cloned
1076+
animation element classifies against the clone it targets.
1077+
1078+
**The 31-measurement probe matrix's load-bearing verdict is the styling
1079+
boundary.** Selector matching against an instance is *totally* scoped to
1080+
the cloned subtree: `#id`, class, type and clone-internal structural
1081+
selectors match; NO selector involving any ancestor outside the clone
1082+
does — not `defs > rect` (the original's position does not carry), not
1083+
`use > rect`, not even descendant combinators like `svg rect`. A clone
1084+
parented in the one flattened tree cannot reproduce that boundary in
1085+
either direction, so **author CSS and `<use>` refuse together, by name**,
1086+
until a shadow-matching rung earns it with Stylo's shadow machinery. The
1087+
2018-era svgwg#504 claim that Blink copies the original's computed style
1088+
is measurably no longer true of Chromium 149.
1089+
1090+
Everything else measured landed as law and cell: `x`/`y` translate
1091+
appended inside the use's own transform; whole-document first-id-wins
1092+
resolution with forward references; plain `href` over `xlink:href`;
1093+
`width`/`height` inert for admitted targets; the correct nothings (an
1094+
unresolved reference, a mutual cycle, an ancestor circle — each baked as
1095+
pixels, each rendering exactly Chromium's nothing with nothing declared);
1096+
a light-tree target painting in place and as an instance; `display: none`
1097+
cloning onto the instance. Chains expand through with cycle guards on the
1098+
expansion chain (use ids and target ids alike, push/pop so siblings never
1099+
see each other's history); indirect cycles beyond the measured shapes hit
1100+
a depth budget and refuse loudly as expansion overflow, as do external
1101+
references and authored element children — each a register row with a
1102+
fixture. `<symbol>` targets surface the symbol element at the clone's own
1103+
path and refuse like the nested viewport they are.
1104+
1105+
Twenty cells baked byte-exact (corpus 119 → 139, the largest single rung
1106+
yet). The refusal register moved one row out (`svg-use` graduates) and
1107+
four in; `svg-path-marker-end`'s defs half stopped declaring the moment
1108+
defs was consumed, leaving the marker attribute itself as the named hole
1109+
— the row now names it directly.

0 commit comments

Comments
 (0)