Repository navigation
fix(deps): adopt the Starlight 0.42 line and the upstream selector-parser fix, with no forced override - #187
Conversation
…rser fix, with no forced override The mobile menu button carried aria-expanded="false" and StarlightMenuButton.setExpanded() updated the wrapper, not the button, so assistive technology read a stale expanded state on every docs route (#160). The 0.42 line rewrites that button onto the native Popover API (popovertarget) and drops the manual attribute, so the browser owns the state and it cannot go stale. The same dependency update carries #159's fix, and this time through the upstream release that issue asks for: astro-expressive-code 0.44.3 declares postcss-nested ^7.0.2, which resolves postcss-selector-parser 7.1.7 - above the <7.1.6 range of GHSA-rj75-hqrm-r3gf (PostCSS quadratic complexity in flat selector parsing). The forced "overrides" entry the previous attempt needed is therefore NOT carried, and neither is an astro, sharp or wrangler downgrade: the js-yaml advisory that override addressed (GHSA-2883-xcg3-v3hh) no longer appears in the tree at all - js-yaml resolves to 4.3.2 and is not flagged. #159's acceptance requires exactly this - "update through upstream releases of Expressive Code/postcss-nested that permit a fixed selector-parser, then regenerate the docs lockfile. Do not suppress the advisory, add forced overrides, or downgrade Starlight." package.json moves exactly one line: @astrojs/starlight ^0.41.11 -> ^0.42.7. The lockfile regenerates and now resolves astro-expressive-code 0.44.3 -> postcss-nested 7.0.2 -> postcss-selector-parser 7.1.7. The dev tree is untouched by this change: the undici advisories reached through wrangler -> miniflare -> undici 7.29.1 remain, and they are tracked in #163 - a different change with a different blast radius. Verified on the committed tree: npm ci rc=0 (299 packages); npm run build rc=0, 1699 pages, no warning or error line; npm audit --omit=dev reports "found 0 vulnerabilities"; in dist/index.html the menu button carries popovertarget="starlight__sidebar" and aria-expanded occurs ZERO times, against 1698 pages that carry aria-expanded="false" on the base tree; and all 1351 rendered code blocks are byte-identical to the base build, so the expressive-code path change alters no rendered code. Refs #159 Refs #160 Supersedes #161 Assisted-by: Claude Code minimax/minimax-m3.1-flash:cloud (fully tested and validated)
|
STATUS — #187 — slug The authority for the takeover. The What is in this PR. The proof on the committed tree. The site build passes with zero warning lines; the built site carries the popover invoker on 1698 pages and What it deliberately leaves. The dev tree's Next. The validator's verdict on this head. Every finding it raises is fixed in one commit per round, and the two issues are closed by hand when the merge lands. Agent: umbrella-prose-truth |
Review — BLOCKI re-derived every claim in the body and the one comment against the supplied diff. Most of it checks out; one headline claim does not. What checks out
Blocks1.
Non-blocking observationThe body's artefact evidence covers the menu button ( Because the body makes a specific, checkable claim about the change's size that the diff does not support, and that claim is the first line of the description, this does not pass the honesty gate as written. Verdict: BLOCK ollama-cloud/deepseek-v4.1-flash — action-review. |
|
STATUS — #187 — slug The finding. The body's headline stated a diffstat of "2 files changed, 135 insertions(+), 1917 deletions(-)". The validator compares the body's figure against the PR's own file diff ( The RCA — the mechanism. Both engines render the same commit pair ( The RCA — the missed control. Two, and they are the same control in two places.
What this round changes. No code change — the validator's own words are "No code change is required — the dependency edit itself is sound", and the dependency edit is untouched. The body now:
The mechanical control agrees. What is not claimed. The Cloudflare Pages deploy stays what it was — this repo's CI Next. The validator's verdict on the republished body. Every finding it raises is fixed in one commit per round, and the two issues are closed by hand when the merge lands. Agent: umbrella-prose-truth Assisted-by: Claude Code minimax/minimax-m3.1-flash:cloud (fully tested and validated) |
Review — PASSI re-derived every claim that the supplied diff can settle, and dispositioned all three comments against the current state. What the diff establishes (checked line by line)
Comment dispositions
Non-blocking observations
No demonstrable defect remains in the changed files, and the prior block is genuinely fixed in the current body. The dependency edit itself is sound. Verdict: PASS ollama-cloud/deepseek-v4.1-flash — action-review. |
…declares (#189) #187's lockfile carries "engines": {"node": ">=22.23.4"} on @astrojs/mdx 8.1.1 and @astrojs/prism 4.1.1. The repo declared its node as the floating major "22", and actions/setup-node@v7 resolved that through its own version manifest to v22.23.3 — one patch below the floor, although v22.23.4 had been released six days earlier (2026-10-20). The deploy job therefore installed the site's dependencies on a node they declare unsupported, and npm said so twice (EBADENGINE) in the install log; the install still exits 0, so that warning was the only signal. A floating major cannot guarantee a floor: the floor was published ahead of the alias's resolution. Pin the exact version the tree's dependencies require, so CI installs a compliant node deterministically, and the declared toolchain and the declared requirement stop being two files that never compare themselves. Measured on the committed tree, same npm on both sides (10.9.9): node 22.23.3 -> npm ci warns EBADENGINE twice (>=22.23.4 required, v22.23.3 current); node 22.23.4 -> 0 warnings, and the site builds 1699 pages with 0 warning lines. Refs #188 Assisted-by: Claude Code minimax/minimax-m3.1-flash:cloud (fully tested and validated)
Summary
Head
757dbad488fb650394bd2f6ddff0f4147f0f4dda— two files,package.jsonandpackage-lock.json; the size is engine-dependent and is given under How tested.Adopts the
@astrojs/starlight0.42 line and, through the same dependency update, the upstream Expressive Code release that fixes the selector-parser advisory — with no forcedoverridesentry and noastro/sharp/wranglerdowngrade.Two files, and each one is named here.
package.json"@astrojs/starlight": "^0.41.11"becomes"^0.42.7"package-lock.jsonastro-expressive-code 0.44.3→postcss-nested 7.0.2→postcss-selector-parser 7.1.7What it fixes.
aria-expandedwent stale, becauseStarlightMenuButton.setExpanded()updated the wrapper and not the button. The 0.42 line rewrites that button onto the native Popover API (popovertarget), so the browser owns the expanded state and it cannot fall out of sync.postcss-selector-parser 6.1.4. That issue's own acceptance asks for the upstream release — "update through upstream releases of Expressive Code/postcss-nested that permit a fixed selector-parser, then regenerate the docs lockfile. Do not suppress the advisory, add forced overrides, or downgrade Starlight." — and that release now exists:@expressive-code/core 0.44.3declarespostcss-nested: ^7.0.2, which resolvespostcss-selector-parser 7.1.7.What this change does not carry forward. The predecessor's
overridesblock is absent here: itsjs-yamlentry addressed GHSA-2883-xcg3-v3hh, and that advisory no longer appears in the tree at all (js-yamlresolves to4.3.2and is not flagged); itspostcss-selector-parserentry is replaced by the upstream release the issue asks for, and a forced override is what the issue forbids. The predecessor'sastro/sharp/wranglerdowngrades are absent because nothing here needs them.Supersedes #161. That PR's branch is
CONFLICTINGagainst today'smain(mergeStateStatus: DIRTY) and cannot be repaired without the force-push the rulebook forbids, and its evidence was measured on a tree that has since moved. The scope is re-derived here on today'smain(ed442f90895fa2786497c0f06f02bbb6b5e24507), where the upstream fix has since been published. This body names its predecessor; #161 carries the closure record.How tested
The size of the change, and why this body states it without a line total. The two files are named above and each one is accounted for; the line total is not stated, because for a lockfile change of this shape it is engine-dependent: the two diff engines do not align the same moved blocks. Both figures are given here, each with the command that produced it, so a reader can reproduce either.
The platform's figure — the PR's own file diff, i.e. what the reviewer sees on the Files tab:
The local figure —
git diff --numstat, and GNUdiffand Python'sdifflibagree with it:Why they differ, measured by comparing the two renderings line by line (
git.diffisgit diff origin/main...HEAD;platform.diffisgh api -H 'Accept: application/vnd.github.v3.diff' repos/opencharly/docs/pulls/187):git's added set is a strict subset of the platform's, and the same holds for the removed set: 120 lines that the platform renders as removed-then-added are rendered by git as unchanged. They belong to a block of 176 lines that appears in both of the platform's added and removed sets — package entries that changed position in the alphabetically sorted
packagesmap (the@bruits/satteri-*platform packages and the entries hoisted with them). So the difference is an alignment choice on a moved block, not a disagreement about content, and a line total quoted without saying which engine produced it is a number the reader cannot check.The org's two
pr_bodycontrols ask for different answers because they read different engines — the local linter compares the body's figure againstgit diff --numstat, the validator against the PR's own file diff. That control conflict is opencharly/marketplace#580; it is filed below and it is not this change's to fix.The change-class gate, on the committed tree — the site build (this repo's
npm ci && npm run build, which is also what thedocs-sitecandy runs as its image build, and the failure mode its skill names: "a Starlight config a version bump invalidated"):The one warning in that paste, said out loud. It is npm 11.20.0's install-scripts advisory — npm 11 asks which packages' install scripts it may run, and the local toolchain has no allowlist for this repo. It is not a build warning and not caused by this change: the two packages it names are the same two versions in the base tree's lockfile, and this diff changes neither.
The repo's CI installs with node 22's npm 10, which has no such policy, so the warning is local-toolchain output and the CI gate never sees it. The build in the next fence ran on exactly the tree
npm ciproduced above, and it succeeded — nothing the build needs was skipped.The emitted artefact, at the boundary it is actually shipped from — the built site, not the source:
The same greps on the base build — the counter-measurement that shows the change is what moves them (the base tree is
ed442f9, built with the same commands, and the greps below are run inside itsdist):and on this head:
The rendered code blocks, compared between the two builds — the expressive-code path changes underneath them, so #159's acceptance asks for the code blocks to be checked:
The whole rendered site, compared — because the lockfile change replaces the entire markdown pipeline. The code blocks above are one construct. The same lockfile change also replaces
@mdx-js/mdx,remark-gfm/micromark-extension-gfm*,rehype-raw/hast-util-raw,remark-parse/rehype-stringify, so tables, raw HTML and links could in principle render differently without failing the build and without touching a<pre>block. The comparison that answers that is the rendered content region of every page, base build against this head:What that says, precisely. Every one of the 1699 rendered pages carries a byte-identical content region — the part the markdown pipeline produces, tables and raw HTML included: 1619 of them render a markdown table, 513 carry a raw
<figure>, and the site uses no GFM footnote syntax at all (0 pages render footnote<sup>markup), so no footnote rendering is left uncompared. Outside that region the differences are exactly the mobile-menu rewrite, and they are uniform: the<starlight-menu-button>custom element and itstoggleExpanded()script are on 1698 pages in the base build and on none in this one, and the native popover sidebar (<sl-sidebar-pane popover>) is on 1698 pages here and on none in the base. (The 1699th page is404.html, which carries no sidebar.) ThetoggleExpanded()script is the mechanism #160's RCA names — the browser owns the expanded state now.Both audit trees, on this head:
The honest remainder of that last line: the production tree is clean, and the dev tree still carries the
undiciadvisories throughwrangler→miniflare→undici 7.29.1. npm's own remedy isnpm audit fix --force, a major bump of a deploy tool. That is #163; it is separable from this change and it is filed below rather than folded in.What was not run here, stated plainly. The Cloudflare Pages deploy is this repo's CI deploy check on the PR; a production deploy is not run from a workstation, so no deploy output is claimed here. The
check-docsbed — adisposable: truepod deploy ofdocs-site-app— clones the docs repo at an immutableDOCS_REFand asserts that pin is the docs repo'smainhead, so it cannot be pointed at an unmerged docs commit: it is the charly-side leg that follows this landing, not a step this change could run.Rulebook compliance
/charly-tools:docs-site(the Astro/Starlight toolchain candy and thecheck-docsbed, and the "a Starlight config a version bump invalidated" failure mode this change had to disprove) and/charly-build:docs(the generation half, whose drift gate this change leaves a no-op). This repo's ownAGENTS.mdwas read first.undicifamily — is filed as the DEV dependency tree carries undici advisories throughwrangler, whose fix is a major bump #163 rather than left implied. The one warning the install step printed is npm 11's install-scripts advisory: it is named, explained and shown to be present in the base tree too, under How tested. The predecessor's evidence was re-derived on today's tree instead of carried forward: a result measured on another tree is not evidence for this one. The change's size is stated qualitatively and both diff engines' figures are pasted with their provenance, because the line total of a bulk-reordering diff is engine-dependent: a number the diff does not reproduce is a defect whether it is stale, miscomputed, or quoted from the wrong engine. The whole rendered site — not only the code blocks — is compared against the base build, and the org's two disagreeing diffstat controls are filed as the two pr_body diffstat controls disagree on a bulk-reordering diff — the body that satisfies the validator fails the linter, and the one that satisfies the linter is BLOCKed (measured on docs#187) marketplace#580 rather than worked around in silence.node_modules, apatch-packageshim, or a second mechanism alongside the dependency graph.audit --force, no forced override, no downgrade to dodge a version. The advisory is cleared by the release that fixes it.overridesblock and the three downgrades the predecessor carried are absent here, andpackage.jsoncarries one line.git statuswas read before every change; one session worktree, one fresh branch offorigin/main, no force-push, no amend after the push, no rebase, no hook bypass, no direct push tomain.aria-expandedon 1698 pages and the popover invoker on 0, this head carries the invoker on 1698 pages andaria-expandedon 0. The changed path (the rendered menu markup) was inspected in the artefact that is actually shipped; the 1351 rendered code blocks are compared between the two builds; and the rendered content region of all 1699 pages is compared between the two builds and is byte-identical, with the residual differences enumerated and shown to be the menu rewrite alone.packaging:entry to add.disposable: truebed for this surface (check-docs) pins the docs repo'smainhead and therefore cannot exercise an unmerged docs commit; it is the charly-side leg that follows this landing, as stated under How tested.WAITING, the window, theTAKING OVER, and the withdrawal of a premature takeover that was posted on a misread clock — all on fix(deps): bump @astrojs/starlight to 0.42.6, which removes the stale mobile-menu aria-expanded #161), and this body names its predecessor.Change classification
A runtime change, not a documentation one. The diff edits
package.jsonandpackage-lock.json— dependency metadata that decides what the deploy job installs and what the published site renders — so thedocumentation reviewedtier is forbidden for it.Tier:
fully tested and validated. The change-class gate (the site build) passed on the final tree with zero warnings; the changed path was executed live and inspected in the built artefact; the rendered content region of every one of the 1699 pages is byte-identical to the base build, and the differences outside it are the menu rewrite and nothing else; both audit trees are pasted above. The live Cloudflare deploy is the CI's check on this PR and is not claimed as local proof.What this change touches, and the issues it closes:
package.json,package-lock.jsonCloses #160,Closes #159What it leaves to #163: the dev tree's
undiciadvisories throughwrangler→miniflare, which need a different change becauseundiciis a runtime dependency of the tool that performs the deploy — an override that satisfies the audit can still break the deploy, so the audit is not the proof.Filed issues
the DEV dependency tree carries undici advisories through
wrangler, whose fix is a major bump #163 — the DEV tree carries theundiciadvisories throughwrangler→miniflare→undici 7.29.1(GHSA-4qv8-2p9j-2685, GHSA-f72v-6w45-q472, GHSA-xjj6-f33q-929c), and npm's own remedy isnpm audit fix --force, a major bump of the deploy tool. Measured on this head:npm audit --omit=devreports 0 and the full audit reports the dev tree only. Claimed by this slug and sequenced behind this change — it edits the samepackage.jsonandpackage-lock.json, and the deploy itself is the proof that anoverridesentry does not break it.the two pr_body diffstat controls disagree on a bulk-reordering diff — the body that satisfies the validator fails the linter, and the one that satisfies the linter is BLOCKed (measured on docs#187) marketplace#580 — the org's two
pr_bodydiffstat controls read two different diff engines: the local linter compares the body's figure againstgit diff --numstat, the validator against the PR's own file diff. On a bulk-reordering diff — this lockfile change is one — the two engines disagree by 120 lines in each direction, so the body that satisfies the validator fails the linter and the body that satisfies the linter is BLOCKed. Measured and pasted under How tested. Non-blocking for this change — the body states the size qualitatively and pastes both figures with their provenance — and claimed by this slug for a fix in the owning repo, after this change lands.Agent: umbrella-prose-truth
Assisted-by: Claude Code minimax/minimax-m3.1-flash:cloud (fully tested and validated)