Repository navigation
The consolidation program — one engine by extraction #43
Copy link
Copy link
Open
Labels
Description
The umbrella for the era after the v2 landing (#5): consolidating the legacy engine (crates/grida) and the v2 engine (crates/n0) into one engine by extraction — the successor program to the legacy seam program (#27).
The normative reference is the git-persisted program directory: docs/wg/consolidation/ — start at its index. The docs:
- index — start-here: reading order, the standing rules, working conventions
- goal — what n0 becomes (render CLIs, engine ecosystem, dev editor, render modes, format posture) and its non-goals
- topology — chassis vs know-how: the per-domain adoption map, render modes, the crate silhouette
- method — the step lifecycle, the three step shapes with worked examples, the gates
- glossary — the program vocabulary
- charter — the ratified route: phases 0–6 with entry/exit gates, the first three PRs, the owner decision registry, and the known unknowns
This issue tracks execution state (the position); the directory defines the program (the route).
Sequencing rule (binding on every PR in this program)
- Zero-behavior moves (crate cuts, re-exports) are gated by byte-identical sweeps alone — they never wait for the scoreboard.
- Capability-granting moves (n0 gaining an importer or any new rendering surface) are gated by the v1-vs-n0 scoreboard — no capability lands unmeasured.
- The conformance bar is the Chromium/consensus oracle, never v1 itself.
- Patrol-before-drop applies to every absorption step.
Milestones
- Phase 0 — Land + arm: model-v2: anchor — land the v2 engine as the crates/n0 family #5 merged
--no-ff; CI arming PR (required checks: declared pixel-sweep subset, seam architecture tests, lock-additions-only, wasm build, CI-hosted v2 gate baselines); decision issues filed; the two long-pole docs lanes started (anchor-spec WG graduation, htmlcss font-provider study) - Phase 1 — Vocabulary lane (∥ 2): cg crate cut (byte gates); paint-RFD conformance suite vs both engines + gap report; the two pinned RFD amendments ratified; D-C decided on evidence
- Phase 2 — Instrument lane (∥ 1): scoreboard v0 (enumerated intersection corpus, per-fixture triples + coverage), CI-hosted with bless flow and wall-clock budget; flip rule ratified before any score exists
- Phase 3 — SVG: the SVG import IR crate cut (name + math vocabulary decided at cut); n0 packer with the dependency-direction lock; legacy suites byte-identical; n0 SVG entry scores on the board
- Phase 4 — HTML + editor lanes (concurrent): htmlcss front-end extraction after its closed-set lock + font-provider decision; n0
from_styledadapter scored; D6 (editor-core ownership, The engine migration — history & the consolidation guideline (residue from gridaco/grida) #1) decided via the timeboxed spike - Phase 5 — Format + text oracle:
.grida→n0 converter over a pinned real-document corpus; v2 archive story decided; text-oracle identity decided at this boundary only - Phase 6 — Flip + retirement: per-suite bar flips off the Phase-2 criterion;
crates/gridacontracts by subtraction; wasm switch + freeze-contract retirement coordinated with the product side
First three PRs
- CI arming
- cg crate cut (no n0 changes)
- Scoreboard v0 (+ PR 4: the paint conformance suite)
Refs: #5 (the landing), #9 (v2 model tracking), #27 (predecessor), #1 (D6 context).
Execution log
- CI arming PR landed — ci(consolidation): arm permanent migration gates #46 merged as
182bb7f2; permanent gates and CI-owned n0 baselines are onmain, and all post-merge push workflows are green. - Required-check ruleset registration — the active
mainruleset still contains only deletion and non-fast-forward protection; registerconsolidation gates / armedandcanvas build / buildas required checks. - Decision-issue filing sweep — twelve dedicated trackers filed; no registry decision taken.
- Anchor-spec WG graduation lane
- htmlcss font-provider study lane
- cg crate cut landed — refactor(cg): extract shared vocabulary crate #59 merged as
cdba65c0;crates/cgis the skia-free workspace crate, legacy retainsgrida::cgthrough a re-export, and the declared 65-fixture sweep is byte-identical. Non0or frozen-surface change.
Decision tracker index
- Phase 1: AMD decision(AMD): ratify the paint-model amendments #47; D-C decision(D-C): choose cg adoption or law-equivalence mapping per leaf #48
- Phase 2: FLIP decision(FLIP): ratify the per-suite conformance-bar flip rule #49
- Phase 3: NAME decision(NAME): name the SVG import IR crate and choose its math vocabulary #50
- Phase 4: D-D decision(D-D): choose the htmlcss font-provider seam #51; D6 decision(D6): choose editor-core ownership #52
- Phase 5: D-H decision(D-H): choose the production text oracle #53; D-G(b) decision(D-G(b)): choose the v2 archive story #54; D-J decision(D-J): choose format stewardship #55
- Preview lane: D-K decision(D-K): choose the realtime-preview time model #56
- Phase 6: D-E decision(D-E): govern per-suite conformance-bar flips #57; D-I decision(D-I): switch the wasm package and retire the freeze contract #58
- Already taken: GO at model-v2: anchor — land the v2 engine as the crates/n0 family #5
- Sequencing declaration: the consolidation follow-up order is already recorded on anchor — the v2 node model #9.
Reactions are currently unavailable
Activity
docs(wg): harden the end-state into the consolidation program directory
softmarshmallow commentedon Jul 20, 2026
Decision-issue filing sweep — captured-essence ledger (2026-07-20)
Patrol
Name and cut
Gate evidence
migration.main; no local or commit-pinned links were introduced.format/grida.fbs,@grida/canvas-wasm@0.91.0-canary.22, and the local worktree were untouched.Next open Phase 0 step: the anchor-spec WG graduation lane.
softmarshmallow commentedon Jul 20, 2026
CI arming owner gate — landed (2026-07-20)
Owner GO was received for #46. GitHub accepted the merge only at the reviewed head
df3d5b5bd553924ce33b76b4f9a8b49c73e98b63; the normal merge-commit strategy produced182bb7f23418efcb77ad75f17dbac6ac9a90bc36. #44 closed automatically.Post-merge gate evidence
All push workflows on the merge commit completed successfully:
armedThe frozen surfaces remain untouched. The local worktree remains clean.
Remaining administration
A read-only ruleset audit found that the active
mainruleset currently enforces deletion and non-fast-forward protection only; no required-status-check rule exists yet. The merge instruction was not broadened into that repository-setting mutation. Required-check registration remains explicitly open in the execution log.docs: say what the engine is for, and give the laws a home
softmarshmallow commentedon Jul 30, 2026
Execution log — catch-up to 2026-07-30
The log below records what landed between 2026-07-20 and 2026-07-30; the entries above stay as written.
grida_dev scoreboardsubcommand over the enumerated corpus. FLIP (decision(FLIP): ratify the per-suite conformance-bar flip rule #49) remains unratified, so no score has been produced or inspected; the seal is code-enforced.rframe), many hosts; HTML/CSS + SVG moved to the front. Supersedes the Phase 3–4 legacy-adapter routes where they conflict. Landed with feat(consolidation): the n0 path becomes the SVG engine of record #61.a64923b5d5c6…(svg-paint-cascade.md)cgis the shared leaf-vocabulary seat, taken for the glyphless vector scope; AMD-dependent and text leaves stay openwebsem → rframe → n0) is the SVG engine of record, static and animated;htmlcss::svgdemoted to frozen semantics donor (svg-engine-of-record.md)mainsince the cutover, each Chromium-baked and law-pinned (dated addenda in the D-N register):<rect> <circle> <ellipse> <path>(no arc)<line>, solid fill + solid centred stroke,<g>+ the SVG transform-attribute grammar, SVG2 §8.2 root sizing with fullpreserveAspectRatio, one exact-time<animate attributeName="x">on a top-level rect. 77 + 10 Chromium-baked cells.consolidation gates / armedandcanvas build / buildare not yet required on themainruleset.softmarshmallow commentedon Jul 30, 2026
Position update:
<polygon>and<polyline>admitted, zero contract change (both lower to the line-segment path<line>already uses). The grammar's edges were measured against Chromium 149 before the parser was written; eight new cells, all byte-exact (85 total). Thesvg-polygon/svg-polylinerefusal rows graduated, and the L0basic-shapesscene now renders every shape — its remaining declared holes are the text labels and one rounded rect.display/visibility, the translucency pair (fill-opacity+ translucent sRGB), shape-geometry percentages, the CSStransformproperty, then<use>/<defs>(needs the id table). First contract widening remains the arc (ConicTo), which permethod.mdwants its amendment ratified before code.softmarshmallow commentedon Jul 31, 2026
Position update — the loop is running direct-to-main now (rungs land as the established 3-commit pattern, CI-gated on push):
fixtures/web-first/STATUS.md: a generated, freshness-gated view of both corpora (baked cells + the refusal register in the compiler's own recompiled words). The gate (crates/websem/tests/capability_status.rs) fails any rung that moves the corpus without regenerating the view — the drift the donor's hand-maintained table suffered is structurally impossible here.display: noneandvisibilityconsumed (attribute + CSS spellings through the one cascade; csscascade's hint set grows to ten, precedence-law-gated). Seven new cells, byte-exact — 92 total. Two findings worth the read in the D-N register's addendum:visibilityis per-element (avisibledescendant un-hides inside a hidden container — the cell forces the reading), and the oracle corrected a probe — a standalone document's outermost<svg>ignoresdisplay: nonewhile an embedded root generates no box, so the compiler splits by entry.fill-opacity+ translucent sRGB), shape-geometry percentages, the CSStransformproperty,<a>, then<use>/<defs>.softmarshmallow commentedon Jul 31, 2026
Position update — chunk 1 of the contract-neutral ladder, three more rungs on
main(the gates' concurrency group verifies the tip, which covers all three):fill-opacity,stroke-opacity, and translucent sRGB consumed. One generating rule: paint alpha = colour alpha × paint opacity, multiplied in float and quantized once; the multiplied cell pins the rounding, and the first quantization guess matched Chromium on every cell. Elementopacitystays refused by design — it is the group scope's first producer. Seven cells (99 total at that tip).stroke-widthpercentages resolve against SVG2 §7.10's bases (viewBox user units when present; x/width, y/height, radii and stroke widths against the normalized diagonal). The10%-of-64x64-is-6.4 measurement recorded when this was a refusal became the resolution's first assertion. Root percentage sizing deliberately stays refused: its basis is the host window, which the element-capture baker cannot express — it graduates only with a host-level oracle. Six cells; the deadUnsupportedLengthvariant retired.<a>admitted as a container sharing<g>'s compiler and patrols (SVG2 §16.2:hrefis interaction, not paint). One cell; a law pins<a>≡<g>.Corpus: 106 Chromium-baked cells, refusal register at 37 rows, STATUS.md regenerating under its freshness gate each rung. Remaining in chunk 1: the CSS
transformproperty,<use>/<defs>(the id table), and the animatable-attributes rung on the animation corpus. Then the contract-widening chunk (arc, rounded rects) behind its amendment ritual, and the group scope.softmarshmallow commentedon Jul 31, 2026
Position update — the transform rung lands (2026-07-31)
The CSS
transformproperty is consumed, and the rung dissolved the SVGtransformattribute as a separate concept: per CSS Transforms L1 §7 the attribute is a presentation attribute of the one property, so it now enters the cascade as a presentation hint (csscascade owns the attribute grammar and its measured rewrite), and websem reads only the computed operation list. Precedence — author CSS beats the attribute,transform: noneincluded, invalid CSS falls back — is the cascade's own, pinned by precedence laws and baked cells, not reimplemented.fixtures/local/transform-probes, untracked): origin verdict (SVG usedtransform-origin 0 0= the local user-space origin, held even under a negative-minviewBoxagainst the spec's reference-box letter), percentage basis (viewBox dimensions), full malformed-boundary parity, and the csswg-drafts#2623 leniency (run-together numbers, functions without separators) — now grammar, since refusing it would render untransformed where Chromium transforms.BadTransformretired), and-webkit-transformgraduated with its property (the pinned Stylo implements the alias — verified when the name left the scan denylist).websem → rframe → n0on the first render. Refusal register 37 → 40:svg-css-transform-propertygraduated;transform-origin,transform-box, the beyond-2D function family, and the individualrotate/translate/scaleproperties each hold a named row. The root<svg>'s transform now refuses in both spellings (computed patrol closed the stylesheet route).Commits: feat add7671, fixtures 5c08b7c, docs c73aed5. Statement of record updated (
crates/n0_cli/README.md); addendum insvg-engine-of-record.md.Next in chunk 1: the
<use>/<defs>flattenable rung (the first id-resolution table with cycle guards — also the prerequisite for gradients-by-reference, markers, andclip-pathreferences), then the animatable-attributes widening on the existing f32 sampler.softmarshmallow commentedon Jul 31, 2026
Position update — the use/defs rung lands (2026-07-31)
The engine's first id-resolution table:
<use>and<defs>are consumed. The architecture the probe matrix forced is expansion-before-cascade — the referenced subtree is physically cloned under the<use>at DOM freeze (csscascade::svg_use), so the instance is styled by the one cascade with inheritance from the use site, exactly as measured. websem renders<use>as a container of its shadow content (x/yas the appended translate) and skips<defs>by name.#id/class/type match, but nothing involving an outside ancestor does, notdefs > rect, notuse > rect, not evensvg rect. The flattened tree can't reproduce that boundary in either direction, so author CSS +<use>refuse together by name until a shadow-matching rung earns it with Stylo's shadow machinery. (The 2018-era svgwg#504 claim that Blink copies the original's style is measurably no longer true of Chromium 149.)<symbol>targets refuse by name.colorjoined the admitted hint set (the currentColor basis — measured through an instance).websem → rframe → n0on the first render. Refusal register:svg-usegraduates, four rows enter (stylesheet, external, authored-children, symbol);svg-path-marker-end's defs half stopped declaring, leavingmarker-enditself as its named hole.Commits: feat
4d27654c, fixtures690bb9e1, docsaa724c2d. Statement of record updated (crates/n0_cli/README.md); addendum insvg-engine-of-record.md.With this rung, chunk 1 of the ladder is complete (transform + use/defs). Next: the animatable-attributes widening on the existing f32 sampler, then chunk 2's amendment-before-code pair — the elliptical arc's
ConicToin rframe and rounded rects, which completes the basic-shapes scoreboard toward FLIP eligibility (#49, owner-gated).softmarshmallow commentedon Jul 31, 2026
Position update — the gradient rung lands (2026-08-01)
The engine's first non-solid paint, and the ladder's first contract amendment:
rframe'sSolidPaintStackbecamePaintStack, admitting linear and radial gradients from the sharedcgleaf seat (D-C) — visible, normal-blend; sweep/diamond/image/non-normal stay construction rejections. The repo law "rframecannot express a gradient" was falsified by design and re-stated: rframe cannot express a paint that references a resource.<linearGradient>/<radialGradient>are consumed on fills and strokes, every shape and both entries.gradientTransformis the transform property's presentation attribute on gradient elements (attr ≡ author CSS byte-identically, plaintransforminert,transform: nonedisarms, raw-origin application — a scale-2 probe killed the CSS-origin hypothesis), so csscascade hints it through the transform rung's rewrite; the authored fallback fires only on invalid references (a valid stopless gradient — self-cycles included — paints nothing, fallback unfired); degenerates resolve producer-side to the backend's own measured meanings (pad → last stop, reflect/repeat → the ramp's integral average); stops are attribute reads (stop-color/stop-opacityare Gecko-only at the D-L pin — author CSS on stops now refuses by name, closing a silent drop) withcurrentColorresolving against the gradient's own ancestor chain.fill-opacityover a gradient multiplies at the backend's 8-bit alpha step (measured ×128/255, not ×0.5) — pinned in the painter.preflight_gradients— now generic over the drawlist owner — runs inside the glyphless compile: an unshadeable gradient is a namedBuildError, never a painter panic reachable from hostile SVG.ramp-quantizationtolerance, both delta 1 with measured counts: the off-center radial (1 pixel, an ulp against Chromium's Skia) and the non-monotonic-stops cell — byte-exact on macOS, 18 clamp-edge pixels under the Linux Skia build's SIMD path, the corpus's first measured cross-platform departure. Mapping it taught the oracle gate to sweep the whole suite before failing, so a platform difference now costs one CI round-trip. Refusal register:svg-gradient-paint-servergraduates; five named rows enter (focal radial, linearRGB interpolation, sheet stop-color, style-attr stop-color, font-relative geometry units).Refuses by name until owner-gated or later rungs: focal radials (
fx/fy/fr— the shared radial leaf is concentric; the paint RFD's focal amendment is the unlock),<pattern>,color-interpolation: linearRGB, gradient-transform percentages (Chromium resolves them against mismatched spaces — measured and declined).Commits: feat
b1a3087a, fixturesae456675, docs33093dcc. Statement of record updated (crates/n0_cli/README.md); addendum insvg-engine-of-record.md; the new SVG checklist ticks its paint-servers section.Next: the elliptical arc's
ConicToamendment in rframe with rounded rects (rx/ry) on the same rung — completing the basic-shapes scoreboard toward FLIP eligibility (#49, owner-gated) — then the group scope (element opacity) as the compositing family's gateway.softmarshmallow commentedon Aug 5, 2026
Position update — D-M is complete: the text stage joined low (2026-08-05, #73).
The two-producer spike the join-point finding required ran once
textlayoutbecame a real producer (#70–#72). Both producers were pushed at a candidate neutral shaped-text + font-key contract; the boundary broke at three seams, measured on two declared platforms (Darwin-arm64/CoreText, Linux-x86_64/FreeType — mapped through the declaration protocol on the PR's CI rounds):rframe's identity refuses andn0::glyphlessis named for.Each engine keeps its own text artifact, font registry, glyph replay policy, and text item; sharing stops at backend glyph/raster utilities; content-digest font identity stays a host-seam convention. The record: the text-stage evidence; the witness:
crates/n0/src/text_join_spike.rs; the locks:rframe's two decided refusals and the spike's dev-only perimeter. Re-opening conditions are registered in the finding.Open decisions remaining: FLIP, NAME, D-D, D6, D-H, D-G(b), D-J, D-K, D-E/D-I.
softmarshmallow commentedon Aug 5, 2026
Position update (2026-08-05, after #74). The per-construct tracker is now the Web checklist, replacing the SVG checklist: the full HTML + CSS + SVG surface (1454 rows) enumerated from the external spec indexes, items only in the platform's own vocabulary, with the strict tick rule (a row ticks only when a Chromium-gated rung lands its full listed grammar — 27 tick today). The tick audit deliberately left four implemented-but-under-gated rows unchecked (viewBox, stroke-linejoin, offset,
<metadata>) and surfaced one over-refusal to fix (zero-extent viewBox vs SVG2 §8.8.1 rendering-disabled). Patrol-before-drop ran on the old Notes column; the corrected standalone-entry caveat ("no DTD" was false at tip — DOCTYPE accepted-and-ignored, internal entity subsets refuse loudly in both admissions) is re-homed in the statement of record. The declared Next is unchanged: the ConicTo amendment + rx/ry pair.softmarshmallow commentedon Aug 6, 2026
Position update (2026-08-06, after #75). The declared Next is taken: the conic rung landed — the third contract amendment (
rframe::PathCommand::ConicTo, positive-finite weight domain, rational-derivative tight bounds; "no arc command" re-stated and standing). A 24-probe Chromium matrix decided the semantics before code: a rounded rect is a conic path in Chromium (byte-identical to itsA-command contour, soGeometrygrew no variant), the rect's auto/clamp order resolves from authored values then clamps per axis, arc corrections are the spec's byte-for-byte, and nothing canonicalizes — the authored angle feeds plain f64 arithmetic. All eleven new cells bake byte-exact (zero tolerance blocks), falsifying the corpus README's prediction that arcs inherit the oval departure: that class is thedrawOvalconstruction's, not the conic curve's.svg-path-arcandsvg-rect-roundedgraduated;UnsupportedPathCommandis deleted (everydcommand letter emits); CSSrx/ryjoined thed-property patrol, closing a latent silent-divergence class; the checklist ticksrx/ry.Next. With
rx/ryin hand, the register's named row-1 scoreboard construct no longer waits on capability: the corpus-growth step (rx/ry rows intosvg-rect-path-v0as a new corpus version, owner-gated threshold-table amendment, fresh bake) toward FLIP eligibility is unblocked — and FLIP's ratification record + #49 GO text remain the standing owner act.45 remaining items
softmarshmallow commentedon Sep 3, 2026
Position after #128 (
10f94f4c): T5b is ADMIT/SPLIT with no checklist closure.textlayout-v6now selects one exact integral-weight/nine-point-stretch/normal-or-italic tuple inside the first reached declared family. SVG presentation attributes and CSS declarations share the one Stylo cascade; the host manifest carries the same exact facts beside verified font bytes. One sixteen-branch Chromium cell is exact through the real strict CLI, and four new rows guard fractional weight, oblique angle, stretch source precision, and a reached family with no exact tuple in both admissions.The estate is 1,051 primitive Chromium cells plus 16 sampled frames, 13 exact text cells, 8 exact-number text geometry witnesses, and 224 named refusals. All CI and review passed. The next preferred text checkpoint is T5c: research and jointly own directional nearest-static-face matching plus synthesis; variable axes, generic mapping, fallback, and external I/O stay separate.
softmarshmallow commentedon Sep 4, 2026
Position after #129 (
9b53e7c0): T5c is ADMIT / SPLIT.textlayout-v7now performs deterministic nearest static face selection inside the first reached declared family, in stretch → style → weight order. Equal winning tuples still refuse asAmbiguousFace; required synthetic bold/italic refuses asSyntheticFaceRequiredbefore shaping.Evidence: one new exact-byte Chromium cell with 16 discriminating branches; every losing mutation changes 85 pixels at max delta 255; the actual
n0CLI raster is RGBA-identical to Chromium. The estate is now 14 exact text cells + 8 geometry witnesses; the named refusal register remains 224 rows. No checklist row ticked, and all CSS-font/SVG font-presentation rows remain open. All CI and review checks passed.Next independent high-ROI text checkpoint: T6, cluster-safe missing-glyph fallback across the ordered declared-family list. T5d synthesis remains a separate quarantined architecture problem.
softmarshmallow commentedon Sep 4, 2026
Position after #130 (
6031a9c6): T6 is ADMIT / SPLIT with no checklist closure.textlayout-v8now performs missing-glyph fallback per complete shaping cluster across the ordered host-declared family list. The first available static face still owns vertical metrics; every cluster restarts family matching, accepts only one face that shapes the whole cluster without.notdef, never searches a second descriptor inside one family, and never separates a base from its mark. Adjacent clusters on the same exact face coalesce. All font and face identity remains private to textlayout;rframestill receives ordinary outlines only.Evidence: one new exact Chromium text cell, exact strict and best-effort CLI RGBA, one deterministic Ahem cmap derivative, and strengthened generic/synthesis/query-grid patrols. The declared-family fallback refusal graduated while exhaustion remains named. The estate is 1,051 primitive Chromium cells + 16 sampled frames + 15 exact text cells + 8 text-geometry witnesses; the refusal register is 223 rows. Gate sensitivity was proved by restoring terminal first-face failure and watching the new cell fail loudly.
Review found repeated font parsing across cluster probes and ink bounds;
94535c95added one resolve-local cache keyed by verified font identity. All CI, Vercel, CodeRabbit, and review checks passed before squash merge.Text pauses here after T6 as planned. The next project action is to review the overall SVG rendering estate and select its highest-ROI standalone gap. T7 explicit generic-family mapping is only the parked next text checkpoint if the text lane is selected again; T5d synthesis remains quarantined separately.
softmarshmallow commentedon Sep 4, 2026
Position after #131 (
02a95111): NV1 is CLOSE / SPLIT. The SVG<svg>element row now closes for direct static root and nested viewport establishment. HTML<svg>, shared viewport attributes,<symbol>, and<use>whose direct target is<svg>remain separate contracts.A direct nested viewport now owns parent-space placement,
viewBoxmapping, descendant percentage bases, bounded nesting, and the Chromium non-root overflow/clipping behavior without adding SVG identity torframe. Review caught the two-valueoverflowpresentation shorthand; it now expands once through Stylo, with a dedicated exact cell and sensitivity proof.Evidence: 28 new exact Chromium cells, both actual CLI admissions exercised, two independent gate mutations failed loudly, and all CI/review checks passed. The primitive estate is now 1,079 Chromium-baked cells plus 16 sampled frames; the named refusal register is 226 rows. Pattern-, mask-, and marker-source programs remain guarded separately, and direct
<use>→<svg>now refuses by name rather than emitting wrong pixels.softmarshmallow commentedon Sep 4, 2026
Position after #132 (
d66d5dbf): VE1 is CLOSE / SPLIT. The direct SVGvector-effectpresentation-attribute row closes at its complete standard-track grammar. The CSS property twin remains open because pinned Stylo has no Servo longhand; live unsupported CSS and substitution-function routes refuse by stable name instead of gaining a second matcher.rframenow carries only source-neutralStrokeSpace::Local | Frame. Non-scaling strokes map their centerline into frame space before applying the nominal pen across every admitted geometry, paint/effect,<use>, viewport, and marker-source route. Blink's separatemarkerUnits="strokeWidth"RMS rule is retained. Focused laws guard identity-linear f32 cancellation and the backend's finite nonzero f32-determinant boundary.Hosted review found that function inspection ran before proving a drawable stroke. Pinned Chromium keeps fill-only and zero-width cases exact; old best effort skipped 1,024 valid pixels at Δ233. The resolution now follows all no-stroke exits, one exact cell guards the ordering, and the separate live marker consumer still resolves it.
Evidence: 48 new exact Chromium cells with no tolerance, four deliberate gate mutations failed loudly, both actual CLI admissions were exercised, and all CI/review checks passed. The primitive estate is now 1,127 Chromium-baked cells plus 16 sampled frames; the named refusal register has 230 rows. No score or FLIP artifact changed.
softmarshmallow commentedon Sep 5, 2026
Position after #133 (
f5f61d12): the direct SVGpaint-orderpresentation-attribute row is closed.normal | [ fill || stroke || markers ]grammar, inheritance, omitted-operation completion, marker placement, opacity scope, transforms,<use>, and the admitted paint/resource routes.paint-orderlonghand. Live substitution functions on an effective multi-operation attribute order refuse by stable name; inert substitutions remain admitted.The CSS-property twin and marker sources outside the admitted solid/context-marker program remain explicit follow-ons, not silent pixels.
softmarshmallow commentedon Sep 6, 2026
Position: RG1 radial circles merged in gridaco/nothing#134, tip
fd4097f2.fx/fy/frnow carry the bounded number/percentage/pxslice throughan ordered two-circle paint fact, including exterior focus, reversed/zero end
radii, templates, and one-stop transparent domains. The shipped one-stop
constant-fold escape is repaired. Incapable writers and translated preview
caching refuse explicitly; the frozen format and external-resource boundary
are unchanged.
127 new Chromium cells: 119 exact, eight with measured existing
ramp-quantization bounds; no old oracle or tolerance changed. The estate is
1,284 primitive cells + 16 sampled frames, with 16 text-pixel cells + 8
geometry witnesses unchanged, and 260 named refusals. No tick: valid
precision aliases and CSS comments still have no own row to carry their gap.
Four code mutations failed the gate; restoration, independent manual
TICK/LAW + REPRO, and all hosted checks passed. No Workflow runner was exposed;
the PR states the fallback plainly. Automated review had no actionable
comments. No conformance score or FLIP change. The
admitted-slice record
and checklist are current.
softmarshmallow commentedon Sep 7, 2026
Position after #135 (
7e1d30d7): B1 SVG group blending ismerged. Existing Stylo values enter checked composition scopes and the same
painter: normal/multiply/screen, isolation and combined opacity, with a bounded
rectangular source profile. Wider geometry/effects/resources and the remaining
modes retain named refusals. No CSS blending checklist ticks.
The corpus is 1,398 Chromium-baked primitive/HTML cells (+114), with 16
sampled frames, 16 text-pixel cells and 8 text-geometry witnesses unchanged;
the named refusal register is 303 (+43). Exact gates pass on ARM and
hosted x86. Deliberate arithmetic/elision mutations fail loudly; existing
oracles, capture hash and tolerances are unchanged. Full final-head CI and
manual independent TICK/LAW + REPRO verification pass; the unavailable
Workflow runner is explicitly recorded in the PR.
Review also caught near-unit group-opacity rounding on x86: four new witnesses
each differed by 141 pixels. The shared consumer now restores byte-255 Normal
exactly through both resolved spellings, retaining the original group layer;
lower opacities keep their established arithmetic.
Additional pre-rung source-precision findings, with causes and tick ownership
still unresolved, are retained separately in #136.
Admitted-slice record
· B1 evidence and cost.
The portable CPU path is expensive for many small active groups: about
131.46 ms for 100 Multiply groups at 256×256 on the measured M2 Ultra.
The newly exact ordinary
.999opacity route takes 119.69 ms for 100 groupsin its separate matched test (previously 1.96 ms); lower-opacity and neutral
controls show no measured regression beyond the investigation threshold.
Next is B2a: source extent and intermediate precision, before widening
geometry/modes or adding raster reuse. External I/O, text and v1 remain separate.
softmarshmallow commentedon Sep 7, 2026
Position: B2a's bounded linear-gradient blend correction is merged in
gridaco/nothing#137, tip
64803a87.The wrong-pixel cause was the temporary raster origin: off-phase Multiply and
Screen sources silently differed at 28/56 pixels (maximum channel delta 1).
The consumer now derives rounded extents from actual draws and the current
view, without a shared-contract change, cache or changed blend equation.
Mapped/nested/non-painted source combinations remain guarded by name;
independent review also found omitted stroke extents despite a live fill,
including unresolved/context strokes, and those are now guarded too.
Hosted review additionally aligned the helper's raw stroke-width normalization
with the painter; exact representation-equivalence tests guard that fix.
25 new exact cells; 1,423 primitive/HTML cells total. 22 new named refusals;
325 total. The 16 sampled frames, 16 text-pixel cells and 8 geometry
witnesses are unchanged. No checklist ticks, old oracle/tolerance changes,
conformance score or FLIP change.
Disabling the source clip fails 23 new pixel cells; disabling the omitted-stroke
guard fails the refusal gate and reproduces a 102-pixel best-effort mismatch.
Restoration, full local verification, independent TICK/LAW + REPRO and all
hosted checks pass. No Workflow runner was exposed; the PR records the manual
independent-role fallback.
The follow-up full automated review was rate-limited; the bot explicitly
accepted the targeted fix and both manual roles renewed their focused pass.
Next: preserve source-coordinate-space extent facts before widening blending
to transformed/nested sources or more geometry/modes. Ordinary opacity
(#136), generic coverage/damage and external I/O remain separate.
Admitted slice
· B2a evidence.
softmarshmallow commentedon Sep 8, 2026
Position: B2b complete blend-source domains is merged in
gridaco/nothing#138, tip
0291a26d.Invisible solid strokes can change a gradient group's temporary source extent
even though they paint nothing. Full-old-Frame equality proved that the consumer
could not reconstruct this distinction. An independently maintained, checked
BlendSourceDomainnow carries the complete source-local rectangle and its mapon the existing blend scope, separate from paint, geometry and damage. The first
Web slice preserves transparent/zero-alpha stroke extents beside live rectangular
linear fills; wider source combinations remain guarded.
44 new exact Chromium-gated cells; 1,467 primitive/HTML cells total. Two
obsolete refusal witnesses were promoted into positive cells; six new witnesses
bring the refusal register to 329. The 16 sampled frames, 16 text-pixel cells
and 8 geometry witnesses are unchanged. No checklist ticks, old oracle/tolerance
changes, conformance score or FLIP change.
Independent review caught a root-lowering escape, including a pre-existing bare
root gradient case: both admissions differed at 85 pixels / maximum delta 6.
Both now refuse by stable name; a domain-only fix is not claimed. The numeric
inward-enclosure boundary also refuses at the Web owner before consumer preflight.
Disabling declaration consumption fails 37 new pixel cells; exact restoration
re-gates green. Full local tests/trace/lints, fixture gates, independent manual
TICK/LAW + REPRO, and all final-head hosted checks pass. No Workflow runner was
exposed; the PR explicitly records the independent-role fallback. CodeRabbit
completed without actionable findings. Main is clean and synchronized.
Next bounded extension to evaluate: non-painted sibling contributions, before
transformed/nested sources or wider modes. Native opacity
(#136), generic damage/coverage, text and external I/O stay separate.
Admitted slice
· B2b evidence.
softmarshmallow commentedon Sep 8, 2026
Position: the B2b non-painted sibling extension is merged in
gridaco/nothing#139, tip
ef2e1251.Transparent rectangle siblings can change a gradient group's source area even
when they paint nothing. The existing complete-domain contract now preserves
the bounded unit-opacity sibling contribution without adding paint, damage,
or a new painter path. Geometry/identity and opacity folding stay intact.
70 new exact Chromium cells; 1,537 primitive/HTML cells total. Four former
refusals are preserved as passing cells; 26 new witnesses bring the refusal
register to 351. Sampled/text estates are unchanged. No checklist ticks,
old oracle/tolerance changes, conformance score or FLIP changes.
Independent review caught effect-elision, disabled-gradient, normalized-pattern
and filter-Hide escapes. Empty/zero-region filters silently changed 236/342
pixels (delta one) across shapes, groups, local instances and nested viewports.
These unproved combinations now refuse by name with whole-group rollback;
they are not approximate admissions.
Removing the new source union fails 51 new pixel cells; exact restoration
re-gates green. Both independent manual roles pass, including 284 final CLI
executions. Full local and hosted checks pass; main is clean and synchronized.
No Workflow runner was exposed, and the PR explicitly records the manual
TICK/LAW + REPRO fallback.
CodeRabbit's full implementation review had no actionable findings; its
comment-only documentation follow-up was rate-limited and independently
rechecked by both manual roles.
Next bounded source candidate: zero-element/container-opacity contributors;
mapped/nested sources and wider blend vocabulary remain separate, unproved
profiles. Native opacity, generic coverage/damage, text and external I/O stay
separate.
Admitted slice
· sibling evidence.
softmarshmallow commentedon Sep 10, 2026
Position: the owner-approved assertion-harness pilot is merged in
gridaco/nothing#141, tip
549ece62.Local main is clean and synchronized.
This adds test instrumentation, not SVG support: one described claim gets
PASS / FAIL / UNRESOLVED. Undescribed inputs remain observations. Chromium
stays the selected reference; fresh resvg and historical PNGs are separately
named second opinions, never alternate passes. Expected refusal is distinct
from rendering support.
Two new exact controls; 1,539 primitive/HTML cells total. Refusals remain
351; the 16 sampled frames, 16 text cells and 8 geometry witnesses
are unchanged. All 1,577 pre-existing oracle artifacts are unchanged.
Green→blue changes 160,000 pixels, maximum channel delta 255. Deliberately
perturbing the real solid-paint path failed both fixture and assertion gates;
byte-for-byte restoration re-gated green. 40 contract tests, full relevant
Rust tests/fmt/Clippy, fixture gates/status, link/OSS checks and final-head PR CI
pass. The uploaded hosted report independently records both exact-render
claims and the separate refusal claim as PASS, without integrity errors.
No Workflow runner was exposed. Manual TICK/LAW and REPRO findings were fixed;
the PR explicitly records the final TICK/LAW tool-policy block, rate-limited
final bot review and unavailable interactive viewer preview. No unperformed
approval or UI QA is claimed.
No feature tick, renderer change, old oracle overwrite, capture change,
tolerance, conformance score, FLIP change or legacy retirement.
gridaco/nothing#140 tracks
separately reviewed expansion and legacy succession.
Tool contract and setup.
softmarshmallow commentedon Sep 12, 2026
Position: main is unchanged at
549ece62(#141). The ordinary-opacity repair is in draft, unmerged gridaco/nothing#142, with local tests, sensitivity checks and independent TICK/LAW + REPRO passing.Hosted assertions exposed a repeat-stable Chromium environment split for the .999 blur/pattern/radial cases. Both n0 builds match the committed images, but Linux Chromium differs from the macOS capture. Landing is paused; no goldens, tolerances, capture or reference policy were changed. Main's corpus counts and checklist remain unchanged. The next crux is the canonical capture-environment contract under #140, before resuming this rung.
softmarshmallow commentedon Sep 14, 2026
Position update: draft gridaco/nothing#142 remains unmerged; main is still
549ece62.The three near-unit-opacity Chromium platform disagreements are now explained exactly by the pinned Skia ARM versus x86 source-over arithmetic (measured, not celled). The investigation and explicit reference-environment proposal preserve one portable engine target and immutable references; no policy or CI relocation has been enacted.
A separate completed Linux Rust test also exposes the new blur-arc cell: 25 differing pixels, maximum delta 3. Its retained signature matches the local circle/arc distinction, but complete Linux output and cause are still owed. Both the reference contract and this engine failure must be resolved before landing. No tracked changes, new ticks, score, tolerance, oracle overwrite or FLIP change in this research turn.
softmarshmallow commentedon Sep 18, 2026
Position update: gridaco/nothing#142 is squash-merged as
e6d91f2f; localmainis clean and synchronized.atan2fprecision and repaired at SVG arc resolution. Deliberately restoring the old boundary reproduces the exact retained Linux failure (25 pixels, maximum channel delta 3); restoration returns the gate to green. No geometry substitution or tolerance.Corpus: 1,575 primitive cells (+36), 368 refusal rows (+17), 16 sampled frames, 16 text pixel cells and eight text geometry witnesses. Existing oracle bytes and the sole capture module are unchanged. Full local ten-crate tests including legacy compatibility/doc-tests, workspace strict Clippy, fmt, Node checks, bake/gate/status, links/OSS audit and all PR CI passed. No Workflow runner was exposed; independent manual TICK/LAW and REPRO both passed, explicitly recorded in the PR. Automated review was answered and resolved with measured evidence.
Remaining work stays in gridaco/nothing#136; harness expansion/legacy succession stay in gridaco/nothing#140. No conformance score, FLIP change, external-I/O expansion or tool retirement.