RUN  v4.1.9 /workspace/niko/agent-platform/frontend Coverage enabled with v8 ✓ src/shared/hooks/useSSE.test.ts > useSSE > 3. entity.created → onEvent({ type: "created", data }) 65ms ✓ src/shared/hooks/useSSE.test.ts > useSSE > 1. opens EventSource on mount: connecting → connected 172ms ✓ src/shared/hooks/useSSE.test.ts > useSSE > 4. entity.updated → onEvent({ type: "updated", data }) 36ms ✓ src/shared/hooks/useSSE.test.ts > useSSE > 2. closes EventSource on unmount 23ms ✓ src/shared/hooks/useSSE.test.ts > useSSE > 5. exponential backoff: 1s → 2s → 4s 41ms ✓ src/shared/hooks/useSSE.test.ts > useSSE > 6. 5 consecutive failures → connection-lost + onConnectionLost 30ms ✓ src/shared/hooks/useSSE.test.ts > useSSE > 7. successful reconnect resets backoff to 1s 29ms ✓ src/shared/hooks/useSSE.test.ts > useSSE > 8. reconnect() manually reopens EventSource 16ms ✓ src/shared/hooks/useSSE.test.ts > useSSE > 9. heartbeat (: heartbeat) does not trigger onEvent 14ms ✓ src/shared/hooks/useSSE.test.ts > useSSE > 10. url change closes old EventSource and opens new one 15ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > createCoordinator > returns an object with useCoordinator 13ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > resolveEndpointTemplate > replaces a single token in the template 14ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > resolveEndpointTemplate > replaces multiple tokens and removes used params 3ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > resolveEndpointTemplate > returns url unchanged when no tokens exist 2ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > resolveEndpointTemplate > throws when a token is missing from params 5ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > resolveEndpointTemplate > throws when one of multiple tokens is missing 2ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > createEntityHooks > returns EntityHooks with required shape 2ms 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 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__/L2W/coordinator.test.ts > useCoordinator — inactive state (no crud) > activeCrud is null when routeContext has no crud 126ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — inactive state (no crud) > activeCrud is null when routeContext.crud is undefined 13ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — inactive state (no crud) > fieldPolicy is empty when inactive 13ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — inactive state (no crud) > formModel is defaults when inactive 8ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — inactive state (no crud) > bridge starts clean when inactive 9ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — inactive state (no crud) > submit is callable even when inactive (no-op) 21ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — owner isolation > activeCrud is null when routeContext.crud.owner != config.owner 11ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — owner isolation > activeCrud is populated when owner matches 8ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useEntityList > returns ListResult shape when API responds with data array 169ms ✓ src/layers/__tests__/L1/entityResolver.test.tsx > entityResolver > resolveContract > resolves repositories contract 10ms ✓ 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 ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — owner isolation > activeCrud includes prefix when provided 13ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — owner isolation > owner isolation works for edit mode 8ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — add flow > formModel initialized with defaults 8ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — add flow > fieldPolicy uses add mode 9ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — add flow > activeCrud has mode add 13ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — add flow > submit calls mutation.create with toCreate(formModel) 33ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — add flow > bridge.pending is true after submit 8ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — add flow > submit uses the latest formModel via setFormModel 14ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — edit flow > formModel populated from entity detail 6ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — edit flow > fieldPolicy uses edit mode 19ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — edit flow > activeCrud has mode edit 20ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — edit flow > submit calls mutation.update with id and toUpdate(formModel) 17ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — edit flow > detail not yet loaded shows formModel as defaults 6ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator lifecycle transitions > handles transition from add → inactive → edit cleanly 23ms 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/entityResolver.test.tsx > entityResolver > useEntityList > returns a ListResult-like shape for repositories 116ms ✓ src/layers/__tests__/L1/entityResolver.test.tsx > entityResolver > useEntityList > returns a ListResult-like shape for projects 12ms ✓ src/layers/__tests__/L1/entityResolver.test.tsx > entityResolver > useEntityList > returns a ListResult-like shape for runs 40ms ✓ src/layers/__tests__/L1/entityResolver.test.tsx > entityResolver > useEntityList > returns a ListResult-like shape for pipelines 12ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useEntityList > filters out pending deleted entities 74ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > rendering states > renders loading state when isLoading is true 168ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > rendering states > renders error state when error is present 16ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > rendering states > renders empty state when data is empty 24ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator lifecycle transitions > closeIntent resets on mode change 22ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator failure path > failure is null initially 8ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator failure path > bridge dirty stays true when pending resets (failure simulation) 8ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator failure path > submit does not throw when called without active crud 27ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator failure path > activeCrud remains populated after submit (branch not closed) 17ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator failure path > failure is null after submit when no sync error occurs 11ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator failure path > failure is set when mutation resolves with isError=true 19ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useEntityList > uses defaultListQuery when no params provided 209ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useEntityList > resolves endpoint template with params and strips used tokens 20ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useEntityList > uses staleTime 0 when queryMode is live 78ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > rendering states > renders data table when data is present 265ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > rendering states > renders column headers from config 59ms ✓ src/layers/__tests__/L1/entityResolver.test.tsx > entityResolver > useEntityList > passes params through to the query 95ms ✓ src/layers/__tests__/L1/entityResolver.test.tsx > entityResolver > useEntityDetail > returns a DetailResult-like shape 18ms ✓ src/layers/__tests__/L1/entityResolver.test.tsx > entityResolver > useEntityDetail > works for runs with run_id-based entities 11ms ✓ src/layers/__tests__/L1/entityResolver.test.tsx > entityResolver > useMutation > returns a MutationHandle-like shape 38ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator closeIntent > closeIntent is null initially 24ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator closeIntent > cancel() sets closeIntent to cancel 9ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator updateField and setFormModel > setFormModel updates snapshot.formModel 18ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator updateField and setFormModel > updateField updates a single field and marks dirty 12ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator updateField and setFormModel > updateField preserves other fields 10ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator snapshot type contract (compile-time) > snapshot has all required CoordinatorSnapshot fields 14ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator snapshot type contract (compile-time) > result exposes updateField, setFormModel, cancel 8ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — delete state machine > deleteState is null on collection route 7ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > rendering states > renders offline indicator when offline 40ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > wiring > renders add button when createTarget is set 26ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > wiring > renders custom add button label from config.createLabel 44ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — delete state machine > deleteState is null on collection route even with crud 8ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — delete state machine > deleteState is non-null on detail route 18ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — delete state machine > requestDelete sets showConfirm to true 12ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — delete state machine > requestDelete clears previous delete errors 19ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — delete state machine > cancelDelete sets showConfirm to false 8ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — delete state machine > cancelDelete does not call mutation.remove 12ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — delete state machine > confirmDelete calls mutation.remove with routeContext.id 11ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — delete state machine > confirmDelete closes showConfirm and clears delete error before calling remove 13ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useEntityList > uses default staleTime when queryMode is cache 70ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > wiring > renders default add button label when createLabel is not set 38ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > wiring > calls navigate with createTarget when add button clicked 78ms ✓ src/layers/__tests__/L1/entityResolver.test.tsx > entityResolver > useMutation > works for all entity paths 52ms ✓ src/layers/__tests__/L1/entityResolver.test.tsx > entityResolver > useSubscription > returns a SubscriptionHandle-like shape 17ms ✓ src/layers/__tests__/L1/entityResolver.test.tsx > entityResolver > useSubscription > works for all entity paths 33ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — delete state machine > confirmDelete is a no-op on collection route 11ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — delete state machine > deleteState.isPending is false when delete not requested 36ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — delete state machine > deleteState.isPending reflects mutation.isPending during active delete 27ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — delete state machine > deleteState.isPending becomes false after delete completes 34ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useEntityDetail > returns DetailResult shape on successful fetch 74ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useEntityDetail > is skipped when id is empty 9ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > returns MutationHandle shape with isPending and callable methods 16ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > update receives id as first argument and sends Idempotency-Key header 58ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > wiring > row click calls navigate with rowTarget and row id 33ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > wiring > does not render add button when createTarget is not set 16ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > sort > sets default sort in URL on initial hydration 48ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — delete state machine > extracts error message from response.data.error 30ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — delete state machine > falls back to error.message when response.data is absent 30ms ✓ 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 21ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — delete state machine > falls back to default string when error is null 19ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > update does not trigger cache invalidation 42ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > create triggers cache invalidation with Idempotency-Key header 50ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > sort > shows sort indicator on active sort column 47ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > sort > cycles sort on header click: none -> asc -> desc -> none 77ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > create resolves endpoint template in mutationFn 81ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > create resolves endpoint template using createPathParams from contract 11ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > create with pipelines-like contract uses context to build URL /projects/{id}/pipelines 18ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > create resolves template from context when body lacks the token field 14ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > create isolates context between rapid successive calls (no ref race) 14ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — delete state machine > successful delete clears error state 29ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — delete state machine > error remains null after successful delete (was null before) 26ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > sort > switches to new column asc when different column is clicked 30ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > sort > sorts data by active sort field asc 62ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > remove adds to pendingDeleteMap, outbox with idempotencyKey, and sends header 22ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > remove does not trigger cache invalidation 14ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > remove onSuccess performs deterministic cache cleanup across all same-path entries 29ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > remove onSuccess cache cleanup removes entity from detail cache entry 19ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > isPending reflects combined mutation state 17ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useSubscription > shape smoke > returns SubscriptionHandle with correct shape 16ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > sort > sorts data by active sort field desc 53ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > sort > places null/undefined values last in asc sort 43ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > sort > sorts numbers numerically 20ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > sort > sorts strings case-insensitively 34ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > sort > does not render sort indicator on non-sortable columns 40ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > overrides > renders custom loading fragment from overrides 13ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > overrides > renders custom empty fragment from overrides 14ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > overrides > renders custom error fragment from overrides 12ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useSubscription > connection-lost after 5 failures > sets isConnectionLost:true after 5 consecutive failures 26ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useSubscription > reconnect resets the state > reconnect is callable and triggers a new connection attempt 16ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useSubscription > SSE deleted cleanup > removes pendingDelete entry on entity.deleted event 13ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > overrides > wraps content in layoutWrapper from overrides 32ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > overrides > uses label overrides for column headers 63ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > overrides > hides columns specified in overrides 42ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > filter-empty state > shows filter-empty when hasActiveFilters is true and data is empty 32ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > filter-empty state > shows regular empty when hasActiveFilters is false and data empty 18ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > filter-empty state > shows clear filters button in filter-empty state when onClearFilters provided 20ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > filter-empty state > does not show filter-empty when data is not empty 22ms ✓ 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 19ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > render contract > render receives full row object 31ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > render contract > renders default plain text when render is omitted 29ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > render contract > supports mixed columns: some with render, some without 34ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > render contract > render is optional — ColumnConfig is valid without render 28ms stderr | src/layers/__tests__/L2R/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/DataTable.test.tsx > DataTable slot > row identity > uses resolveIdOf result for row key and data-testid 448ms ✓ src/layers/__tests__/L2R/DataTable.test.tsx > DataTable slot > row identity > falls back to row.id when resolveIdOf returns null 75ms ✓ src/layers/__tests__/L2R/DataTable.test.tsx > DataTable slot > row identity > falls back to empty string when no id field and resolveIdOf returns null 40ms ✓ src/layers/__tests__/L2R/DataTable.test.tsx > DataTable slot > SSE > shows connection-lost banner with reconnect when SSE enabled and connection lost 102ms ✓ src/layers/__tests__/L2R/DataTable.test.tsx > DataTable slot > SSE > shows data table alongside SSE connection-lost banner (preserving cached data) 48ms ✓ src/layers/__tests__/L2R/DataTable.test.tsx > DataTable slot > SSE > reconnect button calls sse.reconnect 48ms ✓ src/layers/__tests__/L2R/DataTable.test.tsx > DataTable slot > SSE > renders table normally when SSE enabled and connection is live 41ms ✓ src/layers/__tests__/L2R/DataTable.test.tsx > DataTable slot > SSE > renders table normally when SSE is not enabled 57ms ✓ src/layers/__tests__/L2R/DataTable.test.tsx > DataTable slot > states > shows error state 25ms ✓ src/layers/__tests__/L2R/DataTable.test.tsx > DataTable slot > states > shows loading state 29ms ✓ src/layers/__tests__/L2R/DataTable.test.tsx > DataTable slot > states > shows empty state when no data and not loading 24ms stderr | src/layers/__tests__/L2R/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/DataTable.test.tsx > DataTable slot > states > shows filter-empty state when data is empty and filters are active 156ms ✓ src/layers/__tests__/L2R/DataTable.test.tsx > DataTable slot > states > filter-empty state shows clear filters button 43ms ✓ src/layers/__tests__/L2R/DataTable.test.tsx > DataTable slot > states > shows regular empty when no filters are active and data empty 47ms 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/__tests__/L2R/DetailSurface.test.tsx > DetailSurface > rendering states > renders loading state when isLoading is true 318ms ✓ src/layers/__tests__/L2R/DataTable.test.tsx > DataTable slot > states > error takes priority over loading 26ms stderr | src/shared/components/DataTable.test.tsx > DataTable pagination > shows Previous disabled when offset is 0 ⚠️ 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/DataTable.test.tsx > DataTable slot > add button > renders add button in header when createTarget is set 131ms ✓ src/layers/__tests__/L2R/DataTable.test.tsx > DataTable slot > add button > does not render add button when createTarget is not set 79ms ✓ src/layers/__tests__/L2R/DataTable.test.tsx > DataTable slot > row click > navigates via rowTargetOverride on click 114ms ✓ src/layers/__tests__/L2R/DataTable.test.tsx > DataTable slot > filters slot > renders filtersSlot when provided alongside data 45ms ✓ src/shared/components/DataTable.test.tsx > DataTable pagination > shows Previous disabled when offset is 0 746ms ✓ src/layers/__tests__/L2R/DataTable.test.tsx > DataTable slot > filters slot > does not render filters-slot when filtersSlot is not provided 50ms ✓ src/layers/__tests__/L2R/DataTable.test.tsx > DataTable slot > pagination > renders pagination controls with prev/next buttons 77ms ✓ src/shared/components/DataTable.test.tsx > DataTable pagination > shows Next enabled when hasMore is true 271ms ✓ src/layers/__tests__/L2R/DetailSurface.test.tsx > DetailSurface > rendering states > renders error state when error is present 75ms ✓ src/layers/__tests__/L2R/DetailSurface.test.tsx > DetailSurface > rendering states > renders empty state when entity is null 34ms ✓ src/layers/__tests__/L2R/DataTable.test.tsx > DataTable slot > pagination > disables prev button when offset is 0 102ms ✓ src/layers/__tests__/L2R/DataTable.test.tsx > DataTable slot > pagination > enables prev button when offset > 0 52ms ✓ src/shared/components/DataTable.test.tsx > DataTable pagination > shows Next disabled when hasMore is false 94ms ✓ src/shared/components/DataTable.test.tsx > DataTable pagination > displays pagination text with totalEstimate 45ms ✓ src/layers/__tests__/L2R/DetailSurface.test.tsx > DetailSurface > rendering states > renders detail content via CrudReadCard with fields from readGrouping 522ms ✓ src/layers/__tests__/L2R/DataTable.test.tsx > DataTable slot > pagination > disables next button when hasMore is false (total indicates end) 94ms ✓ src/layers/__tests__/L2R/DataTable.test.tsx > DataTable slot > pagination > disables next button when data length < pageSize (no total) 36ms ✓ src/layers/__tests__/L2R/DetailSurface.test.tsx > DetailSurface > rendering states > renders field values correctly via MetadataCard 152ms ✓ src/shared/components/DataTable.test.tsx > DataTable pagination > displays pagination text without estimate 160ms ✓ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > 1. loading shows skeleton header + skeleton card, no buttons rendered 438ms ✓ src/layers/__tests__/L2R/DataTable.test.tsx > DataTable slot > pagination > enables next button when data length equals pageSize (no total, might have more) 84ms ✓ src/layers/__tests__/L2R/DataTable.test.tsx > DataTable slot > pagination > reads offset from URL search params 24ms ✓ src/layers/__tests__/L2R/DataTable.test.tsx > DataTable slot > pagination > uses fixedParams.limit as pageSize when provided 20ms ✓ src/layers/__tests__/L2R/DataTable.test.tsx > DataTable slot > pagination > defaults pageSize to 25 when no fixedParams.limit 33ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > rendering > renders nothing when activeCrud is null 372ms ✓ src/shared/components/DataTable.test.tsx > DataTable pagination > reads offset from URL on mount 155ms ✓ src/layers/__tests__/L2R/DataTable.test.tsx > DataTable slot > pagination > shows total in pagination display when available 82ms ✓ src/layers/__tests__/L2R/DataTable.test.tsx > DataTable slot > pagination > does not show total in pagination display when not available 40ms ✓ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > 2. error shows "Failed to load" + Retry 834ms 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. 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/DetailSurface.test.tsx > DetailSurface > rendering states > renders offline indicator when offline 124ms ✓ src/layers/__tests__/L2R/DetailSurface.test.tsx > DetailSurface > rendering states > uses default grouping when readGrouping is not set 46ms ✓ src/layers/__tests__/L2R/DataTable.test.tsx > DataTable slot > pagination > resets offset when sort changes 68ms ✓ src/layers/__tests__/L2R/DataTable.test.tsx > DataTable slot > pagination > resets offset when filter changes 65ms ✓ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > 3. 404 shows "not found" + "Back to list" 164ms 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/DataTable.test.tsx > DataTable slot > sort + filter param merge > includes stripped filter params and excludes prefixed internal keys 82ms ✓ src/layers/__tests__/L2R/DataTable.test.tsx > DataTable slot > sort + filter param merge > does not break fixedParams 47ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > rendering > renders add mode title by default 818ms ✓ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > 4. default renders title, actions, field grid 159ms ✓ src/layers/__tests__/L2R/DetailSurface.test.tsx > DetailSurface > wiring > renders edit button when edit target is set 274ms ✓ src/shared/components/DataTable.test.tsx > DataTable pagination > updates URL offset when Next clicked 434ms ✓ src/layers/__tests__/L2R/DetailSurface.test.tsx > DetailSurface > wiring > calls navigate with edit target when edit button clicked 268ms ✓ src/layers/__tests__/L2R/DetailSurface.test.tsx > DetailSurface > wiring > does not render edit button when actionTargets is not set 36ms ✓ src/layers/__tests__/L2R/DetailSurface.test.tsx > DetailSurface > wiring > does not render edit button when edit target is missing 23ms ✓ src/layers/__tests__/L2R/DetailSurface.test.tsx > DetailSurface > overrides > renders custom loading fragment 28ms ✓ src/layers/__tests__/L2R/DataTable.test.tsx > DataTable slot > sort toggle > cycles sort: none -> asc -> desc -> none 65ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > rendering > renders edit mode title 269ms ✓ src/shared/components/DataTable.test.tsx > DataTable pagination > resets offset to 0 when Prev clicked at offset 25 232ms ✓ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > 5. edit onClick is called 244ms ✓ src/layers/__tests__/L2R/DetailSurface.test.tsx > DetailSurface > overrides > renders custom empty fragment 12ms ✓ src/layers/__tests__/L2R/DetailSurface.test.tsx > DetailSurface > overrides > renders custom error fragment 18ms ✓ src/layers/__tests__/L2R/DetailSurface.test.tsx > DetailSurface > overrides > wraps in layoutWrapper from overrides 24ms ✓ src/layers/__tests__/L2R/DetailSurface.test.tsx > DetailSurface > DetailSurface — delete UI contract > renders delete button when actionTargets.delete=true and deleteState is present 34ms ✓ src/layers/__tests__/L2R/Crud.test.tsx > Crud slot — route handoff > cancel > navigates to cancelTarget when Cancel is clicked 1422ms ✓ src/shared/components/DataTable.test.tsx > DataTable states > shows loading skeleton 107ms ✓ src/shared/components/DataTable.test.tsx > DataTable states > shows empty state with entity name 23ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > rendering > renders form fields based on fieldPolicy 293ms ✓ src/shared/components/DataTable.test.tsx > DataTable states > shows empty state with add button 173ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > rendering > does not render fields with visible: false 309ms ✓ src/layers/__tests__/L2R/Crud.test.tsx > Crud slot — route handoff > cancel > navigates to cancelTarget via closeIntent cancel 431ms ✓ src/layers/__tests__/L2R/DetailSurface.test.tsx > DetailSurface > DetailSurface — delete UI contract > does not render delete button when actionTargets.delete is not set 50ms ✓ src/layers/__tests__/L2R/DetailSurface.test.tsx > DetailSurface > DetailSurface — delete UI contract > does not render delete button when deleteState is null 18ms ✓ src/layers/__tests__/L2R/DetailSurface.test.tsx > DetailSurface > DetailSurface — delete UI contract > delete button click calls deleteState.requestDelete 34ms ✓ src/shared/components/DataTable.test.tsx > DataTable states > calls onAdd when add button clicked 269ms ✓ src/layers/__tests__/L2R/DetailSurface.test.tsx > DetailSurface > DetailSurface — delete UI contract > renders confirm-delete-dialog when deleteState.showConfirm is true 521ms ✓ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > 6. delete opens ConfirmDialog 775ms 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 480ms ✓ src/shared/components/DataTable.test.tsx > DataTable states > disables add button when disabled is true 177ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > rendering > renders disabled input for fields with editable: false 235ms 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/shared/components/DataTable.test.tsx > DataTable states > shows filter empty state with Clear Filters 142ms ✓ src/shared/components/DataTable.test.tsx > DataTable states > calls onFiltersClear when Clear Filters clicked 137ms ✓ src/layers/__tests__/L2R/DetailSurface.test.tsx > DetailSurface > DetailSurface — delete UI contract > does not render confirm-delete-dialog when showConfirm is false 83ms ✓ src/layers/__tests__/L2R/Crud.test.tsx > Crud slot — route handoff > cancel > falls back to onCancel callback 291ms ✓ src/shared/components/DataTable.test.tsx > DataTable states > shows error state with Retry button 122ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > rendering > renders offline indicator when offline 319ms ✓ src/layers/__tests__/L2R/Crud.test.tsx > Crud slot — route handoff > success > navigates to successTarget with id replaced from mutation result (add) 227ms ✓ src/shared/components/DataTable.test.tsx > DataTable states > calls onRetry when Retry clicked 134ms ✓ src/layers/__tests__/L2R/DetailSurface.test.tsx > DetailSurface > DetailSurface — delete UI contract > cancel button calls deleteState.cancelDelete 369ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > rendering > renders modal with dialog role for accessibility 384ms 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 248ms ✓ src/shared/components/DataTable.test.tsx > DataTable states > shows SSE connection lost with Reconnect button 150ms 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/shared/components/CrudReadCard.test.tsx > CrudReadCard > 7. delete confirm calls onClick 850ms ✓ src/shared/components/DataTable.test.tsx > DataTable states > calls onSseReconnect when Reconnect clicked 247ms ✓ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > 8. delete disabled is muted 231ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > rendering > renders Save and Cancel buttons in modal footer 304ms 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 onSuccess callback 282ms ✓ src/layers/__tests__/L2R/DetailSurface.test.tsx > DetailSurface > DetailSurface — delete UI contract > confirm button calls deleteState.confirmDelete 366ms ✓ src/layers/__tests__/L2R/DetailSurface.test.tsx > DetailSurface > DetailSurface — delete UI contract > confirm button is disabled when isPending is true 5829ms ✓ src/layers/__tests__/L2R/DetailSurface.test.tsx > DetailSurface > DetailSurface — delete UI contract > renders delete-error when deleteState.error is not null 12ms ✓ src/layers/__tests__/L2R/DetailSurface.test.tsx > DetailSurface > DetailSurface — delete UI contract > does not render delete-error when error is null 9ms ✓ src/layers/__tests__/L2R/DetailSurface.test.tsx > DetailSurface > DetailSurface — delete UI contract > calls onDeleteSuccess when delete transitions from pending to done without error 13ms ✓ src/layers/__tests__/L2R/DetailSurface.test.tsx > DetailSurface > DetailSurface — delete UI contract > does not call onDeleteSuccess when pending transition has error 13ms ✓ src/layers/__tests__/L2R/DetailSurface.test.tsx > DetailSurface > DetailSurface — delete UI contract > does not call onDeleteSuccess while still pending 8ms ✓ src/layers/__tests__/L2R/DetailSurface.test.tsx > DetailSurface > DetailSurface — delete UI contract > calls onDeleteSuccess at most once during repeated pending→done cycles 16ms ✓ src/layers/__tests__/L2R/DetailSurface.test.tsx > DetailSurface > field formatters > applies formatter for fields with formatter defined 10ms ✓ src/layers/__tests__/L2R/DetailSurface.test.tsx > DetailSurface > field formatters > applies ReactNode formatter 11ms ✓ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > 9. extra actions rendered before Edit 131ms × src/shared/components/DataTable.test.tsx > DataTable sort > shows sort indicator on active column 35261ms  → Test timed out in 5000ms. If this is a long-running test, pass a timeout value as the last argument or configure it globally with "testTimeout". ✓ src/shared/components/DataTable.test.tsx > DataTable sort > calls onSort when sortable header clicked 249ms ✓ src/shared/components/DataTable.test.tsx > DataTable sort > shows descending indicator 21ms 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/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > pending state > disables fieldset and modal buttons when pending 295ms × src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > pending state > pending makes fields read-only via isEditable check 60160ms  → Test timed out in 5000ms. If this is a long-running test, pass a timeout value as the last argument or configure it globally with "testTimeout". ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > failure and loading states > renders failure message and retry button 2197ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > failure and loading states > retry button calls failure.retry 61ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > failure and loading states > renders loading state when pending 63ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > closeIntent > calls onSuccess when closeIntent is success 56ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > closeIntent > calls onClose when closeIntent is cancel 64ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > user interactions > Save button triggers snapshot.submit 79ms ✓ src/shared/components/DataTable.test.tsx > DataTable sort > calls onRowClick when row clicked 156ms × src/shared/components/DataTable.test.tsx > DataTable header bar > shows Refresh button when sse is not defined 27847ms  → Test timed out in 5000ms. If this is a long-running test, pass a timeout value as the last argument or configure it globally with "testTimeout". ✓ src/shared/components/DataTable.test.tsx > DataTable header bar > calls onRefresh when Refresh clicked 69ms ✓ src/shared/components/DataTable.test.tsx > DataTable header bar > hides Refresh button when sse is defined 35ms ✓ src/shared/components/DataTable.test.tsx > DataTable header bar > shows add button when add prop is provided 48ms ✓ src/shared/components/DataTable.test.tsx > DataTable header bar > renders extraActions 44ms ✓ src/shared/components/DataTable.test.tsx > DataTable header bar > renders FilterBar when filters defined 29ms ✓ src/shared/components/DataTable.test.tsx > DataTable header bar > resets offset to 0 when filter chip clicked with non-zero offset 64ms 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/layers/__tests__/L2R/Crud.test.tsx > Crud slot — route handoff > mutation tracking > does not navigate before coordinator emits closeIntent 45191ms  → Hook timed out in 10000ms. If this is a long-running hook, pass a timeout value as the last argument or configure it globally with "hookTimeout". 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 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 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 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/Crud.test.tsx > Crud slot — route handoff > mutation tracking > stays on page when failure is present 19013ms  → Test timed out in 5000ms. If this is a long-running test, pass a timeout value as the last argument or configure it globally with "testTimeout". ✓ 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) 165ms ✓ 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 102ms ✓ src/layers/__tests__/L2R/DetailSurface.test.tsx > DetailSurface > field formatters > falls back to String() when no formatter for field 13ms ✓ src/layers/__tests__/L2R/DetailSurface.test.tsx > DetailSurface > field formatters > passes entity as second argument to formatter 9ms ✓ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > external deleteState integration > 12. shows confirm dialog when showConfirm is true 107ms × src/shared/components/CrudReadCard.test.tsx > CrudReadCard > external deleteState integration > 10. renders external delete button when deleteState is provided 31245ms  → Test timed out in 5000ms. If this is a long-running test, pass a timeout value as the last argument or configure it globally with "testTimeout". × src/shared/components/CrudReadCard.test.tsx > CrudReadCard > external deleteState integration > 11. external delete button click calls requestDelete 35221ms  → Test timed out in 5000ms. If this is a long-running test, pass a timeout value as the last argument or configure it globally with "testTimeout". ✓ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > external deleteState integration > 13. confirm button calls confirmDelete 145ms ✓ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > external deleteState integration > 14. cancel button calls cancelDelete 206ms ✓ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > external deleteState integration > 15. confirm button disabled when isPending 236ms ✓ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > external deleteState integration > 16. renders deleteError when provided 31ms ✓ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > external deleteState integration > 17. no internal DeleteButton when deleteState is provided 21ms ✓ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > overrides > 18. renders custom error fragment via overrides 46ms ✓ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > overrides > 19. renders custom loading fragment via overrides 15ms ✓ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > overrides > 20. renders custom empty fragment via overrides 12ms ✓ src/layers/__tests__/config-contracts.test.ts > config contracts — CrudConfig minimum requirements > every CrudConfig has entityPath 23ms ✓ 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 3ms ✓ 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 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. ✓ src/shared/hooks/useFilterState.test.tsx > useFilterState > 1. prefix prepends prefix to URL params 179ms ✓ src/shared/hooks/useFilterState.test.tsx > useFilterState > 2. setFilter merges, does not replace other params 20ms ✓ src/shared/hooks/useFilterState.test.tsx > useFilterState > 3. clearFilters removes filters, preserves sort defaults in memory 44ms ✓ src/shared/hooks/useFilterState.test.tsx > useFilterState > 4. setSort cycles: asc → desc → none (returns to default) 63ms ✓ src/shared/hooks/useFilterState.test.tsx > useFilterState > setSort with explicit order 35ms ✓ src/shared/hooks/useFilterState.test.tsx > useFilterState > 5. clearFilters does NOT write sort defaults to URL 42ms ✓ src/shared/hooks/useFilterState.test.tsx > useFilterState > 6. multiple prefixes do not collide 31ms ✓ src/shared/hooks/useFilterState.test.tsx > useFilterState > 7. arrays serialized as pipe-delimited 15ms ✓ src/shared/hooks/useFilterState.test.tsx > useFilterState > 8. undefined removes param entirely 22ms ✓ src/shared/hooks/useFilterState.test.tsx > useFilterState > getFilter returns current value for key 10ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > user interactions > updateField is called when input value changes 69ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > user interactions > dirty guard > calls cancel directly when dirty=false on Cancel click 79ms ✓ src/layers/__tests__/L2W/behaviorContract.test.ts > createDefaultBehaviorContract > returns an object with all BehaviorContract functions 49ms ✓ src/layers/__tests__/L2W/behaviorContract.test.ts > createDefaultBehaviorContract > defaults() returns an object 11ms ✓ src/layers/__tests__/L2W/behaviorContract.test.ts > createDefaultBehaviorContract > populate(entity) returns a copy 69ms × src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > user interactions > dirty guard > opens DiscardDialog when dirty=true on Cancel click 5955ms  → Test timed out in 5000ms. If this is a long-running test, pass a timeout value as the last argument or configure it globally with "testTimeout". ✓ src/layers/__tests__/L2W/behaviorContract.test.ts > createDefaultBehaviorContract > toCreate(form) returns a partial copy 34ms ✓ src/layers/__tests__/L2W/behaviorContract.test.ts > createDefaultBehaviorContract > toUpdate(form) returns a partial copy 31ms ✓ 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 2ms ✓ src/layers/__tests__/L2W/behaviorContract.test.ts > createFieldPolicyFromConfig > returns empty policy when no fieldBehavior config 2ms ✓ 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 2ms ✓ src/layers/__tests__/L2W/behaviorContract.test.ts > createFieldPolicyFromConfig > returns FieldPolicy that satisfies the type contract 3ms ✓ src/msw/__tests__/runs-handler.test.ts > runs MSW handler > returns runs without filter 1037ms ✓ src/msw/__tests__/runs-handler.test.ts > runs MSW handler > filters by created_after (30 days) 38ms ✓ src/msw/__tests__/runs-handler.test.ts > runs MSW handler > filters by created_after (24 hours) 52ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > user interactions > dirty guard > Discard in modal DiscardDialog calls cancel 551ms ✓ src/msw/__tests__/runs-handler.test.ts > runs MSW handler > handles invalid created_after gracefully 52ms ✓ src/msw/__tests__/runs-handler.test.ts > runs MSW handler > sorts by tokens desc 55ms ✓ src/msw/__tests__/runs-handler.test.ts > runs MSW handler > handles today shorthand gracefully 20ms ✓ src/msw/__tests__/runs-handler.test.ts > runs MSW handler > sorts by tokens asc 38ms ✓ src/msw/__tests__/runs-handler.test.ts > runs MSW handler > filters by project_id 26ms ✓ src/msw/__tests__/runs-handler.test.ts > runs MSW handler > filters by multiple project_ids 40ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > user interactions > dirty guard > Keep Editing in modal DiscardDialog does not call cancel 536ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > overrides > renders custom title label 264ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > overrides > renders custom error fragment 142ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > overrides > renders custom loading fragment 148ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > overrides > renders fields in custom order 133ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > field types > renders text input by default 172ms ✓ 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 104ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > field types > renders password input for type password 101ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > field types > renders checkbox for type checkbox 113ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > field types > renders entity-select for type entity-select 134ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > field types > renders kv-editor for type kv-editor 126ms 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 330ms ✓ src/layers/__tests__/L2R/EntityDetail.test.tsx > EntityDetail — delete navigation > calls custom onDeleteSuccess and does not default navigate 110ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > default rendering without targets > renders form and buttons with default snapshot (no closeIntent) 182ms 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/features/auth/CallbackPage.test.tsx > CallbackPage > navigates to dashboard when valid code and verifier are in sessionStorage 461ms ✓ src/features/auth/CallbackPage.test.tsx > CallbackPage > sets auth store with decoded JWT when token exchange succeeds 55ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > useBlocker dirty guard > shows DiscardDialog when blocker state is blocked and proceed is called on confirm 595ms ✓ src/features/auth/CallbackPage.test.tsx > CallbackPage > shows error when no code in sessionStorage 52ms ✓ src/features/auth/CallbackPage.test.tsx > CallbackPage > clears code and verifier from sessionStorage after processing 39ms ✓ src/features/auth/CallbackPage.test.tsx > CallbackPage > navigates to returnUrl when set in sessionStorage 33ms ✓ src/features/auth/CallbackPage.test.tsx > CallbackPage > shows error when token exchange fails 27ms ✓ src/features/auth/CallbackPage.test.tsx > CallbackPage > shows error when only code is present without verifier 25ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > useBlocker dirty guard > does not show DiscardDialog when blocker is unblocked (dirty=false) 262ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > useBlocker dirty guard > Keep Editing in blocker DiscardDialog calls blocker.reset 421ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > checkbox field value > calls updateField with boolean checked value, not string value 242ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > backdrop click > backdrop click does not close the modal 226ms ✓ src/layers/__tests__/L2W/formBridge.test.ts > useFormBridge > starts with dirty=false and pending=false 103ms ✓ src/layers/__tests__/L2W/formBridge.test.ts > useFormBridge > setDirty(true) sets dirty=true on bridge 21ms ✓ src/layers/__tests__/L2W/formBridge.test.ts > useFormBridge > setDirty(false) sets dirty=false on bridge 23ms ✓ src/layers/__tests__/L2W/formBridge.test.ts > useFormBridge > setPending(true) sets pending=true on bridge 28ms ✓ src/layers/__tests__/L2W/formBridge.test.ts > useFormBridge > setPending(false) sets pending=false on bridge 22ms ✓ src/layers/__tests__/L2W/formBridge.test.ts > useFormBridge > markDirty() sets dirty=true 11ms ✓ src/layers/__tests__/L2W/formBridge.test.ts > useFormBridge > reset() clears both dirty and pending 39ms ✓ src/layers/__tests__/L2W/formBridge.test.ts > useFormBridge > supports dirty → pending transition (submit start) 25ms ✓ src/layers/__tests__/L2W/formBridge.test.ts > useFormBridge > supports pending → not pending transition while dirty stays (failure case) 14ms ✓ src/shared/hooks/useDirtyGuard.test.ts > useDirtyGuard > 1. isDirty=false → blocker ei estä 184ms ✓ src/shared/hooks/useDirtyGuard.test.ts > useDirtyGuard > 2. isDirty=true → blocker estää (isBlocked=true) 32ms ✓ src/layers/__tests__/L2W/formBridge.test.ts > useFormBridge > bridge object reflects current state 20ms ✓ src/layouts/uiStore.test.ts > uiStore > defaults > has sidebar open by default 18ms ✓ 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 1ms ✓ 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 2ms ✓ src/layouts/uiStore.test.ts > uiStore > setTheme > sets theme to high-contrast 2ms ✓ src/layouts/uiStore.test.ts > uiStore > setTheme > sets theme to dark 2ms ✓ 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/hooks/useDirtyGuard.test.ts > useDirtyGuard > 3. submitted=true → blocker ei estä vaikka isDirty 55ms ✓ src/shared/hooks/useDirtyGuard.test.ts > useDirtyGuard > 4. confirmNavigation → blocker.proceed() → nav jatkuu 18ms ✓ 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 13ms ✓ src/shared/hooks/useDirtyGuard.test.ts > useDirtyGuard > 7. beforeunload EI estetä kun submitted 12ms ✓ src/shared/components/EntitySelect.test.tsx > EntitySelect > shows loading state 1061ms ✓ src/shared/components/EntitySelect.test.tsx > EntitySelect > shows empty state 60ms ✓ src/shared/components/EntitySelect.test.tsx > EntitySelect > shows error state 95ms ✓ src/shared/components/EntitySelect.test.tsx > EntitySelect > supports single select 689ms ✓ src/shared/components/EntitySelect.test.tsx > EntitySelect > displays placeholder when value is undefined 19ms ✓ src/shared/components/EntitySelect.test.tsx > EntitySelect > supports multi select 200ms ✓ src/shared/components/EntitySelect.test.tsx > EntitySelect > renders readOnly single mode as text 9ms ✓ src/shared/components/EntitySelect.test.tsx > EntitySelect > renders readOnly multi mode as comma-separated labels 7ms ✓ src/shared/components/EntitySelect.test.tsx > EntitySelect > renders raw value in readOnly when no match 9ms ✓ src/shared/components/EntitySelect.test.tsx > EntitySelect > disables the trigger when disabled prop is true 27ms ✓ src/shared/components/CrudModal.test.tsx > CrudModal > 1. open=false renders nothing 176ms ✓ src/shared/components/CrudModal.test.tsx > CrudModal > 2. open=true renders title, children, footer 440ms ✓ src/shared/components/CrudModal.test.tsx > CrudModal > 3. Backdrop click does not close dialog 619ms ✓ src/shared/components/CrudModal.test.tsx > CrudModal > 4. Cancel pristine calls onClose 199ms ✓ src/shared/components/CrudModal.test.tsx > CrudModal > 5. Cancel dirty opens DiscardDialog 359ms ✓ src/shared/components/MetadataCard.test.tsx > MetadataCard > shows loading skeleton 257ms ✓ src/shared/components/MetadataCard.test.tsx > MetadataCard > shows error state with retry button 477ms ✓ src/shared/components/MetadataCard.test.tsx > MetadataCard > renders labels and values in grid 74ms ✓ src/shared/components/MetadataCard.test.tsx > MetadataCard > renders field with spanFull as col-span-2 60ms ✓ src/shared/components/MetadataCard.test.tsx > MetadataCard > shows em dash for empty value 48ms ✓ src/layouts/healthStore.test.ts > healthStore > defaults > has healthy status by default 15ms ✓ 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 2ms ✓ 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 2ms ✓ 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 ✓ src/shared/components/MetadataCard.test.tsx > MetadataCard > uses render callback over value 95ms ✓ src/shared/components/MetadataCard.test.tsx > MetadataCard > renders children instead of default layout 37ms 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/layers/__tests__/L2R/defaultEditNav.test.ts > createDefaultEditNavHandler > returns a function when edit target is present 14ms ✓ src/layers/__tests__/L2R/defaultEditNav.test.ts > createDefaultEditNavHandler > calls navigate with edit target and replaced id 11ms ✓ src/layers/__tests__/L2R/defaultEditNav.test.ts > createDefaultEditNavHandler > returns null when actionTargets is undefined 2ms ✓ src/layers/__tests__/L2R/defaultEditNav.test.ts > createDefaultEditNavHandler > returns null when actionTargets.edit is undefined 2ms ✓ src/layers/__tests__/L2R/defaultEditNav.test.ts > createDefaultEditNavHandler > returns null 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/defaultRowNav.test.ts > createDefaultRowNavHandler > returns a function that accepts an id 12ms ✓ src/layers/__tests__/L2R/defaultRowNav.test.ts > createDefaultRowNavHandler > calls navigate with rowTarget where :id is replaced 11ms ✓ src/layers/__tests__/L2R/defaultRowNav.test.ts > createDefaultRowNavHandler > replaces :id with the provided id string 2ms ✓ src/layers/__tests__/L2R/defaultRowNav.test.ts > createDefaultRowNavHandler > does not call navigate when rowTarget is undefined 2ms ✓ src/layers/__tests__/L2R/defaultRowNav.test.ts > createDefaultRowNavHandler > does not throw when rowTarget is undefined 7ms ✓ 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 2ms ✓ src/shared/components/CrudModal.test.tsx > CrudModal > 6. Discard → onClose, Keep → dialog stays 1956ms ✓ src/features/repositories/RepositoriesPage.test.tsx > RepositoriesPage feature contract > renders CrudSurface from crudConfig 1350ms ✓ src/layers/__tests__/L2R/OfflineIndicator.test.tsx > OfflineIndicator > renders nothing when online and no pending mutations 99ms ✓ src/features/repositories/RepositoriesPage.test.tsx > RepositoriesPage feature contract > CrudSurface shows save and cancel buttons 472ms ✓ src/shared/components/CrudModal.test.tsx > CrudModal > 7. ESC dirty opens DiscardDialog 574ms ✓ src/features/repositories/RepositoriesPage.test.tsx > RepositoriesPage feature contract > CrudSurface renders configured fields from fieldSet 232ms ✓ src/shared/components/CrudModal.test.tsx > CrudModal > 8. ESC pristine calls onClose 292ms ✓ src/features/repositories/RepositoriesPage.test.tsx > RepositoriesPage feature contract > CrudSurface renders create title 320ms ✓ src/shared/components/CrudModal.test.tsx > CrudModal > 9. Save calls onSave 218ms ✓ src/layers/__tests__/L2R/OfflineIndicator.test.tsx > OfflineIndicator > renders offline banner when not online 117ms ✓ src/layers/__tests__/L2R/OfflineIndicator.test.tsx > OfflineIndicator > renders pending count when pendingCount > 0 23ms ✓ src/layers/__tests__/L2R/OfflineIndicator.test.tsx > OfflineIndicator > renders last synced time when available 890ms ✓ src/layers/__tests__/L2R/OfflineIndicator.test.tsx > OfflineIndicator > renders both offline banner and pending count when offline with pending 46ms ✓ src/shared/components/CrudModal.test.tsx > CrudModal > 10. isPending disables Save + Cancel and shows spinner 298ms ✓ src/layers/__tests__/L2R/OfflineIndicator.test.tsx > OfflineIndicator > renders all three indicators when offline, pending, and synced 66ms ✓ src/layers/__tests__/L2R/OfflineIndicator.test.tsx > OfflineIndicator > has role status for accessibility 501ms ✓ src/shared/components/CrudModal.test.tsx > CrudModal > 11. cancelLabel prop overrides the cancel button text 314ms ✓ src/shared/components/DiscardDialog.test.tsx > DiscardDialog > does not render when closed 368ms ✓ src/shared/components/KeyValueEditor.test.tsx > KeyValueEditor > adds a blank row on [+ Add row] click 1000ms ✓ src/shared/components/DiscardDialog.test.tsx > DiscardDialog > renders with default title and description 823ms ✓ src/shared/components/KeyValueEditor.test.tsx > KeyValueEditor > removes a row and emits without it 599ms ✓ src/shared/components/KeyValueEditor.test.tsx > KeyValueEditor > shows duplicate key error but still emits onChange 265ms ✓ src/shared/components/KeyValueEditor.test.tsx > KeyValueEditor > sanitizes empty keys from payload 129ms ✓ src/shared/components/KeyValueEditor.test.tsx > KeyValueEditor > renders readOnly mode as static key: value lines 34ms ✓ 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 29ms 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/features/auth/LoginPage.test.tsx > LoginPage > shows login heading, description and button 1031ms ✓ src/features/auth/LoginPage.test.tsx > LoginPage > shows session expired message when expired query param is set 73ms ✓ src/shared/components/DiscardDialog.test.tsx > DiscardDialog > calls onDiscard when Discard button clicked 644ms ✓ src/features/auth/LoginPage.test.tsx > LoginPage > does not show expired message without expired param 94ms ✓ src/features/auth/LoginPage.test.tsx > LoginPage > shows error toast when error query param is set 56ms ✓ src/shared/components/DiscardDialog.test.tsx > DiscardDialog > calls onKeepEditing when Keep Editing button clicked 631ms ✓ src/features/auth/LoginPage.test.tsx > LoginPage > redirects to dashboard when already authenticated 146ms ✓ src/shared/components/DiscardDialog.test.tsx > DiscardDialog > renders custom title and description 199ms ✓ src/shared/components/DiscardDialog.test.tsx > DiscardDialog > calls onKeepEditing on dialog dismiss (ESC) 300ms ✓ src/layers/__tests__/L2R/defaultAddNav.test.ts > createDefaultAddNavHandler > returns a function 9ms ✓ src/layers/__tests__/L2R/defaultAddNav.test.ts > createDefaultAddNavHandler > calls navigate with createTarget when invoked 6ms ✓ src/layers/__tests__/L2R/defaultAddNav.test.ts > createDefaultAddNavHandler > does not call navigate when createTarget is undefined 2ms ✓ src/layers/__tests__/L2R/defaultAddNav.test.ts > createDefaultAddNavHandler > does not throw when createTarget is undefined 4ms ✓ src/layers/__tests__/L2R/defaultAddNav.test.ts > createDefaultAddNavHandler > calls navigate with the exact createTarget string 1ms × src/features/auth/LoginPage.test.tsx > LoginPage > performs mock login in dev mode and navigates to dashboard 8965ms  → Test timed out in 5000ms. If this is a long-running test, pass a timeout value as the last argument or configure it globally with "testTimeout". ✓ src/shared/components/Page.test.tsx > PageHeader > renders title 133ms ✓ src/shared/components/Page.test.tsx > PageHeader > renders breadcrumbs 56ms ✓ src/shared/components/Page.test.tsx > PageHeader > renders actions slot 233ms ✓ src/shared/components/Page.test.tsx > Page > renders children 12ms ✓ src/shared/components/Page.test.tsx > Page > passes className to root div 10ms ✓ src/shared/components/Page.test.tsx > Page > renders header slot 10ms ✓ src/shared/components/ConfirmDialog.test.tsx > ConfirmDialog > renders with title and message 628ms ✓ src/shared/components/ConfirmDialog.test.tsx > ConfirmDialog > calls onConfirm when confirm button is clicked 285ms ✓ src/shared/components/ConfirmDialog.test.tsx > ConfirmDialog > calls onCancel when cancel button is clicked 183ms ✓ src/shared/components/ConfirmDialog.test.tsx > ConfirmDialog > does not render when closed 30ms ✓ src/features/auth/authStore.test.ts > authStore > starts unauthenticated 21ms ✓ src/features/auth/authStore.test.ts > authStore > setAuth sets authenticated state 13ms ✓ src/features/auth/authStore.test.ts > authStore > clearAuth clears all auth state 2ms ✓ src/layers/__tests__/architecture-contracts.test.ts > architecture contracts > type-level assertions are verified by npm run typecheck:arch 20ms ✓ src/shared/components/TokenDisplay.test.tsx > TokenDisplay > renders 0 as "0" 187ms ✓ src/shared/components/TokenDisplay.test.tsx > TokenDisplay > renders 500 as "500" 16ms ✓ src/shared/components/TokenDisplay.test.tsx > TokenDisplay > renders 1500 as "1.5K" 20ms ✓ src/shared/components/TokenDisplay.test.tsx > TokenDisplay > renders 890123 as "890.1K" 25ms ✓ src/shared/components/TokenDisplay.test.tsx > TokenDisplay > renders 1234567 as "1.2M" 47ms ✓ src/shared/components/TokenDisplay.test.tsx > TokenDisplay > renders 999500 as "999.5K" 21ms ✓ src/shared/components/TokenDisplay.test.tsx > TokenDisplay > renders with label when provided 47ms ✓ src/shared/components/RunPhaseIcon.test.tsx > RunPhaseIcon > renders pending with correct label 332ms ✓ src/shared/components/RunPhaseIcon.test.tsx > RunPhaseIcon > renders running with correct label 19ms ✓ src/shared/components/RunPhaseIcon.test.tsx > RunPhaseIcon > renders succeeded with correct label 32ms ✓ src/shared/components/RunPhaseIcon.test.tsx > RunPhaseIcon > renders failed with correct label 20ms ✓ src/shared/components/FilterBar.test.tsx > FilterBar > renders filter labels 288ms ✓ src/shared/components/FilterBar.test.tsx > FilterBar > renders clear button 720ms ✓ src/shared/components/FilterBar.test.tsx > FilterBar > calls onChange when multi-select option clicked 239ms ✓ src/shared/components/StatsCard.test.tsx > StatsCard > renders label and value 270ms ✓ src/shared/components/StatsCard.test.tsx > StatsCard > renders large values with abbreviation 51ms ✓ src/shared/components/StatsCard.test.tsx > StatsCard > renders accent color border 23ms ✓ src/shared/components/SourceBadge.test.tsx > SourceBadge > renders manual badge 201ms ✓ src/shared/components/SourceBadge.test.tsx > SourceBadge > renders webhook badge 13ms ✓ src/shared/components/SourceBadge.test.tsx > SourceBadge > renders schedule badge 12ms ✓ src/shared/components/SourceBadge.test.tsx > SourceBadge > renders api badge 29ms ✓ src/shared/components/DurationDisplay.test.tsx > DurationDisplay > renders 0ms as "0s" 155ms ✓ src/shared/components/DurationDisplay.test.tsx > DurationDisplay > renders 5000ms as "5s" 15ms ✓ src/shared/components/DurationDisplay.test.tsx > DurationDisplay > renders 65000ms as "1m 5s" 17ms ✓ src/shared/components/DurationDisplay.test.tsx > DurationDisplay > renders 3661000ms as "1h 1m" 14ms ✓ src/shared/components/DurationDisplay.test.tsx > DurationDisplay > renders 3723000ms as "1h 2m" 14ms ✓ src/shared/components/DurationDisplay.test.tsx > DurationDisplay > renders null as "—" 15ms ✓ src/shared/components/Breadcrumb.test.tsx > Breadcrumb > renders items with separators 192ms ✓ src/shared/components/Breadcrumb.test.tsx > Breadcrumb > renders links for items with href 343ms ✓ src/shared/components/Breadcrumb.test.tsx > Breadcrumb > renders last item as plain text 17ms 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 93ms ✓ src/shared/components/ErrorBoundary.test.tsx > ErrorBoundary > renders fallback on error 72ms Failed to parse file:///workspace/niko/agent-platform/frontend/src/App.tsx. Excluding it from coverage. Error [RolldownError]: Parse failed with 1 error: Unexpected token 17: 18: export default function App() { 19: const stopReplayRef = useRef<(() => void) | null>(null) ^ 20: 21: useEffect(() => { at error (file:///workspace/node_modules/rolldown/dist/shared/logs-aMKUxRpj.mjs:147:24) at normalizeParseError (file:///workspace/node_modules/rolldown/dist/parse-ast-index.mjs:25:9) at wrap (file:///workspace/node_modules/rolldown/dist/parse-ast-index.mjs:5:39) at parseAstAsync (file:///workspace/node_modules/rolldown/dist/parse-ast-index.mjs:54:9) at V8CoverageProvider.remapCoverage (file:///workspace/node_modules/@vitest/coverage-v8/dist/provider.js:133:10) at file:///workspace/node_modules/@vitest/coverage-v8/dist/provider.js:119:23 at async Promise.all (index 0) at V8CoverageProvider.getCoverageMapForUncoveredFiles (file:///workspace/node_modules/@vitest/coverage-v8/dist/provider.js:109:4) at V8CoverageProvider.generateCoverage (file:///workspace/node_modules/@vitest/coverage-v8/dist/provider.js:56:29) at file:///workspace/node_modules/vitest/dist/chunks/cli-api.24X8XwN1.js:13604:23 { code: 'PARSE_ERROR', id: undefined, pos: 719 } Failed to parse file:///workspace/niko/agent-platform/frontend/src/lib/mutationOutbox.ts. Excluding it from coverage. Error [RolldownError]: Parse failed with 1 error: Expected `from` but found `{` 1: import { get, set } from 'idb-keyval' 2: import type { QueryClient } from '@tanstack/react-query' ^ 3: import { apiClient } from '@/lib/axios' at error (file:///workspace/node_modules/rolldown/dist/shared/logs-aMKUxRpj.mjs:147:24) at normalizeParseError (file:///workspace/node_modules/rolldown/dist/parse-ast-index.mjs:25:9) at wrap (file:///workspace/node_modules/rolldown/dist/parse-ast-index.mjs:5:39) at parseAstAsync (file:///workspace/node_modules/rolldown/dist/parse-ast-index.mjs:54:9) at V8CoverageProvider.remapCoverage (file:///workspace/node_modules/@vitest/coverage-v8/dist/provider.js:133:10) at file:///workspace/node_modules/@vitest/coverage-v8/dist/provider.js:119:23 at async Promise.all (index 5) at V8CoverageProvider.getCoverageMapForUncoveredFiles (file:///workspace/node_modules/@vitest/coverage-v8/dist/provider.js:109:4) at V8CoverageProvider.generateCoverage (file:///workspace/node_modules/@vitest/coverage-v8/dist/provider.js:56:29) at file:///workspace/node_modules/vitest/dist/chunks/cli-api.24X8XwN1.js:13604:23 { code: 'PARSE_ERROR', id: undefined, pos: 50 } ⎯⎯⎯⎯⎯⎯ Failed Suites 1 ⎯⎯⎯⎯⎯⎯⎯  FAIL  src/App.test.tsx [ src/App.test.tsx ] Error: Failed to resolve import "@tanstack/react-query-persist-client" from "src/App.tsx". Does the file exist? Plugin: vite:import-analysis File: /workspace/niko/agent-platform/frontend/src/App.tsx:2:43  1 | import { RouterProvider } from "react-router-dom"; 2 | import { PersistQueryClientProvider } from "@tanstack/react-query-persist-client"; | ^ 3 | import { ReactQueryDevtools } from "@tanstack/react-query-devtools"; 4 | import { useEffect, useRef } from "react";  ❯ TransformPluginContext._formatLog ../../../node_modules/vite/dist/node/chunks/node.js:29914:39  ❯ TransformPluginContext.error ../../../node_modules/vite/dist/node/chunks/node.js:29911:14  ❯ normalizeUrl ../../../node_modules/vite/dist/node/chunks/node.js:26975:18  ❯ ../../../node_modules/vite/dist/node/chunks/node.js:27038:30  ❯ TransformPluginContext.transform ../../../node_modules/vite/dist/node/chunks/node.js:27006:4  ❯ EnvironmentPluginContainer.transform ../../../node_modules/vite/dist/node/chunks/node.js:29699:14  ❯ loadAndTransform ../../../node_modules/vite/dist/node/chunks/node.js:19725:26 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/10]⎯ ⎯⎯⎯⎯⎯⎯⎯ Failed Tests 9 ⎯⎯⎯⎯⎯⎯⎯  FAIL  src/features/auth/LoginPage.test.tsx > LoginPage > performs mock login in dev mode and navigates to dashboard Error: Test timed out in 5000ms. If this is a long-running test, pass a timeout value as the last argument or configure it globally with "testTimeout".  ❯ src/features/auth/LoginPage.test.tsx:64:3  62| })  63|  64| it('performs mock login in dev mode and navigates to dashboard', asy…  | ^  65| renderLoginPage()  66| const user = userEvent.setup() ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/10]⎯  FAIL  src/shared/components/CrudReadCard.test.tsx > CrudReadCard > external deleteState integration > 10. renders external delete button when deleteState is provided Error: Test timed out in 5000ms. If this is a long-running test, pass a timeout value as the last argument or configure it globally with "testTimeout".  ❯ src/shared/components/CrudReadCard.test.tsx:121:5 119| 120| describe('external deleteState integration', () => { 121| it('10. renders external delete button when deleteState is provide…  | ^ 122| render( 123| <CrudReadCard ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[3/10]⎯  FAIL  src/shared/components/CrudReadCard.test.tsx > CrudReadCard > external deleteState integration > 11. external delete button click calls requestDelete Error: Test timed out in 5000ms. If this is a long-running test, pass a timeout value as the last argument or configure it globally with "testTimeout".  ❯ src/shared/components/CrudReadCard.test.tsx:139:5 137| }) 138| 139| it('11. external delete button click calls requestDelete', async (…  | ^ 140| const requestDelete = vi.fn() 141| render( ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[4/10]⎯  FAIL  src/shared/components/DataTable.test.tsx > DataTable sort > shows sort indicator on active column Error: Test timed out in 5000ms. If this is a long-running test, pass a timeout value as the last argument or configure it globally with "testTimeout".  ❯ src/shared/components/DataTable.test.tsx:293:3 291| }) 292| 293| it('shows sort indicator on active column', () => {  | ^ 294| renderWithRouter( 295| <DataTable ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[5/10]⎯  FAIL  src/shared/components/DataTable.test.tsx > DataTable header bar > shows Refresh button when sse is not defined Error: Test timed out in 5000ms. If this is a long-running test, pass a timeout value as the last argument or configure it globally with "testTimeout".  ❯ src/shared/components/DataTable.test.tsx:337:3 335| 336| describe('DataTable header bar', () => { 337| it('shows Refresh button when sse is not defined', () => {  | ^ 338| renderWithRouter( 339| <DataTable ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[6/10]⎯  FAIL  src/layers/__tests__/L2R/Crud.test.tsx > Crud slot — route handoff > mutation tracking > does not navigate before coordinator emits closeIntent Error: Hook timed out in 10000ms. If this is a long-running hook, pass a timeout value as the last argument or configure it globally with "hookTimeout".  ❯ src/layers/__tests__/L2R/Crud.test.tsx:90:3  88| })  89|  90| afterEach(() => {  | ^  91| setRouteContext(null)  92| }) ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[7/10]⎯  FAIL  src/layers/__tests__/L2R/Crud.test.tsx > Crud slot — route handoff > mutation tracking > stays on page when failure is present Error: Test timed out in 5000ms. If this is a long-running test, pass a timeout value as the last argument or configure it globally with "testTimeout".  ❯ src/layers/__tests__/L2R/Crud.test.tsx:316:5 314| }) 315| 316| it('stays on page when failure is present', () => {  | ^ 317| const config: CrudConfig = { 318| entityPath: 'repositories', ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[8/10]⎯  FAIL  src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > pending state > pending makes fields read-only via isEditable check Error: Test timed out in 5000ms. If this is a long-running test, pass a timeout value as the last argument or configure it globally with "testTimeout".  ❯ src/layers/__tests__/L2R/CrudSurface.test.tsx:208:5 206| }) 207| 208| it('pending makes fields read-only via isEditable check', () => {  | ^ 209| render( 210| <CrudSurface ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[9/10]⎯  FAIL  src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > user interactions > dirty guard > opens DiscardDialog when dirty=true on Cancel click Error: Test timed out in 5000ms. If this is a long-running test, pass a timeout value as the last argument or configure it globally with "testTimeout".  ❯ src/layers/__tests__/L2R/CrudSurface.test.tsx:363:7 361| }) 362| 363| it('opens DiscardDialog when dirty=true on Cancel click', () => {  | ^ 364| render( 365| <CrudSurface ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[10/10]⎯ ⎯⎯⎯⎯⎯⎯ Unhandled Errors ⎯⎯⎯⎯⎯⎯  Vitest caught 1 unhandled error during the test run. This might cause false positive tests. Resolve unhandled errors to make sure your tests are not affected. ⎯⎯⎯⎯⎯⎯ Unhandled Error ⎯⎯⎯⎯⎯⎯⎯ Error: [vitest-pool]: Failed to start forks worker for test files /workspace/niko/agent-platform/frontend/src/layers/__tests__/L1/mutationQueue.test.ts.  ❯ ../../../node_modules/vitest/dist/chunks/cli-api.24X8XwN1.js:3465:94  ❯ Pool.schedule ../../../node_modules/vitest/dist/chunks/cli-api.24X8XwN1.js:3465:5 Caused by: Error: [vitest-pool-runner]: Timeout waiting for worker to respond  ❯ Timeout. ../../../node_modules/vitest/dist/chunks/cli-api.24X8XwN1.js:3041:58  ❯ listOnTimeout node:internal/timers:605:17  ❯ processTimers node:internal/timers:541:7 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯  Test Files  6 failed | 39 passed (45)  Tests  9 failed | 521 passed (530)  Errors  1 error  Start at  04:15:07  Duration  138.78s (transform 56.60s, setup 586.22s, import 110.38s, tests 340.49s, environment 165.20s) JUNIT report written to /workspace/niko/agent-platform/reports/front-unit/junit.xml