Skip to content

Bump @types/node from 25.9.1 to 25.9.2 - #17

Merged
BigSimmo merged 1 commit into
mainfrom
dependabot/npm_and_yarn/types/node-25.9.2
Jun 8, 2026
Merged

Bump @types/node from 25.9.1 to 25.9.2#17
BigSimmo merged 1 commit into
mainfrom
dependabot/npm_and_yarn/types/node-25.9.2

Conversation

@dependabot

@dependabotdependabotBot commented on behalf of githubJun 8, 2026

Copy link
Copy Markdown
Contributor

Bumps @types/node from 25.9.1 to 25.9.2.

Commits

Dependabot compatibility score

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
  • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)

Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 25.9.1 to 25.9.2.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)
---
updated-dependencies:
- dependency-name: "@types/node"
dependency-version: 25.9.2
dependency-type: direct:development
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot] <support@github.com>
@dependabotdependabotBot added dependencies Pull requests that update a dependency file javascript Pull requests that update javascript code labels Jun 8, 2026
@BigSimmo
BigSimmo merged commit 846b42f into mainJun 8, 2026
4 checks passed
@dependabot
dependabotBot deleted the dependabot/npm_and_yarn/types/node-25.9.2 branch June 8, 2026 05:37
BigSimmo pushed a commit that referenced this pull request Jul 21, 2026
Resolves the docs/outstanding-issues.md conflict: main added #11 (auth
DB-connection allocation) via its own ledger update, so this renumbers the
site-audit follow-ups from #11-#16 to #12-#17 (next-id -> 018) and fixes the
#17 cross-reference. Keeps main's #11 intact; no other ledger rows changed.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UbhUVWVJRwDibC2YtJ6aRX
BigSimmo pushed a commit that referenced this pull request Jul 22, 2026
BigSimmo pushed a commit that referenced this pull request Jul 22, 2026
…cile issue IDs
Review findings on PR #1050 (Codex P2 + CodeRabbit major, converged): a case
that attempted generation but lost the provider response (timeout, missing
output) has real-but-unrecorded token spend — keying $0 off hasOpenAIUsage
alone would report those as fully priced. $0 now applies only when no request
id, no model, and no generation time were recorded; provider-attempted cases
without usage metadata stay null (n/a total). Also resolves the ledger merge
conflict against #1049's concurrent ID allocation: main's #12-#17 stand, this
session's six items renumber to #18-#23 (next-id 024), the cost-readout row
is rewritten as post-fix validation only (CodeRabbit), and the unbalanced
strikethrough tildes in the E-3d row are fixed (CodeRabbit).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EXsJcLrbZUXwnBeG91cVo9
cursorBot pushed a commit that referenced this pull request Jul 28, 2026
Per /issues done: remove #12 from the recommended execution queue
composite (#13/#16 remain) and drop the Before #12 sequencing hint
on #17. #12 stays in Resolved/archive with the shipped outcome.
Co-authored-by: BigSimmo <BigSimmo@users.noreply.github.com>
BigSimmo pushed a commit that referenced this pull request Jul 29, 2026
The workflow deliberately downgrades a per-route Lighthouse failure to a
warning, but the summariser enumerated only the reports that existed and
rejected only an entirely empty directory. A directory holding just
desktop-root.json therefore produced zero mobile breaches and rendered
"Every mobile route is within..." — recommending #17 be closed and its
seven gated findings marked WONTFIX on evidence that was never collected.
Track the requested route-by-strategy matrix instead: the workflow passes
ROUTES through, and any expected mobile run with no report is a breach.
The step also exits non-zero when evidence is incomplete, so a partially
failed run cannot be read as a pass. An absent number was already treated
as a breach; an absent run now is too.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FvU8z73P6TXUXoYBqN5K1P
BigSimmo pushed a commit that referenced this pull request Jul 29, 2026
…uments
The documents segment has no page.tsx — it holds only search/, source/ and
[id]/ — and there is no rewrite for the bare path, so the default dispatch
input would have profiled the Next.js 404 document. docs/site-map.md lists
/documents/search as the canonical documents-mode route.
This matters more now that a missing mobile report is a hard breach: a route
that cannot produce a usable report would block the #17 verdict rather than
quietly skew it.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FvU8z73P6TXUXoYBqN5K1P
BigSimmo pushed a commit that referenced this pull request Jul 29, 2026
Two holes in the fail-closed gate, both of which exited 0 and let a verdict be
recorded on evidence that was not collected.
Desktop was never validated. #17 asks for reproducible mobile AND desktop
evidence, but the gate only asked mobileBreaches about missing mobile reports.
A complete mobile sweep with zero desktop reports printed the
metrics-acceptable verdict and exited 0. missingRuns() now covers the full
route-by-strategy matrix.
A present report with a null LCP/CLS did not fail the step. Those rows are
classified under failed with missingReport false, so the gate skipped them and
they surfaced only in the table - contradicting the documented guarantee that a
missing metric fails closed. They now carry missingMetric and are fatal.
An over-threshold number is deliberately still not 'incomplete': that is a real
measurement and a real verdict, and the distinction is pinned by a test.
Also sets persist-credentials: false on checkout (zizmor artipacked); the job
only reads files.
12 tests pass; both gaps were reproduced against the previous gate first.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FvU8z73P6TXUXoYBqN5K1P
BigSimmo pushed a commit that referenced this pull request Jul 29, 2026
LIVE_DOMAIN_URL can point the workflow at a staging cutover. The summariser
still printed 'closes#17 as metrics-acceptable', so a staging dry run read as
production evidence for a ledger item that asks for psychiatry.tools
specifically.
The origin is read from each report's own final URL rather than from
LIVE_DOMAIN_URL, so a redirect to another host is caught as well as a
deliberate override. A non-canonical origin still gets its table and its
threshold summary - it is a useful dry run - but the closure sentence is
replaced with an explicit non-verdict note naming the origin measured.
18 tests pass; reproduced against the previous code, which emitted the closure
sentence for a staging origin.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FvU8z73P6TXUXoYBqN5K1P
BigSimmo pushed a commit that referenced this pull request Jul 29, 2026
The #17 rule has three clauses - LCP, CLS and INP < 200ms - and Lighthouse
cannot measure INP in lab conditions at all. The summariser nonetheless printed
'closes#17 as metrics-acceptable' in bold on LCP and CLS alone and merely
asked the operator to confirm INP afterward, so an unavailable or >=200ms CrUX
value would have invalidated a closure already announced. The pass branch now
states that LCP and CLS are within threshold and that this is explicitly NOT
yet an #17 closure until INP is obtained from CrUX. The script can satisfy at
most two of the three clauses and no longer claims otherwise.
npx --yes lighthouse@12 resolves the range >=12.0.0 <13.0.0-0, so a patch
published between a baseline and its follow-up could change metric collection
independently of the application and decalibrate the comparison this workflow
exists to make. Pinned to 12.8.2 exactly, and summary.json now records the
resolved version so a baseline states its own tooling.
18 tests pass.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FvU8z73P6TXUXoYBqN5K1P
BigSimmo pushed a commit that referenced this pull request Jul 29, 2026
The reservation raised during this PR's review belongs where whoever
dispatches the workflow will find it, months from now, rather than in a
review thread. Records what the instrument is, that the decision rule was
committed before any numbers were read, that it fails closed, and that its
grading logic took eight rounds of corrections — so the first dispatch is a
measurement to sanity-check against the raw artifact, not an oracle, most of
all on a PASS that would close seven findings at once.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FvU8z73P6TXUXoYBqN5K1P
BigSimmo pushed a commit that referenced this pull request Jul 30, 2026
Seven findings, all the same shape: a gate that could pass while proving nothing.
Parser — multiline selectors (finding 5). parseUnlayeredVisualClasses only read the
line that opens a rule, so a selector list split across lines inventoried just its
final class and the registry could pass with an unregistered unlayered class. It
now walks back over comma-continued lines and records each class against the line
it appears on, and no longer requires the opening line to start with a class (an
earlier line can carry one the opening line does not). Closing the hole surfaced
THREE unpoliced classes, not the one reported: dashboard-composer-edge,
edge-glass-header and medication-also-matches. Each now carries an exemption, and
the docs claim is corrected — it no longer says the inventory is single-line only,
because it is not.
Grader completeness (findings 1-4) — these were one defect, not four:
incompleteBudgetEvidence was weaker than what gradeRun grades. It borrowed
hasUsableMetrics from summarise-web-vitals.mjs, which checks only LCP and CLS
because that is all ledger #17 grades. Completeness is now derived from the
tolerance keys and the baseline, so:
- a report missing any graded metric (TBT) fails instead of having it skipped
- a run the recorded baseline does not cover fails instead of grading ok at any
LCP, which is what happens when a route is added after the baseline
- colliding route slugs fail before measurement, reusing the repository's own
collidingRouteSlugs helper that was already exported for exactly this
- baselines store chromeVersion and a cross-version comparison is rejected, so a
runner browser bump is not mistaken for an application regression
CI change scope (findings 6-7). lighthouse-budget.json, both lighthouse scripts,
and tests/__screenshots__/ now set ui_changed, so enabling enforcement, breaking
the runner, or committing a corrupted golden actually triggers the job that would
catch it. Three self-test cases added.
verify:cheap: Test Files 435 passed, Tests 4536 passed | 4 skipped, exit 0.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XrPbbfU9yWuEjEVypCr4ZQ
BigSimmo pushed a commit that referenced this pull request Jul 30, 2026
…noise
`samples` is a free-text `workflow_dispatch` input, so the default of 3 was
only a default. An operator dispatching `samples=1` got back exactly the
single-run matrix this change exists to abolish — one report per cell, a
"median" of one, a zero-width range, and therefore a straddle check that
could never fire — and the output was indistinguishable from a sound run.
Verified against the pre-fix logic: with one sample per cell and every
threshold passing, `mobileBreaches` returned 0, `incompleteEvidence`
returned 0, and the table printed "Every mobile route is within LCP <
2500ms and CLS < 0.1" in bold. Nothing else in the pipeline objected,
because nothing else was looking at the sample count. That matrix could
have been recorded against #17 as a verdict.
Two samples are refused for the same reason: the median is their mean, and
two points cannot distinguish a stable cell from a noisy one whose runs
happened to land close together. Three is the `lighthouse-ci` default and
the smallest count that yields a real median.
Refused in three places, because each has a different failure window:
- `main()` exits before reading a single report, so no summary.json is
written that a reader could mistake for evidence
- `renderTable` adds it to the existing disqualifier list, so the step
summary — which outlives the run — cannot carry verdict prose either
- the workflow rejects it in seconds, before a full measurement pass
against the live domain is spent finding out
Six tests, including the decisive one: a one-sample matrix where every
threshold passes, the evidence is "complete" for the count requested, and
the spread is zero, so only this gate stands between it and a verdict.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FvU8z73P6TXUXoYBqN5K1P
BigSimmo pushed a commit that referenced this pull request Jul 30, 2026
Dispatched live-web-vitals.yml against psychiatry.tools (run 30548662649,
5 routes x 3 samples). #17 has been the gate on seven latency findings for
weeks with no evidence behind it. It now has evidence, and it is a breach.
Mobile medians against LCP<2500ms / CLS<0.1:
root 4308ms 0.023
therapy-compass 4716ms 0.142
documents-search 3676ms 0.220
dsm 3639ms 0.363
forms 3786ms 0.212
Desktop passes everywhere (LCP 625-694ms, CLS 0.016-0.097), which is worth
noting because desktop-only checking would have concluded the opposite.
The verdict is gradeable rather than noisy: every LCP sample range sits wholly
above 2500ms, so the straddle rule #114 added does not fire. That distinction is
the whole point of #1407's sampling work — a single run per cell could not have
told a real breach from variance.
Applying the rule as written before the numbers were read: any breach makes only
the breaching routes' findings actionable, and NOTHING becomes WONTFIX. That is
the opposite of what a favourable sample would have produced, which is exactly
why the rule was written first.
CLS 0.363 on /dsm is the worst single number and is visible layout shift, not a
byte-count problem — so it is not addressed by the payload findings #17 gates.
Recorded honestly as one step short of complete: this reads the summariser's
emitted table, not the raw Lighthouse JSON (artifact 8762211043, 30-day
retention). The row itself asks for that cross-check before recording a verdict,
most of all a PASS; this is a breach, so the risk of the table flattering the
result is lower, but the check is still outstanding. INP is absent because
Lighthouse cannot measure it in lab conditions.
Diff stays 1 line: #17's Detail cell is 2184 chars against the column's 3268
budget, so nothing repads (see #133).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01361jh3eYVjJCzXWjAhdZiF
BigSimmo pushed a commit that referenced this pull request Jul 30, 2026
Main's #1461 reflowed the open-items table while this branch appended
#17's live Web-Vitals verdict, so the two sides conflicted for real
(`git merge-tree` dirty, not staleness). Resolved row by row rather than
by taking either side: kept this branch's #17 BREACH verdict and #105
preconnect evidence, took main's #86 X3 progress and its new #145 row.
#105 closes. Its remaining half — the `LoadingPanel` fallbacks — is now
verified, and by a different method than the row prescribed. It claimed
the fallback renders solely while the client chunk is in flight, so only
a throttled-network run could observe it. That is wrong: the installed
Next 16 loader wraps an `ssr:false` import in Suspense whenever a
`loading` element is supplied, and `BailoutToCSR` throws on the server,
so the fallback is emitted in the server response HTML. Confirmed
against the running dev server — `role="status" aria-label="Loading"`
appears 1x on `/`, 2x on `/dsm`, 2x on `/forms`. No throttled run and no
`verify:ui` were needed. Finding raised by Codex on PR #1459.
The two recommended-queue entries now match their detail rows: #105 is
dropped from the queue, and #17 no longer directs a reader to capture
evidence that has already been captured and graded — its next action is
ranking the mobile findings by measured contribution and cross-checking
the raw Lighthouse JSON artifact.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01361jh3eYVjJCzXWjAhdZiF
BigSimmo pushed a commit that referenced this pull request Jul 30, 2026
…line
#17 asked for the mobile breach to be ranked by measured contribution.
Done, and the measurement turned up something that changes what the work
costs.
Ran the local offline production Lighthouse harness over the same five
routes the live dispatch used. The mobile CLS numbers do not merely
correlate with production — they match run 30548662649 to three decimals
on all four locally measurable routes (0.023 / 0.142 / 0.220 / 0.363),
and the desktop range matches at both endpoints (0.016-0.097). /forms
did not measure locally (Lighthouse NO_NAVSTART, its own "run again"
transient); live it was 0.212.
So CLS on these routes is deterministic layout structure, not network or
production data. The CLS half of #17 is debuggable and gate-able locally
at zero provider cost, and #17's recorded premise that production vitals
need Supabase secrets is stale — run-lighthouse-budget.mjs builds and
serves an offline production app precisely to sidestep that. Its earlier
"dev-mode CLS is excellent at 0.00-0.04" note was measuring dev, which
does not reproduce production.
LCP does NOT reproduce and must not be read from local runs: 2014-2051 ms
local against 3639-4716 ms live, because the loopback server has no
network latency. The LCP ranking does survive — /therapy-compass is the
outlier both locally and live — which corroborates #117.
Filed as #147 with the ranking (/dsm 0.363 worst, then /documents/search
0.220, /forms 0.212, /therapy-compass 0.142, / 0.023 passing) and the
next step: Lighthouse's layout-shift-elements audit returned zero items
on every route, so element attribution needs a PerformanceObserver on
layout-shift against the same offline build.
Two reproduction traps recorded with it: the harness reads CHROME_PATH
but nothing in this container sets it, so chrome-launcher fails on every
route; and a truncated `progress` package in the npx cache broke
Lighthouse startup entirely. No budget baseline was committed — the
grader correctly refused this run as incomplete evidence.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01361jh3eYVjJCzXWjAhdZiF
BigSimmo pushed a commit that referenced this pull request Jul 30, 2026
Fourth genuine conflict on docs/outstanding-issues.md, confirmed with
git merge-tree before acting. Main's #1470 rewrote #13 as
measurement-gated while this branch changed #17, #105 and added #147.
Verified by hash that main touched neither #17 nor #105 — both are
byte-identical at the merge base and at origin/main — so those rows take
this branch's version and #13 takes main's, rather than either side
winning wholesale.
Also de-duplicated against main's new #118, which already owns adopting
the Lighthouse baseline and flipping enforce. #147's gate paragraph now
cross-references it instead of restating it, and contributes the
constraint #118 was missing: pinning a baseline today would bake CLS
0.363 on /dsm in as the accepted value, so the CLS fixes must land first
or the gate ratifies the breach.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01361jh3eYVjJCzXWjAhdZiF
BigSimmo added a commit that referenced this pull request Jul 30, 2026
…ation, restore #105 after an upstream deletion (#1459)
* docs(issues): record #105's preconnect verification in a browser
The preconnect half of #105 is verified; the LoadingPanel half is not, and the
row now says which is which rather than carrying one PENDING for both.
Worth recording how it was verified, because the obvious check silently proves
nothing: locally NEXT_PUBLIC_SUPABASE_URL is unset, so supabaseOrigin() returns
null and the layout renders no link at all. Loading the app and finding no
preconnect would have looked like a failure and been an absent fixture. The
check needs a placeholder origin (no real network call — the point is React's
hoisting, not Supabase connectivity).
With that set, both the SSR HTML and the live browser DOM show preconnect and
dns-prefetch in <head> with zero stray preconnect in <body>, so React 19 does
hoist them out of the body where they are authored.
survives the hoist, which matters: without it supabase-js's CORS fetches open a
second connection and the hint buys nothing.
The remaining half needs a different technique. A LoadingPanel fallback only
renders while a lazy chunk is in flight, so it needs a throttled-network browser
check rather than verify:ui, which would race past it.
Gates: outstanding-issues guard 142 rows / unique ids; prettier clean; the edit
is a 1-line diff because it stays inside the Detail column's existing width
(1133 chars against a 3268 budget) — see #133 for why that matters in this file.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01361jh3eYVjJCzXWjAhdZiF
* docs(issues): record #17's live Web-Vitals verdict — mobile breaches
Dispatched live-web-vitals.yml against psychiatry.tools (run 30548662649,
5 routes x 3 samples). #17 has been the gate on seven latency findings for
weeks with no evidence behind it. It now has evidence, and it is a breach.
Mobile medians against LCP<2500ms / CLS<0.1:
root 4308ms 0.023
therapy-compass 4716ms 0.142
documents-search 3676ms 0.220
dsm 3639ms 0.363
forms 3786ms 0.212
Desktop passes everywhere (LCP 625-694ms, CLS 0.016-0.097), which is worth
noting because desktop-only checking would have concluded the opposite.
The verdict is gradeable rather than noisy: every LCP sample range sits wholly
above 2500ms, so the straddle rule #114 added does not fire. That distinction is
the whole point of #1407's sampling work — a single run per cell could not have
told a real breach from variance.
Applying the rule as written before the numbers were read: any breach makes only
the breaching routes' findings actionable, and NOTHING becomes WONTFIX. That is
the opposite of what a favourable sample would have produced, which is exactly
why the rule was written first.
CLS 0.363 on /dsm is the worst single number and is visible layout shift, not a
byte-count problem — so it is not addressed by the payload findings #17 gates.
Recorded honestly as one step short of complete: this reads the summariser's
emitted table, not the raw Lighthouse JSON (artifact 8762211043, 30-day
retention). The row itself asks for that cross-check before recording a verdict,
most of all a PASS; this is a breach, so the risk of the table flattering the
result is lower, but the check is still outstanding. INP is absent because
Lighthouse cannot measure it in lab conditions.
Diff stays 1 line: #17's Detail cell is 2184 chars against the column's 3268
budget, so nothing repads (see #133).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01361jh3eYVjJCzXWjAhdZiF
* docs(issues): withdraw the #105 LoadingPanel verification — it matched the wrong component
The claim that `LoadingPanel` was verified present in the SSR response HTML
does not hold, so #105 is reopened rather than archived.
The evidence was `role="status" aria-label="Loading"` appearing in the
initial HTML of `/`, `/dsm` and `/forms`. Those hits are real, but that
exact string has exactly one renderer in `src/` — `ModeHomePageSkeleton`
(`src/components/mode-home-page-skeleton.tsx:8`). `LoadingPanel` never
emits a bare "Loading" label; it renders `aria-label={label}`, always a
specific string such as "Loading differentials". Re-checked per route
against a running server, `/`, `/dsm`, `/forms`, `/differentials` and
`/favourites` return zero `aria-label="Loading <something>"` matches.
Codex's mechanism finding on this PR stands and is not what failed: the
installed Next 16 loader does set `hasSuspenseBoundary` when a `loading`
element is supplied, and `BailoutToCSR` throws on the server, so a mounted
`ssr:false` surface emits its fallback into the response HTML. What was
missing is that this only fires for a surface mounted during the initial
render, and none of the eleven in `clinical-dashboard-lazy.tsx` are —
every one sits behind interaction state (`ClinicalDashboard.tsx:3666-4070`).
So neither a cold-load grep nor the throttled check the row originally
prescribed can observe them; that needs a driven browser session.
The reopened row and its queue entry both record the withdrawn claim and
carry an explicit stop rule against re-closing on a cold-load grep. The
preconnect half remains verified and is marked so, to avoid redoing it.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01361jh3eYVjJCzXWjAhdZiF
* docs(issues): rank #17's mobile findings — CLS reproduces exactly offline
#17 asked for the mobile breach to be ranked by measured contribution.
Done, and the measurement turned up something that changes what the work
costs.
Ran the local offline production Lighthouse harness over the same five
routes the live dispatch used. The mobile CLS numbers do not merely
correlate with production — they match run 30548662649 to three decimals
on all four locally measurable routes (0.023 / 0.142 / 0.220 / 0.363),
and the desktop range matches at both endpoints (0.016-0.097). /forms
did not measure locally (Lighthouse NO_NAVSTART, its own "run again"
transient); live it was 0.212.
So CLS on these routes is deterministic layout structure, not network or
production data. The CLS half of #17 is debuggable and gate-able locally
at zero provider cost, and #17's recorded premise that production vitals
need Supabase secrets is stale — run-lighthouse-budget.mjs builds and
serves an offline production app precisely to sidestep that. Its earlier
"dev-mode CLS is excellent at 0.00-0.04" note was measuring dev, which
does not reproduce production.
LCP does NOT reproduce and must not be read from local runs: 2014-2051 ms
local against 3639-4716 ms live, because the loopback server has no
network latency. The LCP ranking does survive — /therapy-compass is the
outlier both locally and live — which corroborates #117.
Filed as #147 with the ranking (/dsm 0.363 worst, then /documents/search
0.220, /forms 0.212, /therapy-compass 0.142, / 0.023 passing) and the
next step: Lighthouse's layout-shift-elements audit returned zero items
on every route, so element attribution needs a PerformanceObserver on
layout-shift against the same offline build.
Two reproduction traps recorded with it: the harness reads CHROME_PATH
but nothing in this container sets it, so chrome-launcher fails on every
route; and a truncated `progress` package in the npx cache broke
Lighthouse startup entirely. No budget baseline was committed — the
grader correctly refused this run as incomplete evidence.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01361jh3eYVjJCzXWjAhdZiF
* docs(review): record PR 1459 final reconciliation
---------
Co-authored-by: Claude <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependenciesPull requests that update a dependency filejavascriptPull requests that update javascript code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@BigSimmo