Skip to content

The stroke-paint rung: the paint grammar celled as twins, the context refusal proven load-bearing - #81

Merged
softmarshmallow merged 1 commit into
mainfrom
rung/stroke-paint
Aug 13, 2026
Merged

The stroke-paint rung: the paint grammar celled as twins, the context refusal proven load-bearing#81
softmarshmallow merged 1 commit into
mainfrom
rung/stroke-paint

Conversation

@softmarshmallow

Copy link
Copy Markdown
Member

What

Checklist-loop iteration 5 — the stroke (<paint>) twin rows, the declared Next from #43. A split, not a tick, exactly as scoped: the checklist is deliberately untouched, and the verify ritual's tick-law audit affirmed the split after arguing both directions.

The cells (suite 217 → 230, every one a byte-identical twin)

  • Seven cells, one oracle — one stroke paint in seven spellings: #4682b4, its name steelblue, the CSS declaration, currentColor against the color hint, an author declaration beating a different attribute, an invalid declaration ceasing to exist so the attribute survives, and a dead url() reference falling back to the same color.
  • Five cells, one oracle — the correct nothings: stroke="none", an invalid paint dropping to that same initial none (the initial value of stroke is none, baked rather than asserted), a dead reference with an explicit none fallback, a dead reference with no fallback, and a valid but stopless gradient whose fallback stays inert — the fill-side reference law, restated on the stroke.
  • svg-gradient-stroke-css — the gradient stroke's CSS spelling bakes onto the committed attribute cell's exact oracle bytes.

Measured beyond the cells, engine ≡ Chromium pixel-for-pixel (recorded as measured-not-celled): a color through var() in every ingress — colors carry no device basis, so indirection is honest here where iteration 4's width had to refuse it — keyword case, transparent, and the CSS-wide keywords including revert-layer, which rolls back one layer so the presentation hint survives where initial/revert land on none. An escaped paint spelling refuses under the stroke patrol's coarse whole-attribute scan where Chromium paints it: declared over-refusal, never a wrong pixel.

Why no tick: the context keywords are load-bearing

The SVG2 grammar is none | <color> | <url> [none | <color>]? | context-fill | context-stroke. The context keywords were measured both ways:

  • On a plain shape, Chromium paints them as nothing (byte-identical to no stroke, both spellings).
  • Under <use> — which this slice admits — a clone's stroke="context-fill" resolves against the use site's own fill (byte-identical to the authored color), and markers do the same.

So the engine's refusal of both keywords is load-bearing, not over-refusal: lowering the plain-document nothing would silently mispaint every instantiated shape. Unlike iteration 4's units, the context keywords have no own checklist row to carry them — the header's partial-admission rule pins both stroke rows unchecked. The refusal gains its register fixture (unsupported/svg-stroke-context-paint.svg, the use-clone form, declared at the clone's own path) and the inline guard grows the attribute and use-clone spellings of both keywords. The remaining work is a context-paint capability rung.

Verification

The verify-rung ritual ran adversarially against the split itself. Repro: all 22 probe pairs reproduced on Chromium 149.0.7827.55, bake verified 230 oracles live, gate 4/4 at the byte-exact bar, 28 suites green, manifests additions-only with all hashes recomputed against disk. The audit's findings were applied before commit: a README row that stamped "(measured)" on unmeasured CSS-wide keywords — the verifier caught revert-layer's distinct restore semantics, which this session then re-measured and recorded precisely — and a statement-of-record clause whose "celled in both spellings" outran the cell inventory, now enumerated in the iteration-4 form. Stroke-cell count refreshed to its true 69-of-70.

… refusal proven load-bearing

Thirteen new Chromium-149-baked cells (suite 217 -> 230), every one a
byte-identical twin. Seven share one oracle -- a hex stroke, its name
steelblue, the CSS declaration, currentColor against the color hint, the
CSS-over-attribute precedence pair, the invalid-declaration fallback, and
a dead url() reference falling back to the same color. Five share the
fill-alone oracle -- stroke none, an invalid paint dropping to that same
initial none, a dead reference with a none fallback or no fallback at
all, and a valid stopless gradient whose fallback stays inert. The
thirteenth bakes the gradient stroke's CSS spelling onto the committed
attribute cell's exact bytes.

No checklist row ticks, on purpose. The <paint> grammar's remaining
members -- context-fill and context-stroke -- were measured both ways:
on a plain shape Chromium paints them as nothing, but a <use> clone
resolves them against the use site's own paint (byte-identical to the
authored color), and markers do the same. This slice admits <use>, so
the engine's refusal of both keywords is load-bearing, not over-refusal:
lowering the plain-document nothing would silently mispaint every
instantiated shape. The refusal gains its register fixture (declared at
the clone's own path), and the inline guard grows the attribute and
use-clone spellings.

Also measured, engine and Chromium agreeing pixel-for-pixel: a color
through var() in every ingress (colors carry no device basis), keyword
case, transparent, and the CSS-wide keywords -- including revert-layer,
which rolls back one layer so the presentation hint survives where
initial and revert land on none. An escaped paint spelling refuses under
the stroke patrol's coarse scan where Chromium paints it: declared
over-refusal, never a wrong pixel. The pre-landing ritual affirmed the
split, and its findings -- a record row stamping (measured) on
unmeasured keywords, and a statement-of-record clause outrunning its
cells -- were applied before this commit.
@vercel

vercel Bot commented Aug 13, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
nothing Ready Ready Preview Aug 13, 2026 10:06am

Request Review

@coderabbitai

coderabbitai Bot commented Aug 13, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@softmarshmallow, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 1 minute

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

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 565e6390-beec-4460-b5c7-012fce2c2c89

📥 Commits

Reviewing files that changed from the base of the PR and between 7f668ec and 4a76e32.

⛔ Files ignored due to path filters (27)
  • fixtures/web-first/chromium/svg-gradient-stroke-css.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-stroke-paint-css-invalid-falls-back.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-stroke-paint-css-over-attr.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-stroke-paint-css.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-stroke-paint-currentcolor.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-stroke-paint-hex.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-stroke-paint-invalid-none.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-stroke-paint-named.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-stroke-paint-none.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-stroke-paint-url-fallback-none.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-stroke-paint-url-fallback.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-stroke-paint-url-missing.png is excluded by !**/*.png
  • fixtures/web-first/chromium/svg-stroke-paint-url-stopless-fallback-inert.png is excluded by !**/*.png
  • fixtures/web-first/svg-gradient-stroke-css.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-stroke-paint-css-invalid-falls-back.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-stroke-paint-css-over-attr.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-stroke-paint-css.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-stroke-paint-currentcolor.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-stroke-paint-hex.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-stroke-paint-invalid-none.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-stroke-paint-named.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-stroke-paint-none.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-stroke-paint-url-fallback-none.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-stroke-paint-url-fallback.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-stroke-paint-url-missing.svg is excluded by !**/*.svg
  • fixtures/web-first/svg-stroke-paint-url-stopless-fallback-inert.svg is excluded by !**/*.svg
  • fixtures/web-first/unsupported/svg-stroke-context-paint.svg is excluded by !**/*.svg
📒 Files selected for processing (8)
  • crates/n0_cli/README.md
  • crates/websem/tests/strokes_contract.rs
  • crates/websem/tests/unsupported_corpus.rs
  • 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

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.

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