Skip to content

websem: retain non-painted blend sibling extents - #139

Merged
softmarshmallow merged 2 commits into
mainfrom
rung/blend-sibling-extents
Sep 8, 2026
Merged

websem: retain non-painted blend sibling extents#139
softmarshmallow merged 2 commits into
mainfrom
rung/blend-sibling-extents

Conversation

@softmarshmallow

Copy link
Copy Markdown
Member

Measured verdict

Extend B2b's existing complete blend-source domain to unit-opacity, identity-mapped rectangle siblings that contribute an enclosure without painting. A transparent-fill sibling changes a fractional live linear ramp's Multiply/Screen result at 236/342 pixels, maximum channel delta one; invisible width-four solid stroke-only siblings change 291/387. Treating those siblings as absent loses the source origin even though they paint nothing.

The Web producer retains these contributions independently of geometry and opacity passes. An independently maintained n0 consumer unit permits ordinarily validated paintless rectangles inside a declared source without requiring noncontributing geometry enclosure. Painted rectangles/strokes still require enclosure. No new rframe field, painter change, cache, timing claim, or new blend mode.

Review found and closed normalization/elision escapes before admission:

  • Paintless filter/mask/clip and nested-viewport participation survives command elision as a named boundary. Offset/blur prototypes silently differed at 236/342 and 240/350 pixels respectively, delta one.
  • Singular gradients with and without stops are not ordinary stopless contributors. Their prototypes differed at 236/342 pixels, delta one. Private resolution provenance preserves their refusal without changing opacity or fallback semantics.
  • A zero-opacity pattern stays a named resource-profile refusal even though the selected control is exact.
  • Empty filters and zero-region filters silently differed at 236/342 pixels, delta one, across shapes, groups, local instances and nested viewports. All four Hide callers preserve the source boundary.
  • A painted zero-width outlier in an already declared source refuses in the producer, allowing best-effort whole-group rollback before consumer preflight.

These probe numbers are measured, not positive conformance claims. The unproved effect/resource, mapped, zero-element/container-opacity and root profiles remain named refusals. An ancestor clip around an already completed blend stays admitted.

Evidence and scope

70 new byte-exact Chromium cells; 1,537 primitive/HTML cells total. Four old refusal witnesses are preserved as passing cells after exact old/new pair captures and actual CLI verification; only their obsolete refusal assertions/files are deliberately removed. 26 new refusal witnesses bring the named register to 351. The 16 sampled frames, 16 text-pixel cells and 8 real-font geometry witnesses are unchanged.

Every selected candidate was twice captured through the unchanged hash-pinned chromium_capture.ts via probe_harness.ts, and rendered through the product CLI in strict and best-effort admissions. No old oracle, existing manifest row or tolerance changed. No checklist tick, conformance score or FLIP change. Native opacity, generic damage/coverage, text and external I/O remain separate.

Verification

Deliberately excluding only the new paintless source-domain union makes just gate fail 51 new pixel cells. Exact source restoration returns the full gate to green.

Local checks: full nine-crate Web path tests, full n0 trace tests, post-review full websem/n0_cli tests, trace-enabled pixel gate, formatting, strict Clippy, just bake, just gate, just status, link/manifest/oracle checks and pre-PR OSS audit. Producer-neutral consumer tests guard retained identity/geometry, no extra coverage, strict painted enclosure, balanced saves and changed-view reuse equal to fresh.

No Workflow runner was exposed. .agents/workflows/verify-rung.js was read but could not be invoked through a Workflow tool. Its independent TICK/LAW and REPRO roles were reproduced manually; all must_fix and should_fix findings were applied. Final independent verdicts and full local completion are confirmed before opening this PR.

Admitted slice · rung evidence.

Preserve bounded rectangle source contributions independently of visible paint,
using the existing checked blend-source domain. Keep effect, filter-Hide,
disabled-server and normalized-pattern provenance behind named source guards.
The independently maintained consumer admits validated paintless rectangles
without inventing paint, coverage or damage.

Add 70 exact Chromium cells and 26 named refusal witnesses. Promote the old
transparent, fill-zero, empty-gradient and stroke-sibling refusal witnesses
after old/new paired captures and actual CLI equality. Deliberately drop only
their obsolete refusal assertions and files; the semantic witnesses survive
as passing cells. No old oracle, tolerance, checklist tick or FLIP change.

Omitting the new paintless source union fails 51 new pixel cells; exact source
restoration re-gates green. Record manual independent verification because no
Workflow runner is exposed.
@vercel

vercel Bot commented Sep 8, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
nothing Ready Ready Preview Sep 8, 2026 10:28am UTC

Request Review

@coderabbitai

coderabbitai Bot commented Sep 8, 2026

Copy link
Copy Markdown

Review Change StackReview Change Stack

Warning

Review limit reached

Next included review available in 39 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Advanced

Run ID: 3ab16fd9-4ccb-46fd-b57d-1a76031385df

📥 Commits

Reviewing files that changed from the base of the PR and between 5e98801 and 519b6d4.

📒 Files selected for processing (1)
  • crates/websem/src/svg.rs

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Advanced

Run ID: a4a4bebf-606c-4af9-b8cc-0f3660eea16d

📥 Commits

Reviewing files that changed from the base of the PR and between 0291a26 and 5e98801.

⛔ Files ignored due to path filters (170)
  • fixtures/web-first/chromium/svg-group-blend-sibling-multiply-ancestor-clip.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-multiply-boundary.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-multiply-css.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-multiply-display.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-multiply-edge.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-multiply-empty-server.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-multiply-fill-alpha.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-multiply-fill-zero.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-multiply-hidden.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-multiply-inherited.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-multiply-invalid-fallback.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-multiply-missing.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-multiply-multiple.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-multiply-near-opacity.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-multiply-neutral.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-multiply-none-outside-domain.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-multiply-none.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-multiply-normal-elided.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-multiply-outer-opacity.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-multiply-own-opacity.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-multiply-reversed.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-multiply-solid-stroke.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-multiply-stroke-dash.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-multiply-stroke-only.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-multiply-stroke-percent.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-multiply-stroke-px.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-multiply-stroke-thin.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-multiply-stroke-zero.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-multiply-transparent.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-multiply-two-ramps.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-multiply-use.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-multiply-zero-outside-domain.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-promoted-empty-server.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-promoted-fill-zero.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-promoted-solid-stroke.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-promoted-transparent.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-review-multiply-empty-radial.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-review-screen-empty-radial.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-screen-ancestor-clip.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-screen-boundary.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-screen-css.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-screen-display.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-screen-edge.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-screen-empty-server.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-screen-fill-alpha.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-screen-fill-zero.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-screen-hidden.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-screen-inherited.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-screen-invalid-fallback.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-screen-missing.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-screen-multiple.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-screen-near-opacity.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-screen-neutral.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-screen-none-outside-domain.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-screen-none.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-screen-normal-elided.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-screen-outer-opacity.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-screen-own-opacity.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-screen-reversed.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-screen-solid-stroke.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-screen-stroke-dash.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-screen-stroke-only.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-screen-stroke-percent.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-screen-stroke-px.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-screen-stroke-thin.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-screen-stroke-zero.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-screen-transparent.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-screen-two-ramps.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-screen-use.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-group-blend-sibling-screen-zero-outside-domain.png is excluded by !**/*.png
  • fixtures/web-first/svg-group-blend-sibling-multiply-ancestor-clip.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-multiply-boundary.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-multiply-css.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-multiply-display.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-multiply-edge.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-multiply-empty-server.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-multiply-fill-alpha.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-multiply-fill-zero.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-multiply-hidden.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-multiply-inherited.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-multiply-invalid-fallback.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-multiply-missing.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-multiply-multiple.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-multiply-near-opacity.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-multiply-neutral.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-multiply-none-outside-domain.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-multiply-none.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-multiply-normal-elided.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-multiply-outer-opacity.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-multiply-own-opacity.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-multiply-reversed.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-multiply-solid-stroke.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-multiply-stroke-dash.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-multiply-stroke-only.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-multiply-stroke-percent.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-multiply-stroke-px.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-multiply-stroke-thin.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-multiply-stroke-zero.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-multiply-transparent.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-multiply-two-ramps.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-multiply-use.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-multiply-zero-outside-domain.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-promoted-empty-server.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-promoted-fill-zero.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-promoted-solid-stroke.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-promoted-transparent.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-review-multiply-empty-radial.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-review-screen-empty-radial.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-screen-ancestor-clip.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-screen-boundary.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-screen-css.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-screen-display.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-screen-edge.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-screen-empty-server.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-screen-fill-alpha.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-screen-fill-zero.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-screen-hidden.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-screen-inherited.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-screen-invalid-fallback.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-screen-missing.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-screen-multiple.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-screen-near-opacity.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-screen-neutral.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-screen-none-outside-domain.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-screen-none.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-screen-normal-elided.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-screen-outer-opacity.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-screen-own-opacity.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-screen-reversed.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-screen-solid-stroke.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-screen-stroke-dash.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-screen-stroke-only.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-screen-stroke-percent.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-screen-stroke-px.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-screen-stroke-thin.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-screen-stroke-zero.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-screen-transparent.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-screen-two-ramps.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-screen-use.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-group-blend-sibling-screen-zero-outside-domain.svg is excluded by !**/*.svg
  • fixtures/web-first/unsupported/svg-group-blend-linear-extent-empty-gradient.svg is excluded by !**/*.svg
  • fixtures/web-first/unsupported/svg-group-blend-linear-extent-fill-zero.svg is excluded by !**/*.svg
  • fixtures/web-first/unsupported/svg-group-blend-linear-extent-stroke-sibling.svg is excluded by !**/*.svg
  • fixtures/web-first/unsupported/svg-group-blend-linear-extent-transparent.svg is excluded by !**/*.svg
  • fixtures/web-first/unsupported/svg-group-blend-sibling-domain-circle.svg is excluded by !**/*.svg
  • fixtures/web-first/unsupported/svg-group-blend-sibling-domain-mapped.svg is excluded by !**/*.svg
  • fixtures/web-first/unsupported/svg-group-blend-sibling-domain-non-scaling.svg is excluded by !**/*.svg
  • fixtures/web-first/unsupported/svg-group-blend-sibling-domain-opacity.svg is excluded by !**/*.svg
  • fixtures/web-first/unsupported/svg-group-blend-sibling-review-group-blur.svg is excluded by !**/*.svg
  • fixtures/web-first/unsupported/svg-group-blend-sibling-review-group-clip.svg is excluded by !**/*.svg
  • fixtures/web-first/unsupported/svg-group-blend-sibling-review-group-mask.svg is excluded by !**/*.svg
  • fixtures/web-first/unsupported/svg-group-blend-sibling-review-group-offset.svg is excluded by !**/*.svg
  • fixtures/web-first/unsupported/svg-group-blend-sibling-review-hide-empty-group.svg is excluded by !**/*.svg
  • fixtures/web-first/unsupported/svg-group-blend-sibling-review-hide-empty-leaf.svg is excluded by !**/*.svg
  • fixtures/web-first/unsupported/svg-group-blend-sibling-review-hide-empty-use.svg is excluded by !**/*.svg
  • fixtures/web-first/unsupported/svg-group-blend-sibling-review-hide-empty-viewport.svg is excluded by !**/*.svg
  • fixtures/web-first/unsupported/svg-group-blend-sibling-review-hide-zero-region-group.svg is excluded by !**/*.svg
  • fixtures/web-first/unsupported/svg-group-blend-sibling-review-hide-zero-region-leaf.svg is excluded by !**/*.svg
  • fixtures/web-first/unsupported/svg-group-blend-sibling-review-hide-zero-region-use.svg is excluded by !**/*.svg
  • fixtures/web-first/unsupported/svg-group-blend-sibling-review-hide-zero-region-viewport.svg is excluded by !**/*.svg
  • fixtures/web-first/unsupported/svg-group-blend-sibling-review-leaf-blur.svg is excluded by !**/*.svg
  • fixtures/web-first/unsupported/svg-group-blend-sibling-review-leaf-clip.svg is excluded by !**/*.svg
  • fixtures/web-first/unsupported/svg-group-blend-sibling-review-leaf-mask.svg is excluded by !**/*.svg
  • fixtures/web-first/unsupported/svg-group-blend-sibling-review-leaf-offset.svg is excluded by !**/*.svg
  • fixtures/web-first/unsupported/svg-group-blend-sibling-review-nested-clipped.svg is excluded by !**/*.svg
  • fixtures/web-first/unsupported/svg-group-blend-sibling-review-nested-visible.svg is excluded by !**/*.svg
  • fixtures/web-first/unsupported/svg-group-blend-sibling-review-painted-zero-domain.svg is excluded by !**/*.svg
  • fixtures/web-first/unsupported/svg-group-blend-sibling-review-singular.svg is excluded by !**/*.svg
  • fixtures/web-first/unsupported/svg-group-blend-sibling-review-stopless-singular.svg is excluded by !**/*.svg
  • fixtures/web-first/unsupported/svg-group-blend-sibling-review-zero-pattern.svg is excluded by !**/*.svg
📒 Files selected for processing (14)
  • crates/n0/README.md
  • crates/n0/src/glyphless.rs
  • crates/n0_cli/README.md
  • crates/websem/src/svg.rs
  • crates/websem/src/svg_paint_server.rs
  • crates/websem/tests/svg_blending.rs
  • crates/websem/tests/unsupported_corpus.rs
  • docs/wg/consolidation/svg-engine-of-record.md
  • docs/wg/consolidation/web-checklist.md
  • fixtures/web-first/README.md
  • fixtures/web-first/STATUS.md
  • fixtures/web-first/oracle-bake.json
  • fixtures/web-first/primitives.json
  • fixtures/web-first/unsupported/README.md

Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review.


Walkthrough

The compiler now distinguishes selected transparent or stopless sibling paint from absent paint. It tracks hidden and non-painted source boundaries, admits identity-mapped paintless rectangles in glyphless validation, and adds tests and fixtures for the updated blend source-domain behavior.

Changes

SVG sibling source-domain contract

Layer / File(s) Summary
Glyphless paintless rectangle contract
crates/n0/src/glyphless.rs, crates/n0/README.md
Identity-mapped paintless rectangles can remain outside a declared source domain. Transformed, nonrectangular, and painted nodes remain subject to existing validation.
Paint-server resolution states
crates/websem/src/svg_paint_server.rs, crates/websem/src/svg.rs
Stopless gradients resolve separately from disabled servers. Paint resolution carries unresolved source-extent state and applies opacity factors through shared helpers.
Compiler source-domain accounting
crates/websem/src/svg.rs, crates/n0_cli/README.md
The compiler records filtered, masked, clipped, hidden, nested-viewport, and non-painted boundaries. It attaches a blend source domain only when a live linear source exists.
Behavior and refusal validation
crates/websem/tests/svg_blending.rs, crates/websem/tests/unsupported_corpus.rs
Tests cover selected sibling paint, absent-paint exclusion, disabled servers, transactional refusal, and the updated unsupported corpus.
Fixture corpus and contract records
fixtures/web-first/*, docs/wg/consolidation/*
The fixture manifests, oracle data, status records, and engineering documents add sibling-domain cases and update corpus counts.

Estimated code review effort: 4 (Complex) | ~45 minutes

Merge Risk: ⚪ Minimal · up to 5e988

The blend source-domain change retains its documented refusal boundaries and adds matching behavior coverage; no actionable merge risk remains.

Sequence Diagram(s)

sequenceDiagram
  participant SVGCompiler
  participant PaintServerResolver
  participant SpanFacts
  participant BlendSourceDomain
  SVGCompiler->>PaintServerResolver: Resolve fill or stroke paint
  PaintServerResolver-->>SVGCompiler: Return selected, stopless, or disabled state
  SVGCompiler->>SpanFacts: Record geometry and source boundaries
  SpanFacts-->>SVGCompiler: Return linear-source and completeness facts
  SVGCompiler->>BlendSourceDomain: Attach or reject the source domain
Loading
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 76.47% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 17 functions across 4 files. (10 skipped:… Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely describes the main change: retaining non-painted blend sibling extents.
Description check ✅ Passed The description directly explains the blend-source domain extension, preserved refusal cases, test coverage, and verification results.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Full details: Docstring Coverage

Explanation

Docstring coverage is 76.47% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 17 functions across 4 files. (10 skipped: 9 unsupported, 1 too large.)

✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch rung/blend-sibling-extents

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@softmarshmallow

Copy link
Copy Markdown
Member Author

Addressed the documentation advisory in 519b6d4b: five doc-comment lines now
explain the four paint-resolution helpers' selection, opacity-pass and
source-provenance behavior. No executable code, fixtures, manifests or oracles
changed. Both independent manual roles reviewed this exact delta and passed;
the local gate, unit tests, strict Clippy and status freshness were renewed.

The reported ast-grep timeout is an incomplete check, not a success. Independent
source review and the Rust compiler/lints completed; the timeout is not used as
evidence. Hosted checks are rerunning on the final head.

@softmarshmallow

Copy link
Copy Markdown
Member Author

The follow-up CodeRabbit run is rate-limited; its green status explicitly says
“Review rate limited,” so it is not counted as a fresh automated review.
The full review completed on 5e988015 with no actionable merge risk. The final
519b6d4b delta contains only five doc-comment lines and was independently
rechecked by both TICK/LAW and REPRO, with no findings. Local gates/lints were
renewed and the full final-head hosted checks are running. No executable code,
fixture, manifest or oracle changed in the follow-up.

@softmarshmallow
softmarshmallow merged commit ef2e125 into main Sep 8, 2026
15 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant