Skip to content

fix(deps): resolve all 16 open Dependabot alerts — triaged bumps, overrides where unavoidable - #980

Merged
artyhoo merged 2 commits into
stagingfrom
claude/getff-dependabot-alerts-5c95b9
Jul 11, 2026
Merged

fix(deps): resolve all 16 open Dependabot alerts — triaged bumps, overrides where unavoidable#980
artyhoo merged 2 commits into
stagingfrom
claude/getff-dependabot-alerts-5c95b9

Conversation

@artyhoo

@artyhoo artyhoo commented Jul 11, 2026

Copy link
Copy Markdown
Owner

Fixes all 16 open Dependabot alerts (triage-first, per-alert rationale below). Two atomic commits: lock/manifest bumps; drizzle fixture pins. No new dependencies — overrides entries and in-range bumps only; not a capability commit.

Per-alert disposition

Alerts Package Fix Mechanism
#17-#24 (7×, incl. critical CVE-2026-33937) handlebars 4.7.8 → 4.7.9 root lock eslint-plugin-boundaries ^5.0.0 → ^6.0.2 in packages/preset-react-spa/package.json:26 — 6.0.2 pins @boundaries/elements 2.0.1 → handlebars 4.7.9. Chosen over also-available ^7.0.2 as the smaller major jump with the same security outcome. The shipped template packages/preset-react-spa/templates/eslint.config.react.mjs is unchanged: v6 keeps the explicitly-configured legacy element-types rule + boundaries/elements settings working.
#4, #5 (CVE-2026-8723) qs 6.15.1 → 6.15.2 both locks overrides in root package.json + packages/core/package.jsonunavoidable: latest typed-rest-client (3.0.0) still pins vulnerable qs 6.15.1 exactly (verified against the npm registry).
#27 (CVE-2026-53550) js-yaml 4.1.1 → 4.2.0 root lock overrides "js-yaml": "4.2.0" — parent markdownlint-cli2 pins exact 4.1.1; its fixed release 0.23.0 requires node>=22 while CI runs node 20, so the parent bump is blocked. Exact spec matches packages/core's direct-dep spec (npm direct-dep override rule).
#12 (CVE-2026-48988) markdown-it 14.1.1 → 14.3.0 root lock overrides "markdown-it": "^14.2.0" — same markdownlint-cli2 exact-pin reason.
#10, #13 (CVE-2026-49356) @babel/core 7.29.0 → 7.29.7 both locks in-range npm update (parents allow ^7.x / ~7.29.0).
#7 esbuild 0.28.0 → 0.28.1 packages/core lock in-range npm update (tsx ~0.28.0, vite ^0.28.0). Root esbuild was already 0.28.1.
#16, #28 (CVE-2026-39356, high) drizzle-orm ^0.40.0 → ^0.45.2 2 fixture manifests + stub packages/core/detector/fixtures/hono-drizzle-monorepo/apps/api/package.json:5, packages/core/research/fixtures/tier1-single-root/package.json:3, stub .../node_modules/drizzle-orm/package.json bumped in lockstep. Consuming tests verified version-insensitive (name-based detection; research-plan.json has version: null) — fixed, not dismissed.

Notes

  • Synth bundle deliberately NOT regenerated: the bundle is built by ROOT esbuild (scripts/build-synth-bundle.sh:17 uses $ROOT/node_modules/.bin/esbuild), which was already 0.28.1 and is unchanged; the packages/core esbuild bump is a non-feeding transitive. NODE_ENV=development build-synth-bundle.sh --check green after fresh npm ci of both locks.
  • Consumer note (preset-react-spa): boundaries v6 changes the dependency-nodes default from ["import"] to ["import","export","require","dynamic-import"]. Consumers may see new (legitimate) boundaries/element-types findings on export … from / require() / dynamic-import edges — stricter, not broken.
  • Expected npm ls marker: invalid: qs@6.15.2 under typed-rest-client is the documented override-forced exact-pin violation (the point of the fix); no CI gate runs npm ls.

Verification

  • Full local CI-equivalent gate set green: typecheck, full packages/core suite (2288 tests, 0 failed), format:check, NODE_ENV=development build:synth-bundle:check, render-rules --check, render-rule-index --check, install-sh gh-534-arch-boundaries + f17-lint-rules-planted-violation + byte-identical (fingerprints unchanged — no SNAPSHOT_MODE regen needed).
  • Lock integrity independently re-verified from clean state: npm ci (root) and npm ci --prefix packages/core both exit 0; every touched lock entry has version+resolved+integrity; zero unexpected version changes in either lock diff (only intended packages + their transitive helper chains).

§1.7 Self-discipline check (REQUIRED if PR touches discipline-bearing files)

§1.7 Forward-check applied

This PR introduces no new rule; the forward obligation is that each fix lands at the earliest reachable channel and is executable, not prose: vulnerable versions are excluded structurally by manifest constraints — package.json:6-10 (overrides block), packages/core/package.json overrides, packages/preset-react-spa/package.json:26 (^6.0.2 floor) — so any future npm install cannot silently re-resolve a vulnerable version; regressions fail at install/lock level, before CI.

§1.7 Backward-check applied

Class of this change = dependency-version-constraint updates. Surfaces where the class occurs, each swept: root package-lock.json (all 6 target packages patched, no residual vulnerable entries — verified over the full lock, not the diff); packages/core/package-lock.json (qs/@babel/core/esbuild patched; contains NO handlebars/js-yaml/markdown-it entries → no overrides needed there); fixture manifests packages/core/detector/fixtures/hono-drizzle-monorepo/apps/api/package.json:5 + packages/core/research/fixtures/tier1-single-root/package.json:3 + its stub (bumped in lockstep, internally coherent); other fixture manifests under packages/core/**/fixtures/ (swept — no other pinned occurrences of affected packages); shipped templates + install.sh (grep: zero version pins of affected packages); synth bundle packages/core/synthesizer/synth-and-wire.bundle.mjs (not fed by the core esbuild entry — scripts/build-synth-bundle.sh:17; --check green); install fingerprints/baselines (tests/install-sh/byte-identical.test.sh green — unshifted).

…own-it/@babel/core/esbuild

- eslint-plugin-boundaries ^5.0.0 → ^6.0.2 in preset-react-spa: pulls handlebars 4.7.9 (direct dep of boundaries 6.x) + @boundaries/elements 2.0.1 (alerts 17-24, incl. critical CVE-2026-33937); boundaries 6.x keeps the legacy element-types rule + boundaries/elements settings working, so the shipped eslint.config.react.mjs template is unchanged. ^6.0.2 chosen over the also-available ^7.0.2 as the smaller major jump that already pins the patched handlebars 4.7.9 — same security outcome, less behavioral surface for preset consumers.
- overrides qs ^6.15.2 (alerts 4, 5; both root + packages/core locks): unavoidable — latest typed-rest-client still pins vulnerable qs 6.15.1; concrete lock version resolved to 6.15.2
- overrides js-yaml 4.2.0 + markdown-it ^14.2.0 (alerts 27, 12; root lock): parent markdownlint-cli2 pins exact vulnerable versions; its 0.23.0 requires node>=22 vs CI node 20
- @babel/core → 7.29.7 (alerts 10, 13; both locks), esbuild → 0.28.1 in packages/core (alert 7)
- synth bundle NOT regenerated: it is built by root esbuild (already 0.28.1, unchanged); the packages/core esbuild bump is a transitive that does not affect the bundle; build-synth-bundle.sh --check verified green (all bundle inputs byte-identical to staging)

No new dependencies — overrides entries and in-range bumps only; not a capability commit.

Prior-art: skipped — no new capability: npm overrides entries + in-range transitive bumps only (security lockfile maintenance); hook false-positives overrides keys as new explicit deps
…, 28, CVE-2026-39356)

Static test fixtures only (detector + research tier1); consuming tests are
name-based and version-insensitive — stub node_modules version bumped in
lockstep so the fixture stays internally coherent.
@socket-security

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Updatedeslint-plugin-boundaries@​5.4.0 ⏵ 6.0.2100 +12100100 +186100
Addeddrizzle-orm@​0.45.2881008897100

View full report

@socket-security

Copy link
Copy Markdown

Warning

Review the following alerts detected in dependencies.

According to your organization's Security Policy, it is recommended to resolve "Warn" alerts. Learn more about Socket for GitHub.

Action Severity Alert  (click "▶" to expand/collapse)
Warn High
Obfuscated code: npm drizzle-orm is 90.0% likely obfuscated

Confidence: 0.90

Location: Package overview

From: packages/core/detector/fixtures/hono-drizzle-monorepo/apps/api/package.jsonnpm/drizzle-orm@0.45.2

ℹ Read more on: This package | This alert | What is obfuscated code?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: Packages should not obfuscate their code. Consider not using packages with obfuscated code.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/drizzle-orm@0.45.2. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

View full report

@artyhoo
artyhoo merged commit 8ec3a6d into staging Jul 11, 2026
36 checks passed
artyhoo added a commit that referenced this pull request Jul 11, 2026
…rides keys as new deps (#983)

Follow-up invited by the maintainer after PR #980: the pre-push capability-commit gate false-positived npm `overrides` entries as new explicit dependencies and demanded a `Prior-art:` trailer on a pure security-maintenance commit.

## Change

- `packages/core/hooks/checks/prior-art.ts:76-118` — `isNewDepAdded()` now tracks `overrides` / `resolutions` / `pnpm` blocks in the package.json diff (indent-based, resets at `@@` hunk headers) and skips keys inside them: they force versions of packages already in the tree, adding no capability. Documented accepted residual: a hunk editing deep inside an existing overrides block without its opening line in diff context can still false-positive — the existing escape-hatch trailer covers that rare case.
- `packages/core/hooks/checks/prior-art.test.ts` — 6 new cases: 3 skip cases (overrides, resolutions, pnpm.overrides) + 3 paired negatives (new dep after the block closes → still detected; nested braces inside overrides don't end the skip early; `@@` reset → conservative re-arm). RED observed before the fix (4 failed), 104/104 after.
- `CLAUDE.md:38` — prose definition updated in the same commit, per its own "the prose definition and the hook stay in sync" contract (CLAUDE.md:36).

Incident evidence: PR #980 push was blocked with `reason: new explicit dep in package.json` on commit whose only package.json additions were the `overrides` security pins.

## §1.7 Self-discipline check (REQUIRED if PR touches discipline-bearing files)

### §1.7 Forward-check applied
The refinement itself lands as an executable artifact at the earliest reachable channel, not prose: the skip logic is enforced in the pre-push hook path (`packages/core/hooks/checks/prior-art.ts:90-113`) and pinned by paired-negative tests (`packages/core/hooks/checks/prior-art.test.ts:112-176`) that fail if the skip over-reaches (post-block dep still detected, hunk-boundary reset re-arms detection conservatively). The prose (CLAUDE.md:38) changed in the same commit as the hook, honoring the stay-in-sync contract.

### §1.7 Backward-check applied
Class of this change = capability-commit detection semantics. Surfaces where the class occurs, each swept: `packages/core/hooks/checks/prior-art.ts` (the only detection implementation — fixed); `.husky/pre-push` + `packages/core/hooks/` shell entry points (grep for a bash duplicate of the dep-detection: none — the bash predecessor was fully ported per prior-art.ts:2-4 header, SWEPT-CLEAN); `CLAUDE.md:38` prose definition (updated in sync); `packages/core/principles/11-build-first-reuse-default.test.ts` (principle test consumes the SSOT register, not the dep-detection regex — grep shows no `isNewDepAdded` import outside hooks/checks, SWEPT-CLEAN); `.github/workflows/audit-self.yml` §7 trailer backstop (validates trailer presence on commits, does not re-implement dep detection — SWEPT-CLEAN). No other surface encodes "what counts as a new dependency".
artyhoo added a commit that referenced this pull request Jul 11, 2026
…-yaml/markdown-it overrides (#986)

Invited follow-up to PR #980. Two commits: CI Node 20 → 22; markdownlint-cli2 ^0.23.0 replacing the two temporary overrides.

## Why

- **Node 20 reached EOL 2026-04-30** (verified via endoflife.date API 2026-07-11) — CI ran an unsupported runtime for 2+ months. The '20' pin was never a decision: introduced without rationale in `3f55ee281` (2026-05-07, first CI job) and copy-pasted across 23 jobs. Node 22 = active LTS until 2027-04-30.
- The `js-yaml` / `markdown-it` overrides from PR #980 existed ONLY because markdownlint-cli2 0.23.0 requires node>=22 while CI was on 20. With CI on 22, the clean parent bump replaces the forced pins.

## What changed / what deliberately didn't

| Surface | Action |
|---|---|
| 23 × `node-version: '20'` in `.github/workflows/` (4 files) | → `'22'`; actionlint clean |
| root `package.json`: markdownlint-cli2 `^0.22.1` | → `^0.23.0` (brings js-yaml 5.2.0 nested + markdown-it 14.2.0 natively) |
| root `overrides`: `js-yaml`, `markdown-it` | removed — no longer needed |
| `overrides.qs` | **stays** — still unavoidable (latest typed-rest-client pins vulnerable qs) |
| f17 matrix `['20','22']` (`audit-self.yml:1222`) | untouched — consumer-compat coverage, not our runtime |
| shipped templates + `.nvmrc` (20.19.0) | untouched — consumer CI reads `node-version-file: '.nvmrc'`, cannot drift from our pins (`tests/install-sh/f11-ci-node-version.test.sh` 6/6, `nvmrc-ci-drift.test.sh` 7/7 green). Bumping the consumer-facing `.nvmrc` default is a separate maintainer decision — surfaced, not smuggled in. |

## Verification

- No vulnerable version reappears after overrides removal — full-lock check: js-yaml 4.2.0 (@eslint/eslintrc) + 5.2.0 (mdl2 nested), markdown-it 14.2.0, qs 6.15.2, handlebars 4.7.9 (all ≥ Dependabot fixed versions).
- **Lint-behavior parity:** markdownlint-cli2 0.22.1 vs 0.23.0 over all 897 tracked `*.md` — error sets byte-identical (160 pre-existing findings, 0 new-only, 0 old-only). The bump changes nothing for pre-commit.
- `NODE_ENV=development build:synth-bundle:check` green; `actionlint` clean locally; local node 24 ≥ mdl2's engines floor.

## §1.7 Self-discipline check (REQUIRED if PR touches discipline-bearing files)

### §1.7 Skipped: mechanical maintenance — version-pin flips (23 CI pins, 1 devDep range, 2 override removals) with no rule/discipline semantics introduced or extended; enforcement surfaces untouched (verified: tests/install-sh/f11-ci-node-version.test.sh 6/6, nvmrc-ci-drift.test.sh 7/7, actionlint clean).
artyhoo added a commit that referenced this pull request Aug 7, 2026
…ntical vendor copies (#1277)

* fix(prior-art): two capability-detector carve-outs — doc files + byte-identical vendor copies

Doc files (*.md) never counted as capability per the CLAUDE.md prose
('doc edits are NOT capability commits') but the LOC triggers lacked the
parity — a shipped >=80-LOC doc template tripped the detector (PR #1272).
A new file byte-identical to a blob already tracked elsewhere in the tree
is a relocation/vendor copy adding no capability by construction (PR #1271
vendored runtime-bridge subset). Both carve-outs land in the shared module
(prior-art.ts) so pre-push, CI backstop, and the PR-body squash-survival
gate all inherit them; CLAUDE.md prose updated in the same commit to stay
in sync per its own 'the prose definition and the hook stay in sync' claim.

Prior-art: skipped — refinement of an existing gate's detector, no new capability; mirrors the PR #980 overrides carve-out precedent
§1.7: forward — carve-outs align hook with existing CLAUDE.md exemption (no new discipline); backward — all three consumer channels (pre-push substance arm, real-commit backstop CI, pr-body-prior-art gate) share prior-art.ts so no sibling drifts; paired-negative tests added for both carve-outs

* test(install-sh): recapture byte-identical baselines after the CLAUDE.md carve-out prose edit

Prior-art: skipped — snapshot regeneration after a doc edit, no new capability

---------

Co-authored-by: Test <test@example.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants