a73x

c095fa6d

build(web): the dependency advisories are answered

a73x   2026-08-11 11:58

Commit message
build(web): the dependency advisories are answered

`npm audit` in web/ reported seven, and the useful question about each is not
its severity but whether its code can run here. The console is a static SPA:
`ssr = false`, `prerender = false`, adapter-static, and the Go server embeds
the client bundle and serves it as files. No Node process handles a request.
devDependencies are a build-time toolchain, and nothing in the tree below vite
or openapi-typescript reaches a browser — the built `build/` tree contains no
reference to any package named below.

Six clear with patch bumps inside the ranges package.json already declares, so
only package-lock.json moves:

  @sveltejs/kit    2.65.0  -> 2.70.2   moderate; GHSA-866w-xmhq-wj7x,
    GHSA-wqjv-9729-c5q2, GHSA-29g2-3rmr-qm68 — all in the server runtime
    (remote-function form handling, Accept-header negotiation) we never run.
  postcss          8.5.15  -> 8.5.26   high; GHSA-r28c-9q8g-f849,
    GHSA-fxqj-rqcc-2cmp — vite's CSS pipeline at build time, reading
    sourceMappingURL out of our own stylesheets.
  nanoid           3.3.12  -> 3.3.18   high; GHSA-28wg-ghj8-5hjv,
    GHSA-2v37-7h3g-55p8 — under postcss, same build-time reach.
  js-yaml          4.2.0   -> 4.3.1    high; GHSA-52cp-r559-cp3m,
    GHSA-5p4m-2wfm-xmqj — under openapi-typescript, parsing the spec `make
    api` hands it, which this repo generates.
  @redocly/openapi-core  1.34.17 -> 1.34.19  high, by way of js-yaml above.
  brace-expansion  2.1.2   -> 2.1.4    high; GHSA-mh99-v99m-4gvg,
    GHSA-rgw5-rvv9-x895 — minimatch, same openapi-typescript branch.

The seventh is accepted and recorded: cookie <0.7.0, GHSA-pxg6-pf52-xh8x, low,
CVSS 0 — out-of-bounds characters accepted in a cookie name. It arrives under
@sveltejs/kit, and kit@2.70.2, the newest 2.x there is, still declares
`cookie: ^0.6.0`; upstream has not moved. npm's offered fix is a downgrade to
@sveltejs/kit@0.0.30, which is not a fix. The parser lives in kit's
request-handling half and never executes in a build that serves no requests,
so the honest answer is to leave it and say why rather than to force a version
nothing here was tested against.

No major bumps were taken. None was needed: no advisory reaches production
code, so none of them buys the risk of moving vite, svelte or kit a major.
docs/assumptions.md records the claim that carries this — the console ships no
server runtime — along with what would make it false, because if anything ever
runs node against this app the accepted advisory goes live and the list has to
be read again.

`npm ci` from the new lockfile, `npm run build`, `npm run check`, `npm test`
and `make ci` all pass; api-check confirms the bumped generator still writes
the same api-types.ts, byte for byte.

docs/assumptions.md
Old New
@@ -502,3 +502,16 @@ and post-power-cycle proofs, read from the console instead of the file. Console
502 history survives a restart, so the reboot proof marks the stream at the start 502 history survives a restart, so the reboot proof marks the stream at the start
503 command and counts only what arrives after it — the freshness the old proof got 503 command and counts only what arrives after it — the freshness the old proof got
504 by truncating the file. 504 by truncating the file.
505
506 ### The console ships no server runtime
507
508 `ssr = false`, `prerender = false`, adapter-static with an index.html fallback:
509 SvelteKit's server half is built but never executed, and the only thing that
510 reaches a browser is the client bundle the Go server embeds. Underpins reading
511 an npm advisory by where its code runs — a SvelteKit request-handling flaw or a
512 cookie parser is dev-tree weight, not shipped attack surface, and clearing it
513 does not justify a major bump of vite, svelte or kit. **Proven** in code and in
514 the artifact: the built `build/` tree contains no reference to the packages the
515 advisories name. False the moment anything runs `node` against this app — a
516 preview server put in front of users, a prerendered route, an SSR endpoint. Any
517 of those turns the accepted advisories live and this list must be re-read.
web/package-lock.json
Old New
@@ -194,9 +194,9 @@
194 "license": "MIT" 194 "license": "MIT"
195 }, 195 },
196 "node_modules/@redocly/openapi-core": { 196 "node_modules/@redocly/openapi-core": {
197 "version": "1.34.17", 197 "version": "1.34.19",
198 "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.34.17.tgz", 198 "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.34.19.tgz",
199 "integrity": "sha512-wsV2keCt6B806XpSdezbWZ9aFJYf14YVh+XQf0ESt7M90yqVuxH9//PxvtC70sgj9OCkRM3nRaLfu4MsGQZRig==", 199 "integrity": "sha512-o/0VgsBXgwcY1lyeqcVtSGdTQAPnVggo0fbFVPlxl5XVDKUcVH0OLRqt3CbkwByT5FU305E0iE0O7MzThjDblw==",
200 "dev": true, 200 "dev": true,
201 "license": "MIT", 201 "license": "MIT",
202 "dependencies": { 202 "dependencies": {
@@ -205,7 +205,7 @@
205 "colorette": "1.4.0", 205 "colorette": "1.4.0",
206 "https-proxy-agent": "7.0.6", 206 "https-proxy-agent": "7.0.6",
207 "js-levenshtein": "1.1.6", 207 "js-levenshtein": "1.1.6",
208 "js-yaml": "4.2.0", 208 "js-yaml": "4.3.1",
209 "minimatch": "5.1.9", 209 "minimatch": "5.1.9",
210 "pluralize": "8.0.0", 210 "pluralize": "8.0.0",
211 "yaml-ast-parser": "0.0.43" 211 "yaml-ast-parser": "0.0.43"
@@ -535,9 +535,9 @@
535 } 535 }
536 }, 536 },
537 "node_modules/@sveltejs/kit": { 537 "node_modules/@sveltejs/kit": {
538 "version": "2.65.0", 538 "version": "2.70.2",
539 "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.65.0.tgz", 539 "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.70.2.tgz",
540 "integrity": "sha512-nUWJ4dSKNo8mIOh+HTL+XyRj8FX9Dyb1ayBxj4q9+WrTJfn4jfTt21p3WUFTnnmdnt9xAXpBKLQ+H9y41x0X7Q==", 540 "integrity": "sha512-RzRoRpuR2KXqc5yMO0akQHDZeT4AslOlznGITURsqHaVbtyYP4Wn3eE3gxj9JcDyNYO0crkxhdwFHc+2vkVm6w==",
541 "dev": true, 541 "dev": true,
542 "license": "MIT", 542 "license": "MIT",
543 "dependencies": { 543 "dependencies": {
@@ -866,9 +866,9 @@
866 "license": "MIT" 866 "license": "MIT"
867 }, 867 },
868 "node_modules/brace-expansion": { 868 "node_modules/brace-expansion": {
869 "version": "2.1.2", 869 "version": "2.1.4",
870 "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.2.tgz", 870 "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz",
871 "integrity": "sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA==", 871 "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==",
872 "dev": true, 872 "dev": true,
873 "license": "MIT", 873 "license": "MIT",
874 "dependencies": { 874 "dependencies": {
@@ -1134,9 +1134,9 @@
1134 "license": "MIT" 1134 "license": "MIT"
1135 }, 1135 },
1136 "node_modules/js-yaml": { 1136 "node_modules/js-yaml": {
1137 "version": "4.2.0", 1137 "version": "4.3.1",
1138 "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", 1138 "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz",
1139 "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", 1139 "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==",
1140 "dev": true, 1140 "dev": true,
1141 "funding": [ 1141 "funding": [
1142 { 1142 {
@@ -1504,9 +1504,9 @@
1504 "license": "MIT" 1504 "license": "MIT"
1505 }, 1505 },
1506 "node_modules/nanoid": { 1506 "node_modules/nanoid": {
1507 "version": "3.3.12", 1507 "version": "3.3.18",
1508 "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", 1508 "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz",
1509 "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", 1509 "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==",
1510 "dev": true, 1510 "dev": true,
1511 "funding": [ 1511 "funding": [
1512 { 1512 {
@@ -1613,9 +1613,9 @@
1613 } 1613 }
1614 }, 1614 },
1615 "node_modules/postcss": { 1615 "node_modules/postcss": {
1616 "version": "8.5.15", 1616 "version": "8.5.26",
1617 "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", 1617 "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz",
1618 "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", 1618 "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==",
1619 "dev": true, 1619 "dev": true,
1620 "funding": [ 1620 "funding": [
1621 { 1621 {
@@ -1633,7 +1633,7 @@
1633 ], 1633 ],
1634 "license": "MIT", 1634 "license": "MIT",
1635 "dependencies": { 1635 "dependencies": {
1636 "nanoid": "^3.3.12", 1636 "nanoid": "^3.3.17",
1637 "picocolors": "^1.1.1", 1637 "picocolors": "^1.1.1",
1638 "source-map-js": "^1.2.1" 1638 "source-map-js": "^1.2.1"
1639 }, 1639 },