RUN  v4.1.9 /workspace/niko/agent-platform/frontend Coverage enabled with v8 (node:373) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:380) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:343) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:388) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:342) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:335) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:361) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:350) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:395) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:337) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:355) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) βœ“ src/layers/__tests__/config-contracts.test.ts > config contracts β€” CrudConfig minimum requirements > every CrudConfig has entityPath 17ms βœ“ src/layers/__tests__/config-contracts.test.ts > config contracts β€” CrudConfig minimum requirements > every CrudConfig has fieldSet with at least one field 5ms βœ“ src/layers/__tests__/config-contracts.test.ts > config contracts β€” CrudConfig minimum requirements > all collection-page configs have both successTarget and cancelTarget 2ms βœ“ src/layers/__tests__/config-contracts.test.ts > config contracts β€” CrudConfig minimum requirements > all detail-page configs have both successTarget and cancelTarget 3ms βœ“ src/layers/__tests__/config-contracts.test.ts > config contracts β€” CrudConfig minimum requirements > all entity-select fields have corresponding entitySelectSources 3ms βœ“ src/shared/hooks/useSSE.test.ts > useSSE > 1. opens EventSource on mount: connecting β†’ connected 122ms βœ“ src/shared/hooks/useSSE.test.ts > useSSE > 2. closes EventSource on unmount 14ms βœ“ src/shared/hooks/useSSE.test.ts > useSSE > 3. entity.created β†’ onEvent({ type: "created", data }) 25ms βœ“ src/shared/hooks/useSSE.test.ts > useSSE > 4. entity.updated β†’ onEvent({ type: "updated", data }) 14ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > createCoordinator > returns an object with useCoordinator 10ms βœ“ src/shared/hooks/useSSE.test.ts > useSSE > 5. exponential backoff: 1s β†’ 2s β†’ 4s 46ms βœ“ src/shared/hooks/useSSE.test.ts > useSSE > 6. 5 consecutive failures β†’ connection-lost + onConnectionLost 18ms βœ“ src/shared/hooks/useSSE.test.ts > useSSE > 7. successful reconnect resets backoff to 1s 22ms βœ“ src/shared/hooks/useSSE.test.ts > useSSE > 8. reconnect() manually reopens EventSource 16ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator β€” inactive state (no crud) > activeCrud is null when routeContext has no crud 123ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator β€” inactive state (no crud) > activeCrud is null when routeContext.crud is undefined 17ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator β€” inactive state (no crud) > fieldPolicy is empty when inactive 20ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator β€” inactive state (no crud) > formModel is defaults when inactive 13ms stderr | src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator β€” inactive state (no crud) > submit is callable even when inactive (no-op) An update to TestComponent inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to TestComponent inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to TestComponent inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act βœ“ src/shared/hooks/useSSE.test.ts > useSSE > 9. heartbeat (: heartbeat) does not trigger onEvent 52ms βœ“ src/shared/hooks/useSSE.test.ts > useSSE > 10. url change closes old EventSource and opens new one 24ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator β€” inactive state (no crud) > bridge starts clean when inactive 20ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator β€” inactive state (no crud) > submit is callable even when inactive (no-op) 28ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator β€” owner isolation > activeCrud is null when routeContext.crud.owner != config.owner 37ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator β€” owner isolation > activeCrud is populated when owner matches 12ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator β€” owner isolation > activeCrud includes prefix when provided 28ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator β€” owner isolation > owner isolation works for edit mode 11ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator β€” add flow > formModel initialized with defaults 10ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator β€” add flow > fieldPolicy uses add mode 11ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator β€” add flow > activeCrud has mode add 9ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator β€” add flow > submit calls mutation.create with toCreate(formModel) 18ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator β€” add flow > bridge.pending is true after submit 9ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator β€” add flow > submit uses the latest formModel via setFormModel 37ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator β€” edit flow > formModel populated from entity detail 11ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator β€” edit flow > fieldPolicy uses edit mode 12ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator β€” edit flow > activeCrud has mode edit 11ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator β€” edit flow > submit calls mutation.update with id and toUpdate(formModel) 19ms stderr | src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator failure path > submit does not throw when called without active crud An update to TestComponent inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to TestComponent inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to TestComponent inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act βœ“ src/layers/__tests__/L1/entityHooks.test.tsx > resolveEndpointTemplate > replaces a single token in the template 23ms βœ“ src/layers/__tests__/L1/entityHooks.test.tsx > resolveEndpointTemplate > replaces multiple tokens and removes used params 4ms βœ“ src/layers/__tests__/L1/entityHooks.test.tsx > resolveEndpointTemplate > returns url unchanged when no tokens exist 13ms βœ“ src/layers/__tests__/L1/entityHooks.test.tsx > resolveEndpointTemplate > throws when a token is missing from params 9ms βœ“ src/layers/__tests__/L1/entityHooks.test.tsx > resolveEndpointTemplate > throws when one of multiple tokens is missing 4ms βœ“ src/layers/__tests__/L1/entityHooks.test.tsx > createEntityHooks > returns EntityHooks with required shape 5ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator β€” edit flow > detail not yet loaded shows formModel as defaults 49ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator lifecycle transitions > handles transition from add β†’ inactive β†’ edit cleanly 15ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator lifecycle transitions > closeIntent resets on mode change 9ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator failure path > failure is null initially 7ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator failure path > bridge dirty stays true when pending resets (failure simulation) 9ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator failure path > submit does not throw when called without active crud 8ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator failure path > activeCrud remains populated after submit (branch not closed) 14ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator failure path > failure is null after submit when no sync error occurs 9ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator failure path > failure is set when mutation resolves with isError=true 23ms βœ“ src/layers/__tests__/L1/entityHooks.test.tsx > useEntityList > returns ListResult shape with hasMore and totalEstimate when API responds with data array 204ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator closeIntent > closeIntent is null initially 11ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator closeIntent > cancel() sets closeIntent to cancel 13ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator updateField and setFormModel > setFormModel updates snapshot.formModel 16ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator updateField and setFormModel > updateField updates a single field and marks dirty 8ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator updateField and setFormModel > updateField preserves other fields 8ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator snapshot type contract (compile-time) > snapshot has all required CoordinatorSnapshot fields 15ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator snapshot type contract (compile-time) > result exposes updateField, setFormModel, cancel 17ms βœ“ src/layers/__tests__/L1/entityHooks.test.tsx > useEntityList > filters out pending deleted entities 76ms βœ“ src/layers/__tests__/L1/entityHooks.test.tsx > useEntityList > uses defaultListQuery when no params provided 67ms βœ“ src/layers/__tests__/L1/entityHooks.test.tsx > useEntityList > resolves endpoint template with params and strips used tokens 14ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator β€” delete state machine > deleteState is null on collection route 11ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator β€” delete state machine > deleteState is null on collection route even with crud 7ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator β€” delete state machine > deleteState is non-null on detail route 7ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator β€” delete state machine > requestDelete sets showConfirm to true 11ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator β€” delete state machine > requestDelete clears previous delete errors 21ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator β€” delete state machine > cancelDelete sets showConfirm to false 37ms βœ“ src/layers/__tests__/L1/entityHooks.test.tsx > useEntityList > uses staleTime 0 when queryMode is live 70ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator β€” delete state machine > cancelDelete does not call mutation.remove 20ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator β€” delete state machine > confirmDelete calls mutation.remove with routeContext.id 24ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator β€” delete state machine > confirmDelete closes showConfirm and clears delete error before calling remove 38ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator β€” delete state machine > confirmDelete is a no-op on collection route 12ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator β€” delete state machine > deleteState.isPending is false when delete not requested 10ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator β€” delete state machine > deleteState.isPending reflects mutation.isPending during active delete 13ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator β€” delete state machine > deleteState.isPending becomes false after delete completes 17ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator β€” delete state machine > extracts error message from response.data.error 16ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator β€” delete state machine > falls back to error.message when response.data is absent 23ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator β€” delete state machine > falls back to String(err) when response.data.error and message are both missing 24ms βœ“ src/layers/__tests__/L1/entityHooks.test.tsx > useEntityList > uses default staleTime when queryMode is cache 78ms βœ“ src/layers/__tests__/L1/entityHooks.test.tsx > useEntityList > returns hasMore true from API meta 80ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator β€” delete state machine > falls back to default string when error is null 23ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator β€” delete state machine > successful delete clears error state 26ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator β€” delete state machine > error remains null after successful delete (was null before) 57ms βœ“ src/layers/__tests__/L1/entityHooks.test.tsx > useEntityList > handles totalEstimate -1 as unknown count 67ms βœ“ src/layers/__tests__/L1/entityHooks.test.tsx > useEntityList > falls back safely when API meta is missing 88ms βœ“ src/layers/__tests__/L1/entityHooks.test.tsx > useEntityDetail > returns DetailResult shape on successful fetch 75ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator β€” entitySelectData resolution > entitySelectData is empty when no entitySelectSources configured 33ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator β€” entitySelectData resolution > resolves entity-select options from L1 useEntityList 24ms βœ“ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator β€” entitySelectData resolution > uses default idField and nameField when not specified 19ms βœ“ src/layers/__tests__/L1/entityHooks.test.tsx > useEntityDetail > is skipped when id is empty 22ms βœ“ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > returns MutationHandle shape with isPending and callable methods 22ms βœ“ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > update receives id as first argument and sends Idempotency-Key header 57ms βœ“ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > update does not trigger cache invalidation 24ms βœ“ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > create triggers cache invalidation with Idempotency-Key header 28ms βœ“ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > create resolves endpoint template in mutationFn 71ms βœ“ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > create resolves endpoint template using createPathParams from contract 10ms βœ“ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > create with pipelines-like contract uses context to build URL /projects/{id}/pipelines 16ms βœ“ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > create resolves template from context when body lacks the token field 17ms βœ“ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > create isolates context between rapid successive calls (no ref race) 18ms βœ“ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > offline create adds to outbox without calling API 10ms βœ“ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > offline update adds to outbox without calling API 10ms βœ“ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > offline remove adds to pendingDeleteMap, cache, and outbox without API call 41ms βœ“ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > remove does not trigger cache invalidation 21ms βœ“ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > remove onSuccess performs deterministic cache cleanup across all same-path entries 26ms βœ“ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > remove onSuccess cache cleanup removes entity from detail cache entry 33ms βœ“ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > isPending reflects combined mutation state 22ms βœ“ src/layers/__tests__/L1/entityHooks.test.tsx > useSubscription > shape smoke > returns SubscriptionHandle with correct shape 38ms stderr | src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > rendering states > renders loading state when isLoading is true ⚠️ React Router Future Flag Warning: React Router will begin wrapping state updates in `React.startTransition` in v7. You can use the `v7_startTransition` future flag to opt-in early. For more information, see https://reactrouter.com/v6/upgrading/future#v7_starttransition. ⚠️ React Router Future Flag Warning: Relative route resolution within Splat routes is changing in v7. You can use the `v7_relativeSplatPath` future flag to opt-in early. For more information, see https://reactrouter.com/v6/upgrading/future#v7_relativesplatpath. βœ“ src/layers/__tests__/L1/entityHooks.test.tsx > useSubscription > connection-lost after 5 failures > sets isConnectionLost:true after 5 consecutive failures 42ms βœ“ src/layers/__tests__/L1/entityHooks.test.tsx > useSubscription > reconnect resets the state > reconnect is callable and triggers a new connection attempt 21ms βœ“ src/layers/__tests__/L1/entityHooks.test.tsx > useSubscription > SSE deleted cleanup > removes pendingDelete entry on entity.deleted event 11ms βœ“ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > rendering states > renders loading state when isLoading is true 280ms βœ“ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > rendering states > renders error state when error is present 21ms βœ“ src/layers/__tests__/L2R/FilterBar.test.tsx > FilterBar > renders filter legends for all filter types 479ms βœ“ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > rendering states > renders empty state when data is empty 53ms βœ“ src/layers/__tests__/L2R/FilterBar.test.tsx > FilterBar > does not render clear button when no active filters 96ms βœ“ src/layers/__tests__/L2R/FilterBar.test.tsx > FilterBar > renders clear button when at least one filter is active 51ms βœ“ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > rendering states > renders data table when data is present 164ms βœ“ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > rendering states > renders column headers from config 106ms βœ“ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > rendering states > renders offline indicator when offline 41ms βœ“ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > wiring > renders add button when createTarget is set 81ms stderr | src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > rendering states > renders loading state when isLoading is true ⚠️ React Router Future Flag Warning: React Router will begin wrapping state updates in `React.startTransition` in v7. You can use the `v7_startTransition` future flag to opt-in early. For more information, see https://reactrouter.com/v6/upgrading/future#v7_starttransition. ⚠️ React Router Future Flag Warning: Relative route resolution within Splat routes is changing in v7. You can use the `v7_relativeSplatPath` future flag to opt-in early. For more information, see https://reactrouter.com/v6/upgrading/future#v7_relativesplatpath. βœ“ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > wiring > renders custom add button label from config.createLabel 125ms βœ“ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > wiring > renders default add button label when createLabel is not set 42ms stderr | src/shared/components/CrudReadCard.test.tsx > CrudReadCard > 1. loading shows skeleton header + skeleton card, no buttons rendered ⚠️ React Router Future Flag Warning: React Router will begin wrapping state updates in `React.startTransition` in v7. You can use the `v7_startTransition` future flag to opt-in early. For more information, see https://reactrouter.com/v6/upgrading/future#v7_starttransition. ⚠️ React Router Future Flag Warning: Relative route resolution within Splat routes is changing in v7. You can use the `v7_relativeSplatPath` future flag to opt-in early. For more information, see https://reactrouter.com/v6/upgrading/future#v7_relativesplatpath. βœ“ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > rendering states > renders loading state when isLoading is true 283ms βœ“ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > rendering states > renders error state when error is present 27ms βœ“ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > wiring > calls navigate with createTarget when add button clicked 67ms βœ“ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > wiring > row click calls navigate with rowTarget and row id 67ms βœ“ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > wiring > does not render add button when createTarget is not set (no fallback) 52ms βœ“ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > wiring > add button is not clickable when createTarget is not set 121ms βœ“ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > wiring > row click uses derived default when rowTarget is not set 35ms βœ“ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > wiring > row click uses rowTargetOverride when provided 61ms βœ“ src/layers/__tests__/L2R/FilterBar.test.tsx > FilterBar > calls onClear when clear button is clicked 723ms βœ“ src/layers/__tests__/L2R/FilterBar.test.tsx > FilterBar β€” multi-select > renders all options 48ms stderr | src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > row identity > uses resolveIdOf result for row key and data-testid ⚠️ React Router Future Flag Warning: React Router will begin wrapping state updates in `React.startTransition` in v7. You can use the `v7_startTransition` future flag to opt-in early. For more information, see https://reactrouter.com/v6/upgrading/future#v7_starttransition. ⚠️ React Router Future Flag Warning: Relative route resolution within Splat routes is changing in v7. You can use the `v7_relativeSplatPath` future flag to opt-in early. For more information, see https://reactrouter.com/v6/upgrading/future#v7_relativesplatpath. βœ“ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > sort > sets default sort in URL on initial hydration 41ms βœ“ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > sort > shows sort indicator on active sort column 36ms βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > row identity > uses resolveIdOf result for row key and data-testid 651ms βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > row identity > falls back to row.id when resolveIdOf returns null 57ms βœ“ src/layers/__tests__/L2R/FilterBar.test.tsx > FilterBar β€” multi-select > calls onChange when an option is clicked 195ms βœ“ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > 1. loading shows skeleton header + skeleton card, no buttons rendered 294ms βœ“ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > sort > cycles sort on header click: none -> asc -> desc -> none 117ms βœ“ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > sort > switches to new column asc when different column is clicked 80ms βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > row identity > falls back to empty string when no id field and resolveIdOf returns null 64ms βœ“ src/layers/__tests__/L2R/FilterBar.test.tsx > FilterBar β€” multi-select > toggles option off when already active 126ms βœ“ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > rendering states > renders empty state when entity is null 74ms βœ“ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > sort > sorts data by active sort field asc 62ms βœ“ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > 2. error shows "Failed to load" + Retry 585ms βœ“ src/layers/__tests__/L2R/FilterBar.test.tsx > FilterBar β€” multi-select > calls onChange with undefined when last option deselected 183ms βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > SSE > shows connection-lost banner with reconnect when SSE enabled and connection lost 112ms βœ“ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > sort > sorts data by active sort field desc 111ms βœ“ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > sort > places null/undefined values last in asc sort 73ms βœ“ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > rendering states > renders detail content via CrudReadCard with fields from readGrouping 659ms βœ“ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > rendering states > renders field values correctly via MetadataCard 83ms βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > SSE > shows data table alongside SSE connection-lost banner (preserving cached data) 193ms βœ“ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > sort > sorts numbers numerically 78ms βœ“ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > sort > sorts strings case-insensitively 52ms βœ“ src/layers/__tests__/L2R/FilterBar.test.tsx > FilterBar β€” multi-select > sets aria-label on option buttons 109ms βœ“ src/layers/__tests__/L2R/FilterBar.test.tsx > FilterBar β€” select > renders all options plus "All" default 29ms βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > SSE > reconnect button calls sse.reconnect 138ms βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > SSE > renders table normally when SSE enabled and connection is live 39ms βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > SSE > renders table normally when SSE is not enabled 47ms βœ“ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > 3. 404 shows "not found" + "Back to list" 254ms βœ“ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > sort > does not render sort indicator on non-sortable columns 60ms βœ“ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > overrides > renders custom loading fragment from overrides 81ms βœ“ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > rendering states > renders offline indicator when offline 93ms βœ“ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > rendering states > uses default grouping when readGrouping is not set 39ms βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > states > shows error state 69ms βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > states > shows loading state 38ms βœ“ src/layers/__tests__/L2R/FilterBar.test.tsx > FilterBar β€” select > calls onChange with selected value 256ms βœ“ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > overrides > renders custom empty fragment from overrides 60ms βœ“ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > overrides > renders custom error fragment from overrides 19ms βœ“ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > 4. default renders title, actions, field grid 270ms βœ“ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > wiring > renders edit button when edit target is set 231ms βœ“ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > overrides > wraps content in layoutWrapper from overrides 76ms βœ“ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > overrides > uses label overrides for column headers 52ms βœ“ src/layers/__tests__/L2R/FilterBar.test.tsx > FilterBar β€” select > calls onChange with undefined when "All" is selected 146ms βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > states > shows empty state when no data and not loading 25ms βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > states > shows filter-empty state when data is empty and filters are active 48ms stderr | src/layers/__tests__/L2R/Crud.test.tsx > Crud slot β€” route handoff > cancel > navigates to cancelTarget when Cancel is clicked ⚠️ React Router Future Flag Warning: React Router will begin wrapping state updates in `React.startTransition` in v7. You can use the `v7_startTransition` future flag to opt-in early. For more information, see https://reactrouter.com/v6/upgrading/future#v7_starttransition. ⚠️ React Router Future Flag Warning: Relative route resolution within Splat routes is changing in v7. You can use the `v7_relativeSplatPath` future flag to opt-in early. For more information, see https://reactrouter.com/v6/upgrading/future#v7_relativesplatpath. βœ“ src/layers/__tests__/L2R/FilterBar.test.tsx > FilterBar β€” select > preselects the current value 87ms βœ“ src/layers/__tests__/L2R/FilterBar.test.tsx > FilterBar β€” date-range > renders preset options 24ms βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > states > filter-empty state shows clear filters button 151ms stderr | src/layers/__tests__/L2R/Crud.test.tsx > Crud slot β€” route handoff > cancel > navigates to cancelTarget when Cancel is clicked An update to Crud inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act βœ“ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > overrides > hides columns specified in overrides 74ms βœ“ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > filter-empty state > shows filter-empty when hasActiveFilters is true and data is empty 81ms βœ“ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > wiring > calls navigate with edit target when edit button clicked 180ms βœ“ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > wiring > does not render edit button when actionTargets.edit is not set 28ms βœ“ src/layers/__tests__/L2R/FilterBar.test.tsx > FilterBar β€” date-range > calls onChange when a preset is clicked 122ms stderr | src/layers/__tests__/L2R/Crud.test.tsx > Crud slot β€” route handoff > cancel > navigates to cancelTarget when Cancel is clicked An update to FocusScope inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to Presence inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to Presence inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to DismissableLayer inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to FocusScope inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to Presence inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to Presence inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to DismissableLayer inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act βœ“ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > filter-empty state > shows regular empty when hasActiveFilters is false and data empty 71ms βœ“ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > filter-empty state > shows clear filters button in filter-empty state when onClearFilters provided 59ms βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > states > shows regular empty when no filters are active and data empty 99ms βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > states > error takes priority over loading 31ms βœ“ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > wiring > edit button navigates to configured target when actionTargets.edit is set 170ms βœ“ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > 5. edit onClick is called 293ms βœ“ src/layers/__tests__/L2R/FilterBar.test.tsx > FilterBar β€” date-range > calls onChange with undefined when active preset is clicked again 88ms βœ“ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > filter-empty state > does not show filter-empty when data is not empty 59ms βœ“ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > render contract > calls render for each cell 24ms βœ“ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > render contract > renders ReactNode from render function 30ms βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > add button > renders add button in header when createTarget is set 118ms βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > add button > does not render add button when createTarget is not set (no fallback) 29ms βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > row click > navigates via rowTargetOverride on click when override is set 27ms βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > row click > rowTargetOverride takes precedence over rowTarget 37ms βœ“ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > wiring > renders edit button when actionTargets.edit is present 143ms βœ“ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > overrides > renders custom loading fragment 37ms βœ“ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > overrides > renders custom empty fragment 15ms βœ“ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > overrides > renders custom error fragment 30ms βœ“ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > render contract > render receives full row object 107ms βœ“ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > rendering > renders nothing when activeCrud is null 447ms βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > row click > navigates to derived default pathname/id when no rowTarget and no override 48ms βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > filters slot > renders filtersSlot when provided alongside data 54ms βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > filters slot > does not render filters-slot when filtersSlot is not provided 29ms βœ“ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > overrides > wraps in layoutWrapper from overrides 60ms βœ“ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > DetailSurface β€” delete UI contract > renders delete button when actionTargets.delete=true and deleteState is present 35ms βœ“ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > DetailSurface β€” delete UI contract > does not render delete button when actionTargets.delete is not set 19ms βœ“ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > DetailSurface β€” delete UI contract > does not render delete button when deleteState is null 34ms βœ“ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > render contract > renders default plain text when render is omitted 97ms βœ“ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > render contract > supports mixed columns: some with render, some without 78ms βœ“ src/layers/__tests__/L2R/FilterBar.test.tsx > FilterBar β€” integration > clear button appears when any filter type has a value 119ms βœ“ src/layers/__tests__/L2R/FilterBar.test.tsx > FilterBar β€” integration > combines multiple active filters 61ms βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > pagination > renders pagination controls with prev/next buttons 31ms βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > pagination > disables prev button when offset is 0 37ms βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > pagination > enables prev button when offset > 0 49ms βœ“ src/layers/__tests__/L2R/Crud.test.tsx > Crud slot β€” route handoff > cancel > navigates to cancelTarget when Cancel is clicked 1733ms βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > pagination > disables next button when hasMore is false 56ms βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > pagination > disables next button when hasMore is undefined and data length < pageSize (fallback) 26ms βœ“ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > render contract > render is optional β€” ColumnConfig is valid without render 57ms βœ“ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > rendering > renders add mode title by default 1591ms (node:423) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) βœ“ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > 6. delete opens ConfirmDialog 522ms βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > pagination > enables next button when hasMore is true 145ms βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > pagination > enables next button when hasMore is true even with less data than pageSize 54ms βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > pagination > reads offset from URL search params 53ms βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > pagination > uses fixedParams.limit as pageSize when provided 25ms βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > pagination > defaults pageSize to 25 when no fixedParams.limit 74ms βœ“ src/layers/__tests__/L2R/Crud.test.tsx > Crud slot β€” route handoff > cancel > navigates to cancelTarget via closeIntent cancel 425ms βœ“ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > rendering > renders edit mode title 330ms βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > pagination > shows totalEstimate in pagination display when >= 0 168ms βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > pagination > hides "of" in pagination display when totalEstimate is -1 28ms βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > pagination > hides "of" in pagination display when totalEstimate is undefined 29ms βœ“ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > DetailSurface β€” delete UI contract > delete button click calls deleteState.requestDelete 49ms βœ“ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > 7. delete confirm calls onClick 609ms stderr | src/layers/__tests__/L2R/Crud.test.tsx > Crud slot β€” route handoff > cancel > falls back to onCancel callback An update to Crud inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act βœ“ src/layers/__tests__/L2R/Crud.test.tsx > Crud slot β€” route handoff > cancel > navigates with :id replaced in edit mode cancel 392ms stderr | src/layers/__tests__/L2R/Crud.test.tsx > Crud slot β€” route handoff > cancel > falls back to onCancel callback An update to FocusScope inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to Presence inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to Presence inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to DismissableLayer inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to FocusScope inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to Presence inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to Presence inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to DismissableLayer inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > pagination > falls back to total for pagination display when totalEstimate is missing but total is set 132ms βœ“ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > rendering > renders form fields based on fieldPolicy 298ms βœ“ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > 8. delete disabled is muted 275ms (node:430) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > pagination > resets offset when sort changes 133ms βœ“ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > 9. extra renders before Edit 160ms βœ“ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > external deleteState integration > 10. renders external delete button when deleteState is provided 22ms βœ“ src/layers/__tests__/L2R/Crud.test.tsx > Crud slot β€” route handoff > cancel > falls back to onCancel callback 385ms βœ“ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > rendering > does not render fields with visible: false 384ms βœ“ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > DetailSurface β€” delete UI contract > renders confirm-delete-dialog when deleteState.showConfirm is true 867ms βœ“ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > DetailSurface β€” delete UI contract > does not render confirm-delete-dialog when showConfirm is false 23ms βœ“ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > rendering > renders disabled input for fields with editable: false 217ms βœ“ src/layers/__tests__/L2R/Crud.test.tsx > Crud slot β€” route handoff > success > navigates to successTarget with id replaced from mutation result (add) 219ms βœ“ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > DetailSurface β€” delete UI contract > cancel button calls deleteState.cancelDelete 338ms βœ“ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > external deleteState integration > 11. external delete button click calls requestDelete 105ms stderr | src/layers/__tests__/L2R/Crud.test.tsx > Crud slot β€” route handoff > success > falls back to onSuccess callback An update to Crud inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act βœ“ src/layers/__tests__/L2R/Crud.test.tsx > Crud slot β€” route handoff > success > navigates using route param id in edit mode 229ms βœ“ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > rendering > renders offline indicator when offline 138ms stderr | src/layers/__tests__/L2R/Crud.test.tsx > Crud slot β€” route handoff > success > falls back to onSuccess callback An update to FocusScope inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to Presence inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to Presence inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to DismissableLayer inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to FocusScope inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to Presence inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to Presence inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to DismissableLayer inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > pagination > resets offset when filter changes 168ms βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > sort + filter param merge > includes stripped filter params and excludes prefixed internal keys 50ms βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > sort + filter param merge > does not break fixedParams 31ms βœ“ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > DetailSurface β€” delete UI contract > confirm button calls deleteState.confirmDelete 217ms βœ“ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > external deleteState integration > 12. shows confirm dialog when showConfirm is true 300ms (node:439) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) βœ“ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > DetailSurface β€” delete UI contract > confirm button is disabled when isPending is true 252ms βœ“ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > DetailSurface β€” delete UI contract > renders delete-error when deleteState.error is not null 24ms βœ“ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > DetailSurface β€” delete UI contract > does not render delete-error when error is null 31ms βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > extra > renders extra Button in header bar 481ms βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > extra > DOM order: extra container before Add button within header flex 68ms βœ“ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > rendering > renders modal with dialog role for accessibility 294ms βœ“ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > DetailSurface β€” delete UI contract > calls onDeleteSuccess when delete transitions from pending to done without error 37ms βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > extra > undefined does not break 30ms βœ“ src/layers/__tests__/L2R/Crud.test.tsx > Crud slot β€” route handoff > success > falls back to onSuccess callback 287ms βœ“ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > DetailSurface β€” delete UI contract > does not call onDeleteSuccess when pending transition has error 102ms βœ“ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > DetailSurface β€” delete UI contract > does not call onDeleteSuccess while still pending 21ms βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > extra > onClick callback is invoked when button clicked 110ms βœ“ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > external deleteState integration > 13. confirm button calls confirmDelete 361ms βœ“ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > DetailSurface β€” delete UI contract > calls onDeleteSuccess at most once during repeated pendingβ†’done cycles 103ms βœ“ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > field formatters > applies formatter for fields with formatter defined 47ms βœ“ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > field formatters > applies ReactNode formatter 20ms βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > extra > fragment with multiple buttons renders all 200ms βœ“ src/layers/__tests__/L2R/Crud.test.tsx > Crud slot β€” route handoff > success > falls back to cancelTarget when successTarget has :id but mutation returns no id 286ms βœ“ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > rendering > renders Save and Cancel buttons in modal footer 258ms βœ“ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > field formatters > falls back to String() when no formatter for field 107ms βœ“ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > field formatters > passes entity as second argument to formatter 53ms βœ“ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > external deleteState integration > 14. cancel button calls cancelDelete 366ms βœ“ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > extra > forwards extra buttons to CrudReadCard when provided 169ms βœ“ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > pending state > disables fieldset and modal buttons when pending 465ms stderr | src/layers/__tests__/L2R/Crud.test.tsx > Crud slot β€” route handoff > mutation tracking > does not navigate before coordinator emits closeIntent An update to Crud inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act βœ“ src/layers/__tests__/L2R/Crud.test.tsx > Crud slot β€” route handoff > success > falls back to entityPath when successTarget has :id, mutation returns no id, and no cancelTarget 335ms βœ“ src/layers/__tests__/L1/entityResolver.test.tsx > entityResolver > resolveContract > resolves repositories contract 12ms βœ“ src/layers/__tests__/L1/entityResolver.test.tsx > entityResolver > resolveContract > resolves projects contract 2ms βœ“ src/layers/__tests__/L1/entityResolver.test.tsx > entityResolver > resolveContract > resolves runs contract 2ms βœ“ src/layers/__tests__/L1/entityResolver.test.tsx > entityResolver > resolveContract > resolves pipelines contract 1ms βœ“ src/layers/__tests__/L1/entityResolver.test.tsx > entityResolver > resolveContract > returns the same contract as the static registry 2ms stderr | src/shared/hooks/useFilterState.test.tsx > useFilterState > 1. prefix prepends prefix to URL params ⚠️ React Router Future Flag Warning: React Router will begin wrapping state updates in `React.startTransition` in v7. You can use the `v7_startTransition` future flag to opt-in early. For more information, see https://reactrouter.com/v6/upgrading/future#v7_starttransition. ⚠️ React Router Future Flag Warning: Relative route resolution within Splat routes is changing in v7. You can use the `v7_relativeSplatPath` future flag to opt-in early. For more information, see https://reactrouter.com/v6/upgrading/future#v7_relativesplatpath. stderr | src/layers/__tests__/L2R/Crud.test.tsx > Crud slot β€” route handoff > mutation tracking > does not navigate before coordinator emits closeIntent An update to FocusScope inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to Presence inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to Presence inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to DismissableLayer inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to FocusScope inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to Presence inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to Presence inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to DismissableLayer inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act βœ“ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > external deleteState integration > 15. confirm button disabled when isPending 381ms βœ“ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > external deleteState integration > 16. renders deleteError when provided 55ms βœ“ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > sort toggle > cycles sort: none -> asc -> desc -> none 123ms βœ“ src/layers/__tests__/L1/entityResolver.test.tsx > entityResolver > useEntityList > returns a ListResult-like shape for repositories 155ms βœ“ src/layers/__tests__/L1/entityResolver.test.tsx > entityResolver > useEntityList > returns a ListResult-like shape for projects 11ms βœ“ src/layers/__tests__/L1/entityResolver.test.tsx > entityResolver > useEntityList > returns a ListResult-like shape for runs 9ms βœ“ src/layers/__tests__/L1/entityResolver.test.tsx > entityResolver > useEntityList > returns a ListResult-like shape for pipelines 13ms βœ“ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > extra > extra buttons render before Edit button in CrudReadCard 115ms βœ“ src/shared/hooks/useFilterState.test.tsx > useFilterState > 1. prefix prepends prefix to URL params 188ms βœ“ src/shared/hooks/useFilterState.test.tsx > useFilterState > 2. setFilter merges, does not replace other params 18ms βœ“ src/shared/hooks/useFilterState.test.tsx > useFilterState > 3. clearFilters removes filters, preserves sort defaults in memory 39ms βœ“ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > pending state > pending makes fields read-only via isEditable check 178ms βœ“ src/layers/__tests__/L1/entityResolver.test.tsx > entityResolver > useEntityList > passes params through to the query 67ms βœ“ src/layers/__tests__/L1/entityResolver.test.tsx > entityResolver > useEntityDetail > returns a DetailResult-like shape 11ms βœ“ src/layers/__tests__/L1/entityResolver.test.tsx > entityResolver > useEntityDetail > works for runs with run_id-based entities 24ms βœ“ src/layers/__tests__/L1/entityResolver.test.tsx > entityResolver > useMutation > returns a MutationHandle-like shape 15ms βœ“ src/layers/__tests__/L2R/Crud.test.tsx > Crud slot β€” route handoff > mutation tracking > does not navigate before coordinator emits closeIntent 369ms stderr | src/layers/__tests__/L2R/Crud.test.tsx > Crud slot β€” route handoff > mutation tracking > stays on page when failure is present An update to Crud inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act βœ“ src/shared/hooks/useFilterState.test.tsx > useFilterState > 4. setSort cycles: asc β†’ desc β†’ none (returns to default) 36ms βœ“ src/shared/hooks/useFilterState.test.tsx > useFilterState > setSort with explicit order 33ms βœ“ src/shared/hooks/useFilterState.test.tsx > useFilterState > 5. clearFilters does NOT write sort defaults to URL 41ms stderr | src/layers/__tests__/L2R/Crud.test.tsx > Crud slot β€” route handoff > mutation tracking > stays on page when failure is present An update to FocusScope inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to Presence inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to Presence inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to DismissableLayer inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to FocusScope inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to Presence inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to Presence inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to DismissableLayer inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act βœ“ src/shared/hooks/useFilterState.test.tsx > useFilterState > 6. multiple prefixes do not collide 30ms βœ“ src/shared/hooks/useFilterState.test.tsx > useFilterState > 7. arrays serialized as pipe-delimited 45ms βœ“ src/shared/hooks/useFilterState.test.tsx > useFilterState > 8. undefined removes param entirely 27ms βœ“ src/shared/hooks/useFilterState.test.tsx > useFilterState > getFilter returns current value for key 10ms βœ“ src/layers/__tests__/L1/entityResolver.test.tsx > entityResolver > useMutation > works for all entity paths 47ms βœ“ src/layers/__tests__/L1/entityResolver.test.tsx > entityResolver > useSubscription > returns a SubscriptionHandle-like shape 26ms βœ“ src/layers/__tests__/L1/entityResolver.test.tsx > entityResolver > useSubscription > works for all entity paths 26ms βœ“ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > failure and loading states > renders failure message and retry button 258ms βœ“ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > external deleteState integration > 17. no internal DeleteButton when deleteState is provided 38ms βœ“ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > overrides > 18. renders custom error fragment via overrides 8ms βœ“ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > overrides > 19. renders custom loading fragment via overrides 23ms βœ“ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > overrides > 20. renders custom empty fragment via overrides 35ms βœ“ src/layers/__tests__/L2W/behaviorContract.test.ts > createDefaultBehaviorContract > returns an object with all BehaviorContract functions 32ms βœ“ src/layers/__tests__/L2W/behaviorContract.test.ts > createDefaultBehaviorContract > defaults() returns an object 2ms βœ“ src/layers/__tests__/L2W/behaviorContract.test.ts > createDefaultBehaviorContract > populate(entity) returns a copy 6ms βœ“ src/layers/__tests__/L2W/behaviorContract.test.ts > createDefaultBehaviorContract > toCreate(form) returns a partial copy 2ms βœ“ src/layers/__tests__/L2W/behaviorContract.test.ts > createDefaultBehaviorContract > toUpdate(form) returns a partial copy 4ms βœ“ src/layers/__tests__/L2W/behaviorContract.test.ts > createDefaultBehaviorContract > fieldPolicy(mode) returns an empty FieldPolicy 2ms βœ“ src/layers/__tests__/L2W/behaviorContract.test.ts > createDefaultBehaviorContract > populated entity does not mutate original 1ms βœ“ src/layers/__tests__/L2W/behaviorContract.test.ts > createFieldPolicyFromConfig > returns empty policy when no fieldBehavior config 3ms βœ“ src/layers/__tests__/L2W/behaviorContract.test.ts > createFieldPolicyFromConfig > applies visible constraint for add mode 3ms βœ“ src/layers/__tests__/L2W/behaviorContract.test.ts > createFieldPolicyFromConfig > applies visibility constraint for edit mode 3ms βœ“ src/layers/__tests__/L2W/behaviorContract.test.ts > createFieldPolicyFromConfig > applies editable constraint per mode 2ms βœ“ src/layers/__tests__/L2W/behaviorContract.test.ts > createFieldPolicyFromConfig > applies both visible and editable together 2ms βœ“ src/layers/__tests__/L2W/behaviorContract.test.ts > createFieldPolicyFromConfig > splits policy by mode independently 2ms βœ“ src/layers/__tests__/L2W/behaviorContract.test.ts > createFieldPolicyFromConfig > handles unknown fields gracefully 1ms βœ“ src/layers/__tests__/L2W/behaviorContract.test.ts > createFieldPolicyFromConfig > returns FieldPolicy that satisfies the type contract 2ms βœ“ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > extra > renders multiple extra buttons via fragment 181ms βœ“ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > failure and loading states > retry button calls failure.retry 231ms βœ“ src/layers/__tests__/L2R/Crud.test.tsx > Crud slot β€” route handoff > mutation tracking > stays on page when failure is present 302ms βœ“ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > failure and loading states > renders loading state when pending 205ms βœ“ src/layers/__tests__/L2R/Crud.test.tsx > Crud slot β€” route handoff > default navigation (without successTarget / onSuccess) > navigates to detail page on success when no successTarget or onSuccess (add mode) 308ms βœ“ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > closeIntent > calls onSuccess when closeIntent is success 149ms βœ“ src/layers/__tests__/L2R/Crud.test.tsx > Crud slot β€” route handoff > default navigation (without successTarget / onSuccess) > navigates back in history on cancel without cancelTarget or onCancel 166ms βœ“ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > closeIntent > calls onClose when closeIntent is cancel 161ms βœ“ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > user interactions > Save button triggers snapshot.submit 208ms (node:447) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) βœ“ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > user interactions > updateField is called when input value changes 156ms βœ“ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > user interactions > dirty guard > calls cancel directly when dirty=false on Cancel click 125ms βœ“ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > user interactions > dirty guard > opens DiscardDialog when dirty=true on Cancel click 420ms βœ“ src/msw/__tests__/runs-handler.test.ts > runs MSW handler > returns runs without filter 198ms βœ“ src/msw/__tests__/runs-handler.test.ts > runs MSW handler > filters by created_after (30 days) 27ms βœ“ src/msw/__tests__/runs-handler.test.ts > runs MSW handler > filters by created_after (24 hours) 26ms βœ“ src/msw/__tests__/runs-handler.test.ts > runs MSW handler > handles invalid created_after gracefully 59ms βœ“ src/msw/__tests__/runs-handler.test.ts > runs MSW handler > handles today shorthand gracefully 50ms βœ“ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > user interactions > dirty guard > Discard in modal DiscardDialog calls cancel 620ms (node:455) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) βœ“ src/msw/__tests__/runs-handler.test.ts > runs MSW handler > filters by project_id 89ms βœ“ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > user interactions > dirty guard > Keep Editing in modal DiscardDialog does not call cancel 449ms βœ“ src/msw/__tests__/runs-handler.test.ts > runs MSW handler > filters by multiple project_ids 200ms βœ“ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > overrides > renders custom title label 283ms βœ“ src/msw/__tests__/runs-handler.test.ts > runs MSW handler > sorts by tokens desc 123ms βœ“ src/msw/__tests__/runs-handler.test.ts > runs MSW handler > sorts by tokens asc 56ms βœ“ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > overrides > renders custom error fragment 192ms βœ“ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > overrides > renders custom loading fragment 275ms βœ“ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > overrides > renders fields in custom order 160ms βœ“ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > field types > renders text input by default 87ms (node:461) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) βœ“ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > field types > renders text input for type text 86ms βœ“ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > field types > renders textarea for type textarea 92ms βœ“ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > field types > renders password input for type password 153ms βœ“ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > field types > renders checkbox for type checkbox 107ms βœ“ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > field types > renders entity-select for type entity-select 166ms βœ“ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > field types > renders kv-editor for type kv-editor 135ms βœ“ src/layers/__tests__/L1/mutationQueue.test.ts > pendingDeleteMap > addPendingDelete + getPendingDeletes > adds an id to the set for an entityPath 23ms βœ“ src/layers/__tests__/L1/mutationQueue.test.ts > pendingDeleteMap > addPendingDelete + getPendingDeletes > adds multiple ids to the same entityPath 2ms βœ“ src/layers/__tests__/L1/mutationQueue.test.ts > pendingDeleteMap > addPendingDelete + getPendingDeletes > handles multiple entityPaths independently 2ms βœ“ src/layers/__tests__/L1/mutationQueue.test.ts > pendingDeleteMap > removePendingDelete > removes a specific id 2ms βœ“ src/layers/__tests__/L1/mutationQueue.test.ts > pendingDeleteMap > removePendingDelete > is a no-op when id does not exist 4ms βœ“ src/layers/__tests__/L1/mutationQueue.test.ts > pendingDeleteMap > removePendingDelete > is a no-op when entityPath has no entries 1ms βœ“ src/layers/__tests__/L1/mutationQueue.test.ts > pendingDeleteMap > isMarkedDeleted > returns true for a marked id 14ms βœ“ src/layers/__tests__/L1/mutationQueue.test.ts > pendingDeleteMap > isMarkedDeleted > returns false for an unmarked id 2ms βœ“ src/layers/__tests__/L1/mutationQueue.test.ts > pendingDeleteMap > isMarkedDeleted > returns false for unknown entityPath 4ms βœ“ src/layers/__tests__/L1/mutationQueue.test.ts > pendingDeleteMap > populatePendingDeletes > populates from an array of entries 3ms βœ“ src/layers/__tests__/L1/mutationQueue.test.ts > pendingDeleteMap > populatePendingDeletes > deduplicates when same id appears twice 1ms βœ“ src/layers/__tests__/L1/mutationQueue.test.ts > pendingDeleteMap > getAllPendingDeleteEntries > returns empty array when map is empty 8ms βœ“ src/layers/__tests__/L1/mutationQueue.test.ts > pendingDeleteMap > getAllPendingDeleteEntries > returns all entries as flat array 11ms βœ“ src/layers/__tests__/L1/mutationQueue.test.ts > pendingDeleteMap > purgePendingDeletes > returns and removes all ids for an entityPath 3ms βœ“ src/layers/__tests__/L1/mutationQueue.test.ts > pendingDeleteMap > purgePendingDeletes > returns empty set for unknown entityPath 1ms βœ“ src/layers/__tests__/L1/mutationQueue.test.ts > pendingDeleteMap > purgePendingDeletes > does not affect other entityPaths 2ms βœ“ src/layers/__tests__/L1/mutationQueue.test.ts > normalizeFilters > removes undefined values 8ms βœ“ src/layers/__tests__/L1/mutationQueue.test.ts > normalizeFilters > removes empty string values 4ms βœ“ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > default rendering without targets > renders form and buttons with default snapshot (no closeIntent) 165ms βœ“ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > useBlocker dirty guard > shows DiscardDialog when blocker state is blocked and proceed is called on confirm 324ms βœ“ src/layers/__tests__/L1/mutationQueue.test.ts > normalizeFilters > sorts keys alphabetically 57ms βœ“ src/layers/__tests__/L1/mutationQueue.test.ts > normalizeFilters > returns empty object for all-empty filters 2ms βœ“ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > useBlocker dirty guard > does not show DiscardDialog when blocker is unblocked (dirty=false) 133ms (node:492) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:512) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:484) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) βœ“ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > useBlocker dirty guard > Keep Editing in blocker DiscardDialog calls blocker.reset 355ms (node:478) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:471) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:503) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) βœ“ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > checkbox field value > calls updateField with boolean checked value, not string value 549ms stderr | src/layers/__tests__/L2R/EntityDetail.test.tsx > EntityDetail β€” delete navigation > navigates to entityPath on delete success without custom onDeleteSuccess ⚠️ React Router Future Flag Warning: React Router will begin wrapping state updates in `React.startTransition` in v7. You can use the `v7_startTransition` future flag to opt-in early. For more information, see https://reactrouter.com/v6/upgrading/future#v7_starttransition. ⚠️ React Router Future Flag Warning: Relative route resolution within Splat routes is changing in v7. You can use the `v7_relativeSplatPath` future flag to opt-in early. For more information, see https://reactrouter.com/v6/upgrading/future#v7_relativesplatpath. βœ“ src/layers/__tests__/L2R/EntityDetail.test.tsx > EntityDetail β€” delete navigation > navigates to entityPath on delete success without custom onDeleteSuccess 469ms βœ“ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > backdrop click > backdrop click does not close the modal 405ms βœ“ src/layers/__tests__/L2R/EntityDetail.test.tsx > EntityDetail β€” delete navigation > calls custom onDeleteSuccess and does not default navigate 72ms (node:485) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) βœ“ src/layers/__tests__/L2R/defaultEditNav.test.ts > createDefaultEditNavHandler > returns a function when edit target is present 31ms βœ“ src/layers/__tests__/L2R/defaultEditNav.test.ts > createDefaultEditNavHandler > calls navigate with edit target and replaced id 13ms βœ“ src/layers/__tests__/L2R/defaultEditNav.test.ts > createDefaultEditNavHandler > falls back to pathname + /edit when actionTargets is undefined 3ms βœ“ src/layers/__tests__/L2R/defaultEditNav.test.ts > createDefaultEditNavHandler > falls back to pathname + /edit when actionTargets.edit is undefined 2ms βœ“ src/layers/__tests__/L2R/defaultEditNav.test.ts > createDefaultEditNavHandler > falls back to pathname + /edit when actionTargets.edit is missing 2ms βœ“ src/layers/__tests__/L2R/defaultEditNav.test.ts > createDefaultEditNavHandler > calls navigate with the replaced id correctly 2ms βœ“ src/layers/__tests__/L2R/defaultEditNav.test.ts > createDefaultEditNavHandler > explicit edit target takes precedence over derived default 4ms βœ“ src/layers/__tests__/L2R/defaultEditNav.test.ts > createDefaultEditNavHandler > derives default from the provided pathname 7ms βœ“ src/layers/__tests__/L2R/defaultEditNav.test.ts > createDefaultEditNavHandler > editTargetOverride takes precedence over actionTargets.edit 2ms stderr | src/layers/__tests__/L2W/routes/CrudRoute.test.tsx > CrudRoute > sets route context on mount with id (detail page) ⚠️ React Router Future Flag Warning: React Router will begin wrapping state updates in `React.startTransition` in v7. You can use the `v7_startTransition` future flag to opt-in early. For more information, see https://reactrouter.com/v6/upgrading/future#v7_starttransition. ⚠️ React Router Future Flag Warning: Relative route resolution within Splat routes is changing in v7. You can use the `v7_relativeSplatPath` future flag to opt-in early. For more information, see https://reactrouter.com/v6/upgrading/future#v7_relativesplatpath. βœ“ src/layers/__tests__/L2W/routes/CrudRoute.test.tsx > CrudRoute > sets route context on mount with id (detail page) 161ms βœ“ src/layers/__tests__/L2W/routes/CrudRoute.test.tsx > CrudRoute > sets route context on mount without id (collection page) 16ms βœ“ src/layers/__tests__/L2W/routes/CrudRoute.test.tsx > CrudRoute > sets route context with prefix when provided 27ms βœ“ src/layers/__tests__/L2W/routes/CrudRoute.test.tsx > CrudRoute > cleans up (sets null) on unmount 11ms stderr | src/features/auth/CallbackPage.test.tsx > CallbackPage > navigates to dashboard when valid code and verifier are in sessionStorage ⚠️ React Router Future Flag Warning: React Router will begin wrapping state updates in `React.startTransition` in v7. You can use the `v7_startTransition` future flag to opt-in early. For more information, see https://reactrouter.com/v6/upgrading/future#v7_starttransition. ⚠️ React Router Future Flag Warning: Relative route resolution within Splat routes is changing in v7. You can use the `v7_relativeSplatPath` future flag to opt-in early. For more information, see https://reactrouter.com/v6/upgrading/future#v7_relativesplatpath. βœ“ src/lib/__tests__/queryCacheEviction.test.tsx > startCacheEviction > removes inactive queries older than retention threshold 33ms βœ“ src/lib/__tests__/queryCacheEviction.test.tsx > startCacheEviction > does not remove queries under retention threshold accounting for interval delay 6ms βœ“ src/layers/__tests__/L2W/routes/CrudRoute.test.tsx > CrudRoute > does not re-set context on re-render with same props 23ms βœ“ src/layers/__tests__/L2W/routes/CrudRoute.test.tsx > CrudRoute > re-sets context when id changes 12ms βœ“ src/lib/__tests__/queryCacheEviction.test.tsx > startCacheEviction > does not remove active queries with observers 193ms βœ“ src/lib/__tests__/queryCacheEviction.test.tsx > startCacheEviction > removes only exact matching query keys 4ms βœ“ src/lib/__tests__/queryCacheEviction.test.tsx > startCacheEviction > skips eviction entirely when offline 3ms βœ“ src/lib/__tests__/queryCacheEviction.test.tsx > startCacheEviction > returns a cleanup function that stops the interval 6ms βœ“ src/lib/__tests__/queryCacheEviction.test.tsx > startCacheEviction > evicts only queries older than threshold across multiple entity paths 5ms βœ“ src/features/auth/CallbackPage.test.tsx > CallbackPage > navigates to dashboard when valid code and verifier are in sessionStorage 632ms βœ“ src/features/auth/CallbackPage.test.tsx > CallbackPage > sets auth store with decoded JWT when token exchange succeeds 77ms βœ“ src/features/auth/CallbackPage.test.tsx > CallbackPage > shows error when no code in sessionStorage 68ms βœ“ src/features/auth/CallbackPage.test.tsx > CallbackPage > clears code and verifier from sessionStorage after processing 41ms βœ“ src/features/auth/CallbackPage.test.tsx > CallbackPage > navigates to returnUrl when set in sessionStorage 85ms βœ“ src/features/auth/CallbackPage.test.tsx > CallbackPage > shows error when token exchange fails 43ms βœ“ src/features/auth/CallbackPage.test.tsx > CallbackPage > shows error when only code is present without verifier 35ms (node:527) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) βœ“ src/layers/__tests__/L2W/formBridge.test.ts > useFormBridge > starts with dirty=false and pending=false 143ms βœ“ src/layers/__tests__/L2W/formBridge.test.ts > useFormBridge > setDirty(true) sets dirty=true on bridge 17ms βœ“ src/layers/__tests__/L2W/formBridge.test.ts > useFormBridge > setDirty(false) sets dirty=false on bridge 15ms βœ“ src/layers/__tests__/L2W/formBridge.test.ts > useFormBridge > setPending(true) sets pending=true on bridge 12ms βœ“ src/layers/__tests__/L2W/formBridge.test.ts > useFormBridge > setPending(false) sets pending=false on bridge 11ms βœ“ src/layers/__tests__/L2W/formBridge.test.ts > useFormBridge > markDirty() sets dirty=true 17ms βœ“ src/layers/__tests__/L2W/formBridge.test.ts > useFormBridge > reset() clears both dirty and pending 13ms βœ“ src/layers/__tests__/L2W/formBridge.test.ts > useFormBridge > supports dirty β†’ pending transition (submit start) 10ms βœ“ src/layers/__tests__/L2W/formBridge.test.ts > useFormBridge > supports pending β†’ not pending transition while dirty stays (failure case) 16ms βœ“ src/layers/__tests__/L2W/formBridge.test.ts > useFormBridge > bridge object reflects current state 38ms (node:535) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) βœ“ src/shared/components/CrudModal.test.tsx > CrudModal > 1. open=false renders nothing 746ms βœ“ src/shared/components/CrudModal.test.tsx > CrudModal > 2. open=true renders title, children, footer 1229ms stderr | src/features/repositories/RepositoriesPage.test.tsx > RepositoriesPage feature contract > renders CrudSurface from crudConfig ⚠️ React Router Future Flag Warning: React Router will begin wrapping state updates in `React.startTransition` in v7. You can use the `v7_startTransition` future flag to opt-in early. For more information, see https://reactrouter.com/v6/upgrading/future#v7_starttransition. ⚠️ React Router Future Flag Warning: Relative route resolution within Splat routes is changing in v7. You can use the `v7_relativeSplatPath` future flag to opt-in early. For more information, see https://reactrouter.com/v6/upgrading/future#v7_relativesplatpath. βœ“ src/shared/components/EntitySelect.test.tsx > EntitySelect > shows loading state 1387ms βœ“ src/shared/components/CrudModal.test.tsx > CrudModal > 3. Backdrop click does not close dialog 388ms βœ“ src/shared/hooks/useDirtyGuard.test.ts > useDirtyGuard > 1. isDirty=false β†’ blocker ei estΓ€ 138ms βœ“ src/shared/hooks/useDirtyGuard.test.ts > useDirtyGuard > 2. isDirty=true β†’ blocker estÀÀ (isBlocked=true) 11ms βœ“ src/shared/hooks/useDirtyGuard.test.ts > useDirtyGuard > 3. submitted=true β†’ blocker ei estΓ€ vaikka isDirty 28ms βœ“ src/shared/hooks/useDirtyGuard.test.ts > useDirtyGuard > 4. confirmNavigation β†’ blocker.proceed() β†’ nav jatkuu 21ms βœ“ src/shared/hooks/useDirtyGuard.test.ts > useDirtyGuard > 5. cancelNavigation β†’ blocker.reset() β†’ formi jÀÀ 41ms βœ“ src/shared/hooks/useDirtyGuard.test.ts > useDirtyGuard > 6. beforeunload estetÀÀn kun isDirty && !submitted 35ms βœ“ src/shared/hooks/useDirtyGuard.test.ts > useDirtyGuard > 7. beforeunload EI estetΓ€ kun submitted 24ms βœ“ src/shared/components/EntitySelect.test.tsx > EntitySelect > shows empty state 184ms βœ“ src/shared/components/CrudModal.test.tsx > CrudModal > 4. Cancel pristine calls onClose 273ms βœ“ src/shared/components/EntitySelect.test.tsx > EntitySelect > shows error state 241ms βœ“ src/features/repositories/RepositoriesPage.test.tsx > RepositoriesPage feature contract > renders CrudSurface from crudConfig 1679ms (node:543) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) βœ“ src/features/repositories/RepositoriesPage.test.tsx > RepositoriesPage feature contract > CrudSurface shows save and cancel buttons 579ms βœ“ src/shared/components/CrudModal.test.tsx > CrudModal > 5. Cancel dirty opens DiscardDialog 518ms (node:549) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) βœ“ src/features/repositories/RepositoriesPage.test.tsx > RepositoriesPage feature contract > CrudSurface renders configured fields from fieldSet 220ms (node:557) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) βœ“ src/shared/components/EntitySelect.test.tsx > EntitySelect > supports single select 941ms βœ“ src/features/repositories/RepositoriesPage.test.tsx > RepositoriesPage feature contract > CrudSurface renders custom title from CrudConfig 315ms βœ“ src/layers/__tests__/L2R/defaultRowNav.test.ts > createDefaultRowNavHandler > returns a function that accepts an id 148ms βœ“ src/layers/__tests__/L2R/defaultRowNav.test.ts > createDefaultRowNavHandler > calls navigate with rowTarget where :id is replaced 16ms βœ“ src/layers/__tests__/L2R/defaultRowNav.test.ts > createDefaultRowNavHandler > replaces :id with the provided id string 2ms βœ“ src/layers/__tests__/L2R/defaultRowNav.test.ts > createDefaultRowNavHandler > falls back to pathname + /:id when rowTarget is undefined 2ms βœ“ src/layers/__tests__/L2R/defaultRowNav.test.ts > createDefaultRowNavHandler > does not throw when rowTarget is undefined (derived default used) 5ms βœ“ src/layers/__tests__/L2R/defaultRowNav.test.ts > createDefaultRowNavHandler > replaces all occurrences of :id in the target 2ms βœ“ src/layers/__tests__/L2R/defaultRowNav.test.ts > createDefaultRowNavHandler > leaves target unchanged if :id not present 3ms βœ“ src/layers/__tests__/L2R/defaultRowNav.test.ts > createDefaultRowNavHandler > explicit rowTarget takes precedence over derived default 6ms βœ“ src/layers/__tests__/L2R/defaultRowNav.test.ts > createDefaultRowNavHandler > derives default from the provided pathname 2ms (node:566) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) βœ“ src/shared/components/EntitySelect.test.tsx > EntitySelect > supports multi select 682ms βœ“ src/shared/components/EntitySelect.test.tsx > EntitySelect > displays placeholder when value is undefined 57ms βœ“ src/shared/components/EntitySelect.test.tsx > EntitySelect > renders readOnly single mode as text 99ms βœ“ src/shared/components/EntitySelect.test.tsx > EntitySelect > renders readOnly multi mode as comma-separated labels 65ms βœ“ src/shared/components/EntitySelect.test.tsx > EntitySelect > renders raw value in readOnly when no match 92ms βœ“ src/shared/components/EntitySelect.test.tsx > EntitySelect > disables the trigger when disabled prop is true 64ms βœ“ src/layouts/healthStore.test.ts > healthStore > defaults > has healthy status by default 20ms βœ“ src/layouts/healthStore.test.ts > healthStore > defaults > has null responseTime by default 2ms βœ“ src/layouts/healthStore.test.ts > healthStore > defaults > has null lastChecked by default 1ms βœ“ src/layouts/healthStore.test.ts > healthStore > defaults > has empty services by default 5ms βœ“ src/layouts/healthStore.test.ts > healthStore > defaults > has null apiVersion by default 1ms βœ“ src/layouts/healthStore.test.ts > healthStore > fetchHealth > sets healthy status on success 5ms βœ“ src/layouts/healthStore.test.ts > healthStore > fetchHealth > sets degraded status when services report issues 2ms βœ“ src/layouts/healthStore.test.ts > healthStore > fetchHealth > sets unhealthy status on network error 3ms (node:568) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:581) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) βœ“ src/shared/components/CrudModal.test.tsx > CrudModal > 6. Discard β†’ onClose, Keep β†’ dialog stays 2346ms βœ“ src/layouts/uiStore.test.ts > uiStore > defaults > has sidebar open by default 20ms βœ“ src/layouts/uiStore.test.ts > uiStore > defaults > has dark theme by default 2ms βœ“ src/layouts/uiStore.test.ts > uiStore > defaults > has null sessionTimeoutAt by default 2ms βœ“ src/layouts/uiStore.test.ts > uiStore > toggleSidebar > closes sidebar when open 2ms βœ“ src/layouts/uiStore.test.ts > uiStore > toggleSidebar > opens sidebar when closed 1ms βœ“ src/layouts/uiStore.test.ts > uiStore > setSidebarOpen > sets sidebar to false 1ms βœ“ src/layouts/uiStore.test.ts > uiStore > setSidebarOpen > sets sidebar to true 1ms βœ“ src/layouts/uiStore.test.ts > uiStore > setTheme > sets theme to light 1ms βœ“ src/layouts/uiStore.test.ts > uiStore > setTheme > sets theme to high-contrast 1ms βœ“ src/layouts/uiStore.test.ts > uiStore > setTheme > sets theme to dark 1ms βœ“ src/layouts/uiStore.test.ts > uiStore > sessionTimeoutAt > sets sessionTimeoutAt to a timestamp 2ms βœ“ src/layouts/uiStore.test.ts > uiStore > sessionTimeoutAt > resets sessionTimeoutAt to null 1ms βœ“ src/layouts/uiStore.test.ts > uiStore > resetSession > restores defaults 2ms βœ“ src/shared/components/CrudModal.test.tsx > CrudModal > 7. ESC dirty opens DiscardDialog 502ms βœ“ src/shared/components/CrudModal.test.tsx > CrudModal > 8. ESC pristine calls onClose 278ms βœ“ src/shared/components/CrudModal.test.tsx > CrudModal > 9. Save calls onSave 573ms βœ“ src/shared/components/CrudModal.test.tsx > CrudModal > 10. isPending disables Save + Cancel and shows spinner 724ms βœ“ src/shared/components/CrudModal.test.tsx > CrudModal > 11. cancelLabel prop overrides the cancel button text 212ms βœ“ src/shared/components/MetadataCard.test.tsx > MetadataCard > shows loading skeleton 284ms βœ“ src/shared/components/MetadataCard.test.tsx > MetadataCard > shows error state with retry button 568ms βœ“ src/shared/components/MetadataCard.test.tsx > MetadataCard > renders labels and values in grid 104ms βœ“ src/shared/components/MetadataCard.test.tsx > MetadataCard > renders field with spanFull as col-span-full 179ms βœ“ src/shared/components/MetadataCard.test.tsx > MetadataCard > shows em dash for empty value 131ms βœ“ src/shared/components/MetadataCard.test.tsx > MetadataCard > uses render callback over value 129ms βœ“ src/shared/components/MetadataCard.test.tsx > MetadataCard > renders children instead of default layout 41ms (node:591) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:613) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:599) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) βœ“ src/shared/components/KeyValueEditor.test.tsx > KeyValueEditor > adds a blank row on [+ Add row] click 1242ms βœ“ src/shared/components/KeyValueEditor.test.tsx > KeyValueEditor > removes a row and emits without it 434ms βœ“ src/layers/__tests__/L2R/OfflineIndicator.test.tsx > OfflineIndicator > renders nothing when online and no pending mutations 116ms βœ“ src/shared/components/KeyValueEditor.test.tsx > KeyValueEditor > shows duplicate key error but still emits onChange 279ms βœ“ src/layers/__tests__/L2R/OfflineIndicator.test.tsx > OfflineIndicator > renders offline banner when not online 90ms βœ“ src/layers/__tests__/L2R/OfflineIndicator.test.tsx > OfflineIndicator > renders pending count when pendingCount > 0 26ms βœ“ src/shared/components/KeyValueEditor.test.tsx > KeyValueEditor > sanitizes empty keys from payload 119ms βœ“ src/shared/components/KeyValueEditor.test.tsx > KeyValueEditor > renders readOnly mode as static key: value lines 28ms βœ“ src/shared/components/KeyValueEditor.test.tsx > KeyValueEditor > shows empty state text when value is undefined in readOnly 9ms βœ“ src/shared/components/KeyValueEditor.test.tsx > KeyValueEditor > shows skeleton when isLoading 14ms βœ“ src/layers/__tests__/L2R/OfflineIndicator.test.tsx > OfflineIndicator > renders last synced time when available 132ms βœ“ src/layers/__tests__/L2R/OfflineIndicator.test.tsx > OfflineIndicator > renders both offline banner and pending count when offline with pending 20ms βœ“ src/layers/__tests__/L2R/OfflineIndicator.test.tsx > OfflineIndicator > renders all three indicators when offline, pending, and synced 35ms βœ“ src/layers/__tests__/L2R/OfflineIndicator.test.tsx > OfflineIndicator > has role status for accessibility 707ms (node:606) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:630) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:622) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) βœ“ src/layers/__tests__/L2R/defaultAddNav.test.ts > createDefaultAddNavHandler > returns a function 124ms βœ“ src/layers/__tests__/L2R/defaultAddNav.test.ts > createDefaultAddNavHandler > calls navigate with createTarget when invoked 49ms (node:637) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) βœ“ src/layers/__tests__/L2R/defaultAddNav.test.ts > createDefaultAddNavHandler > throws when invoked without createTarget (no fallback allowed) 45ms βœ“ src/layers/__tests__/L2R/defaultAddNav.test.ts > createDefaultAddNavHandler > calls navigate with the exact createTarget string when set 10ms βœ“ src/layers/__tests__/L2R/defaultAddNav.test.ts > createDefaultAddNavHandler > empty-string createTarget is treated as missing (throws) 2ms stderr | src/features/auth/LoginPage.test.tsx > LoginPage > shows login heading, description and button ⚠️ React Router Future Flag Warning: React Router will begin wrapping state updates in `React.startTransition` in v7. You can use the `v7_startTransition` future flag to opt-in early. For more information, see https://reactrouter.com/v6/upgrading/future#v7_starttransition. ⚠️ React Router Future Flag Warning: Relative route resolution within Splat routes is changing in v7. You can use the `v7_relativeSplatPath` future flag to opt-in early. For more information, see https://reactrouter.com/v6/upgrading/future#v7_relativesplatpath. βœ“ src/layers/__tests__/architecture-contracts.test.ts > architecture contracts > type-level assertions are verified by npm run typecheck:arch 47ms βœ“ src/features/auth/LoginPage.test.tsx > LoginPage > shows login heading, description and button 1325ms βœ“ src/features/auth/LoginPage.test.tsx > LoginPage > shows session expired message when expired query param is set 61ms βœ“ src/features/auth/LoginPage.test.tsx > LoginPage > does not show expired message without expired param 61ms βœ“ src/features/auth/LoginPage.test.tsx > LoginPage > shows error toast when error query param is set 87ms βœ“ src/features/auth/LoginPage.test.tsx > LoginPage > redirects to dashboard when already authenticated 155ms βœ“ src/shared/components/Page.test.tsx > PageHeader > renders title 293ms βœ“ src/features/auth/authStore.test.ts > authStore > starts unauthenticated 56ms βœ“ src/features/auth/authStore.test.ts > authStore > setAuth sets authenticated state 41ms (node:647) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) βœ“ src/shared/components/ConfirmDialog.test.tsx > ConfirmDialog > renders with title and message 1444ms βœ“ src/features/auth/LoginPage.test.tsx > LoginPage > performs mock login in dev mode and navigates to dashboard 937ms βœ“ src/features/auth/authStore.test.ts > authStore > clearAuth clears all auth state 25ms βœ“ src/shared/components/Page.test.tsx > PageHeader > renders breadcrumbs 109ms βœ“ src/shared/components/Page.test.tsx > PageHeader > renders actions slot 989ms βœ“ src/shared/components/Page.test.tsx > Page > renders children 41ms βœ“ src/shared/components/ConfirmDialog.test.tsx > ConfirmDialog > calls onConfirm when confirm button is clicked 1004ms βœ“ src/shared/components/Page.test.tsx > Page > passes className to root div 88ms βœ“ src/shared/components/Page.test.tsx > Page > renders header slot 55ms βœ“ src/shared/components/DiscardDialog.test.tsx > DiscardDialog > does not render when closed 428ms (node:654) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) βœ“ src/shared/components/ConfirmDialog.test.tsx > ConfirmDialog > calls onCancel when cancel button is clicked 811ms βœ“ src/shared/components/ConfirmDialog.test.tsx > ConfirmDialog > does not render when closed 18ms (node:663) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) βœ“ src/shared/components/TokenDisplay.test.tsx > TokenDisplay > renders 0 as "0" 488ms βœ“ src/shared/components/TokenDisplay.test.tsx > TokenDisplay > renders 500 as "500" 46ms βœ“ src/shared/components/TokenDisplay.test.tsx > TokenDisplay > renders 1500 as "1.5K" 34ms βœ“ src/shared/components/TokenDisplay.test.tsx > TokenDisplay > renders 890123 as "890.1K" 49ms βœ“ src/shared/components/TokenDisplay.test.tsx > TokenDisplay > renders 1234567 as "1.2M" 37ms βœ“ src/shared/components/DiscardDialog.test.tsx > DiscardDialog > renders with default title and description 1166ms βœ“ src/shared/components/TokenDisplay.test.tsx > TokenDisplay > renders 999500 as "999.5K" 16ms βœ“ src/shared/components/TokenDisplay.test.tsx > TokenDisplay > renders with label when provided 33ms βœ“ src/shared/components/DiscardDialog.test.tsx > DiscardDialog > calls onDiscard when Discard button clicked 893ms βœ“ src/shared/components/DurationDisplay.test.tsx > DurationDisplay > renders 0ms as "0s" 188ms βœ“ src/shared/components/DurationDisplay.test.tsx > DurationDisplay > renders 5000ms as "5s" 12ms βœ“ src/shared/components/DurationDisplay.test.tsx > DurationDisplay > renders 65000ms as "1m 5s" 31ms βœ“ src/shared/components/DurationDisplay.test.tsx > DurationDisplay > renders 3661000ms as "1h 1m" 28ms βœ“ src/shared/components/DiscardDialog.test.tsx > DiscardDialog > calls onKeepEditing when Keep Editing button clicked 304ms βœ“ src/shared/components/DurationDisplay.test.tsx > DurationDisplay > renders 3723000ms as "1h 2m" 51ms βœ“ src/shared/components/DurationDisplay.test.tsx > DurationDisplay > renders null as "β€”" 17ms βœ“ src/shared/components/DiscardDialog.test.tsx > DiscardDialog > renders custom title and description 146ms βœ“ src/shared/components/DiscardDialog.test.tsx > DiscardDialog > calls onKeepEditing on dialog dismiss (ESC) 323ms βœ“ src/shared/components/Breadcrumb.test.tsx > Breadcrumb > renders items with separators 225ms (node:671) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) βœ“ src/shared/components/Breadcrumb.test.tsx > Breadcrumb > renders links for items with href 291ms βœ“ src/shared/components/Breadcrumb.test.tsx > Breadcrumb > renders last item as plain text 23ms (node:679) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:686) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) βœ“ src/shared/components/StatsCard.test.tsx > StatsCard > renders label and value 259ms βœ“ src/shared/components/StatsCard.test.tsx > StatsCard > renders large values with abbreviation 22ms βœ“ src/shared/components/StatsCard.test.tsx > StatsCard > renders accent color border 33ms (node:693) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:700) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) βœ“ src/shared/components/RunPhaseIcon.test.tsx > RunPhaseIcon > renders pending with correct label 177ms βœ“ src/shared/components/RunPhaseIcon.test.tsx > RunPhaseIcon > renders running with correct label 23ms βœ“ src/shared/components/RunPhaseIcon.test.tsx > RunPhaseIcon > renders succeeded with correct label 23ms βœ“ src/shared/components/RunPhaseIcon.test.tsx > RunPhaseIcon > renders failed with correct label 14ms βœ“ src/shared/components/SourceBadge.test.tsx > SourceBadge > renders manual badge 184ms βœ“ src/shared/components/SourceBadge.test.tsx > SourceBadge > renders webhook badge 13ms βœ“ src/shared/components/SourceBadge.test.tsx > SourceBadge > renders schedule badge 13ms βœ“ src/shared/components/SourceBadge.test.tsx > SourceBadge > renders api badge 10ms stderr | src/shared/components/ErrorBoundary.test.tsx > ErrorBoundary > renders fallback on error Error: kaboom at Bomb (/workspace/niko/agent-platform/frontend/src/shared/components/ErrorBoundary.test.tsx:6:9) at Object.react_stack_bottom_frame (/workspace/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) at renderWithHooks (/workspace/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) at updateFunctionComponent (/workspace/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) at beginWork (/workspace/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) at runWithFiberInDEV (/workspace/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) at performUnitOfWork (/workspace/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) at workLoopSync (/workspace/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) at renderRootSync (/workspace/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) at performWorkOnRoot (/workspace/node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) { [stack]: [Getter/Setter], [message]: 'kaboom' } The above error occurred in the component. React will try to recreate this component tree from scratch using the error boundary you provided, ErrorBoundary. ErrorBoundary caught: Error: kaboom at Bomb (/workspace/niko/agent-platform/frontend/src/shared/components/ErrorBoundary.test.tsx:6:9) at Object.react_stack_bottom_frame (/workspace/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) at renderWithHooks (/workspace/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) at updateFunctionComponent (/workspace/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) at beginWork (/workspace/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) at runWithFiberInDEV (/workspace/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) at performUnitOfWork (/workspace/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) at workLoopSync (/workspace/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) at renderRootSync (/workspace/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) at performWorkOnRoot (/workspace/node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) { componentStack: '\n' + ' at Bomb (/workspace/niko/agent-platform/frontend/src/shared/components/ErrorBoundary.test.tsx:11:8)\n' + ' at ErrorBoundary (/workspace/niko/agent-platform/frontend/src/shared/components/ErrorBoundary.tsx:10:1)' } βœ“ src/shared/components/ErrorBoundary.test.tsx > ErrorBoundary > renders children when no error 139ms βœ“ src/shared/components/ErrorBoundary.test.tsx > ErrorBoundary > renders fallback on error 84ms stderr | src/App.test.tsx > App > shows login page when unauthenticated ⚠️ React Router Future Flag Warning: React Router will begin wrapping state updates in `React.startTransition` in v7. You can use the `v7_startTransition` future flag to opt-in early. For more information, see https://reactrouter.com/v6/upgrading/future#v7_starttransition. stderr | src/App.test.tsx > App > shows login page when unauthenticated ReferenceError: indexedDB is not defined at getDB (file:///workspace/node_modules/idb-keyval/dist/index.js:14:25) at file:///workspace/node_modules/idb-keyval/dist/index.js:24:34 at Object.get [as getItem] (file:///workspace/node_modules/idb-keyval/dist/index.js:40:12) at Object.restoreClient (file:///workspace/node_modules/@tanstack/query-async-storage-persister/build/modern/index.js:43:43) at persistQueryClientRestore (file:///workspace/node_modules/@tanstack/query-persist-client-core/build/modern/persist.js:15:45) at file:///workspace/node_modules/@tanstack/react-query-persist-client/build/modern/PersistQueryClientProvider.js:31:7 at Object.react_stack_bottom_frame (/workspace/node_modules/react-dom/cjs/react-dom-client.development.js:25989:20) at runWithFiberInDEV (/workspace/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) at commitHookEffectListMount (/workspace/node_modules/react-dom/cjs/react-dom-client.development.js:13249:29) at commitHookPassiveMountEffects (/workspace/node_modules/react-dom/cjs/react-dom-client.development.js:13336:11) Encountered an error attempting to restore client cache from persisted location. As a precaution, the persisted cache will be discarded. βœ“ src/App.test.tsx > App > shows login page when unauthenticated 926ms  Test Files  47 passed (47)  Tests  581 passed (581)  Start at  02:09:04  Duration  58.52s (transform 23.88s, setup 166.25s, import 69.04s, tests 82.74s, environment 152.92s) JUNIT report written to /workspace/niko/agent-platform/reports/front-unit/junit.xml  % Coverage report from v8 -------------------|---------|----------|---------|---------|------------------- File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s -------------------|---------|----------|---------|---------|------------------- All files | 60.92 | 55.75 | 54.48 | 62.21 | src | 43.33 | 58.33 | 50 | 43.33 | App.tsx | 61.53 | 83.33 | 60 | 61.53 | 42-47 main.tsx | 0 | 0 | 0 | 0 | 7-28 router.tsx | 66.66 | 100 | 50 | 66.66 | 39-40 version.ts | 100 | 100 | 100 | 100 | src/components/ui | 68.96 | 80 | 66.66 | 68.96 | button.tsx | 100 | 66.66 | 100 | 100 | 52 card.tsx | 28.57 | 100 | 28.57 | 28.57 | 24-60,83 dialog.tsx | 80 | 83.33 | 80 | 80 | 17,29 skeleton.tsx | 100 | 100 | 100 | 100 | table.tsx | 75 | 100 | 75 | 75 | 41,96 src/features/auth | 75.55 | 84.84 | 84.61 | 74.39 | AuthGuard.tsx | 85.71 | 50 | 100 | 83.33 | 18 CallbackPage.tsx | 94.44 | 89.47 | 90.9 | 96.87 | 93 LoginPage.tsx | 55.81 | 83.33 | 70 | 52.5 | 11-26,64-84 authStore.ts | 100 | 100 | 100 | 100 | ...ures/dashboard | 0 | 0 | 0 | 0 | ...boardPage.tsx | 0 | 0 | 0 | 0 | 11-114 StatsCardRow.tsx | 0 | 0 | 0 | 0 | 9-70 ...eatures/errors | 0 | 100 | 0 | 0 | NotFoundPage.tsx | 0 | 100 | 0 | 0 | 5-11 ...ures/pipelines | 5.97 | 0 | 0 | 6.45 | ...etailPage.tsx | 0 | 0 | 0 | 0 | 12-155 RunNowButton.tsx | 0 | 0 | 0 | 0 | 8-31 ...CrudConfig.ts | 100 | 100 | 100 | 100 | routes.tsx | 100 | 100 | 100 | 100 | ...oryOptions.ts | 0 | 0 | 0 | 0 | 14-34 ...tures/projects | 9.09 | 0 | 0 | 9.09 | ...etailPage.tsx | 0 | 0 | 0 | 0 | 12-141 ProjectsPage.tsx | 0 | 0 | 0 | 0 | 7-32 ...CrudConfig.ts | 100 | 100 | 100 | 100 | routes.tsx | 100 | 100 | 100 | 100 | ...s/repositories | 21.87 | 0 | 8.33 | 25 | ...oriesPage.tsx | 28.57 | 0 | 16.66 | 33.33 | 8-10,24-45 ...etailPage.tsx | 0 | 0 | 0 | 0 | 8-56 ...CrudConfig.ts | 100 | 100 | 100 | 100 | routes.tsx | 100 | 100 | 100 | 100 | src/features/runs | 2.43 | 0 | 0 | 2.7 | ...etailPage.tsx | 2.38 | 0 | 0 | 2.7 | 18-259 ...ailPanels.tsx | 0 | 0 | 0 | 0 | 20-115 RunsPage.tsx | 0 | 0 | 0 | 0 | 11-157 routes.tsx | 100 | 100 | 100 | 100 | ...tures/settings | 12.5 | 100 | 0 | 16.66 | SettingsPage.tsx | 12.5 | 100 | 0 | 16.66 | 10-29 src/layers | 0 | 0 | 0 | 0 | interfaces.ts | 0 | 0 | 0 | 0 | src/layers/L1 | 74.52 | 60.57 | 71.42 | 78.15 | entityHooks.ts | 73.04 | 58.38 | 66.66 | 76.44 | ...23-525,536-548 ...tyResolver.ts | 54.54 | 50 | 71.42 | 66.66 | 30-32 index.ts | 0 | 0 | 0 | 0 | mutationQueue.ts | 100 | 100 | 100 | 100 | ...s/L1/contracts | 36.36 | 0 | 17.64 | 36.36 | index.ts | 100 | 100 | 100 | 100 | pipelines.ts | 16.66 | 0 | 0 | 16.66 | 18-27 projects.ts | 20 | 100 | 0 | 20 | 18-25 repositories.ts | 60 | 100 | 50 | 60 | 24-25 runs.ts | 40 | 100 | 25 | 40 | 18,24-25 src/layers/L2R | 0 | 0 | 0 | 0 | index.ts | 0 | 0 | 0 | 0 | ...rs/L2R/offline | 100 | 100 | 100 | 100 | ...Indicator.tsx | 100 | 100 | 100 | 100 | ...yers/L2R/slots | 72.72 | 67.14 | 61.7 | 74.17 | Crud.tsx | 93.75 | 76.59 | 100 | 93.61 | 44,77-78 DataTable.tsx | 65.68 | 67.12 | 55.26 | 67.1 | ...69,325,394,415 EntityDetail.tsx | 91.66 | 62.5 | 100 | 91.66 | 38 Page.tsx | 50 | 22.22 | 50 | 50 | 19 ...s/L2R/surfaces | 88.28 | 77.61 | 86.44 | 89.14 | CrudSurface.tsx | 75.24 | 58.55 | 69.23 | 75.86 | ...75,242,310-311 ...ilSurface.tsx | 100 | 86 | 100 | 100 | 43-65,86,115,129 FilterBar.tsx | 95.83 | 96.87 | 100 | 95.83 | 127 ListSurface.tsx | 95.23 | 90.47 | 100 | 97.05 | 90,97 ...ers/L2R/wiring | 100 | 100 | 100 | 100 | defaultAddNav.ts | 100 | 100 | 100 | 100 | ...ultEditNav.ts | 100 | 100 | 100 | 100 | defaultRowNav.ts | 100 | 100 | 100 | 100 | src/layers/L2W | 86.41 | 83.14 | 83.33 | 87.35 | ...orContract.ts | 100 | 100 | 100 | 100 | coordinator.ts | 93.79 | 86.41 | 89.28 | 94.89 | ...91-192,224-228 ...orResolver.ts | 5.88 | 0 | 0 | 6.25 | 11-15,24-53 formBridge.ts | 100 | 100 | 100 | 100 | index.ts | 0 | 0 | 0 | 0 | ...ers/L2W/routes | 100 | 83.33 | 100 | 100 | CrudRoute.tsx | 100 | 83.33 | 100 | 100 | 18 ...ntextStore.ts | 100 | 100 | 100 | 100 | src/layouts | 18.03 | 5.76 | 22.22 | 19.6 | AppLayout.tsx | 3.7 | 2.94 | 0 | 4.76 | 20-230 ...eoutModal.tsx | 4 | 0 | 0 | 4.54 | 11-70 healthStore.ts | 100 | 50 | 100 | 100 | 35-36 uiStore.ts | 100 | 100 | 100 | 100 | src/lib | 19.82 | 11.11 | 16.66 | 20.19 | axios.ts | 23.52 | 0 | 0 | 23.52 | 12-16,20-26,30-35 env.ts | 50 | 0 | 0 | 50 | 9 ...tionOutbox.ts | 1.25 | 0 | 0 | 1.42 | 20-180 query-client.ts | 100 | 100 | 100 | 100 | ...heEviction.ts | 100 | 100 | 100 | 100 | ...yPersister.ts | 100 | 100 | 100 | 100 | utils.ts | 100 | 100 | 100 | 100 | ...red/components | 79.02 | 77.01 | 76.84 | 79.35 | Breadcrumb.tsx | 100 | 100 | 100 | 100 | ...andSearch.tsx | 5.55 | 0 | 0 | 5.88 | 18-60 ...irmDialog.tsx | 50 | 50 | 50 | 50 | 31 CrudModal.tsx | 84.61 | 86.66 | 85.71 | 84.61 | 52-53 CrudReadCard.tsx | 95.23 | 94.87 | 80 | 95.23 | 219 ...ardDialog.tsx | 100 | 100 | 100 | 100 | ...onDisplay.tsx | 100 | 80 | 100 | 100 | 10-13 EntitySelect.tsx | 71.27 | 65.11 | 69.23 | 72.61 | ...16-218,250-262 ...rBoundary.tsx | 75 | 100 | 75 | 75 | 40-41 ...lueEditor.tsx | 100 | 93.75 | 100 | 100 | 55,141 LazyLoader.tsx | 100 | 100 | 100 | 100 | LogoMark.tsx | 0 | 0 | 0 | 0 | 7 MetadataCard.tsx | 100 | 94.44 | 100 | 100 | 32 Page.tsx | 100 | 100 | 100 | 100 | ...ransition.tsx | 0 | 100 | 0 | 0 | 4-5 RunPhaseIcon.tsx | 100 | 100 | 100 | 100 | SourceBadge.tsx | 100 | 100 | 100 | 100 | StatsCard.tsx | 57.14 | 44.44 | 50 | 57.14 | 35-37 Toaster.tsx | 100 | 100 | 100 | 100 | TokenDisplay.tsx | 100 | 90 | 100 | 100 | 9 src/shared/hooks | 99.21 | 91.83 | 100 | 100 | useDirtyGuard.ts | 100 | 100 | 100 | 100 | ...ilterState.ts | 100 | 93.33 | 100 | 100 | 24,29 useSSE.ts | 98.38 | 77.77 | 100 | 100 | 48,98 src/shared/utils | 0 | 0 | 0 | 0 | format.ts | 0 | 0 | 0 | 0 | 2-29 -------------------|---------|----------|---------|---------|-------------------