fix(deps): take the fix for the four OSV advisories blocking every manifest PR - #14736
Conversation
…nifest PR `Validate Package Dependencies` (OSV-Scanner against pnpm-lock.yaml) exits 1 on four fixable advisories, so every PR touching any package.json is red: GHSA-6gmq-8vp8-gcm6 @xmldom/xmldom 0.8.13 -> 0.8.15 GHSA-6gmq-8vp8-gcm6 @xmldom/xmldom 0.9.11 -> 0.9.12 GHSA-4mjr-xmp4-gh2g qs 6.15.3 -> 6.16.0 GHSA-x5fp-wj9c-mxmx qs 6.15.3 -> 6.16.0 All four name a fixed version, so this is the take-the-fix path osv-scanner.toml's header describes, not the exemption path. That ledger keeps its zero entries and is untouched here, as is .github/workflows/validate-deps.yml. Both packages are transitive-only; nothing in the workspace declares either. Every dependent's declared range already admits its own fixed version (xml-encryption ^0.8.6, samlify ^0.8.11, xml-crypto ^0.8.10, better-auth/sso ^0.9.10, body-parser ^6.15.2, express ^6.14.0), so each entry is a dedupe onto the patched line rather than a forced upgrade past what a dependent supports - the dompurify / nanoid shape the overrides block already documents. @xmldom/xmldom needs two selectors, not one: both resolved lines are flagged and their fixed versions differ, and a single selector reaching the 0.9 fix would drag the three 0.8 consumers across a 0.x minor. Bounds sit at the compatibility boundary rather than at the fixed version, so a future lift moves only the target. The lockfile was regenerated by `pnpm install --lockfile-only` and never edited by hand; `pnpm install --frozen-lockfile` is green. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WLJQhde67SeTccsmnBVarV
⛔ merge queue 构建失败 — 先分诊,再决定要不要重排队列构建 33696603273 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集), 失败的 job(日志抽取,best effort):
跨 PR 相同签名(24h,按失败测试文件聚合):
历史信号:
分诊清单:
Generated by Claude Code · merge-queue-triage workflow (#4859) |
Four NEW fast-uri advisories (GHSA-5jgf-p345-68v8, GHSA-f65p-4m7j-42xc, GHSA-fph4-wmhf-6fwf, GHSA-jqff-g426-hqxp; 7.5 high each, fixed in 3.1.6) keep `Validate Package Dependencies` red after #14639/#14736 clear the xmldom/qs batch. Lift the existing #5032 override's target from ^3.1.5 to ^3.1.6 (selector stays at the 4.0.0 boundary) and extend its comment with the four new GHSAs. ajv@8.20.0 declares ^3.0.1, which already admits 3.1.6, so this is a dedupe onto the patched line. pnpm-lock.yaml regenerated with `pnpm install --lockfile-only` only. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WLJQhde67SeTccsmnBVarV
Fixes #14639
OSV-Scanner blocks every PR touching a
package.jsonon four fixable advisories inpnpm-lock.yaml. All four name a fixed version, so this is the take-the-fix pathosv-scanner.toml's own header describes.⛔ No
osv-scanner.tomlexemption and no.github/workflows/validate-deps.ymlchange — the ledger still holds zero entries (that file is untouched by this PR), and the scan-cadence question stays where triage put it, on #14645.Where the pin lives — a correction to the card's assumed file surface
The card and the claim both name root
package.jsonpnpm.overrides. That is not this repo's mechanism and under pnpm 10 it would have been a silent no-op: every override in this workspace lives inpnpm-workspace.yaml, which already carries 30 of them, andscripts/check-override-consistency.mjsreads them from there (its pass line says so: "9 published-manifest declaration(s) covered by pnpm-workspace.yaml overrides"). Rootpackage.json'spnpmblock holds onlyignoredBuiltDependenciesand is untouched here.The route is otherwise exactly what triage ruled. A transitive resolution does not move on its own: the only pnpm-native alternative was
pnpm update --recursive --depth Infinity, which re-resolves the whole graph — measured on this branch, it moved nine unrelated packages (@inquirer/*,ip-address,isbot,node-abi,seroval,type-fest) and dropped a peer-resolution suffix from adrizzle-ormentry. That was reverted. An override selector is what makes the move surgical, and it is the shape every prior member of this class used (#5032, #6407, #6506).Dependents — every declared range already admits its own fixed version
@xmldom/xmldom0.8.13@authenio/xml-encryption@2.0.2^0.8.6samlify@2.13.1^0.8.11xml-crypto@6.1.2^0.8.10@xmldom/xmldom0.9.11@better-auth/sso@1.7.2^0.9.10qs6.15.3body-parser@2.3.0^6.15.2express@5.2.1^6.14.0So no dependent needed forcing past what it supports — each entry is a dedupe onto the patched line, the
dompurify/nanoidshape already documented in that block. Ranges read from the installedpackage.jsonof each dependent, not inferred.@xmldom/xmldomneeds two selectors, not one: both of its resolved lines are flagged and they have different fixed versions (0.8.15 and 0.9.12). One selector reaching the 0.9 fix would have dragged the three 0.8 consumers across a 0.x minor — the compatibility boundary for a 0.x package — past every range they declare.Bounds sit at the compatibility boundary (0.9.0 and 0.10.0 for the two 0.x lines, 7.0.0 for
qs), never at the fixed version itself, per that block's header rule and theundici7.28.0 /brace-expansion5.0.8 specimens.check:override-consistencyconfirms the shape: all three new entries are absent from both of its reports — they have consumers, and their bounds sit above their target's version line.Nothing in the workspace declares either package directly (
grepover every non-node_modulespackage.json= 0 hits), so both are transitive-only and no publishable manifest has to move in lockstep.Commands — the lockfile was regenerated by pnpm, never hand-edited
The three flagged lines are gone, the fixed ones are present
Diff hygiene — every changed lockfile line accounted for
Filtering the lockfile diff down to lines that name neither package leaves exactly seven, all of them the moved packages' own metadata: three
resolution:integrity hashes (one per moved version) and, on the-side, twodeprecated: this version has critical issues, please update to the latest versionnotes that upstream dropped when it published the patched releases. No other resolution moved and no peer-resolution suffix changed.OSV result — the workflow's own scanner, run locally
api.osv.devis blocked from this container, so the scan ran against OSV-Scanner's offline npm database (downloaded 2026-09-02 22:27 UTC). Scanner version 2.3.8, matching thegoogle/osv-scanner-actionpin invalidate-deps.yml.Positive control —
origin/main4d0d9445alockfile:This branch, same scanner, same database — all four the card names are gone:
Four new
fast-uriadvisories (7.5 high each, fixed in 3.1.6) landed after #14639 was filed and triaged — that card quotes its CI run as0 Critical, 0 High, 4 Medium, so they were not present then. They are out of this card's ruled scope (⛔ no other dependency moves), and they are a one-line target lift on thefast-uripinpnpm-workspace.yamlalready carries from the #5032 batch. Filed as #14732, with the measurement, the dependents and the fix shape. This PR does not touch them.Tests
Affected workspace packages, from
pnpm why -ron both packages:@objectstack/plugin-auth(xmldom, via@better-auth/ssoandsamlify), and@objectstack/connector-mcp/@objectstack/mcp/@objectstack/example-showcase(qs, via@modelcontextprotocol/sdkandexpress).pnpm --filter @objectstack/plugin-auth testpnpm --filter @objectstack/plugin-auth typecheckpnpm --filter @objectstack/connector-mcp testpnpm --filter @objectstack/connector-mcp typecheckpnpm --filter @objectstack/mcp testpnpm --filter @objectstack/mcp typecheckDependency closures were built first (
pnpm --filter '...^...' build, exit 0), so none of the above is a stale-distreading.Gates
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commandsderived a 10-command family for this change set (pnpm-lock.yaml,pnpm-workspace.yaml; merge basedbf115284). The union was re-run on the final commitac8c23345, after mergingorigin/maindbf115284— that merge brought in one commit (#14651) which touches neither the lockfile nor the override ledger, so nothing had to be regenerated on top. Eight ran green:Two are NOT MEASURED locally, neither of them a red — each printed its own prerequisite verdict and exited 3, the code both scripts reserve for "nothing was measured":
check-test-completeness— needs a savedturbo run testlog, which only CI produces; the script names this branch unreachable in CI and says to record it as NOT MEASURED locally.check:dual-build-cjs-loads—PREREQUISITE NOT MET, run pnpm build first; it reads every package'sdist/. Declared narrowing: this diff changes no workspace source, no workspace manifest and no workspace-package version, only third-party transitive resolutions inside dependencies' own trees, so it cannot alter any package's emitted bytes orexportsmap, which is all this gate reads. CI builds and runs it regardless.Changeset
None —
skip-changeset. This moves only the lockfile and the workspace override ledger; overrides pin what this workspace resolves and do not ship with published packages, and no publishable manifest declares either package, so no published package changes for a consumer.🤖 Generated with Claude Code
https://claude.ai/code/session_01WLJQhde67SeTccsmnBVarV
Generated by Claude Code