Skip to content

SVG-a1: inline <svg> (path, rect, circle; fill, stroke, stroke-width) on web, proven by a strict outline differential against Chrome; native refused as SVG-a2 - #206

Open
thejackshelton wants to merge 37 commits into
masterfrom
svg-a1
Open

thejackshelton wants to merge 37 commits into
masterfrom
svg-a1

Conversation

@thejackshelton

@thejackshelton thejackshelton commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

This PR is SVG-a1, the compiler and web half of coverage-rank lane 16 (inline SVG, reach 395). The spec is /tmp/specs/svg-a.md, approved by the PM ruling of 2026-10-05: interior-sample pixel proof plus a strict, Chrome-proven outline differential, in two sequential unstacked PRs. Native drawing is SVG-a2, off master after this one lands.

It adds an inline <svg> laid out as a block-level replaced box (REPL-a's model), drawing <path>, <rect> and <circle> with fill, stroke and stroke-width from CSS or presentation attributes. It is proven on web against Chrome, in both directions. Native refuses <svg> as SVG-a2.

What changed

  • The svg property family (css/properties/svg.ts, one line in FAMILIES): fill, stroke and stroke-width, all inherited, with Chrome's grammars (gen-css-grammar overrides):

    • <paint> takes <color>, which webref's grammar omits.
    • stroke-width is one non-negative length, percentage or (SVG quirk) number. thin and comma lists are invalid in Chrome (probed).

    A unitless stroke-width computes to px. Animation kind is UNADMITTED. The native hit test models the family, since it paints no box; without that, the UA fill on html refused every interaction case.

  • Elements and the UA dataset:

    • svg joins REPLACED_TAGS; path, rect and circle join SUPPORTED_TAGS.
    • The UA capture now creates SVG-namespace elements (createElementNS). It captures svg (overflow hidden) and the shapes (transform-origin: 0 0) into the replaced-key tables.
    • A shape is its <svg>'s content and never a box: the layout lowering already skips a replaced element's children, and the computed checks give shapes only the SVG checks.
  • Attributes (analysis/elements/svg.ts):

    • Geometry: d, x, y, width, height, cx, cy, r, viewBox.
    • The paint presentation attributes, and an svg's or rect's width/height, become presentational hints.
    • Hints now beat inheritance too. They are a declaration below author rules (css-cascade-5 §6.1); before this, hints were only checked for non-inherited properties.
  • Path data, viewBox and numbers (analysis/elements/svg-path.ts) are parsed as Chrome builds them:

    • Numbers are summed digit by digit in float32. For example, -0.785 is -0.7849999666213989, not the nearest float.
    • Relative points and smooth reflections are float32 sums.
    • Quadratics stay quadratics.
    • A moveto right after a moveto replaces it.
    • Arcs are refused as SVG-arc, because Chrome builds them with the platform sinf, cosf and atan2f.
  • Bounds (packages/layout/src/svg-geometry.ts): Skia's ComputeTightBounds, its extrema and eval helpers, TrimmedBounds for paths of lines only, and gfx::BoundingRect's next-float growth. All are ported in float32 and registered in docs/ports.json (SkGeometry.cpp and .h, SkPathPriv.cpp and .h, rect_f.cc).

  • The strict outline differential (parity/src/svg-compare.ts, part of the host layout lane). Every shape's getBBox, getScreenCTM, getBoundingClientRect and computed fill/stroke/stroke-width must equal Dragon's as doubles or strings, with no allowance.

    • The viewBox and client-rect arithmetic follow Chrome's observed order:
      • the limiting axis is scaled and the other is centred in user units;
      • corners are mapped to the border box in double, rounded to float32, then the origin is added in float32.
    • Both are pinned against captured CTMs and rects.
    • Five plants each fail it: control-point bounds, viewBox ignored, meet as slice, one-step client rect, and fill and stroke swapped.
    • The capture records getBBox and getScreenCTM for SVG shapes only, so every other capture is byte-identical apart from the new longhands.
  • Refusals, each with a reject fixture or a unit test naming its package:

    • An inline <svg>: RF-INL, as for img.
    • A viewBox without width and height: SVG-ratio.
    • Non-px units and percentage stroke-width: SVG-units.
    • Arcs: SVG-arc.
    • <g>, text, nesting, shapes outside <svg>, and CSS geometry on shapes: SVG-b.
    • url() and context paints: SVG-paint.
    • Dash attributes: SVG-dash.
    • Cap, join, miter and fill-rule: SVG-stroke.
    • Opacities: SVG-opacity.
    • The transform attribute and preserveAspectRatio: SVG-transform.
    • <svg> on native: SVG-a2.

    In the parity lanes, native lays out the svg box without its shapes. As with SELD-R2's lane-only interaction, its rows prove nothing for native, and device samples inside an undrawn svg box are dropped (paint-samples/image.ts).

  • Fixtures (group svg, ltr and rtl):

    • svg-basic: path with cubics, quads and smooth curves; rect; circle.
    • svg-viewbox: meet on each axis, offset viewBoxes, padding and border, CSS size over the attributes, no viewBox, the 300x150 default, and float32-sensitive decimals with exponents.
    • svg-paint: inheritance, currentcolor, attribute against CSS precedence, none, and a unitless stroke-width.
    • svg-flex: svg as a flex item.
    • Ten rejects.

Review round (precomputed review of 1f834fa)

  • Medium: the hit lane. hitRefusal now refuses every case with an <svg> by name: "hit testing an svg's shapes comes with SVG-a2". Chrome hits the painted shapes (visiblePainted), which the hit test doesn't model yet.
    • hit-report.test.ts pins the refused set as exactly the transform cases plus the 8 svg cases.
    • rt-vectors/hit/facts.json is regenerated without them.
    • hit-report.test passes, including the pointerEventsNotInherited plant.
  • Medium: attribute values bypassed the profile. An SVG paint attribute (fill, stroke, stroke-width) now resolves with a stand-in declaration at its element's start tag (Declaration.presentationHint). usedKeys therefore keys it like a CSS declaration, and the same rows decide both.
    • A value no context proves is reported as DRAGON_UNSUPPORTED_VALUE naming the attribute, as checkValues reports the CSS value.
    • New test: fill="#ff0000", fill="red", fill="rgba(255, 0, 0, 0.5)", fill="transparent" and stroke="#00f" are each blocked with exactly the diagnostics their CSS equivalents give. Proven rgb() and number values compile from either.
    • The regen now also derives stroke:none (paint/ltr and rtl) from svg-paint's stroke="none" attribute, and the tailwind sweep shows all 6 svg utilities compiling on web.
  • Low: viewBoxTransform. The engine's viewBoxTransform (svg-geometry.ts) now uses Chrome's arithmetic: it branches on the ratio and centres in user units (with a slice flag for meetOrSlice). svg-compare uses it directly, so there is one implementation, pinned by the captured CTMs.
  • Passed:
    • pnpm typecheck.
    • pnpm regen via /tmp/job.sh svga1-regen3, fixed point after 3 passes.
    • 49 targeted test files, 750 tests, now including packages/parity/test/hit-report.test.ts.

Rows promoted (web only, all exact, each in paint/ltr and paint/rtl)

  • fill:<rgb()>, fill:currentcolor, fill:none
  • stroke:<rgb()>, stroke:none
  • stroke-width:<length-px>, stroke-width:<number>

No native rows: SVG-a2 adds them after the driver's device run.

The tailwind sweep shows 5 of its 6 svg utilities now compile on web.

Music-player north-star delta

Only the supported-tags list in the <button> refusal messages changes (it now names svg, path, rect and circle). The music player has no SVG in its tree, so nothing new compiles or is refused.

What passed

  • pnpm typecheck.
  • pnpm regen via /tmp/job.sh svga1-regen and svga1-regen2, reaching a fixed point. Earlier attempts stopped on lane checks (hit-test facts, lane-only profile refusals and the native frames check); I fixed those in source, as the commits say.
  • 48 targeted test files, 741 tests, all passing. They include the new dragon/test/svg.test.ts and parity/test/svg.test.ts, chrome-ports, both registry-claims, the identity tests, the UA and paint-role tests and the android profile test.
  • The svg fixtures passed both host lanes live in Chrome, including the strict differential. They also pass it offline against the committed captures in parity/test/svg.test.ts.
  • The full pnpm test was not run, per the lane contract. Device lanes are the driver's job; native-lanes.ts records them as not yet run (device step pending).

Changed tests, and why

  • dragon/test/block-elements.test.ts: the element table excludes the shape tags, which read replaced keys as the replaced tags do.
  • dragon/test/ua-elb2.test.ts: the replaced-key tables list svg and the shapes. A new pin checks their UA values.
  • dragon/test/s4b.test.ts: stroke-width gets two width values instead of the colour pair. The "(iii) colour conversion stays in css/color.ts" check and the same scan in dragon/test/ua.test.ts exempt analysis/elements/svg-path.ts by path. That follows the fonts, forms and media/viewport.ts precedent: the file reproduces Chrome's float32 path-number arithmetic, and svg.test.ts pins it.
  • dragon/src/css/math.ts: stroke-width takes the number-or-length-percentage math grammar, as its syntax gives. This is source, but math-validity.test checks it.
  • parity/test/replaced-identity.test.ts: the svg fixtures postdate REPL-a and hold a replaced leaf on purpose, so they are excluded from "earlier" fixtures. The count of REPLACED fixtures is still pinned at 6.
  • parity/src/hit-capture.ts, used by hit-capture-identity: the identity strip removes the svg family's keys as well as pointer-events. Every base file therefore still differs from the base only by keys a package added, and svg.test.ts proves the family's own values.

Outside the spec

Notes for the PM

  • The spec named element:svg-style rows, but Dragon has no element-level rows. The svg element is gated by its refusals and proven by its fixtures.
  • Presentation-attribute colour syntaxes are not row-gated (hints are not declarations). Each is proven per fixture by chrome-dual.

Reviewed diff: about 151 KB. All regenerated output is under .macroscope/ignore.md shapes. The spec is at /tmp/specs/svg-a.md.

Land-prep round (2026-10-08, cloud)

Review round: independent review of 7787d4b

  • Medium: the svg differential was one-sided (svg-compare.ts). compareSvg walked only Dragon's scene shapes. Two callers also turned null svgScenes into [], so a shape Chrome paints but Dragon drops passed.
    • compareSvg now takes readonly SvgScene[] | null.
    • Every captured node with svg geometry must be one of Dragon's scene shapes; otherwise the problem reads "Chrome captured an SVG shape that no Dragon svg scene has".
    • Null scenes with captured shapes now fail.
    • The opposite direction (a scene shape Chrome did not capture) was already reported.
    • pipeline.ts and svg.test.ts pass the scenes through without ?? [].
    • New case in parity/test/svg.test.ts. It drops one shape from the first scene of each case (exactly one problem per case), empties every scene list, and returns null scenes. Each fails the differential. All three passed as [] before the fix.

Catch-up merges (2026-10-09)

Review round: independent review of 0c6ada6

  • Medium (parity/src/hit-capture.ts): the identity strip removed the svg family at any value. withoutPointerEvents had fill, stroke and stroke-width in KEYS_SINCE_BASE, so a base file that gained a non-initial value would still hash to the base.
    • Fix: the family is now stripped only at its initial values, fill: rgb(0, 0, 0), stroke: none and stroke-width: 1px, in LONGHANDS order, as GEN-b's neutral longhands are (SVG_JSON and SVG_CSS). KEYS_SINCE_BASE is back to pointer-events and the radii.

    • hit-capture-identity.test.ts: the svg case now checks two things.

      • The neutral triple is stripped, in both JSON and CSS.
      • A non-initial fill (rgb(30, 90, 200) or none), stroke (rgb(200, 40, 40)) or stroke-width (2px) each still differs from the base.

      The old any-value strip fails this: it removed those values.

    • The base-hash case still passes on CI, so the 2471 base files gained only the neutral triple.

  • Mutation check of the new dragon svg case (the svg and GEN-b refusals both fire), run locally. It fails when the shapes' checkSvg call is removed, and it fails when GEN-b's list-marker refusal is disabled. It passes when both are restored.

Catch-up merge (2026-10-09, after #196 and #231 stalled)

What passed on the clean head 565cdba

  • pnpm typecheck (local).
  • Platform-free, local:
    • dragon block-elements, casc-property, lists, s4b, s5, seams, svg, ua-elb2, ua, registry-claims and profile-index (11 files, 143 tests).
    • The latest batch's dragon tests: casc-layer, markers-text, anim-runtime, media-wiring and state-program (5 files, 118 tests).
  • pnpm ci:regen svg-a1 --head 565cdbab1a: already at a fixed point. https://github.com/compiled-run/dragoncss/actions/runs/37934126509
  • pnpm ci:test-files at https://github.com/compiled-run/dragoncss/actions/runs/37934142200, all passing:
    • parity: 564 tests
    • svg: 6
    • hit-report: 9
    • hit-capture-identity: 9
    • hit-lanes: 6
    • pixel-reference: 12
    • glyph-calibration: 8
    • line-breaks: 11
    • native-host: 347
    • device-lanes: 62
    • pnt2-quads: 5
    • pnt2-samples: 7
    • replaced-paint: 13
    • p6a-dash-oracle: 330
    • replaced-identity: 3
    • chrome-ports: 13
    • parity registry-claims: 8
    • android-profile: 5
    • casc-property: 3
    • casc-layer: 3
    • list-style-parse: 1
    • ovfl-metrics: 14
    • dist: 6
    • env-engine: 8
    • fixture-reader: 7
    • fonts-fixtures: 26
    • inline: 13
    • interaction-forced: 3
    • media-runtime: 8
    • media-sweep: 19
    • phrasing-blockified: 3
    • platform: 12
    • tree-faults: 3
    • values: 72
    • lanes.test.ts: 365 passed and 1 failed. The failure is "every device lane ran", which is device step pending.
  • Superseded head 0633c38: https://github.com/compiled-run/dragoncss/actions/runs/37899278032
  • pnpm pr:review 206 --once: exit 0. It reports UNREVIEWED (Macroscope at its spending limit), with 0 unanswered findings. GitHub reports the PR as clean.

🤖 Generated with Claude Code


Generated by Claude Code

…ect> and <circle> with fill, stroke and stroke-width on web, proven by a strict outline differential against Chrome

- The svg property family (fill, stroke, stroke-width; inherited), with Chrome's grammars, and the SVG presentation attributes as
  hints below author rules (they now beat inheritance too).
- svg as a replaced key and the shapes as UA keys (the UA capture creates SVG-namespace elements); svg is a replaced element whose
  shapes are its content; tags, attributes, structure and values refused with named packages (SVG-arc, SVG-units, SVG-b, SVG-paint,
  SVG-dash, SVG-stroke, SVG-opacity, SVG-transform, SVG-ratio); native refuses svg as SVG-a2 (lane-only, like SELD-R2).
- Path data, viewBox and number attributes parsed as Chrome builds them (analysis/elements/svg-path.ts); bounds as Skia's
  ComputeTightBounds and gfx::BoundingRect (packages/layout/src/svg-geometry.ts).
- The parity layout lane compares every shape's getBBox, getScreenCTM, getBoundingClientRect and computed paint with Dragon's
  exactly (svg-compare.ts), with five plants; the fixture reader reads SVG foreign content; device samples inside an undrawn svg
  box are dropped until SVG-a2.
- Fixture group svg: svg-basic, svg-viewbox, svg-paint, svg-flex (ltr and rtl) and ten rejects.
…kGeometry, SkPathPriv, rect_f.cc BoundingRect)
…t (it set fill on html, refusing every interaction case)
…BBox values, the viewBox and client-rect arithmetic against captured CTMs and rects, the fixtures' strict differential and its five plants; retargeted pins for the svg family and keys (element table, replaced keys, paint-role pairs, the float32 exemption for svg-path.ts, the identity checks, stroke-width's number-or-length math grammar)
…n2: pnpm regen, fixed point; the svga1-regen runs that failed on lane checks were fixed in source and rerun): the grammar with fill, stroke and stroke-width, the Chrome UA dataset with the svg and shape keys, every capture and emitted rule with the svg family's keys, the svg fixtures' captures, vectors and break vectors, the web profile rows, NOTICES, the native lanes record, the hit facts, the translated unions and corpus, the tailwind sweep and the north-star check
…-a2; SVG paint attributes keep a stand-in declaration so the support profile checks them as the same CSS value; viewBoxTransform is Chrome's arithmetic, which the differential now uses
…en3: pnpm regen, fixed point after 3 passes): the hit facts without the svg cases, the web profile rows (stroke:none from svg-paint's attribute), the lanes record, the translated unions and corpus, and the tailwind sweep
…sform- cases (their reason) and the eight named svg cases (the SVG-a2 reason), from test/hit-refusals-svg.ts beside #91's hit-refusals.ts
@thejackshelton

Copy link
Copy Markdown
Contributor Author

Landing stopped at step test (pnpm land)

packages/parity/test/parity.test.ts, rerun alone on a quiet machine, exited 1 (log /tmp/land-206-test-solo-1.log)
 ❯ packages/parity/test/parity.test.ts:303:57
    301|     expect(dual.boxesEqual).toBe(dual.boxesCompared);
    302|     expect(dual.channelsEqual).toBeLessThan(dual.channelsCompared);
    303|     expect(dual.problems.every((p) => /color/.test(p))).toBe(true);
       |                                                         ^
    304|   });
    305|

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/1]⎯


 Test Files  1 failed (1)
      Tests  1 failed | 489 passed (490)
   Start at  02:32:58
   Duration  82.84s (transform 1.17s, setup 0ms, import 1.54s, tests 81.24s, environment 0ms)

Found by bisecting the batch #206 #201 (2 proofs): master passes, adding #206 fails.

Fix the cause, then hand #206 back to the landing queue with the new clean head.

…losures, no Math.min/max/sqrt or DataView: subset helpers and sqrtF64, a power-of-two next-float); the colour-only plant test accepts exactly the colour longhands plus fill and stroke, which the plant moves too
…egen, fixed point after 2 passes): the translated unions and strings
…: capture.ts records an svg shape's bbox and CTM beside INL1a's inline-box line fragments; hit-capture.ts hitRefusal refuses transforms, then an <svg> by name, then INL1a's inline box or <br> (rt-hit.ts); parity.test.ts imports COLOR_LONGHANDS beside iosLayoutProjection; hit-refusals-svg.ts folds into master's shared hit-refusals.ts (SVG_OUT, SVG_REASON beside INLINE_OUT), and hit-report.test.ts and lanes.test.ts judge the exact union of the three named refusals
…ed display inline, laid out by SVG as Chrome's LayoutSVGShape) records no <id>:line<j> fragments
claude and others added 8 commits October 8, 2026 19:20
Commands: pnpm regen --skip lanes-host --skip tw-sweep (macos-26) and pnpm regen --only lanes-host (xcode-27), alternated
to a fixed point, then pnpm regen --only tw-sweep (macos-26).
Base: 76f2a78
Run: https://github.com/compiled-run/dragoncss/actions/runs/37831539343
…> fragments (pins 2011c9b's capture.ts fix: a shape's computed display is inline, but SVG lays it out)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WSkSiXMPXTAsNpS9BD9LDR
…mputed-checks.ts walks with OVFL's scroller and checkPercentRelative and gives an svg shape only SVG-a1's checkSvg; replaced-identity.test.ts excludes OVFL's overflow-replaced and the svg fixtures as later fixtures with replaced leaves, and pins both REPLACED at 6 and the excluded set

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WSkSiXMPXTAsNpS9BD9LDR
Commands: pnpm regen --skip lanes-host --skip tw-sweep (macos-26) and pnpm regen --only lanes-host (xcode-27), alternated
to a fixed point, then pnpm regen --only tw-sweep (macos-26).
Base: 6c2fc83
Run: https://github.com/compiled-run/dragoncss/actions/runs/37840937873
…tual conflicts locally (GitHub's conflict is in generated outputs the dragon merge driver keeps; regen rebuilds them)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WSkSiXMPXTAsNpS9BD9LDR
Commands: pnpm regen --skip lanes-host --skip tw-sweep (macos-26) and pnpm regen --only lanes-host (xcode-27), alternated
to a fixed point, then pnpm regen --only tw-sweep (macos-26).
Base: d6b7a4e
Run: https://github.com/compiled-run/dragoncss/actions/runs/37848611592
…e.svg) must be one of Dragon's scene shapes, and null svgScenes (no resolved case) with captured shapes fails instead of passing as []; pipeline.ts and svg.test.ts pass the scenes through without ?? []. svg.test: dropping one shape per case, every scene, or returning null scenes each fails the differential (review finding on 7787d4b)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WSkSiXMPXTAsNpS9BD9LDR

Copy link
Copy Markdown
Contributor Author

LAND-READY
READY svg-a1:206:205b6b35eff8dc147fe9331a3e6fda6839e55403

Lane receipt (PM session A): pnpm typecheck pass; platform-free dragon {block-elements,s4b,svg,ua-elb2,ua,registry-claims,profile-index} pass (local, at 205b6b3); ci:regen https://github.com/compiled-run/dragoncss/actions/runs/37856505325 (already at a fixed point at 205b6b3); ci:test-files https://github.com/compiled-run/dragoncss/actions/runs/37860530081 (tested 205b6b3 at 205b6b3: parity 532, svg 6, hit-report 9, replaced-identity 3, chrome-ports 13, parity registry-claims 8, android-profile 5, and the fixture-wide set p6a-dash-oracle 312, dist, env-engine, fixture-reader, fonts-fixtures, inline, interaction-forced, media-runtime, media-sweep, phrasing-blockified, platform, tree-faults, values all pass; lanes.test "every device lane ran" is device step pending); pr:review 206 --once exit 0 (UNREVIEWED: Macroscope spending limit).

Independent Claude review at 205b6b3 (Medium or higher only). The first review at 7787d4b found that the SVG differential was one-sided; 205b6b3 fixes it with a test that fails without the fix, and the re-review of that fix is clean:

{"pr":206,"head":"205b6b35eff8dc147fe9331a3e6fda6839e55403","findings":[]}

Generated by Claude Code

@thejackshelton thejackshelton added the land-ready Reviewed clean; the Mac landing driver takes it label Oct 8, 2026 — with Claude
@thejackshelton thejackshelton removed the land-ready Reviewed clean; the Mac landing driver takes it label Oct 9, 2026
claude and others added 7 commits October 9, 2026 01:49
…into svg-a1. Conflicts: hit-capture.ts hitRefusal refuses transforms, then an <svg> by name (SVG-a2), then a rounded corner (PNT1), then INL1a's inline box; withoutPointerEvents uses master's KEYS_SINCE_BASE, which now lists the svg family (fill, stroke, stroke-width) beside the radii, with a new hit-capture-identity case; hit-report.test.ts and lanes.test.ts judge the exact union of the four named refusals (transform, radius, inline, svg)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WSkSiXMPXTAsNpS9BD9LDR
Commands: pnpm regen --skip lanes-host --skip tw-sweep (macos-26) and pnpm regen --only lanes-host (xcode-27), alternated
to a fixed point, then pnpm regen --only tw-sweep (macos-26).
Base: 653f1d6
Run: https://github.com/compiled-run/dragoncss/actions/runs/37871598420
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WSkSiXMPXTAsNpS9BD9LDR
Commands: pnpm regen --skip lanes-host --skip tw-sweep (macos-26) and pnpm regen --only lanes-host (xcode-27), alternated
to a fixed point, then pnpm regen --only tw-sweep (macos-26).
Base: 221e278
Run: https://github.com/compiled-run/dragoncss/actions/runs/37876508813
…conflicts locally (GitHub's conflict is in generated outputs; regen rebuilds them)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WSkSiXMPXTAsNpS9BD9LDR
Commands: pnpm regen --skip lanes-host --skip tw-sweep (macos-26) and pnpm regen --only lanes-host (xcode-27), alternated
to a fixed point, then pnpm regen --only tw-sweep (macos-26).
Base: 9fa89a5
Run: https://github.com/compiled-run/dragoncss/actions/runs/37880889006
…erty) into svg-a1. Conflicts: properties.ts keeps GEN-b's lists family, then SVG-a1's svg family last; gen-css-grammar.ts SUBSET keeps GEN-b's content and list-style entries, then SVG_LONGHANDS last; computed-checks.ts keeps checkSvg beside GEN-b's checkComputed(…, faults: GenBFaults) signature; s4b.test.ts and ua.test.ts keep both single-file rounding exemptions (CASC 2's css/chrome-number.ts and SVG-a1's analysis/elements/svg-path.ts)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WSkSiXMPXTAsNpS9BD9LDR
github-actions Bot and others added 6 commits October 9, 2026 06:33
Commands: pnpm regen --skip lanes-host --skip tw-sweep (macos-26) and pnpm regen --only lanes-host (xcode-27), alternated
to a fixed point, then pnpm regen --only tw-sweep (macos-26).
Base: 563d475
Run: https://github.com/compiled-run/dragoncss/actions/runs/37889551569
…dth) and GEN-b's list-marker refusal both fire, so checkSvg and checkComputed's GEN-b checks stay side by side after the #218 merge

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WSkSiXMPXTAsNpS9BD9LDR
…ly at their initial values (rgb(0, 0, 0), none, 1px, in LONGHANDS order), as GEN-b's neutral longhands are, not at any value; hit-capture-identity.test: each non-initial fill, stroke or stroke-width still differs from the base (review finding on 0c6ada6)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WSkSiXMPXTAsNpS9BD9LDR
… layers, #232 GEN-c counter text) into svg-a1. Conflict: stylesheet.ts Declaration keeps SVG-a1's presentationHint beside CASC 3's layer (a hint applies only when no author declaration, layered or not, wins)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WSkSiXMPXTAsNpS9BD9LDR
Commands: pnpm regen --skip lanes-host --skip tw-sweep (macos-26) and pnpm regen --only lanes-host (xcode-27), alternated
to a fixed point, then pnpm regen --only tw-sweep (macos-26).
Base: 366f8c2
Run: https://github.com/compiled-run/dragoncss/actions/runs/37923589554
… a paint presentation attribute, which sits below every author layer (after the #233 merge)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WSkSiXMPXTAsNpS9BD9LDR

Copy link
Copy Markdown
Contributor Author

LAND-READY
READY svg-a1:206:565cdbab1af58b7712c0d4f6a647240bdc93cfa1

Lane receipt (PM session A): master merged through b97cf50 (#208, #198, #210, #101, #218, #216, #203, #102, #233, #232; resolutions in hit-capture.ts, hit-report/lanes tests, properties.ts FAMILIES, gen-css-grammar SUBSET, computed-checks.ts, s4b/ua exemptions, stylesheet.ts Declaration with both presentationHint and layer). pnpm typecheck pass; 16 platform-free files pass (local, at 565cdba); ci:regen https://github.com/compiled-run/dragoncss/actions/runs/37934126509 (already at a fixed point at 565cdba); ci:test-files https://github.com/compiled-run/dragoncss/actions/runs/37934142200 (tested 565cdba at 565cdba: 35 files incl. parity 564, svg, hit-capture-identity, hit-lanes, casc-layer, pixel-reference, native-host and the fixture-wide set, all pass; lanes.test "every device lane ran" is device step pending); pr:review 206 --once exit 0 (UNREVIEWED: Macroscope spending limit).

Note for the driver: #206 conflicts with #196 (math.ts, s4b.test.ts, hit-capture.ts, hit-refusals.ts, hit-report.test.ts, lanes.test.ts; all additive) and #231 (layout/src/index.ts). Whichever lands later needs its lane's catch-up.

Independent Claude review history (Medium or higher only): at 7787d4b (one-sided SVG differential) and 0c6ada6 (svg family stripped at any value in the identity hash), both fixed with tests that fail without the fix; re-reviews clean at 205b6b3 and 0633c38; the final merge with #233/#232/#203/#102 and the layer-vs-hint test are clean at 565cdba:

{"pr":206,"head":"565cdbab1af58b7712c0d4f6a647240bdc93cfa1","findings":[]}

Generated by Claude Code

@thejackshelton thejackshelton added the land-ready Reviewed clean; the Mac landing driver takes it label Oct 9, 2026 — with Claude
@thejackshelton thejackshelton added the landing-failed The landing driver stopped this PR; see its comment label Oct 9, 2026
@thejackshelton

Copy link
Copy Markdown
Contributor Author

Landing stopped at step regen (pnpm land)

pnpm regen exited 1 (log /tmp/land-206-regen.log)
Error: Cannot find package '/private/tmp/dragon-land/packages/dragon/node_modules/css-tree/index.js' imported from /private/tmp/dragon-land/packages/dragon/src/css/properties/radius.ts
    at legacyMainResolve (node:internal/modules/esm/resolve:201:26)
    at packageResolve (node:internal/modules/esm/resolve:774:12)
    at moduleResolve (node:internal/modules/esm/resolve:855:18)
    at defaultResolve (node:internal/modules/esm/resolve:988:11)
    at #cachedDefaultResolve (node:internal/modules/esm/loader:697:20)
    at #resolveAndMaybeBlockOnLoaderThread (node:internal/modules/esm/loader:714:38)
    at ModuleLoader.resolveSync (node:internal/modules/esm/loader:746:52)
    at #resolve (node:internal/modules/esm/loader:679:17)
    at ModuleLoader.getOrCreateModuleJob (node:internal/modules/esm/loader:599:35)
    at ModuleJob.syncLink (node:internal/modules/esm/module_job:162:33) {
  code: 'ERR_MODULE_NOT_FOUND'
}

Node.js v24.15.0

Fix the cause, then hand #206 back to the landing queue with the new clean head.

This branch has not been deployed

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

Labels

landing-failed The landing driver stopped this PR; see its comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants