src/apps/vitals.ts keeps only load and INP per app, but the forge's own page_vital keeps ttfb, load, lcp, inp and cls (src/web/measure.ts). An app gets the same five numbers.
Done looks like:
[ ] A migration adds ttfb, lcp and cls to app_vital. Old rows stay, with the new columns null.
[ ] recordAppVital stores them, validated the same way measure.ts validates them.
[ ] appVitals returns p75 for all five. The app's settings page shows them, with a dash for no data.
[ ] A test records reports and reads each p75 back.
Files: src/apps/vitals.ts, src/core/migrations/, src/web/pages/settings.ts, a test.
src/apps/vitals.tskeeps only load and INP per app, but the forge's ownpage_vitalkeeps ttfb, load, lcp, inp and cls (src/web/measure.ts). An app gets the same five numbers.Done looks like:
ttfb,lcpandclstoapp_vital. Old rows stay, with the new columns null.recordAppVitalstores them, validated the same waymeasure.tsvalidates them.appVitalsreturns p75 for all five. The app's settings page shows them, with a dash for no data.Files:
src/apps/vitals.ts,src/core/migrations/,src/web/pages/settings.ts, a test.