✔ durable exercise favorites are owner-scoped, canonical, bounded, and revision-fenced (24.266ms) ✔ screen read-model RPCs keep coordinated contracts across versioned cutovers (5.9945ms) ✔ screen read-model RPCs are auth-scoped JSONB APIs with prefixed inputs (13.716ms) ✔ SQL contracts and adapters expose the same bounded packages (3.7174ms) ✔ summary read models exclude raw workout detail row bags (2.6564ms) ✔ Home PR and Volume are materialized and independently callable (7.7494ms) ✖ screen RPCs exclude payload blobs and PR reads the final materialized projection (5.1331ms) ✔ stats workers roll refresh and failed integrity validation back together (20.0464ms) ✔ global stats batches serialize before retaining user advisory locks (6.6153ms) ✔ measured transition and current-state tables encode the domain invariants (7.1127ms) ✔ measured projection tables are owner-readable and service-written (26.4532ms) ✔ projector accepts only exact measured session sets and historical 1RM facts (15.6605ms) ✔ projector collapses same-day maxima and emits strict running-max transitions only (8.3119ms) ✔ corrections replay affected exercises atomically and remove obsolete projections (7.2212ms) ✔ raw workout deletion cannot be blocked by projection foreign-key cascades (0.9372ms) ✖ active overview, detail, calendar, Home, and session badges use measured projections (6.648ms) ✔ overview returns five representative rep maxima while detail owns exact 1 through 20 (74.9045ms) ✔ paged detail events expose exact numeric source lineage (21.995ms) ✔ historical 1RM writes are canonical facts and never direct projection writes (43.4995ms) ✔ cutover removes legacy measured-PR writes and guards reused core readers (42.1346ms) ✔ screen RPC contracts use the shared app performance budgets (1.5504ms) ✔ large-data regression tests consume the shared budgets instead of local limits (0.4739ms) ✔ PR and volume overview retain the same mock latency budget (0.105ms) ✔ DB screen RPC SQL keeps the documented row caps (6.7163ms) ✖ split Home bootstrap SQL keeps independent fragment row and payload caps (19.2315ms) ✔ split PR detail SQL keeps independent row and payload caps (21.2548ms) ✖ PR overview foreground reads only the bounded applied-generation snapshot (5.4702ms) ✔ profile feed SQL keeps the documented keyset page cap (0.5735ms) ✔ session search SQL keeps the documented bounded index cap (0.3674ms) ✔ app screen paths keep raw detail table fetches forbidden (9.0509ms) ✔ PR overview materialization uses typed header and exercise snapshot tables (23.5967ms) ✔ catalog changes invalidate snapshots in O(1) and leave bounded per-user rollover work (33.8944ms) ✖ the final PR summary reader consumes only the exact applied-generation snapshot (9.2979ms) ✔ the refresh window prebuilds only browser-local today candidates with no dynamic fallback (11.0177ms) ✔ bounded minute rollover keeps the browser-local date window materialized (16.7702ms) ✔ the final stats wrapper preserves existing read models and publishes PR snapshots (13.7961ms) ✔ job completion cannot advance applied_version without a complete three-date snapshot (15.4501ms) ✔ screen RPC contract file is the shared source of truth (7.5901ms) ✔ set-bearing RPCs pass through persisted e1RM and conditional max-rep projections (6.7992ms) ✔ log table cell set tokens accept null load (bodyweight) and null reps (time-based) (0.3543ms) ✔ PR history set tokens accept null load (bodyweight) and null reps (time-based) (0.4296ms) ✔ calendar read models keep month reads compact and day reads self-contained (10.5465ms) ✔ calendar month adapter accepts exact card ceilings and rejects every overflow path (13.5724ms) ✔ profile feed RPC is bounded, cursor-paginated, and collapses main set details (8.7137ms) ✔ session search RPC is bounded and returns collapsed searchable session cards (11.509ms) ✔ profile/search hard-cutover cards have byte-safe nested bounds and explicit truncation (62.7319ms) ✔ home dashboard is screen-shaped, bounded, and exposes refresh freshness (19.6692ms) ✔ home dashboard rejects truncated detail disguised as a complete edit source (0.829ms) ✔ max-row Home plan cards stay inside the initial Home response envelope without planned sets (7.1791ms) ✔ static catalog separates its normal response target from an enforced structural ceiling (73.3901ms) ✔ favorite RPC adapters require a complete bounded ordered exercise-ref list (1.1107ms) ✔ plan and completed writes share one hierarchy and its set-count limits (15.0808ms) ✔ planned-session detail is exact, owner-bound, and card reads stay set-free (13.2105ms) ✖ Home and PR projections cap every catalog presentation array (10.3343ms) ✔ refresh generations preserve dirty work and expose an auth-scoped bounded read model (12.7244ms) ✔ screen read-model budgets publish explicit performance envelopes (0.1501ms) ✔ PR exercise detail v4 fragments are independently bounded (29.0206ms) ✔ volume overview keeps only bounded aggregate rows (11.5379ms) ✔ volume v3 exposes bounded annual report facts without widening the general top-four rows (1.2217ms) ✔ volume v4 preserves v2/v3 and adds exact period-wide session timing vectors (4.8141ms) ✔ annual report defaults and future clamps use the canonical Seoul app date (3.1205ms) ✔ volume v3 adds exact canonical six-axis taxonomy aggregates without changing v2 (2.0218ms) ✔ set purpose policy is repetition/RPE based while intensity remains percent-of-1RM based (12.649ms) ✔ volume worst-shape top 4 plus annual, taxonomy and session-timing facts stays under 2.1 MB (115.6355ms) ✔ screen RPC validator reads required paths from the contract definitions (1.0184ms) ✔ dashboard adapters reject inconsistent freshness generations (0.2947ms) ✔ PR overview adapter accepts precomputed strength cutlines and profession composites, and rejects broken ladders (Phase 4-3) (1.7104ms) ✔ dashboard adapters reject refresh errors once generations are fresh (0.1488ms) ✔ screen RPC validator fails when payload and contract diverge (0.8448ms) ✔ screen RPC validator rejects forbidden raw detail paths from summary contracts (0.1806ms) ✔ log table month v3 and selected-cell detail enforce independent hard bounds (2.1596ms) ✔ validator and repository depend on screenRpcContracts instead of local maps (0.2438ms) ✔ completed-session detail v6 enforces exact edit-domain hard bounds (5.4532ms) ✔ completed-session detail is bounded in the DB write model and versioned RPC wrapper (10.8946ms) ✔ completed-session child limits serialize inserts and parent moves (5.5543ms) ✔ profile feed note entries are additive: validated when present, bounded to 4, absent pages still adapt (0.4953ms) ✔ static catalog accepts an additive load_multiplier of 1 or 2 and rejects other values (1.0587ms) ℹ tests 77 ℹ suites 0 ℹ pass 71 ℹ fail 6 ℹ cancelled 0 ℹ skipped 0 ℹ todo 0 ℹ duration_ms 1217.9208 ✖ failing tests: test at tests\support\nodeTestBudget.mjs:15:12 ✖ screen RPCs exclude payload blobs and PR reads the final materialized projection (5.1331ms) AssertionError [ERR_ASSERTION]: The input did not match the regular expression /user_pr_exercise_summary_snapshots/. Input: 'create or replace function public.get_user_pr_exercise_summaries_snapshot_json(p_user_id uuid, p_generation bigint, p_as_of date) returns jsonb\n' + ' language sql stable security definer\n' + ' set search_path = public\n' + ' as $$\n' + ' select jsonb_build_object(\n' + " 'items', coalesce((\n" + ' select jsonb_agg(\n' + ' jsonb_build_object(\n' + " 'id', snapshot.exercise_id,\n" + " 'benchmark_key', benchmark.member_key,\n" + " 'slug', '',\n" + " 'origin', case when exercise.owner_user_id is null then 'system' else 'user' end,\n" + " 'owner_user_id', exercise.owner_user_id,\n" + " 'archetype_id', exercise.archetype_id,\n" + " 'name_ko', public.left_utf8_bytes(exercise.name_ko, 120),\n" + " 'name_en', public.left_utf8_bytes(exercise.name_en, 96),\n" + " 'exercise_category', public.left_utf8_bytes(exercise.exercise_category, 48),\n" + " 'primary_part', public.left_utf8_bytes(public.exercise_region_ko_v1(exercise.target_muscles->0->>'region'), 48),\n" + " 'secondary_parts', public.bounded_text_array_json((select coalesce(array_agg(public.exercise_region_ko_v1(part_entry.value->>'region') order by part_entry.ordinality), array[]::text[]) from jsonb_array_elements(exercise.target_muscles) with ordinality part_entry(value, ordinality) where part_entry.ordinality > 1), 2, 32),\n" + " 'secondary_parts_truncated', public.text_array_was_truncated((select coalesce(array_agg(public.exercise_region_ko_v1(part_entry.value->>'region') order by part_entry.ordinality), array[]::text[]) from jsonb_array_elements(exercise.target_muscles) with ordinality part_entry(value, ordinality) where part_entry.ordinality > 1), 2, 32),\n" + " 'measurement_type', public.left_utf8_bytes(public.measurement_type_from_recording_fields_v1(exercise.recording_fields), 32),\n" + " 'bodyweight_factor', exercise.bodyweight_factor,\n" + " 'track_pr', exercise.track_pr,\n" + " 'sort_order', exercise.sort_order,\n" + " 'exercise_id', snapshot.exercise_id,\n" + " 'session_count', snapshot.session_count,\n" + " 'set_count', snapshot.set_count,\n" + " 'total_volume', snapshot.total_volume,\n" + " 'best_reps', snapshot.best_reps,\n" + " 'best_load', snapshot.best_load,\n" + " 'best_load_reps', snapshot.best_load_reps,\n" + " 'best_load_session_id', snapshot.best_load_session_id,\n" + " 'best_load_recorded_at', snapshot.best_load_recorded_at,\n" + " 'best_estimated_1rm', snapshot.best_estimated_1rm,\n" + " 'best_estimated_1rm_load', snapshot.best_estimated_1rm_load,\n" + " 'best_estimated_1rm_reps', snapshot.best_estimated_1rm_reps,\n" + " 'best_estimated_1rm_session_id', snapshot.best_estimated_1rm_session_id,\n" + " 'best_estimated_1rm_recorded_at', snapshot.best_estimated_1rm_recorded_at,\n" + " 'session_best_estimated_1rm', snapshot.session_best_estimated_1rm,\n" + " 'first_trained_at', snapshot.first_trained_at,\n" + " 'last_trained_at', snapshot.last_trained_at,\n" + " 'updated_at', snapshot.stats_updated_at,\n" + " 'current_1rm', snapshot.current_1rm,\n" + " 'current_1rm_date', snapshot.current_1rm_date,\n" + " 'current_1rm_event_id', snapshot.current_1rm_event_id,\n" + " 'current_1rm_source_kind', snapshot.current_1rm_source_kind,\n" + " 'current_1rm_source_id', snapshot.current_1rm_source_id,\n" + " 'current_1rm_is_baseline', snapshot.current_1rm_is_baseline,\n" + " 'display_nrm_target', snapshot.display_nrm_target,\n" + " 'display_nrm_value', snapshot.display_nrm_value,\n" + " 'previous_1rm', snapshot.previous_1rm,\n" + " 'previous_1rm_date', snapshot.previous_1rm_date,\n" + " 'delta_1rm', snapshot.delta_1rm,\n" + " 'yoy_1rm', snapshot.yoy_1rm,\n" + " 'last_pr_at', snapshot.last_pr_at,\n" + " 'rep_maxes', jsonb_build_object(\n" + " '1', snapshot.rep_max_1, '3', snapshot.rep_max_3,\n" + " '5', snapshot.rep_max_5, '8', snapshot.rep_max_8,\n" + " '10', snapshot.rep_max_10\n" + ' ),\n' + " 'recent_30', jsonb_build_object(\n" + " 'session_count', snapshot.recent_30_session_count,\n" + " 'set_count', snapshot.recent_30_set_count,\n" + " 'main_reps', snapshot.recent_30_main_reps,\n" + " 'volume', snapshot.recent_30_volume,\n" + " 'best_load', snapshot.recent_30_best_load,\n" + " 'best_estimated_1rm', snapshot.recent_30_best_estimated_1rm\n" + ' ),\n' + " 'presentation_truncated',\n" + " octet_length(coalesce(exercise.id::text, '')) > 160\n" + " or octet_length(coalesce('', '')) > 160\n" + " or octet_length(coalesce(exercise.archetype_id, '')) > 80\n" + " or octet_length(coalesce(exercise.name_ko, '')) > 120\n" + " or octet_length(coalesce(exercise.name_en, '')) > 96\n" + " or octet_length(coalesce(exercise.exercise_category, '')) > 48\n" + " or octet_length(coalesce(public.exercise_region_ko_v1(exercise.target_muscles->0->>'region'), '')) > 48\n" + " or public.text_array_was_truncated((select coalesce(array_agg(public.exercise_region_ko_v1(part_entry.value->>'region') order by part_entry.ordinality), array[]::text[]) from jsonb_array_elements(exercise.target_muscles) with ordinality part_entry(value, ordinality) where part_entry.ordinality > 1), 2, 32)\n" + ' ) order by snapshot.summary_rank\n' + ' )\n' + ' from public.read_user_pr_snapshot_rows_v1(headers.user_id,headers.generation,headers.as_of_date) snapshot\n' + ' join public.exercises exercise on exercise.id = snapshot.exercise_id\n' + ' left join public.exercise_business_role_memberships benchmark\n' + " on benchmark.role_key = 'pr_summary'\n" + ' and benchmark.exercise_id = snapshot.exercise_id\n' + ' where snapshot.user_id = headers.user_id\n' + ' and snapshot.as_of_date = headers.as_of_date\n' + " ), '[]'::jsonb),\n" + " 'total_count', headers.total_exercise_count,\n" + " 'trained_count', headers.trained_exercise_count,\n" + " 'truncated', headers.summaries_truncated\n" + ' )\n' + ' from public.user_pr_overview_snapshot_headers headers\n' + ' where headers.user_id = p_user_id and headers.generation = p_generation\n' + ' and headers.as_of_date = p_as_of;\n' + '$$;' at TestContext. (file:///C:/Users/USER/Documents/Codex/2026-09-10/14-2/work/barbelic-1422/test/appScreenRpcContract.test.mjs:348:12) at Test.runInAsyncScope (node:async_hooks:227:14) at Test.run (node:internal/test_runner/test:1306:25) at Test.processPendingSubtests (node:internal/test_runner/test:897:18) at Test.postRun (node:internal/test_runner/test:1447:19) at Test.run (node:internal/test_runner/test:1372:12) at async Test.processPendingSubtests (node:internal/test_runner/test:897:7) { generatedMessage: true, code: 'ERR_ASSERTION', actual: "create or replace function public.get_user_pr_exercise_summaries_snapshot_json(p_user_id uuid, p_generation bigint, p_as_of date) returns jsonb\n language sql stable security definer\n set search_path = public\n as $$\n select jsonb_build_object(\n 'items', coalesce((\n select jsonb_agg(\n jsonb_build_object(\n 'id', snapshot.exercise_id,\n 'benchmark_key', benchmark.member_key,\n 'slug', '',\n 'origin', case when exercise.owner_user_id is null then 'system' else 'user' end,\n 'owner_user_id', exercise.owner_user_id,\n 'archetype_id', exercise.archetype_id,\n 'name_ko', public.left_utf8_bytes(exercise.name_ko, 120),\n 'name_en', public.left_utf8_bytes(exercise.name_en, 96),\n 'exercise_category', public.left_utf8_bytes(exercise.exercise_category, 48),\n 'primary_part', public.left_utf8_bytes(public.exercise_region_ko_v1(exercise.target_muscles->0->>'region'), 48),\n 'secondary_parts', public.bounded_text_array_json((select coalesce(array_agg(public.exercise_region_ko_v1(part_entry.value->>'region') order by part_entry.ordinality), array[]::text[]) from jsonb_array_elements(exercise.target_muscles) with ordinality part_entry(value, ordinality) where part_entry.ordinality > 1), 2, 32),\n 'secondary_parts_truncated', public.text_array_was_truncated((select coalesce(array_agg(public.exercise_region_ko_v1(part_entry.value->>'region') order by part_entry.ordinality), array[]::text[]) from jsonb_array_elements(exercise.target_muscles) with ordinality part_entry(value, ordinality) where part_entry.ordinality > 1), 2, 32),\n 'measurement_type', public.left_utf8_bytes(public.measurement_type_from_recording_fields_v1(exercise.recording_fields), 32),\n 'bodyweight_factor', exercise.bodyweight_factor,\n 'track_pr', exercise.track_pr,\n 'sort_order', exercise.sort_order,\n 'exercise_id', snapshot.exercise_id,\n 'session_count', snapshot.session_count,\n 'set_count', snapshot.set_count,\n 'total_volume', snapshot.total_volume,\n 'best_reps', snapshot.best_reps,\n 'best_load', snapshot.best_load,\n 'best_load_reps', snapshot.best_load_reps,\n 'best_load_session_id', snapshot.best_load_session_id,\n 'best_load_recorded_at', snapshot.best_load_recorded_at,\n 'best_estimated_1rm', snapshot.best_estimated_1rm,\n 'best_estimated_1rm_load', snapshot.best_estimated_1rm_load,\n 'best_estimated_1rm_reps', snapshot.best_estimated_1rm_reps,\n 'best_estimated_1rm_session_id', snapshot.best_estimated_1rm_session_id,\n 'best_estimated_1rm_recorded_at', snapshot.best_estimated_1rm_recorded_at,\n 'session_best_estimated_1rm', snapshot.session_best_estimated_1rm,\n 'first_trained_at', snapshot.first_trained_at,\n 'last_trained_at', snapshot.last_trained_at,\n 'updated_at', snapshot.stats_updated_at,\n 'current_1rm', snapshot.current_1rm,\n 'current_1rm_date', snapshot.current_1rm_date,\n 'current_1rm_event_id', snapshot.current_1rm_event_id,\n 'current_1rm_source_kind', snapshot.current_1rm_source_kind,\n 'current_1rm_source_id', snapshot.current_1rm_source_id,\n 'current_1rm_is_baseline', snapshot.current_1rm_is_baseline,\n 'display_nrm_target', snapshot.display_nrm_target,\n 'display_nrm_value', snapshot.display_nrm_value,\n 'previous_1rm', snapshot.previous_1rm,\n 'previous_1rm_date', snapshot.previous_1rm_date,\n 'delta_1rm', snapshot.delta_1rm,\n 'yoy_1rm', snapshot.yoy_1rm,\n 'last_pr_at', snapshot.last_pr_at,\n 'rep_maxes', jsonb_build_object(\n '1', snapshot.rep_max_1, '3', snapshot.rep_max_3,\n '5', snapshot.rep_max_5, '8', snapshot.rep_max_8,\n '10', snapshot.rep_max_10\n ),\n 'recent_30', jsonb_build_object(\n 'session_count', snapshot.recent_30_session_count,\n 'set_count', snapshot.recent_30_set_count,\n 'main_reps', snapshot.recent_30_main_reps,\n 'volume', snapshot.recent_30_volume,\n 'best_load', snapshot.recent_30_best_load,\n 'best_estimated_1rm', snapshot.recent_30_best_estimated_1rm\n ),\n 'presentation_truncated',\n octet_length(coalesce(exercise.id::text, '')) > 160\n or octet_length(coalesce('', '')) > 160\n or octet_length(coalesce(exercise.archetype_id, '')) > 80\n or octet_length(coalesce(exercise.name_ko, '')) > 120\n or octet_length(coalesce(exercise.name_en, '')) > 96\n or octet_length(coalesce(exercise.exercise_category, '')) > 48\n or octet_length(coalesce(public.exercise_region_ko_v1(exercise.target_muscles->0->>'region'), '')) > 48\n or public.text_array_was_truncated((select coalesce(array_agg(public.exercise_region_ko_v1(part_entry.value->>'region') order by part_entry.ordinality), array[]::text[]) from jsonb_array_elements(exercise.target_muscles) with ordinality part_entry(value, ordinality) where part_entry.ordinality > 1), 2, 32)\n ) order by snapshot.summary_rank\n )\n from public.read_user_pr_snapshot_rows_v1(headers.user_id,headers.generation,headers.as_of_date) snapshot\n join public.exercises exercise on exercise.id = snapshot.exercise_id\n left join public.exercise_business_role_memberships benchmark\n on benchmark.role_key = 'pr_summary'\n and benchmark.exercise_id = snapshot.exercise_id\n where snapshot.user_id = headers.user_id\n and snapshot.as_of_date = headers.as_of_date\n ), '[]'::jsonb),\n 'total_count', headers.total_exercise_count,\n 'trained_count', headers.trained_exercise_count,\n 'truncated', headers.summaries_truncated\n )\n from public.user_pr_overview_snapshot_headers headers\n where headers.user_id = p_user_id and headers.generation = p_generation\n and headers.as_of_date = p_as_of;\n$$;", expected: /user_pr_exercise_summary_snapshots/, operator: 'match', diff: 'simple' } test at tests\support\nodeTestBudget.mjs:15:12 ✖ active overview, detail, calendar, Home, and session badges use measured projections (6.648ms) AssertionError [ERR_ASSERTION]: get_user_home_benchmark_prs_json should read the measured state/event projection at TestContext. (file:///C:/Users/USER/Documents/Codex/2026-09-10/14-2/work/barbelic-1422/test/measuredPrProjectionSqlContract.test.mjs:265:12) at Test.runInAsyncScope (node:async_hooks:227:14) at Test.run (node:internal/test_runner/test:1306:25) at Test.processPendingSubtests (node:internal/test_runner/test:897:18) at Test.postRun (node:internal/test_runner/test:1447:19) at Test.run (node:internal/test_runner/test:1372:12) at async Test.processPendingSubtests (node:internal/test_runner/test:897:7) { generatedMessage: false, code: 'ERR_ASSERTION', actual: "create or replace function public.get_user_home_benchmark_prs_json(p_user_id uuid, p_generation bigint, p_as_of date) returns jsonb\n language plpgsql stable security definer\n set search_path = public\n as $$\ndeclare v_payload jsonb;\nbegin\n if p_user_id is null or p_generation is null or p_generation < 0 or p_as_of is null then\n raise exception 'user_id, non-negative generation, and as_of are required' using errcode = '22023';\n end if;\n\n with benchmark_sources as materialized (\n select membership.sort_order as benchmark_rank,\n membership.member_key as benchmark_key,\n membership.exercise_id\n from public.exercise_business_role_memberships membership\n where membership.role_key = 'home_benchmark'\n ), ranked as materialized (\n select benchmark.*, snapshot.current_1rm as record_value,\n snapshot.current_1rm_date as recorded_at,\n snapshot.current_1rm_event_id as event_id,\n snapshot.current_1rm_source_kind as source_kind,\n snapshot.current_1rm_source_id as source_id,\n snapshot.current_1rm_is_baseline as is_baseline,\n exercise.name_ko, exercise.name_en\n from benchmark_sources benchmark\n join public.read_user_pr_snapshot_rows_v1(p_user_id,p_generation,p_as_of) snapshot\n on snapshot.user_id = p_user_id\n and snapshot.as_of_date = p_as_of and snapshot.exercise_id = benchmark.exercise_id\n join public.exercises exercise on exercise.id = benchmark.exercise_id\n where snapshot.current_1rm > 0\n ), bounded as (\n select * from ranked order by benchmark_rank limit 8\n )\n select coalesce(jsonb_agg(jsonb_build_object(\n 'benchmark_key', bounded.benchmark_key,\n 'exercise_id', bounded.exercise_id,\n 'source_exercise_id', bounded.exercise_id,\n 'name_ko', public.left_utf8_bytes(bounded.name_ko, 120),\n 'name_en', public.left_utf8_bytes(bounded.name_en, 96),\n 'target_reps', 1,\n 'record_value', bounded.record_value,\n 'record_unit', 'kg',\n 'recorded_at', bounded.recorded_at,\n 'record_kind', 'measured_1rm',\n 'event_id', bounded.event_id,\n 'source_kind', bounded.source_kind,\n 'source_id', bounded.source_id,\n 'is_baseline', bounded.is_baseline,\n 'presentation_truncated', false\n ) order by bounded.benchmark_rank), '[]'::jsonb)\n into v_payload from bounded;\n\n if jsonb_array_length(v_payload) > 8 or octet_length(v_payload::text) > 16000 then\n raise exception 'Home benchmark measured PR payload exceeded its bound' using errcode = '54000';\n end if;\n return v_payload;\nend;\n$$;", expected: /user_pr_exercise_summary_snapshots/i, operator: 'match', diff: 'simple' } test at tests\support\nodeTestBudget.mjs:15:12 ✖ split Home bootstrap SQL keeps independent fragment row and payload caps (19.2315ms) AssertionError [ERR_ASSERTION]: The input did not match the regular expression /join public\.user_pr_exercise_summary_snapshots snapshot/. Input: 'create or replace function public.get_user_home_benchmark_prs_json(p_user_id uuid, p_generation bigint, p_as_of date) returns jsonb\n' + ' language plpgsql stable security definer\n' + ' set search_path = public\n' + ' as $$\n' + 'declare v_payload jsonb;\n' + 'begin\n' + ' if p_user_id is null or p_generation is null or p_generation < 0 or p_as_of is null then\n' + " raise exception 'user_id, non-negative generation, and as_of are required' using errcode = '22023';\n" + ' end if;\n' + '\n' + ' with benchmark_sources as materialized (\n' + ' select membership.sort_order as benchmark_rank,\n' + ' membership.member_key as benchmark_key,\n' + ' membership.exercise_id\n' + ' from public.exercise_business_role_memberships membership\n' + " where membership.role_key = 'home_benchmark'\n" + ' ), ranked as materialized (\n' + ' select benchmark.*, snapshot.current_1rm as record_value,\n' + ' snapshot.current_1rm_date as recorded_at,\n' + ' snapshot.current_1rm_event_id as event_id,\n' + ' snapshot.current_1rm_source_kind as source_kind,\n' + ' snapshot.current_1rm_source_id as source_id,\n' + ' snapshot.current_1rm_is_baseline as is_baseline,\n' + ' exercise.name_ko, exercise.name_en\n' + ' from benchmark_sources benchmark\n' + ' join public.read_user_pr_snapshot_rows_v1(p_user_id,p_generation,p_as_of) snapshot\n' + ' on snapshot.user_id = p_user_id\n' + ' and snapshot.as_of_date = p_as_of and snapshot.exercise_id = benchmark.exercise_id\n' + ' join public.exercises exercise on exercise.id = benchmark.exercise_id\n' + ' where snapshot.current_1rm > 0\n' + ' ), bounded as (\n' + ' select * from ranked order by benchmark_rank limit 8\n' + ' )\n' + ' select coalesce(jsonb_agg(jsonb_build_object(\n' + " 'benchmark_key', bounded.benchmark_key,\n" + " 'exercise_id', bounded.exercise_id,\n" + " 'source_exercise_id', bounded.exercise_id,\n" + " 'name_ko', public.left_utf8_bytes(bounded.name_ko, 120),\n" + " 'name_en', public.left_utf8_bytes(bounded.name_en, 96),\n" + " 'target_reps', 1,\n" + " 'record_value', bounded.record_value,\n" + " 'record_unit', 'kg',\n" + " 'recorded_at', bounded.recorded_at,\n" + " 'record_kind', 'measured_1rm',\n" + " 'event_id', bounded.event_id,\n" + " 'source_kind', bounded.source_kind,\n" + " 'source_id', bounded.source_id,\n" + " 'is_baseline', bounded.is_baseline,\n" + " 'presentation_truncated', false\n" + " ) order by bounded.benchmark_rank), '[]'::jsonb)\n" + ' into v_payload from bounded;\n' + '\n' + ' if jsonb_array_length(v_payload) > 8 or octet_length(v_payload::text) > 16000 then\n' + " raise exception 'Home benchmark measured PR payload exceeded its bound' using errcode = '54000';\n" + ' end if;\n' + ' return v_payload;\n' + 'end;\n' + '$$;' at TestContext. (file:///C:/Users/USER/Documents/Codex/2026-09-10/14-2/work/barbelic-1422/test/performanceBudgets.test.mjs:268:10) at Test.runInAsyncScope (node:async_hooks:227:14) at Test.run (node:internal/test_runner/test:1306:25) at Test.processPendingSubtests (node:internal/test_runner/test:897:18) at Test.postRun (node:internal/test_runner/test:1447:19) at Test.run (node:internal/test_runner/test:1372:12) at async Test.processPendingSubtests (node:internal/test_runner/test:897:7) { generatedMessage: true, code: 'ERR_ASSERTION', actual: "create or replace function public.get_user_home_benchmark_prs_json(p_user_id uuid, p_generation bigint, p_as_of date) returns jsonb\n language plpgsql stable security definer\n set search_path = public\n as $$\ndeclare v_payload jsonb;\nbegin\n if p_user_id is null or p_generation is null or p_generation < 0 or p_as_of is null then\n raise exception 'user_id, non-negative generation, and as_of are required' using errcode = '22023';\n end if;\n\n with benchmark_sources as materialized (\n select membership.sort_order as benchmark_rank,\n membership.member_key as benchmark_key,\n membership.exercise_id\n from public.exercise_business_role_memberships membership\n where membership.role_key = 'home_benchmark'\n ), ranked as materialized (\n select benchmark.*, snapshot.current_1rm as record_value,\n snapshot.current_1rm_date as recorded_at,\n snapshot.current_1rm_event_id as event_id,\n snapshot.current_1rm_source_kind as source_kind,\n snapshot.current_1rm_source_id as source_id,\n snapshot.current_1rm_is_baseline as is_baseline,\n exercise.name_ko, exercise.name_en\n from benchmark_sources benchmark\n join public.read_user_pr_snapshot_rows_v1(p_user_id,p_generation,p_as_of) snapshot\n on snapshot.user_id = p_user_id\n and snapshot.as_of_date = p_as_of and snapshot.exercise_id = benchmark.exercise_id\n join public.exercises exercise on exercise.id = benchmark.exercise_id\n where snapshot.current_1rm > 0\n ), bounded as (\n select * from ranked order by benchmark_rank limit 8\n )\n select coalesce(jsonb_agg(jsonb_build_object(\n 'benchmark_key', bounded.benchmark_key,\n 'exercise_id', bounded.exercise_id,\n 'source_exercise_id', bounded.exercise_id,\n 'name_ko', public.left_utf8_bytes(bounded.name_ko, 120),\n 'name_en', public.left_utf8_bytes(bounded.name_en, 96),\n 'target_reps', 1,\n 'record_value', bounded.record_value,\n 'record_unit', 'kg',\n 'recorded_at', bounded.recorded_at,\n 'record_kind', 'measured_1rm',\n 'event_id', bounded.event_id,\n 'source_kind', bounded.source_kind,\n 'source_id', bounded.source_id,\n 'is_baseline', bounded.is_baseline,\n 'presentation_truncated', false\n ) order by bounded.benchmark_rank), '[]'::jsonb)\n into v_payload from bounded;\n\n if jsonb_array_length(v_payload) > 8 or octet_length(v_payload::text) > 16000 then\n raise exception 'Home benchmark measured PR payload exceeded its bound' using errcode = '54000';\n end if;\n return v_payload;\nend;\n$$;", expected: /join public\.user_pr_exercise_summary_snapshots snapshot/, operator: 'match', diff: 'simple' } test at tests\support\nodeTestBudget.mjs:15:12 ✖ PR overview foreground reads only the bounded applied-generation snapshot (5.4702ms) AssertionError [ERR_ASSERTION]: The input did not match the regular expression /public\.user_pr_exercise_summary_snapshots/. Input: 'create or replace function public.get_user_pr_exercise_summaries_snapshot_json(p_user_id uuid, p_generation bigint, p_as_of date) returns jsonb\n' + ' language sql stable security definer\n' + ' set search_path = public\n' + ' as $$\n' + ' select jsonb_build_object(\n' + " 'items', coalesce((\n" + ' select jsonb_agg(\n' + ' jsonb_build_object(\n' + " 'id', snapshot.exercise_id,\n" + " 'benchmark_key', benchmark.member_key,\n" + " 'slug', '',\n" + " 'origin', case when exercise.owner_user_id is null then 'system' else 'user' end,\n" + " 'owner_user_id', exercise.owner_user_id,\n" + " 'archetype_id', exercise.archetype_id,\n" + " 'name_ko', public.left_utf8_bytes(exercise.name_ko, 120),\n" + " 'name_en', public.left_utf8_bytes(exercise.name_en, 96),\n" + " 'exercise_category', public.left_utf8_bytes(exercise.exercise_category, 48),\n" + " 'primary_part', public.left_utf8_bytes(public.exercise_region_ko_v1(exercise.target_muscles->0->>'region'), 48),\n" + " 'secondary_parts', public.bounded_text_array_json((select coalesce(array_agg(public.exercise_region_ko_v1(part_entry.value->>'region') order by part_entry.ordinality), array[]::text[]) from jsonb_array_elements(exercise.target_muscles) with ordinality part_entry(value, ordinality) where part_entry.ordinality > 1), 2, 32),\n" + " 'secondary_parts_truncated', public.text_array_was_truncated((select coalesce(array_agg(public.exercise_region_ko_v1(part_entry.value->>'region') order by part_entry.ordinality), array[]::text[]) from jsonb_array_elements(exercise.target_muscles) with ordinality part_entry(value, ordinality) where part_entry.ordinality > 1), 2, 32),\n" + " 'measurement_type', public.left_utf8_bytes(public.measurement_type_from_recording_fields_v1(exercise.recording_fields), 32),\n" + " 'bodyweight_factor', exercise.bodyweight_factor,\n" + " 'track_pr', exercise.track_pr,\n" + " 'sort_order', exercise.sort_order,\n" + " 'exercise_id', snapshot.exercise_id,\n" + " 'session_count', snapshot.session_count,\n" + " 'set_count', snapshot.set_count,\n" + " 'total_volume', snapshot.total_volume,\n" + " 'best_reps', snapshot.best_reps,\n" + " 'best_load', snapshot.best_load,\n" + " 'best_load_reps', snapshot.best_load_reps,\n" + " 'best_load_session_id', snapshot.best_load_session_id,\n" + " 'best_load_recorded_at', snapshot.best_load_recorded_at,\n" + " 'best_estimated_1rm', snapshot.best_estimated_1rm,\n" + " 'best_estimated_1rm_load', snapshot.best_estimated_1rm_load,\n" + " 'best_estimated_1rm_reps', snapshot.best_estimated_1rm_reps,\n" + " 'best_estimated_1rm_session_id', snapshot.best_estimated_1rm_session_id,\n" + " 'best_estimated_1rm_recorded_at', snapshot.best_estimated_1rm_recorded_at,\n" + " 'session_best_estimated_1rm', snapshot.session_best_estimated_1rm,\n" + " 'first_trained_at', snapshot.first_trained_at,\n" + " 'last_trained_at', snapshot.last_trained_at,\n" + " 'updated_at', snapshot.stats_updated_at,\n" + " 'current_1rm', snapshot.current_1rm,\n" + " 'current_1rm_date', snapshot.current_1rm_date,\n" + " 'current_1rm_event_id', snapshot.current_1rm_event_id,\n" + " 'current_1rm_source_kind', snapshot.current_1rm_source_kind,\n" + " 'current_1rm_source_id', snapshot.current_1rm_source_id,\n" + " 'current_1rm_is_baseline', snapshot.current_1rm_is_baseline,\n" + " 'display_nrm_target', snapshot.display_nrm_target,\n" + " 'display_nrm_value', snapshot.display_nrm_value,\n" + " 'previous_1rm', snapshot.previous_1rm,\n" + " 'previous_1rm_date', snapshot.previous_1rm_date,\n" + " 'delta_1rm', snapshot.delta_1rm,\n" + " 'yoy_1rm', snapshot.yoy_1rm,\n" + " 'last_pr_at', snapshot.last_pr_at,\n" + " 'rep_maxes', jsonb_build_object(\n" + " '1', snapshot.rep_max_1, '3', snapshot.rep_max_3,\n" + " '5', snapshot.rep_max_5, '8', snapshot.rep_max_8,\n" + " '10', snapshot.rep_max_10\n" + ' ),\n' + " 'recent_30', jsonb_build_object(\n" + " 'session_count', snapshot.recent_30_session_count,\n" + " 'set_count', snapshot.recent_30_set_count,\n" + " 'main_reps', snapshot.recent_30_main_reps,\n" + " 'volume', snapshot.recent_30_volume,\n" + " 'best_load', snapshot.recent_30_best_load,\n" + " 'best_estimated_1rm', snapshot.recent_30_best_estimated_1rm\n" + ' ),\n' + " 'presentation_truncated',\n" + " octet_length(coalesce(exercise.id::text, '')) > 160\n" + " or octet_length(coalesce('', '')) > 160\n" + " or octet_length(coalesce(exercise.archetype_id, '')) > 80\n" + " or octet_length(coalesce(exercise.name_ko, '')) > 120\n" + " or octet_length(coalesce(exercise.name_en, '')) > 96\n" + " or octet_length(coalesce(exercise.exercise_category, '')) > 48\n" + " or octet_length(coalesce(public.exercise_region_ko_v1(exercise.target_muscles->0->>'region'), '')) > 48\n" + " or public.text_array_was_truncated((select coalesce(array_agg(public.exercise_region_ko_v1(part_entry.value->>'region') order by part_entry.ordinality), array[]::text[]) from jsonb_array_elements(exercise.target_muscles) with ordinality part_entry(value, ordinality) where part_entry.ordinality > 1), 2, 32)\n" + ' ) order by snapshot.summary_rank\n' + ' )\n' + ' from public.read_user_pr_snapshot_rows_v1(headers.user_id,headers.generation,headers.as_of_date) snapshot\n' + ' join public.exercises exercise on exercise.id = snapshot.exercise_id\n' + ' left join public.exercise_business_role_memberships benchmark\n' + " on benchmark.role_key = 'pr_summary'\n" + ' and benchmark.exercise_id = snapshot.exercise_id\n' + ' where snapshot.user_id = headers.user_id\n' + ' and snapshot.as_of_date = headers.as_of_date\n' + " ), '[]'::jsonb),\n" + " 'total_count', headers.total_exercise_count,\n" + " 'trained_count', headers.trained_exercise_count,\n" + " 'truncated', headers.summaries_truncated\n" + ' )\n' + ' from public.user_pr_overview_snapshot_headers headers\n' + ' where headers.user_id = p_user_id and headers.generation = p_generation\n' + ' and headers.as_of_date = p_as_of;\n' + '$$;' at TestContext. (file:///C:/Users/USER/Documents/Codex/2026-09-10/14-2/work/barbelic-1422/test/performanceBudgets.test.mjs:388:12) at Test.runInAsyncScope (node:async_hooks:227:14) at Test.run (node:internal/test_runner/test:1306:25) at Test.processPendingSubtests (node:internal/test_runner/test:897:18) at Test.postRun (node:internal/test_runner/test:1447:19) at Test.run (node:internal/test_runner/test:1372:12) at async Test.processPendingSubtests (node:internal/test_runner/test:897:7) { generatedMessage: true, code: 'ERR_ASSERTION', actual: "create or replace function public.get_user_pr_exercise_summaries_snapshot_json(p_user_id uuid, p_generation bigint, p_as_of date) returns jsonb\n language sql stable security definer\n set search_path = public\n as $$\n select jsonb_build_object(\n 'items', coalesce((\n select jsonb_agg(\n jsonb_build_object(\n 'id', snapshot.exercise_id,\n 'benchmark_key', benchmark.member_key,\n 'slug', '',\n 'origin', case when exercise.owner_user_id is null then 'system' else 'user' end,\n 'owner_user_id', exercise.owner_user_id,\n 'archetype_id', exercise.archetype_id,\n 'name_ko', public.left_utf8_bytes(exercise.name_ko, 120),\n 'name_en', public.left_utf8_bytes(exercise.name_en, 96),\n 'exercise_category', public.left_utf8_bytes(exercise.exercise_category, 48),\n 'primary_part', public.left_utf8_bytes(public.exercise_region_ko_v1(exercise.target_muscles->0->>'region'), 48),\n 'secondary_parts', public.bounded_text_array_json((select coalesce(array_agg(public.exercise_region_ko_v1(part_entry.value->>'region') order by part_entry.ordinality), array[]::text[]) from jsonb_array_elements(exercise.target_muscles) with ordinality part_entry(value, ordinality) where part_entry.ordinality > 1), 2, 32),\n 'secondary_parts_truncated', public.text_array_was_truncated((select coalesce(array_agg(public.exercise_region_ko_v1(part_entry.value->>'region') order by part_entry.ordinality), array[]::text[]) from jsonb_array_elements(exercise.target_muscles) with ordinality part_entry(value, ordinality) where part_entry.ordinality > 1), 2, 32),\n 'measurement_type', public.left_utf8_bytes(public.measurement_type_from_recording_fields_v1(exercise.recording_fields), 32),\n 'bodyweight_factor', exercise.bodyweight_factor,\n 'track_pr', exercise.track_pr,\n 'sort_order', exercise.sort_order,\n 'exercise_id', snapshot.exercise_id,\n 'session_count', snapshot.session_count,\n 'set_count', snapshot.set_count,\n 'total_volume', snapshot.total_volume,\n 'best_reps', snapshot.best_reps,\n 'best_load', snapshot.best_load,\n 'best_load_reps', snapshot.best_load_reps,\n 'best_load_session_id', snapshot.best_load_session_id,\n 'best_load_recorded_at', snapshot.best_load_recorded_at,\n 'best_estimated_1rm', snapshot.best_estimated_1rm,\n 'best_estimated_1rm_load', snapshot.best_estimated_1rm_load,\n 'best_estimated_1rm_reps', snapshot.best_estimated_1rm_reps,\n 'best_estimated_1rm_session_id', snapshot.best_estimated_1rm_session_id,\n 'best_estimated_1rm_recorded_at', snapshot.best_estimated_1rm_recorded_at,\n 'session_best_estimated_1rm', snapshot.session_best_estimated_1rm,\n 'first_trained_at', snapshot.first_trained_at,\n 'last_trained_at', snapshot.last_trained_at,\n 'updated_at', snapshot.stats_updated_at,\n 'current_1rm', snapshot.current_1rm,\n 'current_1rm_date', snapshot.current_1rm_date,\n 'current_1rm_event_id', snapshot.current_1rm_event_id,\n 'current_1rm_source_kind', snapshot.current_1rm_source_kind,\n 'current_1rm_source_id', snapshot.current_1rm_source_id,\n 'current_1rm_is_baseline', snapshot.current_1rm_is_baseline,\n 'display_nrm_target', snapshot.display_nrm_target,\n 'display_nrm_value', snapshot.display_nrm_value,\n 'previous_1rm', snapshot.previous_1rm,\n 'previous_1rm_date', snapshot.previous_1rm_date,\n 'delta_1rm', snapshot.delta_1rm,\n 'yoy_1rm', snapshot.yoy_1rm,\n 'last_pr_at', snapshot.last_pr_at,\n 'rep_maxes', jsonb_build_object(\n '1', snapshot.rep_max_1, '3', snapshot.rep_max_3,\n '5', snapshot.rep_max_5, '8', snapshot.rep_max_8,\n '10', snapshot.rep_max_10\n ),\n 'recent_30', jsonb_build_object(\n 'session_count', snapshot.recent_30_session_count,\n 'set_count', snapshot.recent_30_set_count,\n 'main_reps', snapshot.recent_30_main_reps,\n 'volume', snapshot.recent_30_volume,\n 'best_load', snapshot.recent_30_best_load,\n 'best_estimated_1rm', snapshot.recent_30_best_estimated_1rm\n ),\n 'presentation_truncated',\n octet_length(coalesce(exercise.id::text, '')) > 160\n or octet_length(coalesce('', '')) > 160\n or octet_length(coalesce(exercise.archetype_id, '')) > 80\n or octet_length(coalesce(exercise.name_ko, '')) > 120\n or octet_length(coalesce(exercise.name_en, '')) > 96\n or octet_length(coalesce(exercise.exercise_category, '')) > 48\n or octet_length(coalesce(public.exercise_region_ko_v1(exercise.target_muscles->0->>'region'), '')) > 48\n or public.text_array_was_truncated((select coalesce(array_agg(public.exercise_region_ko_v1(part_entry.value->>'region') order by part_entry.ordinality), array[]::text[]) from jsonb_array_elements(exercise.target_muscles) with ordinality part_entry(value, ordinality) where part_entry.ordinality > 1), 2, 32)\n ) order by snapshot.summary_rank\n )\n from public.read_user_pr_snapshot_rows_v1(headers.user_id,headers.generation,headers.as_of_date) snapshot\n join public.exercises exercise on exercise.id = snapshot.exercise_id\n left join public.exercise_business_role_memberships benchmark\n on benchmark.role_key = 'pr_summary'\n and benchmark.exercise_id = snapshot.exercise_id\n where snapshot.user_id = headers.user_id\n and snapshot.as_of_date = headers.as_of_date\n ), '[]'::jsonb),\n 'total_count', headers.total_exercise_count,\n 'trained_count', headers.trained_exercise_count,\n 'truncated', headers.summaries_truncated\n )\n from public.user_pr_overview_snapshot_headers headers\n where headers.user_id = p_user_id and headers.generation = p_generation\n and headers.as_of_date = p_as_of;\n$$;", expected: /public\.user_pr_exercise_summary_snapshots/, operator: 'match', diff: 'simple' } test at tests\support\nodeTestBudget.mjs:15:12 ✖ the final PR summary reader consumes only the exact applied-generation snapshot (9.2979ms) AssertionError [ERR_ASSERTION]: The input did not match the regular expression /public\.user_pr_exercise_summary_snapshots/i. Input: 'create or replace function public.get_user_pr_exercise_summaries_snapshot_json(p_user_id uuid, p_generation bigint, p_as_of date) returns jsonb\n' + ' language sql stable security definer\n' + ' set search_path = public\n' + ' as $$\n' + ' select jsonb_build_object(\n' + " 'items', coalesce((\n" + ' select jsonb_agg(\n' + ' jsonb_build_object(\n' + " 'id', snapshot.exercise_id,\n" + " 'benchmark_key', benchmark.member_key,\n" + " 'slug', '',\n" + " 'origin', case when exercise.owner_user_id is null then 'system' else 'user' end,\n" + " 'owner_user_id', exercise.owner_user_id,\n" + " 'archetype_id', exercise.archetype_id,\n" + " 'name_ko', public.left_utf8_bytes(exercise.name_ko, 120),\n" + " 'name_en', public.left_utf8_bytes(exercise.name_en, 96),\n" + " 'exercise_category', public.left_utf8_bytes(exercise.exercise_category, 48),\n" + " 'primary_part', public.left_utf8_bytes(public.exercise_region_ko_v1(exercise.target_muscles->0->>'region'), 48),\n" + " 'secondary_parts', public.bounded_text_array_json((select coalesce(array_agg(public.exercise_region_ko_v1(part_entry.value->>'region') order by part_entry.ordinality), array[]::text[]) from jsonb_array_elements(exercise.target_muscles) with ordinality part_entry(value, ordinality) where part_entry.ordinality > 1), 2, 32),\n" + " 'secondary_parts_truncated', public.text_array_was_truncated((select coalesce(array_agg(public.exercise_region_ko_v1(part_entry.value->>'region') order by part_entry.ordinality), array[]::text[]) from jsonb_array_elements(exercise.target_muscles) with ordinality part_entry(value, ordinality) where part_entry.ordinality > 1), 2, 32),\n" + " 'measurement_type', public.left_utf8_bytes(public.measurement_type_from_recording_fields_v1(exercise.recording_fields), 32),\n" + " 'bodyweight_factor', exercise.bodyweight_factor,\n" + " 'track_pr', exercise.track_pr,\n" + " 'sort_order', exercise.sort_order,\n" + " 'exercise_id', snapshot.exercise_id,\n" + " 'session_count', snapshot.session_count,\n" + " 'set_count', snapshot.set_count,\n" + " 'total_volume', snapshot.total_volume,\n" + " 'best_reps', snapshot.best_reps,\n" + " 'best_load', snapshot.best_load,\n" + " 'best_load_reps', snapshot.best_load_reps,\n" + " 'best_load_session_id', snapshot.best_load_session_id,\n" + " 'best_load_recorded_at', snapshot.best_load_recorded_at,\n" + " 'best_estimated_1rm', snapshot.best_estimated_1rm,\n" + " 'best_estimated_1rm_load', snapshot.best_estimated_1rm_load,\n" + " 'best_estimated_1rm_reps', snapshot.best_estimated_1rm_reps,\n" + " 'best_estimated_1rm_session_id', snapshot.best_estimated_1rm_session_id,\n" + " 'best_estimated_1rm_recorded_at', snapshot.best_estimated_1rm_recorded_at,\n" + " 'session_best_estimated_1rm', snapshot.session_best_estimated_1rm,\n" + " 'first_trained_at', snapshot.first_trained_at,\n" + " 'last_trained_at', snapshot.last_trained_at,\n" + " 'updated_at', snapshot.stats_updated_at,\n" + " 'current_1rm', snapshot.current_1rm,\n" + " 'current_1rm_date', snapshot.current_1rm_date,\n" + " 'current_1rm_event_id', snapshot.current_1rm_event_id,\n" + " 'current_1rm_source_kind', snapshot.current_1rm_source_kind,\n" + " 'current_1rm_source_id', snapshot.current_1rm_source_id,\n" + " 'current_1rm_is_baseline', snapshot.current_1rm_is_baseline,\n" + " 'display_nrm_target', snapshot.display_nrm_target,\n" + " 'display_nrm_value', snapshot.display_nrm_value,\n" + " 'previous_1rm', snapshot.previous_1rm,\n" + " 'previous_1rm_date', snapshot.previous_1rm_date,\n" + " 'delta_1rm', snapshot.delta_1rm,\n" + " 'yoy_1rm', snapshot.yoy_1rm,\n" + " 'last_pr_at', snapshot.last_pr_at,\n" + " 'rep_maxes', jsonb_build_object(\n" + " '1', snapshot.rep_max_1, '3', snapshot.rep_max_3,\n" + " '5', snapshot.rep_max_5, '8', snapshot.rep_max_8,\n" + " '10', snapshot.rep_max_10\n" + ' ),\n' + " 'recent_30', jsonb_build_object(\n" + " 'session_count', snapshot.recent_30_session_count,\n" + " 'set_count', snapshot.recent_30_set_count,\n" + " 'main_reps', snapshot.recent_30_main_reps,\n" + " 'volume', snapshot.recent_30_volume,\n" + " 'best_load', snapshot.recent_30_best_load,\n" + " 'best_estimated_1rm', snapshot.recent_30_best_estimated_1rm\n" + ' ),\n' + " 'presentation_truncated',\n" + " octet_length(coalesce(exercise.id::text, '')) > 160\n" + " or octet_length(coalesce('', '')) > 160\n" + " or octet_length(coalesce(exercise.archetype_id, '')) > 80\n" + " or octet_length(coalesce(exercise.name_ko, '')) > 120\n" + " or octet_length(coalesce(exercise.name_en, '')) > 96\n" + " or octet_length(coalesce(exercise.exercise_category, '')) > 48\n" + " or octet_length(coalesce(public.exercise_region_ko_v1(exercise.target_muscles->0->>'region'), '')) > 48\n" + " or public.text_array_was_truncated((select coalesce(array_agg(public.exercise_region_ko_v1(part_entry.value->>'region') order by part_entry.ordinality), array[]::text[]) from jsonb_array_elements(exercise.target_muscles) with ordinality part_entry(value, ordinality) where part_entry.ordinality > 1), 2, 32)\n" + ' ) order by snapshot.summary_rank\n' + ' )\n' + ' from public.read_user_pr_snapshot_rows_v1(headers.user_id,headers.generation,headers.as_of_date) snapshot\n' + ' join public.exercises exercise on exercise.id = snapshot.exercise_id\n' + ' left join public.exercise_business_role_memberships benchmark\n' + " on benchmark.role_key = 'pr_summary'\n" + ' and benchmark.exercise_id = snapshot.exercise_id\n' + ' where snapshot.user_id = headers.user_id\n' + ' and snapshot.as_of_date = headers.as_of_date\n' + " ), '[]'::jsonb),\n" + " 'total_count', headers.total_exercise_count,\n" + " 'trained_count', headers.trained_exercise_count,\n" + " 'truncated', headers.summaries_truncated\n" + ' )\n' + ' from public.user_pr_overview_snapshot_headers headers\n' + ' where headers.user_id = p_user_id and headers.generation = p_generation\n' + ' and headers.as_of_date = p_as_of;\n' + '$$;' at TestContext. (file:///C:/Users/USER/Documents/Codex/2026-09-10/14-2/work/barbelic-1422/test/prOverviewMaterialization.test.mjs:104:12) at Test.runInAsyncScope (node:async_hooks:227:14) at Test.run (node:internal/test_runner/test:1306:25) at Test.processPendingSubtests (node:internal/test_runner/test:897:18) at Test.postRun (node:internal/test_runner/test:1447:19) at Test.run (node:internal/test_runner/test:1372:12) at async Test.processPendingSubtests (node:internal/test_runner/test:897:7) { generatedMessage: true, code: 'ERR_ASSERTION', actual: "create or replace function public.get_user_pr_exercise_summaries_snapshot_json(p_user_id uuid, p_generation bigint, p_as_of date) returns jsonb\n language sql stable security definer\n set search_path = public\n as $$\n select jsonb_build_object(\n 'items', coalesce((\n select jsonb_agg(\n jsonb_build_object(\n 'id', snapshot.exercise_id,\n 'benchmark_key', benchmark.member_key,\n 'slug', '',\n 'origin', case when exercise.owner_user_id is null then 'system' else 'user' end,\n 'owner_user_id', exercise.owner_user_id,\n 'archetype_id', exercise.archetype_id,\n 'name_ko', public.left_utf8_bytes(exercise.name_ko, 120),\n 'name_en', public.left_utf8_bytes(exercise.name_en, 96),\n 'exercise_category', public.left_utf8_bytes(exercise.exercise_category, 48),\n 'primary_part', public.left_utf8_bytes(public.exercise_region_ko_v1(exercise.target_muscles->0->>'region'), 48),\n 'secondary_parts', public.bounded_text_array_json((select coalesce(array_agg(public.exercise_region_ko_v1(part_entry.value->>'region') order by part_entry.ordinality), array[]::text[]) from jsonb_array_elements(exercise.target_muscles) with ordinality part_entry(value, ordinality) where part_entry.ordinality > 1), 2, 32),\n 'secondary_parts_truncated', public.text_array_was_truncated((select coalesce(array_agg(public.exercise_region_ko_v1(part_entry.value->>'region') order by part_entry.ordinality), array[]::text[]) from jsonb_array_elements(exercise.target_muscles) with ordinality part_entry(value, ordinality) where part_entry.ordinality > 1), 2, 32),\n 'measurement_type', public.left_utf8_bytes(public.measurement_type_from_recording_fields_v1(exercise.recording_fields), 32),\n 'bodyweight_factor', exercise.bodyweight_factor,\n 'track_pr', exercise.track_pr,\n 'sort_order', exercise.sort_order,\n 'exercise_id', snapshot.exercise_id,\n 'session_count', snapshot.session_count,\n 'set_count', snapshot.set_count,\n 'total_volume', snapshot.total_volume,\n 'best_reps', snapshot.best_reps,\n 'best_load', snapshot.best_load,\n 'best_load_reps', snapshot.best_load_reps,\n 'best_load_session_id', snapshot.best_load_session_id,\n 'best_load_recorded_at', snapshot.best_load_recorded_at,\n 'best_estimated_1rm', snapshot.best_estimated_1rm,\n 'best_estimated_1rm_load', snapshot.best_estimated_1rm_load,\n 'best_estimated_1rm_reps', snapshot.best_estimated_1rm_reps,\n 'best_estimated_1rm_session_id', snapshot.best_estimated_1rm_session_id,\n 'best_estimated_1rm_recorded_at', snapshot.best_estimated_1rm_recorded_at,\n 'session_best_estimated_1rm', snapshot.session_best_estimated_1rm,\n 'first_trained_at', snapshot.first_trained_at,\n 'last_trained_at', snapshot.last_trained_at,\n 'updated_at', snapshot.stats_updated_at,\n 'current_1rm', snapshot.current_1rm,\n 'current_1rm_date', snapshot.current_1rm_date,\n 'current_1rm_event_id', snapshot.current_1rm_event_id,\n 'current_1rm_source_kind', snapshot.current_1rm_source_kind,\n 'current_1rm_source_id', snapshot.current_1rm_source_id,\n 'current_1rm_is_baseline', snapshot.current_1rm_is_baseline,\n 'display_nrm_target', snapshot.display_nrm_target,\n 'display_nrm_value', snapshot.display_nrm_value,\n 'previous_1rm', snapshot.previous_1rm,\n 'previous_1rm_date', snapshot.previous_1rm_date,\n 'delta_1rm', snapshot.delta_1rm,\n 'yoy_1rm', snapshot.yoy_1rm,\n 'last_pr_at', snapshot.last_pr_at,\n 'rep_maxes', jsonb_build_object(\n '1', snapshot.rep_max_1, '3', snapshot.rep_max_3,\n '5', snapshot.rep_max_5, '8', snapshot.rep_max_8,\n '10', snapshot.rep_max_10\n ),\n 'recent_30', jsonb_build_object(\n 'session_count', snapshot.recent_30_session_count,\n 'set_count', snapshot.recent_30_set_count,\n 'main_reps', snapshot.recent_30_main_reps,\n 'volume', snapshot.recent_30_volume,\n 'best_load', snapshot.recent_30_best_load,\n 'best_estimated_1rm', snapshot.recent_30_best_estimated_1rm\n ),\n 'presentation_truncated',\n octet_length(coalesce(exercise.id::text, '')) > 160\n or octet_length(coalesce('', '')) > 160\n or octet_length(coalesce(exercise.archetype_id, '')) > 80\n or octet_length(coalesce(exercise.name_ko, '')) > 120\n or octet_length(coalesce(exercise.name_en, '')) > 96\n or octet_length(coalesce(exercise.exercise_category, '')) > 48\n or octet_length(coalesce(public.exercise_region_ko_v1(exercise.target_muscles->0->>'region'), '')) > 48\n or public.text_array_was_truncated((select coalesce(array_agg(public.exercise_region_ko_v1(part_entry.value->>'region') order by part_entry.ordinality), array[]::text[]) from jsonb_array_elements(exercise.target_muscles) with ordinality part_entry(value, ordinality) where part_entry.ordinality > 1), 2, 32)\n ) order by snapshot.summary_rank\n )\n from public.read_user_pr_snapshot_rows_v1(headers.user_id,headers.generation,headers.as_of_date) snapshot\n join public.exercises exercise on exercise.id = snapshot.exercise_id\n left join public.exercise_business_role_memberships benchmark\n on benchmark.role_key = 'pr_summary'\n and benchmark.exercise_id = snapshot.exercise_id\n where snapshot.user_id = headers.user_id\n and snapshot.as_of_date = headers.as_of_date\n ), '[]'::jsonb),\n 'total_count', headers.total_exercise_count,\n 'trained_count', headers.trained_exercise_count,\n 'truncated', headers.summaries_truncated\n )\n from public.user_pr_overview_snapshot_headers headers\n where headers.user_id = p_user_id and headers.generation = p_generation\n and headers.as_of_date = p_as_of;\n$$;", expected: /public\.user_pr_exercise_summary_snapshots/i, operator: 'match', diff: 'simple' } test at tests\support\nodeTestBudget.mjs:15:12 ✖ Home and PR projections cap every catalog presentation array (10.3343ms) AssertionError [ERR_ASSERTION]: The input did not match the regular expression /user_pr_exercise_summary_snapshots/. Input: 'create or replace function public.get_user_pr_exercise_summaries_snapshot_json(p_user_id uuid, p_generation bigint, p_as_of date) returns jsonb\n' + ' language sql stable security definer\n' + ' set search_path = public\n' + ' as $$\n' + ' select jsonb_build_object(\n' + " 'items', coalesce((\n" + ' select jsonb_agg(\n' + ' jsonb_build_object(\n' + " 'id', snapshot.exercise_id,\n" + " 'benchmark_key', benchmark.member_key,\n" + " 'slug', '',\n" + " 'origin', case when exercise.owner_user_id is null then 'system' else 'user' end,\n" + " 'owner_user_id', exercise.owner_user_id,\n" + " 'archetype_id', exercise.archetype_id,\n" + " 'name_ko', public.left_utf8_bytes(exercise.name_ko, 120),\n" + " 'name_en', public.left_utf8_bytes(exercise.name_en, 96),\n" + " 'exercise_category', public.left_utf8_bytes(exercise.exercise_category, 48),\n" + " 'primary_part', public.left_utf8_bytes(public.exercise_region_ko_v1(exercise.target_muscles->0->>'region'), 48),\n" + " 'secondary_parts', public.bounded_text_array_json((select coalesce(array_agg(public.exercise_region_ko_v1(part_entry.value->>'region') order by part_entry.ordinality), array[]::text[]) from jsonb_array_elements(exercise.target_muscles) with ordinality part_entry(value, ordinality) where part_entry.ordinality > 1), 2, 32),\n" + " 'secondary_parts_truncated', public.text_array_was_truncated((select coalesce(array_agg(public.exercise_region_ko_v1(part_entry.value->>'region') order by part_entry.ordinality), array[]::text[]) from jsonb_array_elements(exercise.target_muscles) with ordinality part_entry(value, ordinality) where part_entry.ordinality > 1), 2, 32),\n" + " 'measurement_type', public.left_utf8_bytes(public.measurement_type_from_recording_fields_v1(exercise.recording_fields), 32),\n" + " 'bodyweight_factor', exercise.bodyweight_factor,\n" + " 'track_pr', exercise.track_pr,\n" + " 'sort_order', exercise.sort_order,\n" + " 'exercise_id', snapshot.exercise_id,\n" + " 'session_count', snapshot.session_count,\n" + " 'set_count', snapshot.set_count,\n" + " 'total_volume', snapshot.total_volume,\n" + " 'best_reps', snapshot.best_reps,\n" + " 'best_load', snapshot.best_load,\n" + " 'best_load_reps', snapshot.best_load_reps,\n" + " 'best_load_session_id', snapshot.best_load_session_id,\n" + " 'best_load_recorded_at', snapshot.best_load_recorded_at,\n" + " 'best_estimated_1rm', snapshot.best_estimated_1rm,\n" + " 'best_estimated_1rm_load', snapshot.best_estimated_1rm_load,\n" + " 'best_estimated_1rm_reps', snapshot.best_estimated_1rm_reps,\n" + " 'best_estimated_1rm_session_id', snapshot.best_estimated_1rm_session_id,\n" + " 'best_estimated_1rm_recorded_at', snapshot.best_estimated_1rm_recorded_at,\n" + " 'session_best_estimated_1rm', snapshot.session_best_estimated_1rm,\n" + " 'first_trained_at', snapshot.first_trained_at,\n" + " 'last_trained_at', snapshot.last_trained_at,\n" + " 'updated_at', snapshot.stats_updated_at,\n" + " 'current_1rm', snapshot.current_1rm,\n" + " 'current_1rm_date', snapshot.current_1rm_date,\n" + " 'current_1rm_event_id', snapshot.current_1rm_event_id,\n" + " 'current_1rm_source_kind', snapshot.current_1rm_source_kind,\n" + " 'current_1rm_source_id', snapshot.current_1rm_source_id,\n" + " 'current_1rm_is_baseline', snapshot.current_1rm_is_baseline,\n" + " 'display_nrm_target', snapshot.display_nrm_target,\n" + " 'display_nrm_value', snapshot.display_nrm_value,\n" + " 'previous_1rm', snapshot.previous_1rm,\n" + " 'previous_1rm_date', snapshot.previous_1rm_date,\n" + " 'delta_1rm', snapshot.delta_1rm,\n" + " 'yoy_1rm', snapshot.yoy_1rm,\n" + " 'last_pr_at', snapshot.last_pr_at,\n" + " 'rep_maxes', jsonb_build_object(\n" + " '1', snapshot.rep_max_1, '3', snapshot.rep_max_3,\n" + " '5', snapshot.rep_max_5, '8', snapshot.rep_max_8,\n" + " '10', snapshot.rep_max_10\n" + ' ),\n' + " 'recent_30', jsonb_build_object(\n" + " 'session_count', snapshot.recent_30_session_count,\n" + " 'set_count', snapshot.recent_30_set_count,\n" + " 'main_reps', snapshot.recent_30_main_reps,\n" + " 'volume', snapshot.recent_30_volume,\n" + " 'best_load', snapshot.recent_30_best_load,\n" + " 'best_estimated_1rm', snapshot.recent_30_best_estimated_1rm\n" + ' ),\n' + " 'presentation_truncated',\n" + " octet_length(coalesce(exercise.id::text, '')) > 160\n" + " or octet_length(coalesce('', '')) > 160\n" + " or octet_length(coalesce(exercise.archetype_id, '')) > 80\n" + " or octet_length(coalesce(exercise.name_ko, '')) > 120\n" + " or octet_length(coalesce(exercise.name_en, '')) > 96\n" + " or octet_length(coalesce(exercise.exercise_category, '')) > 48\n" + " or octet_length(coalesce(public.exercise_region_ko_v1(exercise.target_muscles->0->>'region'), '')) > 48\n" + " or public.text_array_was_truncated((select coalesce(array_agg(public.exercise_region_ko_v1(part_entry.value->>'region') order by part_entry.ordinality), array[]::text[]) from jsonb_array_elements(exercise.target_muscles) with ordinality part_entry(value, ordinality) where part_entry.ordinality > 1), 2, 32)\n" + ' ) order by snapshot.summary_rank\n' + ' )\n' + ' from public.read_user_pr_snapshot_rows_v1(headers.user_id,headers.generation,headers.as_of_date) snapshot\n' + ' join public.exercises exercise on exercise.id = snapshot.exercise_id\n' + ' left join public.exercise_business_role_memberships benchmark\n' + " on benchmark.role_key = 'pr_summary'\n" + ' and benchmark.exercise_id = snapshot.exercise_id\n' + ' where snapshot.user_id = headers.user_id\n' + ' and snapshot.as_of_date = headers.as_of_date\n' + " ), '[]'::jsonb),\n" + " 'total_count', headers.total_exercise_count,\n" + " 'trained_count', headers.trained_exercise_count,\n" + " 'truncated', headers.summaries_truncated\n" + ' )\n' + ' from public.user_pr_overview_snapshot_headers headers\n' + ' where headers.user_id = p_user_id and headers.generation = p_generation\n' + ' and headers.as_of_date = p_as_of;\n' + '$$;' at TestContext. (file:///C:/Users/USER/Documents/Codex/2026-09-10/14-2/work/barbelic-1422/tests/react/screenRpcContracts.test.mjs:2593:12) at Test.runInAsyncScope (node:async_hooks:227:14) at Test.run (node:internal/test_runner/test:1306:25) at Test.processPendingSubtests (node:internal/test_runner/test:897:18) at Test.postRun (node:internal/test_runner/test:1447:19) at Test.run (node:internal/test_runner/test:1372:12) at async Test.processPendingSubtests (node:internal/test_runner/test:897:7) { generatedMessage: true, code: 'ERR_ASSERTION', actual: "create or replace function public.get_user_pr_exercise_summaries_snapshot_json(p_user_id uuid, p_generation bigint, p_as_of date) returns jsonb\n language sql stable security definer\n set search_path = public\n as $$\n select jsonb_build_object(\n 'items', coalesce((\n select jsonb_agg(\n jsonb_build_object(\n 'id', snapshot.exercise_id,\n 'benchmark_key', benchmark.member_key,\n 'slug', '',\n 'origin', case when exercise.owner_user_id is null then 'system' else 'user' end,\n 'owner_user_id', exercise.owner_user_id,\n 'archetype_id', exercise.archetype_id,\n 'name_ko', public.left_utf8_bytes(exercise.name_ko, 120),\n 'name_en', public.left_utf8_bytes(exercise.name_en, 96),\n 'exercise_category', public.left_utf8_bytes(exercise.exercise_category, 48),\n 'primary_part', public.left_utf8_bytes(public.exercise_region_ko_v1(exercise.target_muscles->0->>'region'), 48),\n 'secondary_parts', public.bounded_text_array_json((select coalesce(array_agg(public.exercise_region_ko_v1(part_entry.value->>'region') order by part_entry.ordinality), array[]::text[]) from jsonb_array_elements(exercise.target_muscles) with ordinality part_entry(value, ordinality) where part_entry.ordinality > 1), 2, 32),\n 'secondary_parts_truncated', public.text_array_was_truncated((select coalesce(array_agg(public.exercise_region_ko_v1(part_entry.value->>'region') order by part_entry.ordinality), array[]::text[]) from jsonb_array_elements(exercise.target_muscles) with ordinality part_entry(value, ordinality) where part_entry.ordinality > 1), 2, 32),\n 'measurement_type', public.left_utf8_bytes(public.measurement_type_from_recording_fields_v1(exercise.recording_fields), 32),\n 'bodyweight_factor', exercise.bodyweight_factor,\n 'track_pr', exercise.track_pr,\n 'sort_order', exercise.sort_order,\n 'exercise_id', snapshot.exercise_id,\n 'session_count', snapshot.session_count,\n 'set_count', snapshot.set_count,\n 'total_volume', snapshot.total_volume,\n 'best_reps', snapshot.best_reps,\n 'best_load', snapshot.best_load,\n 'best_load_reps', snapshot.best_load_reps,\n 'best_load_session_id', snapshot.best_load_session_id,\n 'best_load_recorded_at', snapshot.best_load_recorded_at,\n 'best_estimated_1rm', snapshot.best_estimated_1rm,\n 'best_estimated_1rm_load', snapshot.best_estimated_1rm_load,\n 'best_estimated_1rm_reps', snapshot.best_estimated_1rm_reps,\n 'best_estimated_1rm_session_id', snapshot.best_estimated_1rm_session_id,\n 'best_estimated_1rm_recorded_at', snapshot.best_estimated_1rm_recorded_at,\n 'session_best_estimated_1rm', snapshot.session_best_estimated_1rm,\n 'first_trained_at', snapshot.first_trained_at,\n 'last_trained_at', snapshot.last_trained_at,\n 'updated_at', snapshot.stats_updated_at,\n 'current_1rm', snapshot.current_1rm,\n 'current_1rm_date', snapshot.current_1rm_date,\n 'current_1rm_event_id', snapshot.current_1rm_event_id,\n 'current_1rm_source_kind', snapshot.current_1rm_source_kind,\n 'current_1rm_source_id', snapshot.current_1rm_source_id,\n 'current_1rm_is_baseline', snapshot.current_1rm_is_baseline,\n 'display_nrm_target', snapshot.display_nrm_target,\n 'display_nrm_value', snapshot.display_nrm_value,\n 'previous_1rm', snapshot.previous_1rm,\n 'previous_1rm_date', snapshot.previous_1rm_date,\n 'delta_1rm', snapshot.delta_1rm,\n 'yoy_1rm', snapshot.yoy_1rm,\n 'last_pr_at', snapshot.last_pr_at,\n 'rep_maxes', jsonb_build_object(\n '1', snapshot.rep_max_1, '3', snapshot.rep_max_3,\n '5', snapshot.rep_max_5, '8', snapshot.rep_max_8,\n '10', snapshot.rep_max_10\n ),\n 'recent_30', jsonb_build_object(\n 'session_count', snapshot.recent_30_session_count,\n 'set_count', snapshot.recent_30_set_count,\n 'main_reps', snapshot.recent_30_main_reps,\n 'volume', snapshot.recent_30_volume,\n 'best_load', snapshot.recent_30_best_load,\n 'best_estimated_1rm', snapshot.recent_30_best_estimated_1rm\n ),\n 'presentation_truncated',\n octet_length(coalesce(exercise.id::text, '')) > 160\n or octet_length(coalesce('', '')) > 160\n or octet_length(coalesce(exercise.archetype_id, '')) > 80\n or octet_length(coalesce(exercise.name_ko, '')) > 120\n or octet_length(coalesce(exercise.name_en, '')) > 96\n or octet_length(coalesce(exercise.exercise_category, '')) > 48\n or octet_length(coalesce(public.exercise_region_ko_v1(exercise.target_muscles->0->>'region'), '')) > 48\n or public.text_array_was_truncated((select coalesce(array_agg(public.exercise_region_ko_v1(part_entry.value->>'region') order by part_entry.ordinality), array[]::text[]) from jsonb_array_elements(exercise.target_muscles) with ordinality part_entry(value, ordinality) where part_entry.ordinality > 1), 2, 32)\n ) order by snapshot.summary_rank\n )\n from public.read_user_pr_snapshot_rows_v1(headers.user_id,headers.generation,headers.as_of_date) snapshot\n join public.exercises exercise on exercise.id = snapshot.exercise_id\n left join public.exercise_business_role_memberships benchmark\n on benchmark.role_key = 'pr_summary'\n and benchmark.exercise_id = snapshot.exercise_id\n where snapshot.user_id = headers.user_id\n and snapshot.as_of_date = headers.as_of_date\n ), '[]'::jsonb),\n 'total_count', headers.total_exercise_count,\n 'trained_count', headers.trained_exercise_count,\n 'truncated', headers.summaries_truncated\n )\n from public.user_pr_overview_snapshot_headers headers\n where headers.user_id = p_user_id and headers.generation = p_generation\n and headers.as_of_date = p_as_of;\n$$;", expected: /user_pr_exercise_summary_snapshots/, operator: 'match', diff: 'simple' }