Skip to content

The consolidation program — one engine by extraction #43

Open

Description

@softmarshmallow

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_styled adapter 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/grida contracts by subtraction; wasm switch + freeze-contract retirement coordinated with the product side

First three PRs

  1. CI arming
  2. cg crate cut (no n0 changes)
  3. 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 on main, and all post-merge push workflows are green.
  • Required-check ruleset registration — the active main ruleset still contains only deletion and non-fast-forward protection; register consolidation gates / armed and canvas build / build as 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/cg is the skia-free workspace crate, legacy retains grida::cg through a re-export, and the declared 65-fixture sweep is byte-identical. No n0 or frozen-surface change.

Decision tracker index

Activity

  1. softmarshmallow commented on Jul 20, 2026

    @softmarshmallow
    MemberAuthor

    Decision-issue filing sweep — captured-essence ledger (2026-07-20)

    Patrol

    Name and cut

    Gate evidence

    • 12/12 trackers are open and labeled migration.
    • 12/12 state the decision question, decision time, evidence bar, guardrails, completion record, and explicit owner gate.
    • Paired decisions are cross-linked; all authored document links target main; no local or commit-pinned links were introduced.
    • No registry decision was taken. 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.

  2. softmarshmallow commented on Jul 20, 2026

    @softmarshmallow
    MemberAuthor

    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 produced 182bb7f23418efcb77ad75f17dbac6ac9a90bc36. #44 closed automatically.

    Post-merge gate evidence

    All push workflows on the merge commit completed successfully:

    The frozen surfaces remain untouched. The local worktree remains clean.

    Remaining administration

    A read-only ruleset audit found that the active main ruleset 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.

  3. softmarshmallow commented on Jul 30, 2026

    @softmarshmallow
    MemberAuthor

    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.

    • Scoreboard v0 landed — feat(consolidation): add sealed scoreboard v0 #60 merged: the sealed grida_dev scoreboard subcommand 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.
    • Web-First Amendment ratified (2026-07-21) — web-first.md: one engine kernel, source-native semantic models, one provisional resolved render contract (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.
    • Decisions taken (registry updated in the charter; tracker issues still open for the record):
      • D-L (2026-07-23) — SVG paint enters through official-upstream Stylo, pinned at a64923b5d5c6… (svg-paint-cascade.md)
      • D-C (2026-07-23) — cg is the shared leaf-vocabulary seat, taken for the glyphless vector scope; AMD-dependent and text leaves stay open
      • D-M vector stage (2026-07-23) — glyphless visual facts join high into the shared downstream (n0-join-point.md); the text stage stays open
      • D-N (2026-07-24) — the n0 path (websem → rframe → n0) is the SVG engine of record, static and animated; htmlcss::svg demoted to frozen semantics donor (svg-engine-of-record.md)
    • The evolution ladder is running — five capability rungs plus a law repair on main since the cutover, each Chromium-baked and law-pinned (dated addenda in the D-N register):
      • best-effort becomes the host default (07-24); viewport rung (07-25); basic-shapes rung, container rung, paths rung, strokes rung + the tiger, the committed cub scene (07-26); the closed-contour cap defect closed (07-27).
      • Admitted at tip: <rect> <circle> <ellipse> <path> (no arc) <line>, solid fill + solid centred stroke, <g> + the SVG transform-attribute grammar, SVG2 §8.2 root sizing with full preserveAspectRatio, one exact-time <animate attributeName="x"> on a top-level rect. 77 + 10 Chromium-baked cells.
    • In review — fix(websem): close the load-active SMIL hole; arm the locks; widen the refusal register #62: the load-active SMIL hole closed (the register's one recorded silent wrong pixel, measured wider than recorded: zero declarations in both admissions at the host), the refusal corpus widened 20 → 45 rows to the classes the next rungs graduate, the websem/rframe/n0 architecture locks armed in the seam CI job, and the charter/orientation corrections.
    • Still open, blocking row-1 exit: FLIP (decision(FLIP): ratify the per-suite conformance-bar flip rule #49) — the Web-first row-1 exit and the Phase 2 exit both read through it.
    • Still open, carried from PR 1: required-check registration — consolidation gates / armed and canvas build / build are not yet required on the main ruleset.
    • Lanes not started: anchor-spec WG graduation; the htmlcss font-provider study (D-D evidence).
  4. softmarshmallow commented on Jul 30, 2026

    @softmarshmallow
    MemberAuthor

    Position update:

    • fix(websem): close the load-active SMIL hole; arm the locks; widen the refusal register #62 merged — the load-active SMIL hole closed (the register's one recorded silent wrong pixel), the refusal corpus widened 20 → 45 rows, the websem/rframe/n0 architecture locks armed in the seam CI job, charter/orientation corrections.
    • The points rung landed — feat(websem): the points rung — <polygon> and <polyline> #63: <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). The svg-polygon/svg-polyline refusal rows graduated, and the L0 basic-shapes scene now renders every shape — its remaining declared holes are the text labels and one rounded rect.
    • Next on the contract-neutral ladder, per the register: display/visibility, the translucency pair (fill-opacity + translucent sRGB), shape-geometry percentages, the CSS transform property, then <use>/<defs> (needs the id table). First contract widening remains the arc (ConicTo), which per method.md wants its amendment ratified before code.
  5. softmarshmallow commented on Jul 31, 2026

    @softmarshmallow
    MemberAuthor

    Position update — the loop is running direct-to-main now (rungs land as the established 3-commit pattern, CI-gated on push):

    • The capability-status view landed — 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.
    • The visibility rung landed — display: none and visibility consumed (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: visibility is per-element (a visible descendant un-hides inside a hidden container — the cell forces the reading), and the oracle corrected a probe — a standalone document's outermost <svg> ignores display: none while an embedded root generates no box, so the compiler splits by entry.
    • Next contract-neutral pulls: the translucency pair (fill-opacity + translucent sRGB), shape-geometry percentages, the CSS transform property, <a>, then <use>/<defs>.
  6. softmarshmallow commented on Jul 31, 2026

    @softmarshmallow
    MemberAuthor

    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):

    • The translucency rung — 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. Element opacity stays refused by design — it is the group scope's first producer. Seven cells (99 total at that tip).
    • The percentages rung — shape-geometry and stroke-width percentages resolve against SVG2 §7.10's bases (viewBox user units when present; x/width, y/height, radii and stroke widths against the normalized diagonal). The 10%-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 dead UnsupportedLength variant retired.
    • The anchor rung — <a> admitted as a container sharing <g>'s compiler and patrols (SVG2 §16.2: href is 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 transform property, <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.

  7. softmarshmallow commented on Jul 31, 2026

    @softmarshmallow
    MemberAuthor

    Position update — the transform rung lands (2026-07-31)

    The CSS transform property is consumed, and the rung dissolved the SVG transform attribute 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: none included, invalid CSS falls back — is the cascade's own, pinned by precedence laws and baked cells, not reimplemented.

    • 40-measurement probe matrix before code (fixtures/local/transform-probes, untracked): origin verdict (SVG used transform-origin 0 0 = the local user-space origin, held even under a negative-min viewBox against 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.
    • Two measured behavior flips: a malformed attribute list drops whole and renders untransformed (all 23 previously-refused lists re-baked as drops — Chromium-exact, celled, BadTransform retired), and -webkit-transform graduated with its property (the pinned Stylo implements the alias — verified when the name left the scan denylist).
    • Corpus 106 → 119, all byte-exact through websem → rframe → n0 on the first render. Refusal register 37 → 40: svg-css-transform-property graduated; transform-origin, transform-box, the beyond-2D function family, and the individual rotate/translate/scale properties 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 in svg-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, and clip-path references), then the animatable-attributes widening on the existing f32 sampler.

  8. softmarshmallow commented on Jul 31, 2026

    @softmarshmallow
    MemberAuthor

    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/y as the appended translate) and skips <defs> by name.

    • 31-measurement probe matrix before code. The load-bearing verdict is the styling boundary: selector matching against an instance is totally scoped to the cloned subtree — #id/class/type match, but nothing involving an outside ancestor does, not defs > rect, not use > rect, not even svg 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.)
    • The measured correct nothings render as nothing, each baked as pixels: an unresolved reference, a mutual reference cycle, a reference to a shadow-including ancestor. Chains expand through with push/pop cycle guards; indirect cycles beyond the measured shapes hit the chain budget and refuse loudly. External references, authored children, and <symbol> targets refuse by name.
    • color joined the admitted hint set (the currentColor basis — measured through an instance).
    • Corpus 119 → 139 (the largest single rung yet), all byte-exact through websem → rframe → n0 on the first render. Refusal register: svg-use graduates, four rows enter (stylesheet, external, authored-children, symbol); svg-path-marker-end's defs half stopped declaring, leaving marker-end itself as its named hole.

    Commits: feat 4d27654c, fixtures 690bb9e1, docs aa724c2d. Statement of record updated (crates/n0_cli/README.md); addendum in svg-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 ConicTo in rframe and rounded rects, which completes the basic-shapes scoreboard toward FLIP eligibility (#49, owner-gated).

  9. softmarshmallow commented on Jul 31, 2026

    @softmarshmallow
    MemberAuthor

    Position update — the gradient rung lands (2026-08-01)

    The engine's first non-solid paint, and the ladder's first contract amendment: rframe's SolidPaintStack became PaintStack, admitting linear and radial gradients from the shared cg leaf seat (D-C) — visible, normal-blend; sweep/diamond/image/non-normal stay construction rejections. The repo law "rframe cannot 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.

    • 72-measurement probe matrix before code. The verdicts that shaped the architecture: gradientTransform is the transform property's presentation attribute on gradient elements (attr ≡ author CSS byte-identically, plain transform inert, transform: none disarms, 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-opacity are Gecko-only at the D-L pin — author CSS on stops now refuses by name, closing a silent drop) with currentColor resolving against the gradient's own ancestor chain.
    • Ramps dither, and the dither is byte-exact. Chromium dithers gradient ramps with Skia's ordered matrix; the painter sets the same flag and the dither pattern itself bakes byte-identical. fill-opacity over a gradient multiplies at the backend's 8-bit alpha step (measured ×128/255, not ×0.5) — pinned in the painter.
    • The glyphless preflight is wired. The once-deferred path paint-box decision is taken (tight-bounds origin as a unit-space pre-translate), and preflight_gradients — now generic over the drawlist owner — runs inside the glyphless compile: an unshadeable gradient is a named BuildError, never a painter panic reachable from hostile SVG.
    • Corpus 139 → 166. 27 gradient cells, 26 byte-exact on the first gate run. Two carry the new ramp-quantization tolerance, 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-server graduates; five named rows enter (focal radial, linearRGB interpolation, sheet stop-color, style-attr stop-color, font-relative geometry units).
    • The tracker went visual. The generated STATUS.md now renders every baked cell as a click-through thumbnail gallery of its committed Chromium oracle — which byte-exactness makes the engine's own render — with the refusal register beneath. Zero new images committed; the freshness gate keeps it un-driftable.

    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, fixtures ae456675, docs 33093dcc. Statement of record updated (crates/n0_cli/README.md); addendum in svg-engine-of-record.md; the new SVG checklist ticks its paint-servers section.

    Next: the elliptical arc's ConicTo amendment 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.

  10. softmarshmallow commented on Aug 5, 2026

    @softmarshmallow
    MemberAuthor

    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 textlayout became 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):

    • Glyph identity joins bit-exactly; placement and metrics are the scaler's. n0's producer facts pass through its scaler backend, and which facts arrive exact is platform-dependent (CoreText: exact pen x, 2⁻¹⁴ metrics; FreeType: exact metrics, 2⁻¹⁶-short advances — pixel-visible when realized exactly).
    • Replay is the engine's matched policy. The two builds fail in opposite directions: CoreText replay fringes 432 non-bilevel bytes on the admitted lattice against exact outlines; FreeType replay is lattice-exact only because its subpixel snapping rewrites the producer's quantized placement. The producer/replay pair cancels only inside the engine — split across a contract, each side is a silent wrong pixel somewhere.
    • The fact is a resource reference — realizing it requires a digest→bytes environment and an undeclared-key refusal, the boundary rframe's identity refuses and n0::glyphless is 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.

  11. softmarshmallow commented on Aug 5, 2026

    @softmarshmallow
    MemberAuthor

    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.

  12. softmarshmallow commented on Aug 6, 2026

    @softmarshmallow
    MemberAuthor

    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 its A-command contour, so Geometry grew 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 the drawOval construction's, not the conic curve's. svg-path-arc and svg-rect-rounded graduated; UnsupportedPathCommand is deleted (every d command letter emits); CSS rx/ry joined the d-property patrol, closing a latent silent-divergence class; the checklist ticks rx/ry.

    Next. With rx/ry in hand, the register's named row-1 scoreboard construct no longer waits on capability: the corpus-growth step (rx/ry rows into svg-rect-path-v0 as 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.

  13. 45 remaining items

  14. softmarshmallow commented on Sep 3, 2026

    @softmarshmallow
    MemberAuthor

    Position after #128 (10f94f4c): T5b is ADMIT/SPLIT with no checklist closure.

    textlayout-v6 now 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.

  15. softmarshmallow commented on Sep 4, 2026

    @softmarshmallow
    MemberAuthor

    Position after #129 (9b53e7c0): T5c is ADMIT / SPLIT. textlayout-v7 now performs deterministic nearest static face selection inside the first reached declared family, in stretch → style → weight order. Equal winning tuples still refuse as AmbiguousFace; required synthetic bold/italic refuses as SyntheticFaceRequired before shaping.

    Evidence: one new exact-byte Chromium cell with 16 discriminating branches; every losing mutation changes 85 pixels at max delta 255; the actual n0 CLI 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.

  16. softmarshmallow commented on Sep 4, 2026

    @softmarshmallow
    MemberAuthor

    Position after #130 (6031a9c6): T6 is ADMIT / SPLIT with no checklist closure.

    textlayout-v8 now 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; rframe still 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; 94535c95 added 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.

  17. softmarshmallow commented on Sep 4, 2026

    @softmarshmallow
    MemberAuthor

    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, viewBox mapping, descendant percentage bases, bounded nesting, and the Chromium non-root overflow/clipping behavior without adding SVG identity to rframe. Review caught the two-value overflow presentation 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.

  18. softmarshmallow commented on Sep 4, 2026

    @softmarshmallow
    MemberAuthor

    Position after #132 (d66d5dbf): VE1 is CLOSE / SPLIT. The direct SVG vector-effect presentation-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.

    rframe now carries only source-neutral StrokeSpace::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 separate markerUnits="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.

  19. softmarshmallow commented on Sep 5, 2026

    @softmarshmallow
    MemberAuthor

    Position after #133 (f5f61d12): the direct SVG paint-order presentation-attribute row is closed.

    • Admitted: the complete normal | [ fill || stroke || markers ] grammar, inheritance, omitted-operation completion, marker placement, opacity scope, transforms, <use>, and the admitted paint/resource routes.
    • Kept separate: the CSS property spelling remains open and refused because the pinned Stylo has no paint-order longhand. Live substitution functions on an effective multi-operation attribute order refuse by stable name; inert substitutions remain admitted.
    • Evidence: 30 new primitive/HTML cells plus 1 text cell. The corpus is now 1,157 primitive/HTML Chromium-baked cells plus 16 sampled frames; text has 16 pixel cells and 8 geometry cells; the named refusal register has 234 rows.
    • Sensitivity was proven against five deliberate faults: normalizing all orders, forcing markers last, dropping deferred opacity, duplicating fill/stroke identity, and inspecting inert functions too early. Each failed the intended pixel or contract gate before restoration.
    • All hosted CI and CodeRabbit passed with no actionable review findings. No Workflow runner was exposed, so independent TICK/LAW and REPRO reviews were performed manually and recorded in the PR.

    The CSS-property twin and marker sources outside the admitted solid/context-marker program remain explicit follow-ons, not silent pixels.

  20. softmarshmallow commented on Sep 6, 2026

    @softmarshmallow
    MemberAuthor

    Position: RG1 radial circles merged in gridaco/nothing#134, tip fd4097f2.

    fx / fy / fr now carry the bounded number/percentage/px slice through
    an 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.

  21. softmarshmallow commented on Sep 7, 2026

    @softmarshmallow
    MemberAuthor

    Position after #135 (7e1d30d7): B1 SVG group blending is
    merged. 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 .999 opacity route takes 119.69 ms for 100 groups
    in 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.

  22. softmarshmallow commented on Sep 7, 2026

    @softmarshmallow
    MemberAuthor

    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.

  23. softmarshmallow commented on Sep 8, 2026

    @softmarshmallow
    MemberAuthor

    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
    BlendSourceDomain now carries the complete source-local rectangle and its map
    on 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.

  24. softmarshmallow commented on Sep 8, 2026

    @softmarshmallow
    MemberAuthor

    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.

  25. softmarshmallow commented on Sep 10, 2026

    @softmarshmallow
    MemberAuthor

    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.

  26. softmarshmallow commented on Sep 12, 2026

    @softmarshmallow
    MemberAuthor

    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.

  27. softmarshmallow commented on Sep 14, 2026

    @softmarshmallow
    MemberAuthor

    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.

  28. softmarshmallow commented on Sep 18, 2026

    @softmarshmallow
    MemberAuthor

    Position update: gridaco/nothing#142 is squash-merged as e6d91f2f; local main is clean and synchronized.

    • Ordinary-opacity blur, repeating-pattern and radial-source precision cases are repaired. Source enclosure is an explicit resolved contract, separate from opacity and damage. Unsupported composition profiles remain named transactional refusals; both opacity checklist rows are open. No new tick.
    • The separate Linux authored-arc defect was traced to negative-axis atan2f precision 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.
    • The assertion harness now checks two obligations against one immutable reference set: portable n0 pixels, and fresh Chromium reproduction in the declared canonical ARM environment. Both required CI jobs passed. Actual browser ABI/hash/revision, kernel and raster identity are checked; engine-only success is never reference certification. Common instrument integrity remains mandatory.

    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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions