Merge branch 'feat/v144-userneeds' into release/v1.44.0

# Conflicts:
#	src/__tests__/sharing-surface-guard.test.ts
#	src/__tests__/workout-canonical-identity-guard.test.ts
This commit is contained in:
Marc-André Bombeck committed 2026-10-21 22:24:01 +02:00
commit aa899a9d54
86 files changed
+12949 -9

No files matched your search

@@ -96,6 +96,9 @@ const MAY_READ_EVERY_ROW: Record<string, string> = {
// as stored, schedule and switch included.
"lib/export/full-backup-payload.ts": "backup carries the stored rows",
"lib/export/restore-backup.ts": "restore writes the stored rows back",
// v1.44 — the CSV import writes new medications and reads only their names
// and doses to skip duplicates; it derives nothing due.
"lib/import/medications-csv.ts": "imports new rows, derives nothing due",
// v1.43 — the units a taken dose consumed, resolved per slot exactly as
// the inventory does. It reads only doses already recorded as taken.
"lib/medications/ingredients/recompute.ts":
+16 -1
View File
@@ -1077,6 +1077,18 @@ const DELEGABLE_ROUTES: Record<string, DelegableEntry> = {
domain: "measurements",
why: "The record's workout list. Verified to carry no AI-written paragraph: the single-workout route beside it does, and stays refused for exactly that reason.",
},
"app/api/measurements/provenance/route.ts": {
domain: "measurements",
why: "Which source delivered a metric on one UTC day and which one the record's source priority picks, with the reason. Read-only aggregates of the resolved user's readings; no AI, no note text.",
},
"app/api/measurements/provenance/compare/route.ts": {
domain: "measurements",
why: "Two sources of one metric side by side over at most a year of UTC days, with the source the ladder picked each day. Read-only aggregates of the resolved user's readings; no AI, no note text.",
},
"app/api/activity/calendar/route.ts": {
domain: "measurements",
why: "The activity calendar: day totals of steps, active minutes and load, workouts by sport, and the record owner's goals, computed without AI. Read-only, scoped to the resolved user, module-gated on the record's own `workouts` switch like the workout list beside it.",
},
"app/api/cycle/cycles/route.ts": {
domain: "cycle",
why: "The record's cycle history. Whether cycle tracking applies is a property of the record, and the gate gets there by re-loading the profile and gender for the resolved user id — note that the `gender` argument at the call site is dead (`requireCycleEnabled` names it `_gender`), so it is the id that carries the substitution, not that argument.",
@@ -2178,8 +2190,11 @@ const ACTOR_ROUTES: Record<string, string> = {
*
* v1.44 -- the module list layout and the preview-feature switch are the
* person's own presentation and join the actor list. 268 -> 270.
*
* v1.44 -- the activity calendar read, the activity goals and the source
* provenance reads join the list. 270 -> 273.
*/
const FROZEN_ENTRY_COUNT = 270;
const FROZEN_ENTRY_COUNT = 273;
/**
* The two surfaces that authenticate a Bearer token outside `requireAuth` —
@@ -82,6 +82,9 @@ const PINNED_AFFORDANCES: Record<
// the two status grids used to spell the tint at every call site and now
// name a tone instead, so the marker lives here once.
"src/components/admin/_shared.tsx": { "text-success": 3, "toast.success": 1 },
// v1.44: the activity calendar's per-week tick for "every weekly goal met",
// a state of a row the person reads, not the outcome of a write.
"src/components/activity/activity-calendar-card.tsx": { "text-success": 1 },
// v1.42: the readiness inventory's "carries" status icon, one arm of the
// carries / thin / empty tone table, beside its spoken status label.
"src/components/timeline/readiness-inventory.tsx": { "text-success": 1 },
@@ -46,6 +46,9 @@ const IDENTITY_OWNER: Record<string, string> = {
// The doctor report's per-sport block (v1.44): sums sessions, so a session
// two sources reported must count once, as it does on the list.
"lib/doctor-report/workouts.ts": "lib/doctor-report/workouts.ts",
// The activity calendar counts workouts per day; a session two devices
// recorded must count once there, as it does in the list.
"lib/activity/calendar-read.ts": "lib/activity/calendar-read.ts",
// The only indirection in the set. The Coach block is handed rows it does not
// read itself; the snapshot builder fetches them in parallel with every other
// block's data. Recording the owner here rather than assuming the call site
@@ -53,6 +53,9 @@ const LIMITING_HELPERS: Record<string, string[]> = {
"lib/withings/webhook-handler.ts",
"lib/whoop/webhook-handler.ts",
],
// v1.44 — the lab and medication CSV imports: a preview bucket for a dry
// run, the shared `import:` bucket for the import itself.
handleRecordImport: ["lib/import/record-import-route.ts"],
};
/** Mutating routes with no limit, each with the reason it needs none. */