Skip to content

Agent/claude/release 0.13.1 - #58

Open
catgarret wants to merge 7 commits into
mainfrom
agent/claude/release-0.13.1
Open

catgarret wants to merge 7 commits into
mainfrom
agent/claude/release-0.13.1

Conversation

@catgarret

Copy link
Copy Markdown
Owner

No description provided.

…entrance; WebKit shard flakes

Every CI run since #52 spent 60-140 s more on the third WebKit shard than on
the others (lane 202-284 s against about 140 s; the measured-time split
predicts 134 s for each). The check-run annotations show why: two tests failed
their first attempt there and passed on a retry.

reveal-variant-browser (native mask and wipe: "must render intermediate
frames"). The rAF clock that drives Reveal's mask, wipe and clock entrances
without GSAP added the whole gap between frames. A probe that puts one 300 ms
frame right after the start showed 0 frames in motion for mask and wipe in
both WebKit and Chromium: a short entrance finished inside that one frame and
the element simply appeared. Each frame now advances at most
MAX_FRAME_STEP_MS (four 60 Hz frames, the limit frameEase() already used,
now one named constant in src/utils.js), so the same probe shows 10 frames in
motion. New case in tests/reveal-variant-browser.mjs: two 300 ms frames at
the start of a native mask and wipe; fails on the old clock (0 frames), passes
in Chromium, WebKit and Firefox. The sampling window also runs until every
entrance has completed (at least 450 ms, at most 2.5 s), so a late start on a
slow runner cannot read as "no motion" or "never finished".

components-a11y tilt-rest waited a fixed 1.2 s, but the default smoothing
needs about 1.05 s of 60 Hz frames to settle, so a runner that dropped frames
still saw the tilt moving. It now waits for the rest (at most 4 s) and a
failure reports how long after the last move frames were still requested.

Verified in this container: the WebKit shard 11/11 in 2.2 min with no retry,
the Chromium browser lane 48/48 with no retry, Node lane 65/65, lint.

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

scan() finds every module of an engine tier with one selector made of all
their [data-kt-*] attributes. jsdom 30 and later reject a selector longer
than 2048 characters (browsers have no limit), so an app that registers
enough modules of its own got a RangeError from autoInit() in its unit tests.
Found while trying Dependabot's jsdom 30 bump (#7): tests/performance-runtime
registers 100 modules, a 2.3 KB selector.

queryAny() joins the attribute selectors up to the limit and starts another
selector when the next one would pass it. The built-in registry (about 1.1 KB)
is still one traversal. With several selectors, an element they share is
collected once, and the union is put back in document order, so each module
still creates its elements top to bottom. The test now emulates the limit on
the root (querySelectorAll and matches throw past 2048): two traversals for
100 modules, every selector within the limit, and one element matched by two
selectors created once per module, after the element before it. The old code
fails it with the RangeError.

The rest of #7 stays on hold: jsdom 30's CSSOM keeps background-position-x/y
after removeProperty('background-position') (jsdom 29 and browsers remove
them), which test:leak reports as a Scroll Shadows leftover.

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

Squircle measured the element once at create. Inside a hidden panel (a
closed tab, accordion or dialog) the box is 0x0, so nothing was written, and
only the polyfill path had a ResizeObserver: in Chromium, which draws with
the native corner-shape property, a squircle in a hidden tab stayed a plain
rectangle after the tab opened. The native path also wrote a percentage
cornerRadius in pixels once, so it no longer matched the box after a resize.
Both paths now observe the box; apply() already skips an unchanged box.

tests/browser/squircle.mjs creates both paths inside display:none, shows the
panel, and resizes a 50% radius. The old native path fails it (radius "").

scripts/audit-hidden-panel.mjs (npm run audit:hidden-panel) is how this was
found: every module with demo markup is created visible, visible again, and
inside display:none shown 80 ms later, and the script lists those whose
layout boxes, node count or inline style differ only because they were
created hidden. Modules whose two visible runs already differ are skipped,
and understood differences are listed in one place with the reason. After
the fix, 51 modules compare equal in Chromium, WebKit and Firefox. It is a
tool for changes to how a module measures itself, not a CI gate (a few
minutes per engine).

Verified: squircle in Chromium, WebKit and Firefox; Node lane 65/65; the
Chromium browser lane 48/48 with no retry; lint.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FauCMhuVzQvUy2RZAXchUa
…pens; audit --each

Without GSAP (blocked or offline, or a data-saver device on the low
performance tier) Reveal decides "in view" with an IntersectionObserver on
the element, then measures the element without the transform it animates.
A slide-left/right waits one whole element width aside. On a page that clips
horizontal overflow (overflow-x: clip on html/body, common where things
slide in), a wide card shows the observer only a sliver of that moved box,
under the 10% threshold. Created while its panel was closed, the card got no
further report when the panel opened (no scroll, no threshold crossing) and
stayed at opacity 0 in Chromium, WebKit and Firefox.

observeBoundaries() now also runs its check from a ResizeObserver, so the
size change from 0x0 when the panel opens wakes it; the decision is still
made on the unmoved box. (Widening the observer's root sideways was tried
first and does nothing here: the html/body clip cuts the intersection before
the root is applied.) The same check now resolves a percentage top/bottom
rootMargin against the viewport height, as IntersectionObserver does; it
used the width.

tests/browser/reveal-hidden-panel.mjs (both browser lanes) blocks GSAP's
CDN, creates a full-width slide-right and slide-left inside a closed panel
on a clipping page, and opens it: the old code leaves both at opacity 0
after 3 s in all three engines, the fix plays them in about 420 ms.

audit:hidden-panel gains --each (every distinct demo variant of a module,
not only the first), which is how the two demo cards were found: 291
variants in Chromium, none differ after this fix.

Verified: the new gate in Chromium, WebKit and Firefox (and failing on the
old code in all three); Chromium browser lane 49/49 with no retry; the
reveal/lifecycle subset in WebKit and Firefox; Node lane 65/65 (one retry of
the Bootstrap integration's accordion reveal, which also flakes under load
on the old code — it runs on the GSAP path, not the one changed here).

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

v0.13.0 was tagged on a green commit, then the release workflow's
all-lockfile audit failed on new undici advisories (GHSA-rfgv-xxqx-mfg5,
GHSA-w293-vg96-wgc3 and eight lower) published after CI ran. Nothing
reached npm and the tag cannot be moved, so 0.13 first ships as v0.13.1.

- package-lock.json: undici 7.29.0 -> 7.30.0 (jsdom's ^7.25.0 range, dev
  only). audit:lockfiles reports 0 across all five lockfiles.
- scripts/ship-release.mjs: after CI passes and before `git tag`, run
  scripts/audit-lockfiles.mjs; a failure stops with the version unused
  and says how to fix it.
- tests/release-automation.mjs: the audit runs after the CI wait and
  before the tag, its failure message says no tag was created, and the
  release workflow still runs audit:lockfiles.
- docs/RELEASING.md, CHANGELOG [Unreleased] (EN/KO: first-published 0.13
  bullet, release:ship audit, undici), docs/QA_REPORT.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FauCMhuVzQvUy2RZAXchUa
The first published 0.13 release: why v0.13.0 did not publish, the
pre-tag lockfile audit, and the hidden-panel / Reveal clock / jsdom 30 /
WebKit shard fixes it carries.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FauCMhuVzQvUy2RZAXchUa
First published 0.13 release: v0.13.0 was tagged but its release audit
failed on new undici advisories, so nothing reached npm (0.12.3 is still
latest). Bumps every tracked version source, moves the bilingual
Unreleased notes into [0.13.1], writes .github/release-notes/v0.13.1.md
and regenerates the contract docs, builds, registry, MCP contract copies,
module-cost and consumer bundle tables.

Also: AI-HANDOFF records the version npm actually serves (0.12.3, seen
with npm view) and that v0.13.0 never published; the QA section for this
batch is labelled v0.13.1.

Verified: npm run verify (lint, build, Node 65/65, demo QA, Chromium
browser lane 49/49, pack, all-lockfile audit 0) and release:check.

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

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, you can upgrade your account or add credits to your account and enable them for code reviews in your settings.

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

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants