Skip to content

chore(deps): npm audit fix before release bump; monthly npm-outdated issue - #2232

Open
cliffhall wants to merge 4 commits into
v2/mainfrom
v2/chore/2231-audit-fix-and-npm-outdated
Open

chore(deps): npm audit fix before release bump; monthly npm-outdated issue#2232
cliffhall wants to merge 4 commits into
v2/mainfrom
v2/chore/2231-audit-fix-and-npm-outdated

Conversation

@cliffhall

@cliffhall cliffhall commented Sep 3, 2026

Copy link
Copy Markdown
Member

Closes #2231

Two independent pieces, both scoped out of #2229 so they land before the bigger alert-driven pipeline that issue proposes.

Note

.github/dependabot.yml is no longer touched here. This PR originally also removed the five npm ecosystem entries; that edit moved to #2235, so every change to that one file lands in a single reviewable piece — along with the github-actions entry, which #2229 had left out of scope but which opens the same issue-less, board-cardless PR the decision exists to remove.

Consequence: until #2235 lands, Dependabot's npm PRs and the monthly tracking issue below both exist. That is duplicate signal rather than conflicting action, and the header comments in both new files say so explicitly rather than claiming a switch-off that has not happened.

1. npm audit fix in the release flow

/release's step 1 (bump on v2/main) now runs npm audit fix — root and every client, since each has its own lockfile — before npm version, gated by npm run local:gate. Never --force; whatever fix can't resolve on its own (typically a transitive dependency needing an overrides pin) is left to the dependabot-alert pipeline or a follow-up issue, called out in the release notes instead of forced through.

2. A monthly npm outdated tracking issue

  • Added .github/workflows/dependency-refresh.yml (monthly cron + workflow_dispatch) and scripts/dependency-refresh.mjs, which runs npm outdated across the root install and every client and files or updates one idempotent tracking issue (marker-based, so a re-run before the issue closes edits it in place rather than duplicating it). No PR is opened automatically — a maintainer reviews the issue and opens a normal PR against v2/main.
  • GITHUB_TOKEN is sufficient (issues: write + public milestone reads); board placement is intentionally not attempted, so an unboarded issue is picked up by the next /issue-triage sweep, same as any other maintainer-filed issue.
  • Pure parsing/formatting logic (parseOutdated, buildIssueBody) is unit-tested in scripts/dependency-refresh.test.mjs.

Testing

Re-run after removing the dependabot.yml edit:

  • npm run test:scripts — 402 pass, including the 5 new tests.
  • npm run format:check:scripts — clean.
  • npm run verify:skills — OK (release skill frontmatter still parses, listing budget unaffected since release is disable-model-invocation: true).
  • npm run local:gate — full pass in an isolated worktree with a real npm install.

🤖 Generated with Claude Code

https://claude.ai/code/session_017N9ha27Qg6LHpBQP7G7zPY

@cliffhall cliffhall added the v2 Issues and PRs for v2 label Sep 3, 2026
@cliffhall
cliffhall requested a balanced review from Copilot September 3, 2026 14:01

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Command failures can be silently reported as success, orchestration is untested, and the release procedure conflicts with dependency-management safeguards.

Once you've addressed the issues Copilot identified, you can request another Copilot review.

Pull request overview

Adds release-time dependency auditing and replaces npm Dependabot PRs with a monthly tracking issue.

Changes:

  • Adds a monthly npm outdated workflow and issue-management script.
  • Removes npm entries from Dependabot configuration.
  • Adds npm audit fix to release instructions and tests formatting helpers.
File summaries
File Description
scripts/dependency-refresh.mjs Collects outdated packages and manages the tracking issue.
scripts/dependency-refresh.test.mjs Tests parsing and issue-body formatting.
.github/workflows/dependency-refresh.yml Schedules the monthly dependency sweep.
.github/dependabot.yml Disables npm version-update PRs.
.claude/skills/release/SKILL.md Adds dependency auditing to releases.
Review details
  • Files reviewed: 5/5 changed files
  • Comments generated: 5
  • Review effort level: Balanced

Comment thread scripts/dependency-refresh.mjs
Comment thread scripts/dependency-refresh.mjs Outdated
Comment thread scripts/dependency-refresh.mjs
Comment thread .claude/skills/release/SKILL.md Outdated
Comment thread scripts/dependency-refresh.mjs Outdated
cliffhall added a commit that referenced this pull request Sep 4, 2026
Five findings, all valid.

`runOutdated` accepted every exit status and returned `result.stdout ?? ""`.
A failed `npm outdated` (exit 2 on a registry or config error) also prints
nothing, so the empty string parsed to an empty package list — and across five
installs a total outage produced output byte-identical to a clean sweep. It now
throws on any status other than the documented 0/1.

`main()` was untested, which is how that reached review: the helper-only suite
passed while the silent-success path was live. It now takes its spawn function
as a parameter and is driven by a fake, covering npm failure, create vs. edit,
milestone handling, both no-op paths and the missing-repo guard.

The no-op path returned before looking for the marker issue, so once every
install caught up, a still-open tracking issue kept its obsolete package table
indefinitely — contradicting the body's own promise to update in place. It now
rewrites through `buildClearedBody()`. It deliberately does not close the
issue: the sweep takes no board actions, and closing one whose card a
maintainer may have moved would make the board assert work shipped that this
script cannot verify shipped.

The release step mandated `npm audit fix`, which AGENTS.md forbids. The reason
is not `--force`: plain `audit fix` resolves an advisory with no upward escape
in range by silently downgrading, as it did to esbuild across three installs in
 #2058, and `local:gate` has no version-regression check to catch it. The step
is now `npm audit` report-only, with fixes applied deliberately via a direct
bump or an `overrides` entry.

An unmilestoned issue is swept into Incoming, not Todo — Todo asserts a
maintainer signed off. Message corrected and pinned by a test.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RWMJENjs1mExXE5XPJTEei
Signed-off-by: cliffhall <cliff@futurescale.com>
@cliffhall

Copy link
Copy Markdown
Member Author

Copilot review round 1 — all five addressed (bb9af94)

Mirrored at PR level because inline replies get hidden once their threads go outdated.

1. runOutdated accepted any exit status — fixed. A failed npm outdated (exit 2 on a registry/config error) prints nothing to stdout, so result.stdout ?? "" parsed to an empty package list; across five installs a total outage produced output byte-identical to a clean sweep. Now throws on anything but the documented 0/1.

2. main() untested — fixed. It now takes its spawn function as a parameter (main(repo, spawn = spawnSync)), threaded through every helper, and the tests drive it with a fake keyed on command shape. Seven new tests: npm failure, create, edit, milestone present/absent, both no-op paths, missing repo. This is the finding that explains the others — the helper-only suite passed while the silent-success path in #1 was live.

3. No-op path skipped the existing issue — fixed. It returned before findExistingIssue, so once everything caught up a still-open tracking issue kept its obsolete table forever, contradicting the body's own "updates this body in place" promise. Now rewrites through a pure buildClearedBody() that keeps the marker.

One deliberate deviation: it rewrites rather than closes. The sweep takes no board actions by design, and closing an issue whose card a maintainer may have moved would make the board assert work shipped that this script cannot verify shipped — Done means shipped in this repo. The reasoning is a comment on the function, not left implicit.

4. npm audit fix contradicted AGENTS.md:99 — fixed, and the most important finding here. The citation is exact, and the local-dev skill has the concrete case: tsup@8.5.1 declares esbuild: ^0.27.0 against an advisory covering 0.27.3 - 0.28.0 with no upward escape, and plain audit fix walked three installs back to 0.27.2 — tried and reverted in #2058. The PR would have made an already-reverted mistake mandatory every release, and local:gate has no version-regression check, so it would have passed green.

The step is now npm audit --audit-level=high report-only, with fixes applied deliberately (direct bump or overrides). I took the report-only option rather than the before/after downgrade guard: a trustworthy guard needs semver-aware lockfile comparison across five installs, and a half-built one is worse than none because it licenses the operation it cannot check. AGENTS.md is unchanged — the release flow conforms to the rule rather than earning an exemption.

⚠️ This narrows #2231's original framing ("add npm audit fix to the release flow") to an audit-and-act step. Flagging for the maintainer rather than silently redefining the issue.

5. "swept into Todo" — fixed. Unmilestoned means unapproved, so triage parks it in Incoming; Todo asserts a sign-off that never happened, which is the more damaging direction to be wrong in. Corrected, commented, and pinned by a test asserting the log never says Todo.

Verification

  • npm run test:scripts — 13 pass (5 pre-existing + 8 new).
  • npm run verify:skills — OK; listing budget unaffected (release is disable-model-invocation: true).
  • npm run local:gate7386/7387. The one failure is ServerImportJsonModal > guards against a live edit made before the debounce re-validates, which this branch does not touch: the diff is four files (scripts/dependency-refresh.{mjs,test.mjs}, the release skill, the workflow) and that component is byte-identical to v2/main. It passes 16/16 run alone, and the full gate was green on this same web code at e32a1be. It is a timing flake under machine contention — several full gate runs were in flight concurrently, and the file took 18.1s versus 9.2s isolated.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 Approval recommended

The updated implementation resolves prior findings and is well covered by focused orchestration tests.

Review details
  • Files reviewed: 4/4 changed files
  • Comments generated: 0 new
  • Review effort level: Balanced

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 Approval recommended

The revised implementation is consistent with repository dependency rules and covers the workflow's critical orchestration paths.

Review details
  • Files reviewed: 4/4 changed files
  • Comments generated: 0 new
  • Review effort level: Balanced

@cliffhall

Copy link
Copy Markdown
Member Author

Copilot rounds 2 and 3 — clean

Both came back 🟢 Approval recommended with 0 new comments against bb9af94, and the inline comment count held at 10 throughout (Copilot's original 5 from round 1 plus my 5 replies — no new threads).

Round 3 was requested deliberately rather than stopping at round 2: Copilot's inline comments can land after its review body, so a single zero-comment round is not on its own evidence that a round produced nothing. Two consecutive clean rounds is the stop condition.

  • Round 1 (5102950044) — 🟡 5 findings, all valid, all fixed in bb9af94.
  • Round 2 (5108387664) — 🟢 0 new. "resolves prior findings and is well covered by focused orchestration tests".
  • Round 3 (5108396254) — 🟢 0 new. "consistent with repository dependency rules and covers the workflow's critical orchestration paths".

Review is done. One open item for the maintainer, carried over from round 1 rather than resolved by it: finding #4 narrowed this PR from "add npm audit fix to the release flow" to an audit-and-act step, which is a change to #2231's framing, not just its implementation. Worth a look before merge.

cliffhall added a commit that referenced this pull request Sep 4, 2026
Closes #2235.

Switches the old dependency flow off now that #2232 landed the
replacement. Removes the five npm ecosystem entries (root plus each
client under clients/*) and, resolving the question #2229 left open, the
github-actions entry as well — so .github/dependabot.yml goes away
outright rather than being emptied, which its schema does not allow.

The github-actions entry had exactly the property #2229 exists to
remove: it opened a grouped monthly PR carrying no `Closes #N` and no
board card, the one standing exception to "every PR references an
issue". Deleting it unreplaced would have left 9 actions unwatched, and
`npm outdated` says nothing about actions, so the monthly sweep now also
checks every `uses:` ref under .github/workflows and renders the stale
ones as one more section of the same tracking issue.

Ranking comes from the release LIST, not `releases/latest`. That
endpoint returns the release GitHub designates most recent, not the
greatest version, so an action publishing a maintenance release for an
older major (a v6.9.1 cut after v8.0.0) would make a workflow pinned to
v7 compare against v6 and read as current — silently missing a whole
major upgrade, the one thing this check exists to catch.

Staleness is compared only to the precision the ref specifies. `v7` is a
moving major tag that GitHub repoints at every v7.x release, so `v7`
against a highest of `v7.0.1` is current and only `v8` makes it stale;
an exactly-pinned `v7.0.0` is behind `v7.0.1`; a SHA pin is deliberately
immovable and is never reported.

A release lookup suppresses only a 404 — the legitimate "this action has
never cut a release" answer — and throws on anything else. Treating a
rate limit or an expired token as "no release" is indistinguishable from
"not stale", and since every action here already sits on its latest
major, the resulting empty section is byte-identical to a healthy run.

`buildClearedBody` now speaks for both halves: once actions are in scope,
its npm-only wording would assert a clean bill of health the sweep never
checked.

Dependabot security updates are unaffected — they are configured in repo
settings, not in this file, and kept working while it was missing
entirely (#1833, #1840). That note moves into the workflow header rather
than dying with the file; #2233 is where they are turned off
deliberately. The script header, the workflow header and the generated
issue body all say version-update PRs rather than claiming Dependabot is
replaced wholesale.

Also renames the workflow's npm-outdated job to dependency-sweep now
that the sweep is no longer npm-only.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NGtzPg3UxMLszysQXXfqax
Signed-off-by: cliffhall <cliff@futurescale.com>
cliffhall added a commit that referenced this pull request Sep 4, 2026
Closes #2235.

Switches the old dependency flow off now that #2232 landed the
replacement. Removes the five npm ecosystem entries (root plus each
client under clients/*) and, resolving the question #2229 left open, the
github-actions entry as well — so .github/dependabot.yml goes away
outright rather than being emptied, which its schema does not allow.

The github-actions entry had exactly the property #2229 exists to
remove: it opened a grouped monthly PR carrying no `Closes #N` and no
board card, the one standing exception to "every PR references an
issue". Deleting it unreplaced would have left 9 actions unwatched, and
`npm outdated` says nothing about actions, so the monthly sweep now also
checks every `uses:` ref under .github/workflows and renders the stale
ones as one more section of the same tracking issue.

Ranking comes from the release LIST, not `releases/latest`. That
endpoint returns the release GitHub designates most recent, not the
greatest version, so an action publishing a maintenance release for an
older major (a v6.9.1 cut after v8.0.0) would make a workflow pinned to
v7 compare against v6 and read as current — silently missing a whole
major upgrade, the one thing this check exists to catch.

Staleness is compared only to the precision the ref specifies. `v7` is a
moving major tag that GitHub repoints at every v7.x release, so `v7`
against a highest of `v7.0.1` is current and only `v8` makes it stale;
an exactly-pinned `v7.0.0` is behind `v7.0.1`; a SHA pin is deliberately
immovable and is never reported.

A release lookup suppresses only a 404 — the legitimate "this action has
never cut a release" answer — and throws on anything else. Treating a
rate limit or an expired token as "no release" is indistinguishable from
"not stale", and since every action here already sits on its latest
major, the resulting empty section is byte-identical to a healthy run.

`buildClearedBody` now speaks for both halves: once actions are in scope,
its npm-only wording would assert a clean bill of health the sweep never
checked.

Dependabot security updates are unaffected — they are configured in repo
settings, not in this file, and kept working while it was missing
entirely (#1833, #1840). That note moves into the workflow header rather
than dying with the file; #2233 is where they are turned off
deliberately. The script header, the workflow header and the generated
issue body all say version-update PRs rather than claiming Dependabot is
replaced wholesale.

Also renames the workflow's npm-outdated job to dependency-sweep now
that the sweep is no longer npm-only.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NGtzPg3UxMLszysQXXfqax
Signed-off-by: cliffhall <cliff@futurescale.com>
cliffhall and others added 4 commits September 3, 2026 22:23
…issue

Adds npm audit fix (root + every client) as the first sub-step of the
release skill's bump step, before npm version, so a release is never
gated on remembering to check separately. Never --force; anything
audit fix can't resolve is left to the dependabot-alert pipeline
(#2229) or a follow-up issue.

Disables Dependabot npm version updates in dependabot.yml (a
version-update PR carries no issue and no board card) and replaces
them with a monthly scheduled sweep that runs npm outdated across the
root install and every client, filing or updating one idempotent
tracking issue instead of an auto-generated PR.

Closes #2231
Part of #2229

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017N9ha27Qg6LHpBQP7G7zPY
Signed-off-by: cliffhall <cliff@futurescale.com>
The npm-entry removal in `.github/dependabot.yml` is split out of this PR so
that every change to that one file lands in a single reviewable piece —
alongside the `github-actions` entry, which #2229 had declared out of scope but
which opens the same issue-less, board-cardless PR the decision exists to
remove.

Reverts `.github/dependabot.yml` to its `v2/main` state, leaving this PR with
the release-time `npm audit fix` and the monthly `npm outdated` sweep: the
replacement flow, not the switch-off.

Both new files' header comments claimed the switch-off had already happened,
which is false until #2235 lands. They now say #2235 does it, and that until
then Dependabot's npm PRs and this sweep overlap — duplicate signal rather than
conflicting action.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RWMJENjs1mExXE5XPJTEei
Signed-off-by: cliffhall <cliff@futurescale.com>
Five findings, all valid.

`runOutdated` accepted every exit status and returned `result.stdout ?? ""`.
A failed `npm outdated` (exit 2 on a registry or config error) also prints
nothing, so the empty string parsed to an empty package list — and across five
installs a total outage produced output byte-identical to a clean sweep. It now
throws on any status other than the documented 0/1.

`main()` was untested, which is how that reached review: the helper-only suite
passed while the silent-success path was live. It now takes its spawn function
as a parameter and is driven by a fake, covering npm failure, create vs. edit,
milestone handling, both no-op paths and the missing-repo guard.

The no-op path returned before looking for the marker issue, so once every
install caught up, a still-open tracking issue kept its obsolete package table
indefinitely — contradicting the body's own promise to update in place. It now
rewrites through `buildClearedBody()`. It deliberately does not close the
issue: the sweep takes no board actions, and closing one whose card a
maintainer may have moved would make the board assert work shipped that this
script cannot verify shipped.

The release step mandated `npm audit fix`, which AGENTS.md forbids. The reason
is not `--force`: plain `audit fix` resolves an advisory with no upward escape
in range by silently downgrading, as it did to esbuild across three installs in
 #2058, and `local:gate` has no version-regression check to catch it. The step
is now `npm audit` report-only, with fixes applied deliberately via a direct
bump or an `overrides` entry.

An unmilestoned issue is swept into Incoming, not Todo — Todo asserts a
maintainer signed off. Message corrected and pinned by a test.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RWMJENjs1mExXE5XPJTEei
Signed-off-by: cliffhall <cliff@futurescale.com>
`main refuses to run without a repo` called `main(undefined, …)` so the default
parameter would fire, then asserted it throws. The default reads
`process.env.GITHUB_REPOSITORY` — which GitHub Actions sets on every run — so
the assertion held only where the variable happened to be unset. It passed
locally and failed CI, the one environment where the default is always
populated.

The test now clears the variable and restores it, and a second test covers the
other half of the default: with it set, `main(undefined, …)` uses it instead of
throwing. Between them the default's behavior is pinned in both environments
rather than inherited from whichever one is running.

Verified both ways: 14 pass with the variable unset and with it set, and the
full `test:scripts` suite is 411/411 under the CI environment shape.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RWMJENjs1mExXE5XPJTEei
Signed-off-by: cliffhall <cliff@futurescale.com>
cliffhall added a commit that referenced this pull request Sep 4, 2026
Closes #2235.

Switches the old dependency flow off now that #2232 landed the
replacement. Removes the five npm ecosystem entries (root plus each
client under clients/*) and, resolving the question #2229 left open, the
github-actions entry as well — so .github/dependabot.yml goes away
outright rather than being emptied, which its schema does not allow.

The github-actions entry had exactly the property #2229 exists to
remove: it opened a grouped monthly PR carrying no `Closes #N` and no
board card, the one standing exception to "every PR references an
issue". Deleting it unreplaced would have left 9 actions unwatched, and
`npm outdated` says nothing about actions, so the monthly sweep now also
checks every `uses:` ref under .github/workflows and renders the stale
ones as one more section of the same tracking issue.

Ranking comes from the release LIST, not `releases/latest`. That
endpoint returns the release GitHub designates most recent, not the
greatest version, so an action publishing a maintenance release for an
older major (a v6.9.1 cut after v8.0.0) would make a workflow pinned to
v7 compare against v6 and read as current — silently missing a whole
major upgrade, the one thing this check exists to catch.

Staleness is compared only to the precision the ref specifies. `v7` is a
moving major tag that GitHub repoints at every v7.x release, so `v7`
against a highest of `v7.0.1` is current and only `v8` makes it stale;
an exactly-pinned `v7.0.0` is behind `v7.0.1`; a SHA pin is deliberately
immovable and is never reported.

A release lookup suppresses only a 404 — the legitimate "this action has
never cut a release" answer — and throws on anything else. Treating a
rate limit or an expired token as "no release" is indistinguishable from
"not stale", and since every action here already sits on its latest
major, the resulting empty section is byte-identical to a healthy run.

`buildClearedBody` now speaks for both halves: once actions are in scope,
its npm-only wording would assert a clean bill of health the sweep never
checked.

Dependabot security updates are unaffected — they are configured in repo
settings, not in this file, and kept working while it was missing
entirely (#1833, #1840). That note moves into the workflow header rather
than dying with the file; #2233 is where they are turned off
deliberately. The script header, the workflow header and the generated
issue body all say version-update PRs rather than claiming Dependabot is
replaced wholesale.

Also renames the workflow's npm-outdated job to dependency-sweep now
that the sweep is no longer npm-only.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NGtzPg3UxMLszysQXXfqax
Signed-off-by: cliffhall <cliff@futurescale.com>
@cliffhall
cliffhall force-pushed the v2/chore/2231-audit-fix-and-npm-outdated branch from c1b150f to 7186b44 Compare September 4, 2026 02:23
@cliffhall
cliffhall requested a balanced review from Copilot September 4, 2026 02:51

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

The workflow introduces persistent repository automation and modifies release-critical procedures, warranting final human validation despite no additional code findings.

Review details
  • Files reviewed: 4/4 changed files
  • Comments generated: 0 new
  • Review effort level: Balanced

@cliffhall

Copy link
Copy Markdown
Member Author

Copilot round 4 — clean on the rebased head (7186b441)

Requested after the stack was rebased and the CI fix landed, because rounds 2 and 3 approved bb9af94 and two tests were added afterward — an approval of an older state is not an approval of what would merge.

0 new comments; the inline count has held at 10 since round 1 (Copilot's original 5 plus my 5 replies).

The verdict moved to 🔵 Needs a closer look, which is not a code finding — the stated reason is that this "introduces persistent repository automation and modifies release-critical procedures, warranting final human validation despite no additional code findings." That is a request for a maintainer, not a change request, and it is a fair one: this PR schedules a monthly job that files issues on its own and rewrites a step of the release procedure.

Review history

Round Commit Verdict New comments
1 (5102950044) e32a1be 🟡 Changes recommended 5, all valid, all fixed
2 (5108387664) bb9af94 🟢 Approval recommended 0
3 (5108396254) bb9af94 🟢 Approval recommended 0
4 (5108727454) 7186b441 🔵 Needs a closer look 0

CI

Green on 7186b441build pass (27m25s), coverage pass (20m5s).

The earlier red was mine and is fixed here: main refuses to run without a repo exercised the repo = process.env.GITHUB_REPOSITORY default, and Actions sets that variable on every run, so the assertion held only where it happened to be unset. local:gate cannot catch that class — CI is the one environment where the default is always populated. Both halves of the default are now pinned explicitly.

Two items for the maintainer

  1. Add npm audit fix to the release flow and a monthly npm-outdated tracking issue #2231's framing narrowed. Round 1 finding SSE transport support #4 turned this from "add npm audit fix to the release flow" into an audit-and-act step, because AGENTS.md:99 forbids npm audit fix — plain, not just --force — and High-severity nanoid advisory in the production tree (via vite → postcss), on both branches #2058 is the reverted incident behind that rule. That is a change to what the issue asked for, not only how it was built.
  2. Round 4's 🔵 stands unaddressed by design. It asks for human validation of the automation and the release-procedure change. Nothing for me to fix; it wants eyes.

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

Labels

v2 Issues and PRs for v2

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add npm audit fix to the release flow and a monthly npm-outdated tracking issue

2 participants