Skip to content

Investigate pre-existing SVG source precision under ordinary group opacity #136

Open

Description

@softmarshmallow

Measured finding

Ordinary group-opacity source controls found while verifying #135
already depart from Chromium on the pre-rung fd4097f2 build. This is not a
regression from its byte-255 restore correction: the retained pre-rung binary,
evidence-only 7d42ab20 binary and corrected consumer produce identical PNG
bytes for every successful output in the 24-source matrix (both admissions).

Measured on CPU N32 raster, macOS arm64, Rust 1.92.0 / Skia 0.99.0, against
twice-deterministic Chromium 149.0.7827.55 captures through the repository's
unchanged hash-pinned capture module and probe harness. These are measured,
not celled
. No new tolerance, oracle replacement, conformance score or FLIP
change is proposed.

Source inside ordinary opacity group Opacity .999 Opacity .998
Circle with Gaussian blur sigma 4, unrotated 25 differing pixels, maximum channel delta 3 25 pixels, maximum delta 2
Circle with repeating pattern, unrotated 1 pixel, maximum delta 1 1 pixel, maximum delta 1
Circle with radial ramp, rotated 15 degrees 1,312 pixels, maximum delta 1 1,307 pixels, maximum delta 1

Strict accepts these sources without a named departure; best effort gives
the same image without degradation. Neighboring ordinary circle, ellipse,
curved path, round stroke, curved clip and admitted alpha-mask controls are
exact. Rotated pattern/mask and small-kernel blur controls separately reach
their existing stable refusal names before and after the correction.

Retained blur reproduction

This is the exact retained source, not a claimed minimal reduction. Unused
definitions are intentionally retained; deleting them has not been measured.

<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64"><defs><radialGradient id="rg"><stop stop-color="#d76843"/><stop offset="1" stop-color="#5bace1" stop-opacity=".4"/></radialGradient><pattern id="p" width="8" height="8" patternUnits="userSpaceOnUse"><rect width="4" height="8" fill="#d76843"/><rect x="4" width="4" height="8" fill="#5bace1" fill-opacity=".6"/></pattern><clipPath id="c"><circle cx="30" cy="30" r="22"/></clipPath><mask id="m" maskUnits="userSpaceOnUse" x="0" y="0" width="64" height="64"><rect width="64" height="64" fill="white" fill-opacity=".7"/></mask><filter id="f" x="-30%" y="-30%" width="160%" height="160%"><feGaussianBlur stdDeviation="4"/></filter></defs><rect width="64" height="64" fill="#426589"/><g opacity=".999" transform="translate(0 0)"><g filter="url(#f)"><circle cx="30" cy="30" r="20" fill="#d76843"/></g><rect x="38" y="34" width="18" height="20" fill="#5bace1" fill-opacity=".6"/></g></svg>

Changing the group opacity to .998 gives the other measured blur control.
For the pattern pair, replace only the filtered-circle group with
<circle cx="30" cy="30" r="24" fill="url(#p)"/>. For the radial pair,
use <circle cx="30" cy="30" r="24" fill="url(#rg)"/>, change the outer
transform to rotate(15 32 32), and change the unused blur definition back
to stdDeviation="1"; those are the measured matrix sources.

Render the source through cargo run -p n0_cli --bin n0 -- input.svg out.png 64x64 --strict and without --strict. Capture via the
probe harness,
not a separate browser recipe. Capture-module SHA-256:
069296201718c43d29efe356fbea893781b73250dca51de3b6d47468d74027b0.
Retained pre-rung CLI SHA-256:
0c134a4192100693b30c6620e220985c31c07123740716f8b24fc5a6b97d7d5f.

Follow-up work

  1. Minimize each source with exact measured pairs; compare with no opacity
    before assigning causality to opacity, source materialization or a backend.
  2. Determine whether an existing ratified cell-local ramp/arc precision rule
    actually applies. A small delta alone is not justification for tolerance.
  3. Fix true semantic departures or quarantine them by a stable name in both
    admissions; reassess the affected feature row if its grammar has a gap.
  4. Add discriminating Chromium cells through just add, bake without
    overwriting, and prove gate sensitivity.

Keep this separate from the bounded authored-blending profile and from
#87, #88 and #93; no common cause
with those issues has been established.

Both opacity checklist rows and <radialGradient> are currently ticked.
Pre-existence establishes no regression from the B1 correction, not that
those obligations are unaffected. Cause and tick ownership remain unresolved;
if attribution proves a closed-row defect, its repair/refusal and tick
disposition must follow. No additional B1 production change or new tolerance
is justified by these still-unclassified measurements alone.

Activity

  1. softmarshmallow commented on Sep 12, 2026

    @softmarshmallow
    MemberAuthor

    The retained blur/pattern/radial causes have a locally verified repair in draft, unmerged gridaco/nothing#142: completed blur-source materialization and a checked complete local source enclosure across rframe. The proposal adds 36 exact cells and 17 refusal witnesses, and reopens both opacity rows for the remaining composition profiles.

    Landing is paused on a new independently verified Chromium environment disagreement. Linux n0 and macOS n0 agree with the committed references, but same-version Linux Chromium differs in the three .999 cases; .998 controls agree. This is measured, not celled, and its OS/architecture/backend cause is not isolated. No reference, tolerance or CI policy was changed to suppress it.

    This issue remains open. The repair is not on main, and neither remaining source-composition work nor the new reference-environment question is claimed complete.

  2. softmarshmallow commented on Sep 18, 2026

    @softmarshmallow
    MemberAuthor

    The bounded repair is now merged in gridaco/nothing#142, e6d91f2f.

    The retained blur, repeating-pattern and radial cases now match their immutable Chromium references exactly in both admissions and repeats. Active blur source preparation and ordinary-opacity source enclosure are repaired; zero-area contributors cannot fabricate an enclosure. A separate Linux authored-arc precision dependency was isolated and fixed, with an exact mutation/recovery proof. Required Linux and canonical ARM checks both passed against the same images.

    36 positive cells and 17 named-refusal witnesses protect the admitted slice and its boundaries. Both opacity checklist rows have been reopened: independent child mappings, shear/unequal scale, paths, complex strokes, incomplete contributors and unsupported source placement remain explicit refusals. Bare multi-operation paint-server sources feeding filters/masks also retain a separate refusal.

    Keeping this issue open for those remaining composition profiles. This repairs the measured cases; it does not claim complete opacity support or resolve #88.

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

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions