RUN  v4.1.9 /workspace/niko/agent-platform/frontend Coverage enabled with v8 (node:384) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:365) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:373) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:335) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:348) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:368) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:355) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:366) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:334) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:341) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:343) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) ✓ src/layers/__tests__/L2W/coordinator.test.ts > createCoordinator > returns an object with useCoordinator 49ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > resolveEndpointTemplate > replaces a single token in the template 17ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > resolveEndpointTemplate > replaces multiple tokens and removes used params 4ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > resolveEndpointTemplate > returns url unchanged when no tokens exist 2ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > resolveEndpointTemplate > throws when a token is missing from params 6ms ✓ 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 ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — inactive state (no crud) > activeCrud is null when routeContext has no crud 174ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — inactive state (no crud) > activeCrud is null when routeContext.crud is undefined 17ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — inactive state (no crud) > fieldPolicy is empty when inactive 25ms ✓ src/layers/__tests__/L1/SseConnectionState.test.tsx > SseConnectionState — state machine > initial state: reconnecting → connected > starts in reconnecting and transitions to connected on onopen 256ms stderr | src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — inactive state (no crud) > submit is callable even when inactive (no-op) An update to TestComponent inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to TestComponent inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to TestComponent inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — inactive state (no crud) > formModel is defaults when inactive 65ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — inactive state (no crud) > bridge starts clean when inactive 41ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useEntityList > returns ListResult shape with hasMore and totalEstimate when API responds with data array 268ms ✓ src/layers/__tests__/L1/SseConnectionState.test.tsx > SseConnectionState — state machine > connection lost after 5 onerrors > sets connectionState:lost after 5 consecutive failures 87ms ✓ src/layers/__tests__/L1/SseConnectionState.test.tsx > SseConnectionState — state machine > reconnecting state on 1–4 onerrors > stays in reconnecting after 4 consecutive onerrors 37ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — inactive state (no crud) > submit is callable even when inactive (no-op) 82ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — owner isolation > activeCrud is null when routeContext.crud.owner != config.owner 33ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — owner isolation > activeCrud is populated when owner matches 36ms ✓ src/layers/__tests__/L1/SseConnectionState.test.tsx > SseConnectionState — state machine > reconnect() resets failureCount and state > reconnect() moves from lost back to reconnecting and resets backoff 55ms ✓ src/layers/__tests__/L1/SseConnectionState.test.tsx > SseConnectionState — state machine > heartbeat timeout triggers lost state > transitions to lost after 30s without heartbeat 62ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useEntityList > filters out pending deleted entities 120ms ✓ src/layers/__tests__/L1/ReconnectRefresh.test.tsx > ReconnectRefresh > DoD-3: initial mount does NOT invalidate > first onopen does not call invalidateQueries 396ms ✓ src/layers/__tests__/L1/ReconnectRefresh.test.tsx > ReconnectRefresh > DoD-4/DoD-5: 1 onerror + onopen triggers invalidate after wasEverConnected > invalidates on reconnect onopen after an onerror on the established connection 58ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — owner isolation > activeCrud includes prefix when provided 31ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — owner isolation > owner isolation works for edit mode 21ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — add flow > formModel initialized with defaults 24ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — add flow > fieldPolicy uses add mode 15ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — add flow > activeCrud has mode add 16ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useEntityList > uses defaultListQuery when no params provided 110ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useEntityList > resolves endpoint template with params and strips used tokens 28ms ✓ src/layers/__tests__/L1/ReconnectRefresh.test.tsx > ReconnectRefresh > DoD-4: 4+ onerrors during initial mount + onopen = NO invalidate > no invalidate when errors happen before first successful connection 31ms ✓ src/layers/__tests__/L1/ReconnectRefresh.test.tsx > ReconnectRefresh > DoD-5: flag cycle > cycles: onerror→onopen(invalidate)→onerror→onopen(invalidate)→onopen(no invalidate) 24ms ✓ src/layers/__tests__/L1/ReconnectRefresh.test.tsx > ReconnectRefresh > DoD-6: manual reconnect in lost state triggers invalidate > reconnect from lost state triggers invalidate when flag is true 64ms ✓ src/layers/__tests__/L1/SseConnectionState.test.tsx > SseConnectionState — state machine > heartbeat timeout triggers lost state > heartbeat timeout → reconnecting with backoff 74ms ✓ src/layers/__tests__/L1/SseConnectionState.test.tsx > SseConnectionState — state machine > heartbeat timeout triggers lost state > heartbeat events prevent lost state (35s with heartbeat at 20s does NOT trigger lost) 55ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — add flow > submit calls mutation.create with toCreate(formModel) 36ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — add flow > bridge.pending is true after submit 18ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — add flow > submit uses the latest formModel via setFormModel 70ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useEntityList > uses staleTime 0 when queryMode is live 84ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useEntityList > uses default staleTime when queryMode is cache 84ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — edit flow > formModel populated from entity detail 15ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — edit flow > fieldPolicy uses edit mode 15ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — edit flow > activeCrud has mode edit 15ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — edit flow > submit calls mutation.update with id and toUpdate(formModel) 45ms ✓ src/layers/__tests__/L1/SseConnectionState.test.tsx > SseConnectionState — state machine > 60s lost auto-retry > retries after 60s in lost state and schedules next retry on failure 111ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useEntityList > returns hasMore true from API meta 88ms ✓ src/layers/__tests__/L1/SseConnectionState.test.tsx > SseConnectionState — state machine > unmount cancels timers > cancels lostRetryTimeout and closes EventSource on unmount in lost state 122ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — edit flow > detail not yet loaded shows formModel as defaults 48ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator lifecycle transitions > handles transition from add → inactive → edit cleanly 58ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useEntityList > handles totalEstimate -1 as unknown count 71ms ✓ src/layers/__tests__/L1/RefCountIntegration.test.tsx > RefCount Integration > Mount -> refCount=1 -> staleTime Infinity > useEntityList sees staleTime Infinity when refCount > 0 968ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useEntityList > falls back safely when API meta is missing 108ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useEntityDetail > returns DetailResult shape on successful fetch 86ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator lifecycle transitions > closeIntent resets on mode change 139ms ✓ src/layers/__tests__/L1/SseConnectionState.test.tsx > SseConnectionState — state machine > per-subscription heartbeat isolation > two hook instances do not share heartbeat state 271ms 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__/L2W/coordinator.test.ts > useCoordinator failure path > failure is null initially 97ms ✓ src/layers/__tests__/L1/RefCountIntegration.test.tsx > RefCount Integration > Unmount -> refCount=0 -> staleTime 120_000 > after unmount, refCount drops to 0 and staleTime falls back to sseMode value 245ms ✓ src/layers/__tests__/L1/SseConnectionState.test.tsx > SseConnectionState — state machine > Phase 3 fix: clearLostRetry() on every open() — no duplicate 60s timers > after 60s lost retry fires, open() clears the stale timer and starts fresh backoff cycle 167ms ✓ src/layers/__tests__/L1/SseConnectionState.test.tsx > SseConnectionState — state machine > Phase 3 fix: onopen resets heartbeat timestamp to prevent premature timeout > onopen resets heartbeat timestamp so heartbeat does not trigger within 10s of reconnect 15ms ✓ src/layers/__tests__/L1/ReconnectRefresh.test.tsx > ReconnectRefresh > DoD-7: zombie callback — unmount prevents invalidate > does not invalidate when onopen fires after unmount 43ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useEntityDetail > is skipped when id is empty 131ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > returns MutationHandle shape with isPending and callable methods 43ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator failure path > bridge dirty stays true when pending resets (failure simulation) 135ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator failure path > submit does not throw when called without active crud 80ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > update receives id as first argument and sends Idempotency-Key header 134ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > update does not trigger cache invalidation 60ms ✓ src/layers/__tests__/L1/SseConnectionState.test.tsx > SseConnectionState — state machine > Phase 3 fix: pendingTimeouts cleared on lost — stale reconnecting timers do not override lost > after 5 rapid onerrors trigger lost, stale backoff timers do NOT fire and override lost state 18ms ✓ src/layers/__tests__/L1/SseConnectionState.test.tsx > SseConnectionState — state machine > Phase 3 fix: clearLostRetry() in reconnecting path — stale lost timer does not override reconnecting > reconnect() clears stale lost timer and stays connected past the 60s window 42ms ✓ src/layers/__tests__/L1/SseConnectionState.test.tsx > SseConnectionState — state machine > DoD-4: backoff survives re-render (normalizedRef fix) > failureCount persists across re-renders and retry fires on schedule 43ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator failure path > activeCrud remains populated after submit (branch not closed) 75ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator failure path > failure is null after submit when no sync error occurs 52ms ✓ src/layers/__tests__/L1/RefCountIntegration.test.tsx > RefCount Integration > Two components, same queryKey -> refCount=2 > both subscriptions contribute to refCount, both become 0 only after both unmount 124ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator failure path > failure is set when mutation resolves with isError=true 86ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator closeIntent > closeIntent is null initially 26ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > create triggers cache invalidation with Idempotency-Key header 148ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator closeIntent > cancel() sets closeIntent to cancel 111ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator updateField and setFormModel > setFormModel updates snapshot.formModel 34ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator updateField and setFormModel > updateField updates a single field and marks dirty 48ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > create resolves endpoint template in mutationFn 125ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator updateField and setFormModel > updateField preserves other fields 20ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator snapshot type contract (compile-time) > snapshot has all required CoordinatorSnapshot fields 45ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator snapshot type contract (compile-time) > result exposes updateField, setFormModel, cancel 26ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — delete state machine > deleteState is null on collection route 16ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > create resolves endpoint template using createPathParams from contract 120ms ✓ src/layers/__tests__/L1/RefCountIntegration.test.tsx > RefCount Integration > Two components, different queryKey > different filters get independent refCounts 96ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — delete state machine > deleteState is null on collection route even with crud 22ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — delete state machine > deleteState is non-null on detail route 23ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — delete state machine > requestDelete sets showConfirm to true 24ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > create with pipelines-like contract uses context to build URL /projects/{id}/pipelines 83ms ✓ src/layers/__tests__/L1/RefCountIntegration.test.tsx > RefCount Integration > Race condition: refCount 0->1 cancels ongoing refetch > calls cancelQueries when refCount transitions 0->1 mid-refetch 340ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — delete state machine > requestDelete clears previous delete errors 79ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > create resolves template from context when body lacks the token field 124ms ✓ src/layers/__tests__/L1/RefCountIntegration.test.tsx > RefCount Integration > sseMode + refCount combinations > sseMode true, refCount 0 -> staleTime 120_000 166ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > create isolates context between rapid successive calls (no ref race) 142ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — delete state machine > cancelDelete sets showConfirm to false 120ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > offline create adds to outbox without calling API 131ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > offline update adds to outbox without calling API 43ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — delete state machine > cancelDelete does not call mutation.remove 189ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — delete state machine > confirmDelete calls mutation.remove with routeContext.id 24ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — delete state machine > confirmDelete closes showConfirm and clears delete error before calling remove 32ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > offline remove adds to pendingDeleteMap, cache, and outbox without API call 54ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > remove does not trigger cache invalidation 31ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > remove onSuccess performs deterministic cache cleanup across all same-path entries 53ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — delete state machine > confirmDelete is a no-op on collection route 47ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — delete state machine > deleteState.isPending is false when delete not requested 16ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > remove onSuccess cache cleanup removes entity from detail cache entry 39ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useMutation > isPending reflects combined mutation state 59ms ✓ src/layers/__tests__/L1/RefCountIntegration.test.tsx > RefCount Integration > sseMode + refCount combinations > sseMode true, refCount > 0 -> staleTime Infinity 318ms ✓ src/layers/__tests__/L1/RefCountIntegration.test.tsx > RefCount Integration > sseMode + refCount combinations > sseMode false/undef, refCount 0 -> staleTime undefined (global default) 257ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — delete state machine > deleteState.isPending reflects mutation.isPending during active delete 114ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useSubscription > shape smoke > returns SubscriptionHandle with correct shape 28ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — delete state machine > deleteState.isPending becomes false after delete completes 180ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — delete state machine > extracts error message from response.data.error 87ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useSubscription > connection-lost after 5 failures > sets connectionState:lost after 5 consecutive failures 262ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useSubscription > reconnect resets the state > reconnect is callable and triggers a new connection attempt 112ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — delete state machine > falls back to error.message when response.data is absent 207ms ✓ src/layers/__tests__/L1/RefCountIntegration.test.tsx > RefCount Integration > sseMode + refCount combinations > sseMode false/undef, refCount > 0 -> staleTime Infinity 361ms ✓ 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 153ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — delete state machine > falls back to default string when error is null 70ms ✓ src/layers/__tests__/L1/RefCountIntegration.test.tsx > RefCount Integration > useEntityDetail refCount-aware staleTime > detail query sees staleTime Infinity when subscription is active for same entity 183ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — delete state machine > successful delete clears error state 55ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — delete state machine > error remains null after successful delete (was null before) 45ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — entitySelectData resolution > entitySelectData is empty when no entitySelectSources configured 11ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — entitySelectData resolution > resolves entity-select options from L1 useEntityList 13ms ✓ src/layers/__tests__/L2W/coordinator.test.ts > useCoordinator — entitySelectData resolution > uses default idField and nameField when not specified 17ms ✓ src/layers/__tests__/L1/RefCountIntegration.test.tsx > RefCount Integration > useEntityDetail refCount-aware staleTime > detail query sees staleTime undefined when no subscription 112ms ✓ src/layers/__tests__/L1/entityHooks.test.tsx > useSubscription > SSE deleted cleanup > removes pendingDelete entry on entity.deleted event 110ms ✓ src/layers/__tests__/L1/RefCountIntegration.test.tsx > RefCount Integration > Per-queryKey isolation (DoD-7) > two different queryKeys do not share refCount 111ms 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/shared/components/CrudReadCard.test.tsx > CrudReadCard > 1. loading shows skeleton header + skeleton card, no buttons rendered 443ms ✓ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > 2. error shows "Failed to load" + Retry 395ms stderr | src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > row identity > uses resolveIdOf result for row key and data-testid ⚠️ React Router Future Flag Warning: React Router will begin wrapping state updates in `React.startTransition` in v7. You can use the `v7_startTransition` future flag to opt-in early. For more information, see https://reactrouter.com/v6/upgrading/future#v7_starttransition. ⚠️ React Router Future Flag Warning: Relative route resolution within Splat routes is changing in v7. You can use the `v7_relativeSplatPath` future flag to opt-in early. For more information, see https://reactrouter.com/v6/upgrading/future#v7_relativesplatpath. ✓ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > 3. 404 shows "not found" + "Back to list" 277ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > row identity > uses resolveIdOf result for row key and data-testid 414ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > row identity > falls back to row.id when resolveIdOf returns null 59ms ✓ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > 4. default renders title, actions, field grid 321ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > row identity > falls back to empty string when no id field and resolveIdOf returns null 144ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > SSE > shows connection-lost banner with reconnect when SSE enabled and connection lost 369ms ✓ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > 5. edit onClick is called 562ms 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__/L2R/ListSurface.test.tsx > ListSurface > rendering states > renders loading state when isLoading is true 1907ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > SSE > shows data table alongside SSE connection-lost banner (preserving cached data) 599ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > rendering states > renders error state when error is present 230ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > SSE > reconnect button calls sse.reconnect 504ms ✓ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > 6. delete opens ConfirmDialog 1073ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > rendering states > renders empty state when data is empty 140ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > rendering states > renders data table when data is present 229ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > SSE > renders table normally when SSE enabled and connection is live 162ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > SSE > renders table normally when SSE is not enabled 188ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > rendering states > renders column headers from config 80ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > wiring > renders add button when createTarget is set 42ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > wiring > renders custom add button label from config.createLabel 44ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > states > shows error state 135ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > states > shows loading state 154ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > wiring > renders default add button label when createLabel is not set 109ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > states > shows empty state when no data and not loading 80ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > wiring > calls navigate with createTarget when add button clicked 233ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > wiring > row click calls navigate with rowTarget and row id 71ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > wiring > does not render add button when createTarget is not set (no fallback) 206ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > states > shows filter-empty state when data is empty and filters are active 335ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > wiring > add button is not clickable when createTarget is not set 206ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > states > filter-empty state shows clear filters button 345ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > states > shows regular empty when no filters are active and data empty 170ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > wiring > row click uses derived default when rowTarget is not set 245ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > wiring > row click uses rowTargetOverride when provided 359ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > sort > sets default sort in URL on initial hydration 295ms stderr | src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > rendering states > renders loading state when isLoading is true ⚠️ React Router Future Flag Warning: React Router will begin wrapping state updates in `React.startTransition` in v7. You can use the `v7_startTransition` future flag to opt-in early. For more information, see https://reactrouter.com/v6/upgrading/future#v7_starttransition. ⚠️ React Router Future Flag Warning: Relative route resolution within Splat routes is changing in v7. You can use the `v7_relativeSplatPath` future flag to opt-in early. For more information, see https://reactrouter.com/v6/upgrading/future#v7_relativesplatpath. ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > states > error takes priority over loading 113ms ✓ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > rendering states > renders loading state when isLoading is true 1201ms ✓ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > rendering states > renders error state when error is present 68ms 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/L2R/slots/DataTable.test.tsx > DataTable slot > add button > renders add button in header when createTarget is set 668ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > sort > shows sort indicator on active sort column 69ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > add button > does not render add button when createTarget is not set (no fallback) 363ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > row click > navigates via rowTargetOverride on click when override is set 75ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > sort > cycles sort on header click: none -> asc -> desc -> none 665ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > row click > rowTargetOverride takes precedence over rowTarget 184ms stderr | src/layers/__tests__/L2R/Crud.test.tsx > Crud slot — route handoff > cancel > navigates to cancelTarget when Cancel is clicked An update to FocusScope inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to Presence inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to Presence inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to DismissableLayer inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to FocusScope inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to Presence inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to Presence inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to DismissableLayer inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > sort > switches to new column asc when different column is clicked 118ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > row click > navigates to derived default pathname/id when no rowTarget and no override 230ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > filters slot > renders filtersSlot when provided alongside data 67ms ✓ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > 7. delete confirm calls onClick 2400ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > filters slot > does not render filters-slot when filtersSlot is not provided 108ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > sort > sorts data by active sort field asc 361ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > sort > sorts data by active sort field desc 51ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > pagination > renders pagination controls with prev/next buttons 149ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > pagination > disables prev button when offset is 0 80ms ✓ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > rendering states > renders empty state when entity is null 181ms ✓ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > rendering states > renders detail content via CrudReadCard with fields from readGrouping 1153ms ✓ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > rendering states > renders field values correctly via MetadataCard 84ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > sort > places null/undefined values last in asc sort 237ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > pagination > enables prev button when offset > 0 52ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > sort > sorts numbers numerically 338ms ✓ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > rendering states > uses default grouping when readGrouping is not set 83ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > pagination > disables next button when hasMore is false 564ms ✓ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > 8. delete disabled is muted 1023ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > sort > sorts strings case-insensitively 223ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > sort > does not render sort indicator on non-sortable columns 168ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > overrides > renders custom loading fragment from overrides 26ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > overrides > renders custom empty fragment from overrides 66ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > overrides > renders custom error fragment from overrides 64ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > pagination > disables next button when hasMore is undefined and data length < pageSize (fallback) 506ms ✓ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > 9. extra renders before Edit 995ms ✓ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > wiring > renders edit button when edit target is set 383ms ✓ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > wiring > calls navigate with edit target when edit button clicked 699ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > overrides > wraps content in layoutWrapper from overrides 264ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > overrides > uses label overrides for column headers 350ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > overrides > hides columns specified in overrides 74ms ✓ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > external deleteState integration > 10. renders external delete button when deleteState is provided 417ms ✓ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > wiring > does not render edit button when actionTargets.edit is not set 136ms ✓ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > wiring > edit button navigates to configured target when actionTargets.edit is set 195ms ✓ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > wiring > renders edit button when actionTargets.edit is present 66ms ✓ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > overrides > renders custom loading fragment 13ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > filter-empty state > shows filter-empty when hasActiveFilters is true and data is empty 132ms ✓ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > overrides > renders custom empty fragment 26ms ✓ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > overrides > renders custom error fragment 11ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > filter-empty state > shows regular empty when hasActiveFilters is false and data empty 168ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > rendering > renders nothing when activeCrud is null 2155ms ✓ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > overrides > wraps in layoutWrapper from overrides 163ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > filter-empty state > shows clear filters button in filter-empty state when onClearFilters provided 230ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > filter-empty state > does not show filter-empty when data is not empty 41ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > pagination > enables next button when hasMore is true 1117ms ✓ src/layers/__tests__/L2R/Crud.test.tsx > Crud slot — route handoff > cancel > navigates to cancelTarget when Cancel is clicked 3316ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > pagination > enables next button when hasMore is true even with less data than pageSize 190ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > pagination > reads offset from URL search params 55ms ✓ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > DetailSurface — delete UI contract > renders delete button when actionTargets.delete=true and deleteState is present 388ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > pagination > uses fixedParams.limit as pageSize when provided 52ms ✓ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > DetailSurface — delete UI contract > does not render delete button when actionTargets.delete is not set 310ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > render contract > calls render for each cell 201ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > pagination > defaults pageSize to 25 when no fixedParams.limit 119ms ✓ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > DetailSurface — delete UI contract > does not render delete button when deleteState is null 91ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > pagination > shows totalEstimate in pagination display when >= 0 297ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > render contract > renders ReactNode from render function 479ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > rendering > renders add mode title by default 3074ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > render contract > render receives full row object 252ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > render contract > renders default plain text when render is omitted 66ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > render contract > supports mixed columns: some with render, some without 113ms ✓ src/layers/__tests__/L2R/ListSurface.test.tsx > ListSurface > render contract > render is optional — ColumnConfig is valid without render 162ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > pagination > hides "of" in pagination display when totalEstimate is -1 290ms ✓ src/layers/__tests__/L2R/Crud.test.tsx > Crud slot — route handoff > cancel > navigates to cancelTarget via closeIntent cancel 2475ms ✓ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > external deleteState integration > 11. external delete button click calls requestDelete 898ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > rendering > renders edit mode title 1059ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > pagination > hides "of" in pagination display when totalEstimate is undefined 610ms ✓ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > external deleteState integration > 12. shows confirm dialog when showConfirm is true 1860ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > pagination > falls back to total for pagination display when totalEstimate is missing but total is set 522ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > pagination > resets offset when sort changes 471ms 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 1390ms 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/CrudReadCard.test.tsx > CrudReadCard > external deleteState integration > 13. confirm button calls confirmDelete 760ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > rendering > renders form fields based on fieldPolicy 1037ms ✓ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > DetailSurface — delete UI contract > delete button click calls deleteState.requestDelete 196ms ✓ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > DetailSurface — delete UI contract > renders confirm-delete-dialog when deleteState.showConfirm is true 2971ms (node:436) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) ✓ src/layers/__tests__/L2R/Crud.test.tsx > Crud slot — route handoff > cancel > falls back to onCancel callback 1237ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > pagination > resets offset when filter changes 1460ms ✓ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > external deleteState integration > 14. cancel button calls cancelDelete 822ms ✓ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > external deleteState integration > 15. confirm button disabled when isPending 890ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > sort + filter param merge > includes stripped filter params and excludes prefixed internal keys 240ms ✓ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > external deleteState integration > 16. renders deleteError when provided 116ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > rendering > does not render fields with visible: false 1562ms ✓ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > external deleteState integration > 17. no internal DeleteButton when deleteState is provided 277ms ✓ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > DetailSurface — delete UI contract > does not render confirm-delete-dialog when showConfirm is false 96ms ✓ src/layers/__tests__/L2R/Crud.test.tsx > Crud slot — route handoff > success > navigates to successTarget with id replaced from mutation result (add) 1143ms ✓ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > overrides > 18. renders custom error fragment via overrides 195ms ✓ src/shared/components/CrudReadCard.test.tsx > CrudReadCard > overrides > 19. renders custom loading fragment via overrides 131ms 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 966ms 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 > overrides > 20. renders custom empty fragment via overrides 83ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > sort + filter param merge > does not break fixedParams 275ms ✓ src/layers/__tests__/L2R/Crud.test.tsx > Crud slot — route handoff > success > falls back to onSuccess callback 221ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > rendering > renders disabled input for fields with editable: false 1038ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > extra > renders extra Button in header bar 891ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > extra > DOM order: extra container before Add button within header flex 110ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > extra > undefined does not break 42ms (node:429) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) ✓ src/layers/__tests__/L2R/Crud.test.tsx > Crud slot — route handoff > success > falls back to cancelTarget when successTarget has :id but mutation returns no id 342ms ✓ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > DetailSurface — delete UI contract > cancel button calls deleteState.cancelDelete 1051ms (node:442) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) 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 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/Crud.test.tsx > Crud slot — route handoff > success > falls back to entityPath when successTarget has :id, mutation returns no id, and no cancelTarget 346ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > extra > onClick callback is invoked when button clicked 188ms (node:422) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) ✓ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > DetailSurface — delete UI contract > confirm button calls deleteState.confirmDelete 1166ms ✓ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > DetailSurface — delete UI contract > confirm button is disabled when isPending is true 420ms ✓ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > DetailSurface — delete UI contract > renders delete-error when deleteState.error is not null 23ms ✓ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > DetailSurface — delete UI contract > does not render delete-error when error is null 34ms ✓ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > DetailSurface — delete UI contract > calls onDeleteSuccess when delete transitions from pending to done without error 29ms ✓ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > DetailSurface — delete UI contract > does not call onDeleteSuccess when pending transition has error 31ms ✓ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > DetailSurface — delete UI contract > does not call onDeleteSuccess while still pending 20ms ✓ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > DetailSurface — delete UI contract > calls onDeleteSuccess at most once during repeated pending→done cycles 47ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > rendering > renders modal with dialog role for accessibility 791ms ✓ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > field formatters > applies formatter for fields with formatter defined 38ms ✓ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > field formatters > applies ReactNode formatter 56ms ✓ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > field formatters > falls back to String() when no formatter for field 39ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > extra > fragment with multiple buttons renders all 539ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > sort toggle > cycles sort: none -> asc -> desc -> none 571ms ✓ src/layers/__tests__/L2R/Crud.test.tsx > Crud slot — route handoff > mutation tracking > does not navigate before coordinator emits closeIntent 435ms 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 stderr | src/layers/__tests__/L2R/Crud.test.tsx > Crud slot — route handoff > mutation tracking > stays on page when failure is present An update to FocusScope inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to Presence inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to Presence inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to DismissableLayer inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to FocusScope inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to Presence inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to Presence inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act An update to DismissableLayer inside a test was not wrapped in act(...). When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state */ }); /* assert on the output */ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > refresh button > refresh button visible when SSE not enabled 131ms ✓ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > field formatters > passes entity as second argument to formatter 101ms ✓ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > extra > forwards extra buttons to CrudReadCard when provided 425ms ✓ src/layers/__tests__/L2R/Crud.test.tsx > Crud slot — route handoff > mutation tracking > stays on page when failure is present 797ms ✓ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > extra > extra buttons render before Edit button in CrudReadCard 127ms ✓ 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) 342ms ✓ src/layers/L2R/surfaces/DetailSurface.test.tsx > DetailSurface > extra > renders multiple extra buttons via fragment 184ms ✓ src/layers/__tests__/config-contracts.test.ts > config contracts — CrudConfig minimum requirements > every CrudConfig has entityPath 21ms ✓ src/layers/__tests__/config-contracts.test.ts > config contracts — CrudConfig minimum requirements > every CrudConfig has fieldSet with at least one field 5ms ✓ src/layers/__tests__/config-contracts.test.ts > config contracts — CrudConfig minimum requirements > all collection-page configs have both successTarget and cancelTarget 2ms ✓ src/layers/__tests__/config-contracts.test.ts > config contracts — CrudConfig minimum requirements > all detail-page configs have both successTarget and cancelTarget 3ms ✓ src/layers/__tests__/config-contracts.test.ts > config contracts — CrudConfig minimum requirements > all entity-select and entity-select-list fields have corresponding entitySelectSources 3ms ✓ 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 320ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > refresh button > refresh button visible when SSE is enabled 112ms ✓ src/layers/L2R/slots/DataTable.test.tsx > DataTable slot > refresh button > refresh button calls refetch 44ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > rendering > renders Save and Cancel buttons in modal footer 1257ms (node:450) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > pending state > disables fieldset and modal buttons when pending 1667ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > pending state > pending makes fields read-only via isEditable check 1518ms ✓ src/features/pipelines/laneLint.test.ts > laneLint > empty configs > returns empty result for an empty config 44ms ✓ src/features/pipelines/laneLint.test.ts > laneLint > empty configs > returns empty result for a config with an empty vikunja section 15ms ✓ src/features/pipelines/laneLint.test.ts > laneLint > empty configs > errors with a root-level config error when the parsed config is a string or array 37ms ✓ src/features/pipelines/laneLint.test.ts > laneLint > empty configs > errors with a root-level config error when the parsed config is null 36ms ✓ src/features/pipelines/laneLint.test.ts > laneLint > empty configs > returns empty result for a clean full lanes config 1ms ✓ src/shared/components/YamlEditor.test.tsx > YamlEditor > rendering > renders textarea with value 1805ms ✓ src/shared/components/YamlEditor.test.tsx > YamlEditor > rendering > renders read-only view as static plain text 19ms ✓ src/msw/__tests__/container-registries-handler.test.ts > containerRegistryHandlers — list & get > GET list returns data + meta with limit/offset/has_more 301ms ✓ src/msw/__tests__/container-registries-handler.test.ts > containerRegistryHandlers — list & get > GET by known id returns the registry without token fields 79ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > failure and loading states > renders failure message and retry button 836ms stderr | src/msw/__tests__/container-registries-handler.test.ts > containerRegistryHandlers — create validation mirroring the API > POST without name returns 422 name is required TypeError: Body is unusable: Body has already been read  at consumeBody (node:internal/deps/undici/undici:6981:31)  at FetchRequest.json (node:internal/deps/undici/undici:6909:18) at /workspace/niko/agent-platform/frontend/src/msw/handlers/container-registries.ts:44:32 at file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:176:26 at HttpHandler.run (file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:142:35)  at processTicksAndRejections (node:internal/process/task_queues:104:5) at executeHandlers (file:///workspace/node_modules/msw/lib/core/utils/executeHandlers.mjs:11:14) at until (file:///workspace/node_modules/until-async/lib/index.js:14:17) at InterceptorHttpNetworkFrame.resolve (file:///workspace/node_modules/msw/lib/core/experimental/frames/http-frame.mjs:81:41) at Emitter. (file:///workspace/node_modules/msw/lib/core/experimental/define-network.mjs:80:11) [MSW] Encountered an unhandled exception during the handler lookup for "POST http://localhost:3000/api/v1/container-registries". Please see the original error above. ✓ src/shared/components/YamlEditor.test.tsx > YamlEditor > rendering > renders read-only view in monospace style 16ms ✓ src/shared/components/YamlEditor.test.tsx > YamlEditor > rendering > renders dash when read-only and value is empty 24ms ✓ src/shared/components/YamlEditor.test.tsx > YamlEditor > rendering > renders lint errors below the editor in red error state 22ms ✓ src/shared/components/YamlEditor.test.tsx > YamlEditor > rendering > renders lint warnings in amber without red error state 16ms ✓ src/shared/components/YamlEditor.test.tsx > YamlEditor > rendering > renders multiple lint issues 25ms stderr | src/msw/__tests__/container-registries-handler.test.ts > containerRegistryHandlers — create validation mirroring the API > POST with too-short name returns 422 TypeError: Body is unusable: Body has already been read  at consumeBody (node:internal/deps/undici/undici:6981:31)  at FetchRequest.json (node:internal/deps/undici/undici:6909:18) at /workspace/niko/agent-platform/frontend/src/msw/handlers/container-registries.ts:44:32 at file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:176:26 at HttpHandler.run (file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:142:35)  at processTicksAndRejections (node:internal/process/task_queues:104:5) at executeHandlers (file:///workspace/node_modules/msw/lib/core/utils/executeHandlers.mjs:11:14) at until (file:///workspace/node_modules/until-async/lib/index.js:14:17) at InterceptorHttpNetworkFrame.resolve (file:///workspace/node_modules/msw/lib/core/experimental/frames/http-frame.mjs:81:41) at Emitter. (file:///workspace/node_modules/msw/lib/core/experimental/define-network.mjs:80:11) [MSW] Encountered an unhandled exception during the handler lookup for "POST http://localhost:3000/api/v1/container-registries". Please see the original error above. stderr | src/msw/__tests__/container-registries-handler.test.ts > containerRegistryHandlers — create validation mirroring the API > POST with too-long name returns 422 TypeError: Body is unusable: Body has already been read  at consumeBody (node:internal/deps/undici/undici:6981:31)  at FetchRequest.json (node:internal/deps/undici/undici:6909:18) at /workspace/niko/agent-platform/frontend/src/msw/handlers/container-registries.ts:44:32 at file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:176:26 at HttpHandler.run (file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:142:35)  at processTicksAndRejections (node:internal/process/task_queues:104:5) at executeHandlers (file:///workspace/node_modules/msw/lib/core/utils/executeHandlers.mjs:11:14) at until (file:///workspace/node_modules/until-async/lib/index.js:14:17) at InterceptorHttpNetworkFrame.resolve (file:///workspace/node_modules/msw/lib/core/experimental/frames/http-frame.mjs:81:41) at Emitter. (file:///workspace/node_modules/msw/lib/core/experimental/define-network.mjs:80:11) [MSW] Encountered an unhandled exception during the handler lookup for "POST http://localhost:3000/api/v1/container-registries". Please see the original error above. stderr | src/msw/__tests__/container-registries-handler.test.ts > containerRegistryHandlers — create validation mirroring the API > POST without url returns 422 url is required TypeError: Body is unusable: Body has already been read  at consumeBody (node:internal/deps/undici/undici:6981:31)  at FetchRequest.json (node:internal/deps/undici/undici:6909:18) at /workspace/niko/agent-platform/frontend/src/msw/handlers/container-registries.ts:44:32 at file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:176:26 at HttpHandler.run (file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:142:35)  at processTicksAndRejections (node:internal/process/task_queues:104:5) at executeHandlers (file:///workspace/node_modules/msw/lib/core/utils/executeHandlers.mjs:11:14) at until (file:///workspace/node_modules/until-async/lib/index.js:14:17) at InterceptorHttpNetworkFrame.resolve (file:///workspace/node_modules/msw/lib/core/experimental/frames/http-frame.mjs:81:41) at Emitter. (file:///workspace/node_modules/msw/lib/core/experimental/define-network.mjs:80:11) [MSW] Encountered an unhandled exception during the handler lookup for "POST http://localhost:3000/api/v1/container-registries". Please see the original error above. stderr | src/msw/__tests__/container-registries-handler.test.ts > containerRegistryHandlers — create validation mirroring the API > POST with a URL missing scheme or host returns 422 TypeError: Body is unusable: Body has already been read  at consumeBody (node:internal/deps/undici/undici:6981:31)  at FetchRequest.json (node:internal/deps/undici/undici:6909:18) at /workspace/niko/agent-platform/frontend/src/msw/handlers/container-registries.ts:44:32 at file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:176:26 at HttpHandler.run (file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:142:35)  at processTicksAndRejections (node:internal/process/task_queues:104:5) at executeHandlers (file:///workspace/node_modules/msw/lib/core/utils/executeHandlers.mjs:11:14) at until (file:///workspace/node_modules/until-async/lib/index.js:14:17) at InterceptorHttpNetworkFrame.resolve (file:///workspace/node_modules/msw/lib/core/experimental/frames/http-frame.mjs:81:41) at Emitter. (file:///workspace/node_modules/msw/lib/core/experimental/define-network.mjs:80:11) [MSW] Encountered an unhandled exception during the handler lookup for "POST http://localhost:3000/api/v1/container-registries". Please see the original error above. stderr | src/msw/__tests__/container-registries-handler.test.ts > containerRegistryHandlers — create validation mirroring the API > POST with an invalid URL string returns 422 TypeError: Body is unusable: Body has already been read  at consumeBody (node:internal/deps/undici/undici:6981:31)  at FetchRequest.json (node:internal/deps/undici/undici:6909:18) at /workspace/niko/agent-platform/frontend/src/msw/handlers/container-registries.ts:44:32 at file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:176:26 at HttpHandler.run (file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:142:35)  at processTicksAndRejections (node:internal/process/task_queues:104:5) at executeHandlers (file:///workspace/node_modules/msw/lib/core/utils/executeHandlers.mjs:11:14) at until (file:///workspace/node_modules/until-async/lib/index.js:14:17) at InterceptorHttpNetworkFrame.resolve (file:///workspace/node_modules/msw/lib/core/experimental/frames/http-frame.mjs:81:41) at Emitter. (file:///workspace/node_modules/msw/lib/core/experimental/define-network.mjs:80:11) [MSW] Encountered an unhandled exception during the handler lookup for "POST http://localhost:3000/api/v1/container-registries". Please see the original error above. ✓ src/msw/__tests__/container-registries-handler.test.ts > containerRegistryHandlers — list & get > GET by unknown id returns 404 with the API message 51ms ✓ src/msw/__tests__/container-registries-handler.test.ts > containerRegistryHandlers — create validation mirroring the API > POST with too-short name returns 422 42ms ✓ src/msw/__tests__/container-registries-handler.test.ts > containerRegistryHandlers — create validation mirroring the API > POST with too-long name returns 422 65ms ✓ src/msw/__tests__/container-registries-handler.test.ts > containerRegistryHandlers — create validation mirroring the API > POST without name returns 422 name is required 66ms ✓ src/msw/__tests__/container-registries-handler.test.ts > containerRegistryHandlers — create validation mirroring the API > POST without url returns 422 url is required 20ms ✓ src/features/pipelines/laneLint.test.ts > laneLint > root and vikunja strictness > errors on an undeclared root key 2ms ✓ src/features/pipelines/laneLint.test.ts > laneLint > root and vikunja strictness > errors on a non-object vikunja value 4ms ✓ src/features/pipelines/laneLint.test.ts > laneLint > root and vikunja strictness > errors on an undeclared vikunja key 2ms ✓ src/features/pipelines/laneLint.test.ts > laneLint > root and vikunja strictness > collects root and vikunja errors together 2ms ✓ src/features/pipelines/laneLint.test.ts > laneLint > root and vikunja strictness > keeps reporting lane issues when root and vikunja keys are clean 8ms ✓ src/features/pipelines/laneLint.test.ts > laneLint > lanes structure > errors when lanes is not an object 5ms ✓ src/features/pipelines/laneLint.test.ts > laneLint > lanes structure > errors on unknown lane keys 2ms ✓ src/features/pipelines/laneLint.test.ts > laneLint > start lane > errors when start is missing 1ms ✓ src/features/pipelines/laneLint.test.ts > laneLint > start lane > errors when start is empty 7ms ✓ src/features/pipelines/laneLint.test.ts > laneLint > start lane > errors when start is not an array 1ms ✓ src/features/pipelines/laneLint.test.ts > laneLint > start lane > rejects string literals inside start 2ms ✓ src/features/pipelines/laneLint.test.ts > laneLint > start lane > rejects non-positive start elements 2ms ✓ src/features/pipelines/laneLint.test.ts > laneLint > start lane > rejects non-integer start elements 1ms ✓ src/features/pipelines/laneLint.test.ts > laneLint > start lane > errors on duplicate bucket ids within start 1ms ✓ src/features/pipelines/laneLint.test.ts > laneLint > start lane > errors on duplicate bucket ids across lanes 1ms ✓ src/features/pipelines/laneLint.test.ts > laneLint > start lane > errors on duplicate bucket ids across two optional lanes 1ms ✓ src/features/pipelines/laneLint.test.ts > laneLint > optional lanes > rejects string literals for optional lanes 1ms ✓ src/features/pipelines/laneLint.test.ts > laneLint > optional lanes > rejects non-positive optional lane values 1ms ✓ src/features/pipelines/laneLint.test.ts > laneLint > optional lanes > emits exactly eight warnings in fixed order when only start is configured 2ms ✓ src/features/pipelines/laneLint.test.ts > laneLint > optional lanes > combines errors and warnings (unknown key + missing optional lanes) 8ms ✓ src/shared/components/YamlEditor.test.tsx > YamlEditor > rendering > renders no lint output when lint returns no issues 41ms stderr | src/msw/__tests__/container-registries-handler.test.ts > containerRegistryHandlers — create validation mirroring the API > POST with an existing name returns 409 TypeError: Body is unusable: Body has already been read  at consumeBody (node:internal/deps/undici/undici:6981:31)  at FetchRequest.json (node:internal/deps/undici/undici:6909:18) at /workspace/niko/agent-platform/frontend/src/msw/handlers/container-registries.ts:44:32 at file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:176:26 at HttpHandler.run (file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:142:35)  at processTicksAndRejections (node:internal/process/task_queues:104:5) at executeHandlers (file:///workspace/node_modules/msw/lib/core/utils/executeHandlers.mjs:11:14) at until (file:///workspace/node_modules/until-async/lib/index.js:14:17) at InterceptorHttpNetworkFrame.resolve (file:///workspace/node_modules/msw/lib/core/experimental/frames/http-frame.mjs:81:41) at Emitter. (file:///workspace/node_modules/msw/lib/core/experimental/define-network.mjs:80:11) [MSW] Encountered an unhandled exception during the handler lookup for "POST http://localhost:3000/api/v1/container-registries". Please see the original error above. ✓ src/shared/components/YamlEditor.test.tsx > YamlEditor > rendering > renders a help block below the editor when help is provided 113ms ✓ src/shared/components/YamlEditor.test.tsx > YamlEditor > rendering > renders nested children indented inside the help block 58ms stderr | src/msw/__tests__/container-registries-handler.test.ts > containerRegistryHandlers — create validation mirroring the API > POST with valid payload returns 201 with the created registry (no token echo) TypeError: Body is unusable: Body has already been read  at consumeBody (node:internal/deps/undici/undici:6981:31)  at FetchRequest.json (node:internal/deps/undici/undici:6909:18) at /workspace/niko/agent-platform/frontend/src/msw/handlers/container-registries.ts:44:32 at file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:176:26 at HttpHandler.run (file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:142:35)  at processTicksAndRejections (node:internal/process/task_queues:104:5) at executeHandlers (file:///workspace/node_modules/msw/lib/core/utils/executeHandlers.mjs:11:14) at until (file:///workspace/node_modules/until-async/lib/index.js:14:17) at InterceptorHttpNetworkFrame.resolve (file:///workspace/node_modules/msw/lib/core/experimental/frames/http-frame.mjs:81:41) at Emitter. (file:///workspace/node_modules/msw/lib/core/experimental/define-network.mjs:80:11) [MSW] Encountered an unhandled exception during the handler lookup for "POST http://localhost:3000/api/v1/container-registries". Please see the original error above. ✓ src/msw/__tests__/container-registries-handler.test.ts > containerRegistryHandlers — create validation mirroring the API > POST with a URL missing scheme or host returns 422 17ms ✓ src/msw/__tests__/container-registries-handler.test.ts > containerRegistryHandlers — create validation mirroring the API > POST with an invalid URL string returns 422 20ms ✓ src/msw/__tests__/container-registries-handler.test.ts > containerRegistryHandlers — create validation mirroring the API > POST with an existing name returns 409 65ms ✓ src/shared/components/YamlEditor.test.tsx > YamlEditor > rendering > renders the required marker on required keys 48ms ✓ src/shared/components/YamlEditor.test.tsx > YamlEditor > rendering > renders no help block when help is undefined 64ms ✓ src/shared/components/YamlEditor.test.tsx > YamlEditor > rendering > renders key descriptions inside the help block 82ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > failure and loading states > retry button calls failure.retry 641ms stderr | src/msw/__tests__/container-registries-handler.test.ts > containerRegistryHandlers — create validation mirroring the API > POST without username stores null TypeError: Body is unusable: Body has already been read  at consumeBody (node:internal/deps/undici/undici:6981:31)  at FetchRequest.json (node:internal/deps/undici/undici:6909:18) at /workspace/niko/agent-platform/frontend/src/msw/handlers/container-registries.ts:44:32 at file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:176:26 at HttpHandler.run (file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:142:35)  at processTicksAndRejections (node:internal/process/task_queues:104:5) at executeHandlers (file:///workspace/node_modules/msw/lib/core/utils/executeHandlers.mjs:11:14) at until (file:///workspace/node_modules/until-async/lib/index.js:14:17) at InterceptorHttpNetworkFrame.resolve (file:///workspace/node_modules/msw/lib/core/experimental/frames/http-frame.mjs:81:41) at Emitter. (file:///workspace/node_modules/msw/lib/core/experimental/define-network.mjs:80:11) [MSW] Encountered an unhandled exception during the handler lookup for "POST http://localhost:3000/api/v1/container-registries". Please see the original error above. ✓ src/msw/__tests__/container-registries-handler.test.ts > containerRegistryHandlers — create validation mirroring the API > POST with valid payload returns 201 with the created registry (no token echo) 57ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > failure and loading states > renders loading state when pending 536ms ✓ src/shared/components/YamlEditor.test.tsx > YamlEditor > rendering > renders no help block when help is an empty array 104ms ✓ src/msw/__tests__/container-registries-handler.test.ts > containerRegistryHandlers — create validation mirroring the API > POST without username stores null 285ms stderr | src/msw/__tests__/container-registries-handler.test.ts > containerRegistryHandlers — update & delete > PUT updates fields and returns the updated registry TypeError: Body is unusable: Body has already been read  at consumeBody (node:internal/deps/undici/undici:6981:31)  at FetchRequest.json (node:internal/deps/undici/undici:6909:18) at /workspace/niko/agent-platform/frontend/src/msw/handlers/container-registries.ts:88:32 at file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:176:26 at HttpHandler.run (file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:142:35)  at processTicksAndRejections (node:internal/process/task_queues:104:5) at executeHandlers (file:///workspace/node_modules/msw/lib/core/utils/executeHandlers.mjs:11:14) at until (file:///workspace/node_modules/until-async/lib/index.js:14:17) at InterceptorHttpNetworkFrame.resolve (file:///workspace/node_modules/msw/lib/core/experimental/frames/http-frame.mjs:81:41) at Emitter. (file:///workspace/node_modules/msw/lib/core/experimental/define-network.mjs:80:11) [MSW] Encountered an unhandled exception during the handler lookup for "PUT http://localhost:3000/api/v1/container-registries/registry-3". Please see the original error above. ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > closeIntent > calls onSuccess when closeIntent is success 175ms ✓ src/msw/__tests__/container-registries-handler.test.ts > containerRegistryHandlers — update & delete > PUT updates fields and returns the updated registry 489ms stderr | src/msw/__tests__/container-registries-handler.test.ts > containerRegistryHandlers — update & delete > PUT to an unknown id returns 404 TypeError: Body is unusable: Body has already been read  at consumeBody (node:internal/deps/undici/undici:6981:31)  at FetchRequest.json (node:internal/deps/undici/undici:6909:18) at /workspace/niko/agent-platform/frontend/src/msw/handlers/container-registries.ts:88:32 at file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:176:26 at HttpHandler.run (file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:142:35)  at processTicksAndRejections (node:internal/process/task_queues:104:5) at executeHandlers (file:///workspace/node_modules/msw/lib/core/utils/executeHandlers.mjs:11:14) at until (file:///workspace/node_modules/until-async/lib/index.js:14:17) at InterceptorHttpNetworkFrame.resolve (file:///workspace/node_modules/msw/lib/core/experimental/frames/http-frame.mjs:81:41) at Emitter. (file:///workspace/node_modules/msw/lib/core/experimental/define-network.mjs:80:11) [MSW] Encountered an unhandled exception during the handler lookup for "PUT http://localhost:3000/api/v1/container-registries/registry-does-not-exist". Please see the original error above. ✓ src/shared/components/YamlEditor.test.tsx > YamlEditor > interaction > calls onChange with the mutated YAML string 399ms ✓ src/msw/__tests__/container-registries-handler.test.ts > containerRegistryHandlers — update & delete > PUT to an unknown id returns 404 255ms stderr | src/msw/__tests__/container-registries-handler.test.ts > containerRegistryHandlers — update & delete > PUT with a too-short name returns 422 TypeError: Body is unusable: Body has already been read  at consumeBody (node:internal/deps/undici/undici:6981:31)  at FetchRequest.json (node:internal/deps/undici/undici:6909:18) at /workspace/niko/agent-platform/frontend/src/msw/handlers/container-registries.ts:88:32 at file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:176:26 at HttpHandler.run (file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:142:35)  at processTicksAndRejections (node:internal/process/task_queues:104:5) at executeHandlers (file:///workspace/node_modules/msw/lib/core/utils/executeHandlers.mjs:11:14) at until (file:///workspace/node_modules/until-async/lib/index.js:14:17) at InterceptorHttpNetworkFrame.resolve (file:///workspace/node_modules/msw/lib/core/experimental/frames/http-frame.mjs:81:41) at Emitter. (file:///workspace/node_modules/msw/lib/core/experimental/define-network.mjs:80:11) [MSW] Encountered an unhandled exception during the handler lookup for "PUT http://localhost:3000/api/v1/container-registries/registry-1". Please see the original error above. ✓ src/shared/components/YamlEditor.test.tsx > YamlEditor > interaction > shows error on invalid YAML 472ms ✓ src/msw/__tests__/container-registries-handler.test.ts > containerRegistryHandlers — update & delete > PUT with a too-short name returns 422 141ms stderr | src/msw/__tests__/container-registries-handler.test.ts > containerRegistryHandlers — update & delete > PUT with an invalid URL returns 422 TypeError: Body is unusable: Body has already been read  at consumeBody (node:internal/deps/undici/undici:6981:31)  at FetchRequest.json (node:internal/deps/undici/undici:6909:18) at /workspace/niko/agent-platform/frontend/src/msw/handlers/container-registries.ts:88:32 at file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:176:26 at HttpHandler.run (file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:142:35)  at processTicksAndRejections (node:internal/process/task_queues:104:5) at executeHandlers (file:///workspace/node_modules/msw/lib/core/utils/executeHandlers.mjs:11:14) at until (file:///workspace/node_modules/until-async/lib/index.js:14:17) at InterceptorHttpNetworkFrame.resolve (file:///workspace/node_modules/msw/lib/core/experimental/frames/http-frame.mjs:81:41) at Emitter. (file:///workspace/node_modules/msw/lib/core/experimental/define-network.mjs:80:11) [MSW] Encountered an unhandled exception during the handler lookup for "PUT http://localhost:3000/api/v1/container-registries/registry-1". Please see the original error above. ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > closeIntent > calls onClose when closeIntent is cancel 456ms ✓ src/shared/components/YamlEditor.test.tsx > YamlEditor > interaction > clears error on valid YAML 213ms ✓ src/msw/__tests__/container-registries-handler.test.ts > containerRegistryHandlers — update & delete > PUT with an invalid URL returns 422 177ms stderr | src/msw/__tests__/container-registries-handler.test.ts > containerRegistryHandlers — update & delete > PUT renaming onto an existing name returns 409 TypeError: Body is unusable: Body has already been read  at consumeBody (node:internal/deps/undici/undici:6981:31)  at FetchRequest.json (node:internal/deps/undici/undici:6909:18) at /workspace/niko/agent-platform/frontend/src/msw/handlers/container-registries.ts:88:32 at file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:176:26 at HttpHandler.run (file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:142:35)  at processTicksAndRejections (node:internal/process/task_queues:104:5) at executeHandlers (file:///workspace/node_modules/msw/lib/core/utils/executeHandlers.mjs:11:14) at until (file:///workspace/node_modules/until-async/lib/index.js:14:17) at InterceptorHttpNetworkFrame.resolve (file:///workspace/node_modules/msw/lib/core/experimental/frames/http-frame.mjs:81:41) at Emitter. (file:///workspace/node_modules/msw/lib/core/experimental/define-network.mjs:80:11) [MSW] Encountered an unhandled exception during the handler lookup for "PUT http://localhost:3000/api/v1/container-registries/registry-4". Please see the original error above. ✓ src/shared/components/YamlEditor.test.tsx > YamlEditor > interaction > clears error when textarea is emptied 174ms ✓ src/msw/__tests__/container-registries-handler.test.ts > containerRegistryHandlers — update & delete > PUT renaming onto an existing name returns 409 218ms stderr | src/msw/__tests__/container-registries-handler.test.ts > containerRegistryHandlers — update & delete > PUT with no fields to update returns 422 TypeError: Body is unusable: Body has already been read  at consumeBody (node:internal/deps/undici/undici:6981:31)  at FetchRequest.json (node:internal/deps/undici/undici:6909:18) at /workspace/niko/agent-platform/frontend/src/msw/handlers/container-registries.ts:88:32 at file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:176:26 at HttpHandler.run (file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:142:35)  at processTicksAndRejections (node:internal/process/task_queues:104:5) at executeHandlers (file:///workspace/node_modules/msw/lib/core/utils/executeHandlers.mjs:11:14) at until (file:///workspace/node_modules/until-async/lib/index.js:14:17) at InterceptorHttpNetworkFrame.resolve (file:///workspace/node_modules/msw/lib/core/experimental/frames/http-frame.mjs:81:41) at Emitter. (file:///workspace/node_modules/msw/lib/core/experimental/define-network.mjs:80:11) [MSW] Encountered an unhandled exception during the handler lookup for "PUT http://localhost:3000/api/v1/container-registries/registry-4". Please see the original error above. ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > user interactions > Save button triggers snapshot.submit 568ms ✓ src/shared/components/YamlEditor.test.tsx > YamlEditor > interaction > re-evaluates lint results when the value changes 317ms ✓ src/shared/components/YamlEditor.test.tsx > YamlEditor > interaction > calls lint with parsed object and raw string 34ms ✓ src/shared/components/YamlEditor.test.tsx > YamlEditor > interaction > does not call lint when YAML is syntactically invalid 38ms ✓ src/msw/__tests__/container-registries-handler.test.ts > containerRegistryHandlers — update & delete > PUT with no fields to update returns 422 285ms ✓ src/shared/components/YamlEditor.test.tsx > YamlEditor > interaction > shows syntax error only when no lint prop is provided 200ms ✓ src/shared/components/YamlEditor.test.tsx > YamlEditor > interaction > syntax error blocks lint result rendering 148ms ✓ src/msw/__tests__/container-registries-handler.test.ts > containerRegistryHandlers — update & delete > DELETE removes the registry (204) and subsequent GET returns 404 297ms ✓ src/msw/__tests__/container-registries-handler.test.ts > containerRegistryHandlers — update & delete > DELETE of an unknown id returns 404 192ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > user interactions > updateField is called when input value changes 634ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > user interactions > dirty guard > calls cancel directly when dirty=false on Cancel click 1024ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > user interactions > dirty guard > opens DiscardDialog when dirty=true on Cancel click 1167ms ✓ src/layers/__tests__/L2R/FilterBar.test.tsx > FilterBar > renders filter legends for all filter types 2072ms (node:462) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) ✓ src/layers/__tests__/L2R/FilterBar.test.tsx > FilterBar > does not render clear button when no active filters 411ms ✓ src/layers/__tests__/L2R/FilterBar.test.tsx > FilterBar > renders clear button when at least one filter is active 406ms ✓ src/layers/__tests__/L2R/FilterBar.test.tsx > FilterBar > calls onClear when clear button is clicked 799ms ✓ src/layers/__tests__/L2R/FilterBar.test.tsx > FilterBar — multi-select > renders all options 73ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > user interactions > dirty guard > Discard in modal DiscardDialog calls cancel 1470ms ✓ src/layers/__tests__/L2R/FilterBar.test.tsx > FilterBar — multi-select > calls onChange when an option is clicked 574ms ✓ src/layers/__tests__/L2R/FilterBar.test.tsx > FilterBar — multi-select > toggles option off when already active 559ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > user interactions > dirty guard > Keep Editing in modal DiscardDialog does not call cancel 2048ms ✓ src/layers/__tests__/L2R/FilterBar.test.tsx > FilterBar — multi-select > calls onChange with undefined when last option deselected 487ms (node:477) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > overrides > renders custom title label 756ms ✓ src/layers/__tests__/L2R/FilterBar.test.tsx > FilterBar — multi-select > sets aria-label on option buttons 133ms ✓ src/layers/__tests__/L2R/FilterBar.test.tsx > FilterBar — select > renders all options plus "All" default 116ms ✓ src/shared/hooks/useSSE.test.ts > useSSE > 1. opens EventSource on mount: connecting → connected 934ms ✓ src/shared/hooks/useSSE.test.ts > useSSE > 2. closes EventSource on unmount 13ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > overrides > renders custom error fragment 363ms ✓ src/shared/hooks/useSSE.test.ts > useSSE > 3. entity.created → onEvent({ type: "created", data }) 227ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > overrides > renders custom loading fragment 1230ms ✓ src/shared/hooks/useSSE.test.ts > useSSE > 4. entity.updated → onEvent({ type: "updated", data }) 173ms ✓ src/layers/__tests__/L2R/FilterBar.test.tsx > FilterBar — select > calls onChange with selected value 1117ms ✓ src/shared/hooks/useSSE.test.ts > useSSE > 5. exponential backoff: 1s → 2s → 4s 316ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > overrides > renders fields in custom order 258ms ✓ src/shared/hooks/useSSE.test.ts > useSSE > 6. 5 consecutive failures → connection-lost + onConnectionLost 139ms ✓ src/shared/hooks/useSSE.test.ts > useSSE > 7. successful reconnect resets backoff to 1s 173ms ✓ src/shared/hooks/useSSE.test.ts > useSSE > 8. reconnect() manually reopens EventSource 228ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > field types > renders text input by default 407ms ✓ src/shared/hooks/useSSE.test.ts > useSSE > 9. heartbeat (: heartbeat) does not trigger onEvent 212ms ✓ src/shared/hooks/useSSE.test.ts > useSSE > 10. url change closes old EventSource and opens new one 45ms ✓ src/layers/__tests__/L2R/FilterBar.test.tsx > FilterBar — select > calls onChange with undefined when "All" is selected 1026ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > field types > renders text input for type text 330ms ✓ src/layers/__tests__/L2R/FilterBar.test.tsx > FilterBar — select > preselects the current value 375ms ✓ src/layers/__tests__/L2R/FilterBar.test.tsx > FilterBar — date-range > renders preset options 58ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > field types > renders textarea for type textarea 390ms (node:470) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:490) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) ✓ src/layers/__tests__/L2R/FilterBar.test.tsx > FilterBar — date-range > calls onChange when a preset is clicked 280ms (node:509) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > field types > renders password input for type password 333ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > field types > renders checkbox for type checkbox 183ms ✓ src/layers/__tests__/L2W/coordinatorFK.test.tsx > coordinator FK refresh (§7 DoD-3) > calls refetchQueries when activeCrud is truthy 146ms ✓ src/layers/__tests__/L2W/coordinatorFK.test.tsx > coordinator FK refresh (§7 DoD-3) > calls refetchQueries for each entitySelectSource with cancelRefetch: false 27ms ✓ src/layers/__tests__/L2R/FilterBar.test.tsx > FilterBar — date-range > calls onChange with undefined when active preset is clicked again 416ms (node:483) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) ✓ src/layers/__tests__/L2W/coordinatorFK.test.tsx > coordinator FK refresh (§7 DoD-3) > does NOT call refetchQueries when activeCrud is null (no modal) 72ms ✓ src/layers/__tests__/L2R/FilterBar.test.tsx > FilterBar — integration > clear button appears when any filter type has a value 248ms ✓ src/layers/__tests__/L2R/FilterBar.test.tsx > FilterBar — integration > combines multiple active filters 122ms ✓ src/layers/__tests__/L2W/coordinatorFK.test.tsx > coordinator FK refresh (§7 DoD-3) > does NOT call refetchQueries when entitySelectSources is empty 192ms ✓ src/layers/__tests__/L2W/coordinatorFK.test.tsx > coordinator FK refresh (§7 DoD-3) > does NOT call refetchQueries when crud owner does not match 298ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > field types > renders entity-select for type entity-select 351ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > field types > renders kv-editor for type kv-editor 848ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > field types > renders yaml editor for type yaml 173ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > field types > passes the field lint from fieldLints into the yaml editor 131ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > field types > renders lint warnings in amber when fieldLints returns warnings only 602ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > field types > renders yaml editor as static text when not editable 290ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > field types > passes the field help from fieldHelp into the yaml editor 131ms 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/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > field types > renders no help block when the yaml field has no fieldHelp entry 113ms ✓ src/shared/hooks/useFilterState.test.tsx > useFilterState > 1. prefix prepends prefix to URL params 1006ms (node:498) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) ✓ src/shared/hooks/useFilterState.test.tsx > useFilterState > 2. setFilter merges, does not replace other params 330ms stderr | src/msw/__tests__/pipelines-handler.test.ts > pipelineHandlers — skill_repos FK semantics > resolves submitted ordered repository ids into joined refs on create TypeError: Body is unusable: Body has already been read  at consumeBody (node:internal/deps/undici/undici:6981:31)  at FetchRequest.json (node:internal/deps/undici/undici:6909:18) at /workspace/niko/agent-platform/frontend/src/msw/handlers/pipelines.ts:61:33 at file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:176:26 at HttpHandler.run (file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:142:35)  at processTicksAndRejections (node:internal/process/task_queues:104:5) at executeHandlers (file:///workspace/node_modules/msw/lib/core/utils/executeHandlers.mjs:11:14) at until (file:///workspace/node_modules/until-async/lib/index.js:14:17) at InterceptorHttpNetworkFrame.resolve (file:///workspace/node_modules/msw/lib/core/experimental/frames/http-frame.mjs:81:41) at Emitter. (file:///workspace/node_modules/msw/lib/core/experimental/define-network.mjs:80:11) [MSW] Encountered an unhandled exception during the handler lookup for "POST http://localhost:3000/api/v1/projects/proj-1/pipelines". Please see the original error above. stderr | src/msw/__tests__/pipelines-handler.test.ts > pipelineHandlers — skill_repos FK semantics > PUT with an ordered id array round-trips the refs in the submitted order TypeError: Body is unusable: Body has already been read  at consumeBody (node:internal/deps/undici/undici:6981:31)  at FetchRequest.json (node:internal/deps/undici/undici:6909:18) at /workspace/niko/agent-platform/frontend/src/msw/handlers/pipelines.ts:77:33 at file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:176:26 at HttpHandler.run (file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:142:35)  at processTicksAndRejections (node:internal/process/task_queues:104:5) at executeHandlers (file:///workspace/node_modules/msw/lib/core/utils/executeHandlers.mjs:11:14) at until (file:///workspace/node_modules/until-async/lib/index.js:14:17) at InterceptorHttpNetworkFrame.resolve (file:///workspace/node_modules/msw/lib/core/experimental/frames/http-frame.mjs:81:41) at Emitter. (file:///workspace/node_modules/msw/lib/core/experimental/define-network.mjs:80:11) [MSW] Encountered an unhandled exception during the handler lookup for "PUT http://localhost:3000/api/v1/pipelines/pipeline-proj-1-1". Please see the original error above. ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > field validation > does not show a pattern error for an empty value on a non-required field 412ms ✓ src/shared/hooks/useFilterState.test.tsx > useFilterState > 3. clearFilters removes filters, preserves sort defaults in memory 303ms stderr | src/msw/__tests__/pipelines-handler.test.ts > pipelineHandlers — skill_repos FK semantics > PUT with [] clears skill repos TypeError: Body is unusable: Body has already been read  at consumeBody (node:internal/deps/undici/undici:6981:31)  at FetchRequest.json (node:internal/deps/undici/undici:6909:18) at /workspace/niko/agent-platform/frontend/src/msw/handlers/pipelines.ts:77:33 at file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:176:26 at HttpHandler.run (file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:142:35)  at processTicksAndRejections (node:internal/process/task_queues:104:5) at executeHandlers (file:///workspace/node_modules/msw/lib/core/utils/executeHandlers.mjs:11:14) at until (file:///workspace/node_modules/until-async/lib/index.js:14:17) at InterceptorHttpNetworkFrame.resolve (file:///workspace/node_modules/msw/lib/core/experimental/frames/http-frame.mjs:81:41) at Emitter. (file:///workspace/node_modules/msw/lib/core/experimental/define-network.mjs:80:11) [MSW] Encountered an unhandled exception during the handler lookup for "PUT http://localhost:3000/api/v1/pipelines/pipeline-proj-1-1". Please see the original error above. stderr | src/msw/__tests__/pipelines-handler.test.ts > pipelineHandlers — skill_repos FK semantics > PUT with null keeps existing skill repos untouched TypeError: Body is unusable: Body has already been read  at consumeBody (node:internal/deps/undici/undici:6981:31)  at FetchRequest.json (node:internal/deps/undici/undici:6909:18) at /workspace/niko/agent-platform/frontend/src/msw/handlers/pipelines.ts:77:33 at file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:176:26 at HttpHandler.run (file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:142:35)  at processTicksAndRejections (node:internal/process/task_queues:104:5) at executeHandlers (file:///workspace/node_modules/msw/lib/core/utils/executeHandlers.mjs:11:14) at until (file:///workspace/node_modules/until-async/lib/index.js:14:17) at InterceptorHttpNetworkFrame.resolve (file:///workspace/node_modules/msw/lib/core/experimental/frames/http-frame.mjs:81:41) at Emitter. (file:///workspace/node_modules/msw/lib/core/experimental/define-network.mjs:80:11) [MSW] Encountered an unhandled exception during the handler lookup for "PUT http://localhost:3000/api/v1/pipelines/pipeline-proj-1-1". Please see the original error above. ✓ src/msw/__tests__/pipelines-handler.test.ts > pipelineHandlers — skill_repos FK semantics > resolves submitted ordered repository ids into joined refs on create 182ms ✓ src/msw/__tests__/pipelines-handler.test.ts > pipelineHandlers — skill_repos FK semantics > PUT with an ordered id array round-trips the refs in the submitted order 47ms ✓ src/msw/__tests__/pipelines-handler.test.ts > pipelineHandlers — skill_repos FK semantics > PUT with [] clears skill repos 27ms stderr | src/msw/__tests__/pipelines-handler.test.ts > pipelineHandlers — skill_repos FK semantics > PUT with null keeps existing skill repos untouched TypeError: Body is unusable: Body has already been read  at consumeBody (node:internal/deps/undici/undici:6981:31)  at FetchRequest.json (node:internal/deps/undici/undici:6909:18) at /workspace/niko/agent-platform/frontend/src/msw/handlers/pipelines.ts:77:33 at file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:176:26 at HttpHandler.run (file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:142:35)  at processTicksAndRejections (node:internal/process/task_queues:104:5) at executeHandlers (file:///workspace/node_modules/msw/lib/core/utils/executeHandlers.mjs:11:14) at until (file:///workspace/node_modules/until-async/lib/index.js:14:17) at InterceptorHttpNetworkFrame.resolve (file:///workspace/node_modules/msw/lib/core/experimental/frames/http-frame.mjs:81:41) at Emitter. (file:///workspace/node_modules/msw/lib/core/experimental/define-network.mjs:80:11) [MSW] Encountered an unhandled exception during the handler lookup for "PUT http://localhost:3000/api/v1/pipelines/pipeline-proj-1-1". Please see the original error above. stderr | src/msw/__tests__/pipelines-handler.test.ts > pipelineHandlers — skill_repos FK semantics > PUT without the skill_repos field leaves skill repos untouched TypeError: Body is unusable: Body has already been read  at consumeBody (node:internal/deps/undici/undici:6981:31)  at FetchRequest.json (node:internal/deps/undici/undici:6909:18) at /workspace/niko/agent-platform/frontend/src/msw/handlers/pipelines.ts:77:33 at file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:176:26 at HttpHandler.run (file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:142:35)  at processTicksAndRejections (node:internal/process/task_queues:104:5) at executeHandlers (file:///workspace/node_modules/msw/lib/core/utils/executeHandlers.mjs:11:14) at until (file:///workspace/node_modules/until-async/lib/index.js:14:17) at InterceptorHttpNetworkFrame.resolve (file:///workspace/node_modules/msw/lib/core/experimental/frames/http-frame.mjs:81:41) at Emitter. (file:///workspace/node_modules/msw/lib/core/experimental/define-network.mjs:80:11) [MSW] Encountered an unhandled exception during the handler lookup for "PUT http://localhost:3000/api/v1/pipelines/pipeline-proj-1-1". Please see the original error above. stderr | src/msw/__tests__/pipelines-handler.test.ts > pipelineHandlers — config lane lint conformance > PUT with a string config returns 422 config must be a JSON object TypeError: Body is unusable: Body has already been read  at consumeBody (node:internal/deps/undici/undici:6981:31)  at FetchRequest.json (node:internal/deps/undici/undici:6909:18) at /workspace/niko/agent-platform/frontend/src/msw/handlers/pipelines.ts:77:33 at file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:176:26 at HttpHandler.run (file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:142:35)  at processTicksAndRejections (node:internal/process/task_queues:104:5) at executeHandlers (file:///workspace/node_modules/msw/lib/core/utils/executeHandlers.mjs:11:14) at until (file:///workspace/node_modules/until-async/lib/index.js:14:17) at InterceptorHttpNetworkFrame.resolve (file:///workspace/node_modules/msw/lib/core/experimental/frames/http-frame.mjs:81:41) at Emitter. (file:///workspace/node_modules/msw/lib/core/experimental/define-network.mjs:80:11) [MSW] Encountered an unhandled exception during the handler lookup for "PUT http://localhost:3000/api/v1/pipelines/pipeline-proj-1-1". Please see the original error above. stderr | src/msw/__tests__/pipelines-handler.test.ts > pipelineHandlers — config lane lint conformance > PUT with an array config returns 422 TypeError: Body is unusable: Body has already been read  at consumeBody (node:internal/deps/undici/undici:6981:31)  at FetchRequest.json (node:internal/deps/undici/undici:6909:18) at /workspace/niko/agent-platform/frontend/src/msw/handlers/pipelines.ts:77:33 at file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:176:26 at HttpHandler.run (file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:142:35)  at processTicksAndRejections (node:internal/process/task_queues:104:5) at executeHandlers (file:///workspace/node_modules/msw/lib/core/utils/executeHandlers.mjs:11:14) at until (file:///workspace/node_modules/until-async/lib/index.js:14:17) at InterceptorHttpNetworkFrame.resolve (file:///workspace/node_modules/msw/lib/core/experimental/frames/http-frame.mjs:81:41) at Emitter. (file:///workspace/node_modules/msw/lib/core/experimental/define-network.mjs:80:11) [MSW] Encountered an unhandled exception during the handler lookup for "PUT http://localhost:3000/api/v1/pipelines/pipeline-proj-1-1". Please see the original error above. stderr | src/msw/__tests__/pipelines-handler.test.ts > pipelineHandlers — config lane lint conformance > PUT with lane-lint error config returns 422 with the error issues TypeError: Body is unusable: Body has already been read  at consumeBody (node:internal/deps/undici/undici:6981:31)  at FetchRequest.json (node:internal/deps/undici/undici:6909:18) at /workspace/niko/agent-platform/frontend/src/msw/handlers/pipelines.ts:77:33 at file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:176:26 at HttpHandler.run (file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:142:35)  at processTicksAndRejections (node:internal/process/task_queues:104:5) at executeHandlers (file:///workspace/node_modules/msw/lib/core/utils/executeHandlers.mjs:11:14) at until (file:///workspace/node_modules/until-async/lib/index.js:14:17) at InterceptorHttpNetworkFrame.resolve (file:///workspace/node_modules/msw/lib/core/experimental/frames/http-frame.mjs:81:41) at Emitter. (file:///workspace/node_modules/msw/lib/core/experimental/define-network.mjs:80:11) [MSW] Encountered an unhandled exception during the handler lookup for "PUT http://localhost:3000/api/v1/pipelines/pipeline-proj-1-1". Please see the original error above. ✓ src/msw/__tests__/pipelines-handler.test.ts > pipelineHandlers — skill_repos FK semantics > PUT with null keeps existing skill repos untouched 50ms ✓ src/msw/__tests__/pipelines-handler.test.ts > pipelineHandlers — skill_repos FK semantics > PUT without the skill_repos field leaves skill repos untouched 42ms ✓ src/msw/__tests__/pipelines-handler.test.ts > pipelineHandlers — config lane lint conformance > PUT with a string config returns 422 config must be a JSON object 35ms stderr | src/msw/__tests__/pipelines-handler.test.ts > pipelineHandlers — config lane lint conformance > PUT with warnings-only lanes config succeeds and stores the config TypeError: Body is unusable: Body has already been read  at consumeBody (node:internal/deps/undici/undici:6981:31)  at FetchRequest.json (node:internal/deps/undici/undici:6909:18) at /workspace/niko/agent-platform/frontend/src/msw/handlers/pipelines.ts:77:33 at file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:176:26 at HttpHandler.run (file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:142:35)  at processTicksAndRejections (node:internal/process/task_queues:104:5) at executeHandlers (file:///workspace/node_modules/msw/lib/core/utils/executeHandlers.mjs:11:14) at until (file:///workspace/node_modules/until-async/lib/index.js:14:17) at InterceptorHttpNetworkFrame.resolve (file:///workspace/node_modules/msw/lib/core/experimental/frames/http-frame.mjs:81:41) at Emitter. (file:///workspace/node_modules/msw/lib/core/experimental/define-network.mjs:80:11) [MSW] Encountered an unhandled exception during the handler lookup for "PUT http://localhost:3000/api/v1/pipelines/pipeline-proj-1-1". Please see the original error above. stderr | src/msw/__tests__/pipelines-handler.test.ts > pipelineHandlers — config lane lint conformance > PUT with a valid full lanes config succeeds TypeError: Body is unusable: Body has already been read  at consumeBody (node:internal/deps/undici/undici:6981:31)  at FetchRequest.json (node:internal/deps/undici/undici:6909:18) at /workspace/niko/agent-platform/frontend/src/msw/handlers/pipelines.ts:77:33 at file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:176:26 at HttpHandler.run (file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:142:35)  at processTicksAndRejections (node:internal/process/task_queues:104:5) at executeHandlers (file:///workspace/node_modules/msw/lib/core/utils/executeHandlers.mjs:11:14) at until (file:///workspace/node_modules/until-async/lib/index.js:14:17) at InterceptorHttpNetworkFrame.resolve (file:///workspace/node_modules/msw/lib/core/experimental/frames/http-frame.mjs:81:41) at Emitter. (file:///workspace/node_modules/msw/lib/core/experimental/define-network.mjs:80:11) [MSW] Encountered an unhandled exception during the handler lookup for "PUT http://localhost:3000/api/v1/pipelines/pipeline-proj-1-1". Please see the original error above. stderr | src/msw/__tests__/pipelines-handler.test.ts > pipelineHandlers — config lane lint conformance > POST with a valid lanes config returns 201 TypeError: Body is unusable: Body has already been read  at consumeBody (node:internal/deps/undici/undici:6981:31)  at FetchRequest.json (node:internal/deps/undici/undici:6909:18) at /workspace/niko/agent-platform/frontend/src/msw/handlers/pipelines.ts:61:33 at file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:176:26 at HttpHandler.run (file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:142:35)  at processTicksAndRejections (node:internal/process/task_queues:104:5) at executeHandlers (file:///workspace/node_modules/msw/lib/core/utils/executeHandlers.mjs:11:14) at until (file:///workspace/node_modules/until-async/lib/index.js:14:17) at InterceptorHttpNetworkFrame.resolve (file:///workspace/node_modules/msw/lib/core/experimental/frames/http-frame.mjs:81:41) at Emitter. (file:///workspace/node_modules/msw/lib/core/experimental/define-network.mjs:80:11) [MSW] Encountered an unhandled exception during the handler lookup for "POST http://localhost:3000/api/v1/projects/proj-1/pipelines". Please see the original error above. ✓ src/msw/__tests__/pipelines-handler.test.ts > pipelineHandlers — config lane lint conformance > PUT with an array config returns 422 21ms ✓ src/msw/__tests__/pipelines-handler.test.ts > pipelineHandlers — config lane lint conformance > PUT with lane-lint error config returns 422 with the error issues 27ms ✓ src/msw/__tests__/pipelines-handler.test.ts > pipelineHandlers — config lane lint conformance > PUT with warnings-only lanes config succeeds and stores the config 27ms ✓ src/msw/__tests__/pipelines-handler.test.ts > pipelineHandlers — config lane lint conformance > PUT with a valid full lanes config succeeds 30ms ✓ src/shared/hooks/useFilterState.test.tsx > useFilterState > 4. setSort cycles: asc → desc → none (returns to default) 343ms ✓ src/msw/__tests__/pipelines-handler.test.ts > pipelineHandlers — config lane lint conformance > POST with a valid lanes config returns 201 50ms stderr | src/msw/__tests__/pipelines-handler.test.ts > pipelineHandlers — config lane lint conformance > POST with lane-lint error config returns 422 TypeError: Body is unusable: Body has already been read  at consumeBody (node:internal/deps/undici/undici:6981:31)  at FetchRequest.json (node:internal/deps/undici/undici:6909:18) at /workspace/niko/agent-platform/frontend/src/msw/handlers/pipelines.ts:61:33 at file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:176:26 at HttpHandler.run (file:///workspace/node_modules/msw/lib/core/handlers/RequestHandler.mjs:142:35)  at processTicksAndRejections (node:internal/process/task_queues:104:5) at executeHandlers (file:///workspace/node_modules/msw/lib/core/utils/executeHandlers.mjs:11:14) at until (file:///workspace/node_modules/until-async/lib/index.js:14:17) at InterceptorHttpNetworkFrame.resolve (file:///workspace/node_modules/msw/lib/core/experimental/frames/http-frame.mjs:81:41) at Emitter. (file:///workspace/node_modules/msw/lib/core/experimental/define-network.mjs:80:11) [MSW] Encountered an unhandled exception during the handler lookup for "POST http://localhost:3000/api/v1/projects/proj-1/pipelines". Please see the original error above. (node:518) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) ✓ src/shared/hooks/useFilterState.test.tsx > useFilterState > setSort with explicit order 274ms ✓ src/shared/hooks/useFilterState.test.tsx > useFilterState > 5. clearFilters does NOT write sort defaults to URL 245ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > field validation > shows the patternMessage for an invalid non-empty value 992ms ✓ src/shared/hooks/useFilterState.test.tsx > useFilterState > 6. multiple prefixes do not collide 144ms ✓ src/shared/hooks/useFilterState.test.tsx > useFilterState > 7. arrays serialized as pipe-delimited 47ms ✓ src/shared/hooks/useFilterState.test.tsx > useFilterState > 8. undefined removes param entirely 157ms ✓ src/shared/hooks/useFilterState.test.tsx > useFilterState > getFilter returns current value for key 29ms ✓ src/msw/__tests__/pipelines-handler.test.ts > pipelineHandlers — config lane lint conformance > POST with lane-lint error config returns 422 127ms ✓ src/features/projects/projectConfigLint.test.ts > projectConfigLint > root type > returns empty result for an empty config object 85ms ✓ src/features/projects/projectConfigLint.test.ts > projectConfigLint > root type > errors with a root-level config error when the parsed config is null (empty YAML) 13ms ✓ src/features/projects/projectConfigLint.test.ts > projectConfigLint > root type > errors with a root-level config error when the parsed config is a string, number, boolean, or array 17ms ✓ src/features/projects/projectConfigLint.test.ts > projectConfigLint > root type > never emits the "must be valid JSON" message (YAML parser handles unparseable input) 8ms ✓ src/features/projects/projectConfigLint.test.ts > projectConfigLint > root and vikunja strictness > errors on an undeclared root key 14ms ✓ src/features/projects/projectConfigLint.test.ts > projectConfigLint > root and vikunja strictness > errors on a non-object vikunja value 53ms ✓ src/features/projects/projectConfigLint.test.ts > projectConfigLint > root and vikunja strictness > errors on an undeclared vikunja key 14ms ✓ src/features/projects/projectConfigLint.test.ts > projectConfigLint > root and vikunja strictness > collects root and vikunja errors together in API order 11ms ✓ src/features/projects/projectConfigLint.test.ts > projectConfigLint > root and vikunja strictness > sorts unknown root and vikunja keys like the API (sortedObjectKeys) 9ms ✓ src/features/projects/projectConfigLint.test.ts > projectConfigLint > root and vikunja strictness > returns empty result when vikunja is absent 36ms ✓ src/features/projects/projectConfigLint.test.ts > projectConfigLint > vikunja url and project_id > errors on an empty url 22ms ✓ src/features/projects/projectConfigLint.test.ts > projectConfigLint > vikunja url and project_id > errors on a null url 3ms ✓ src/features/projects/projectConfigLint.test.ts > projectConfigLint > vikunja url and project_id > errors on an empty project_id 23ms ✓ src/features/projects/projectConfigLint.test.ts > projectConfigLint > vikunja url and project_id > errors on a non-string url (YAML number) 17ms ✓ src/features/projects/projectConfigLint.test.ts > projectConfigLint > vikunja url and project_id > returns empty result for a valid full config 48ms ✓ src/features/projects/projectConfigLint.test.ts > projectConfigLint > vikunja url and project_id > errors on non-string project_id values (number, boolean, object) 56ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > default rendering without targets > renders form and buttons with default snapshot (no closeIntent) 793ms ✓ src/features/projects/projectConfigLint.test.ts > projectConfigLint > vikunja view_id > accepts a valid integer view_id 46ms ✓ src/features/projects/projectConfigLint.test.ts > projectConfigLint > vikunja view_id > accepts view_id alongside url and project_id 2ms ✓ src/features/projects/projectConfigLint.test.ts > projectConfigLint > vikunja view_id > errors on a string view_id (YAML-quoted integer) 31ms ✓ src/features/projects/projectConfigLint.test.ts > projectConfigLint > vikunja view_id > errors on a null view_id 32ms ✓ src/features/projects/projectConfigLint.test.ts > projectConfigLint > vikunja view_id > errors on a fractional view_id 45ms ✓ src/features/projects/projectConfigLint.test.ts > projectConfigLint > vikunja view_id > errors on a boolean view_id 47ms ✓ src/features/projects/projectConfigLint.test.ts > projectConfigLint > vikunja view_id > returns no error when view_id is absent (presence-optional) 36ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > useBlocker dirty guard > shows DiscardDialog when blocker state is blocked and proceed is called on confirm 1864ms ✓ src/layers/__tests__/L1/entityResolver.test.tsx > entityResolver > resolveContract > resolves repositories contract 245ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > useBlocker dirty guard > does not show DiscardDialog when blocker is unblocked (dirty=false) 892ms ✓ src/layers/__tests__/L1/entityResolver.test.tsx > entityResolver > resolveContract > resolves projects contract 56ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > useBlocker dirty guard > Keep Editing in blocker DiscardDialog calls blocker.reset 2490ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > checkbox field value > calls updateField with boolean checked value, not string value 384ms ✓ src/layers/__tests__/L2R/CrudSurface.test.tsx > CrudSurface > backdrop click > backdrop click does not close the modal 197ms ✓ src/layers/__tests__/L1/entityResolver.test.tsx > entityResolver > resolveContract > resolves runs contract 71ms ✓ src/layers/__tests__/L1/entityResolver.test.tsx > entityResolver > resolveContract > resolves pipelines contract 32ms ✓ src/layers/__tests__/L1/entityResolver.test.tsx > entityResolver > resolveContract > returns the same contract as the static registry 2ms ✓ src/layers/__tests__/L1/entityResolver.test.tsx > entityResolver > useEntityList > returns a ListResult-like shape for repositories 1230ms ✓ src/layers/__tests__/L1/entityResolver.test.tsx > entityResolver > useEntityList > returns a ListResult-like shape for projects 41ms ✓ src/layers/__tests__/L1/entityResolver.test.tsx > entityResolver > useEntityList > returns a ListResult-like shape for runs 185ms ✓ src/layers/__tests__/L1/entityResolver.test.tsx > entityResolver > useEntityList > returns a ListResult-like shape for pipelines 307ms ✓ src/layers/__tests__/L1/entityResolver.test.tsx > entityResolver > useEntityList > passes params through to the query 594ms ✓ src/layers/__tests__/L1/entityResolver.test.tsx > entityResolver > useEntityDetail > returns a DetailResult-like shape 265ms ✓ src/layers/__tests__/L1/entityResolver.test.tsx > entityResolver > useEntityDetail > works for runs with run_id-based entities 118ms ✓ src/layers/__tests__/L1/entityResolver.test.tsx > entityResolver > useMutation > returns a MutationHandle-like shape 79ms ✓ src/layers/__tests__/L1/entityResolver.test.tsx > entityResolver > useMutation > works for all entity paths 53ms ✓ src/layers/__tests__/L1/entityResolver.test.tsx > entityResolver > useSubscription > returns a SubscriptionHandle-like shape 179ms ✓ src/layers/__tests__/L1/entityResolver.test.tsx > entityResolver > useSubscription > works for all entity paths 402ms ✓ src/layers/__tests__/L1/SseRealConnection.integration.test.tsx > SseRealConnection — real EventSource + MSW SSE handler > connects via MSW and receives SSE events into query cache 3994ms (node:525) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) ✓ src/layers/__tests__/L1/SseRealConnection.integration.test.tsx > SseRealConnection — real EventSource + MSW SSE handler > on connection loss transitions to reconnecting and recovers on new connection 1747ms (node:541) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) ✓ src/layers/__tests__/L1/SseRealConnection.integration.test.tsx > SseRealConnection — real EventSource + MSW SSE handler > with fake timers — backoff, lost, reconnect, heartbeat > 5 connection failures via 500 responses → lost state 1271ms ✓ src/layers/__tests__/L1/SseRealConnection.integration.test.tsx > SseRealConnection — real EventSource + MSW SSE handler > with fake timers — backoff, lost, reconnect, heartbeat > reconnect() from lost state transitions to connected 734ms ↓ src/layers/__tests__/L1/SseRealConnection.integration.test.tsx > SseRealConnection — real EventSource + MSW SSE handler > with fake timers — backoff, lost, reconnect, heartbeat > heartbeat checker triggers lost at 30s — skipped: eventsource uses setTimeout internally for stream reader; fake timers freeze open streams ↓ src/layers/__tests__/L1/SseRealConnection.integration.test.tsx > SseRealConnection — real EventSource + MSW SSE handler > with fake timers — backoff, lost, reconnect, heartbeat > heartbeat event resets timestamp — skipped: same eventsource + fake timers incompatibility as above ✓ src/layers/__tests__/L2W/behaviorContract.test.ts > createDefaultBehaviorContract > returns an object with all BehaviorContract functions 162ms ✓ src/layers/__tests__/L2W/behaviorContract.test.ts > createDefaultBehaviorContract > defaults() returns an object 57ms ✓ src/layers/__tests__/L2W/behaviorContract.test.ts > createDefaultBehaviorContract > populate(entity) returns a copy 207ms ✓ src/layers/__tests__/L2W/behaviorContract.test.ts > createDefaultBehaviorContract > toCreate(form) returns a partial copy 2ms ✓ src/layers/__tests__/L2W/behaviorContract.test.ts > createDefaultBehaviorContract > toUpdate(form) returns a partial copy 31ms ✓ src/layers/__tests__/L2W/behaviorContract.test.ts > createDefaultBehaviorContract > fieldPolicy(mode) returns an empty FieldPolicy 28ms ✓ 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 22ms ✓ src/layers/__tests__/L2W/behaviorContract.test.ts > createFieldPolicyFromConfig > applies visible constraint for add mode 31ms ✓ src/layers/__tests__/L2W/behaviorContract.test.ts > createFieldPolicyFromConfig > applies visibility constraint for edit mode 19ms ✓ src/layers/__tests__/L2W/behaviorContract.test.ts > createFieldPolicyFromConfig > applies editable constraint per mode 24ms ✓ src/layers/__tests__/L2W/behaviorContract.test.ts > createFieldPolicyFromConfig > applies both visible and editable together 15ms ✓ src/layers/__tests__/L2W/behaviorContract.test.ts > createFieldPolicyFromConfig > splits policy by mode independently 2ms 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__/L2W/behaviorContract.test.ts > createFieldPolicyFromConfig > handles unknown fields gracefully 24ms ✓ src/layers/__tests__/L2W/behaviorContract.test.ts > createFieldPolicyFromConfig > returns FieldPolicy that satisfies the type contract 47ms ✓ src/layers/__tests__/L2R/EntityDetail.test.tsx > EntityDetail — delete navigation > navigates to entityPath on delete success without custom onDeleteSuccess 2019ms ✓ src/layers/__tests__/L2R/EntityDetail.test.tsx > EntityDetail — delete navigation > calls custom onDeleteSuccess and does not default navigate 729ms (node:548) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:534) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:564) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) ✓ src/layers/__tests__/L2R/AgeCheckIndicator.test.tsx > AgeCheckIndicator > renders children when refCount > 0 (SSE view) 333ms ✓ src/layers/__tests__/L2R/AgeCheckIndicator.test.tsx > AgeCheckIndicator > renders children when refCount === 0 and data is fresh 23ms ✓ src/layers/__tests__/L2R/AgeCheckIndicator.test.tsx > AgeCheckIndicator > renders skeleton + message + refresh button when refCount === 0 and data is stale 266ms ✓ src/layers/__tests__/L2R/AgeCheckIndicator.test.tsx > AgeCheckIndicator > refresh button calls invalidateQueries when no onRefresh provided 98ms ✓ src/layers/__tests__/L2R/AgeCheckIndicator.test.tsx > AgeCheckIndicator > refresh button calls onRefresh when provided 114ms (node:572) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) ✓ src/layers/__tests__/L1/mutationQueue.test.ts > pendingDeleteMap > addPendingDelete + getPendingDeletes > adds an id to the set for an entityPath 14ms ✓ src/layers/__tests__/L1/mutationQueue.test.ts > pendingDeleteMap > addPendingDelete + getPendingDeletes > adds multiple ids to the same entityPath 2ms ✓ src/layers/__tests__/L1/mutationQueue.test.ts > pendingDeleteMap > addPendingDelete + getPendingDeletes > handles multiple entityPaths independently 4ms ✓ src/layers/__tests__/L1/mutationQueue.test.ts > pendingDeleteMap > removePendingDelete > removes a specific id 2ms ✓ src/layers/__tests__/L1/mutationQueue.test.ts > pendingDeleteMap > removePendingDelete > is a no-op when id does not exist 1ms ✓ src/layers/__tests__/L1/mutationQueue.test.ts > pendingDeleteMap > removePendingDelete > is a no-op when entityPath has no entries 1ms ✓ src/layers/__tests__/L1/mutationQueue.test.ts > pendingDeleteMap > isMarkedDeleted > returns true for a marked id 2ms ✓ src/layers/__tests__/L1/mutationQueue.test.ts > pendingDeleteMap > isMarkedDeleted > returns false for an unmarked id 1ms ✓ src/layers/__tests__/L1/mutationQueue.test.ts > pendingDeleteMap > isMarkedDeleted > returns false for unknown entityPath 1ms ✓ src/layers/__tests__/L1/mutationQueue.test.ts > pendingDeleteMap > populatePendingDeletes > populates from an array of entries 2ms ✓ src/layers/__tests__/L1/mutationQueue.test.ts > pendingDeleteMap > populatePendingDeletes > deduplicates when same id appears twice 22ms ✓ src/layers/__tests__/L1/mutationQueue.test.ts > pendingDeleteMap > getAllPendingDeleteEntries > returns empty array when map is empty 7ms ✓ src/layers/__tests__/L1/mutationQueue.test.ts > pendingDeleteMap > getAllPendingDeleteEntries > returns all entries as flat array 31ms ✓ src/layers/__tests__/L1/mutationQueue.test.ts > pendingDeleteMap > purgePendingDeletes > returns and removes all ids for an entityPath 10ms ✓ src/layers/__tests__/L1/mutationQueue.test.ts > pendingDeleteMap > purgePendingDeletes > returns empty set for unknown entityPath 5ms ✓ src/layers/__tests__/L1/mutationQueue.test.ts > pendingDeleteMap > purgePendingDeletes > does not affect other entityPaths 3ms ✓ src/layers/__tests__/L1/mutationQueue.test.ts > normalizeFilters > removes undefined values 13ms ✓ src/layers/__tests__/L1/mutationQueue.test.ts > normalizeFilters > removes empty string values 6ms ✓ src/layers/__tests__/L1/mutationQueue.test.ts > normalizeFilters > sorts keys alphabetically 86ms ✓ src/layers/__tests__/L1/mutationQueue.test.ts > normalizeFilters > returns empty object for all-empty filters 6ms ✓ src/msw/__tests__/runs-handler.test.ts > runs MSW handler > returns runs without filter 1324ms ✓ src/msw/__tests__/runs-handler.test.ts > runs MSW handler > filters by created_after (30 days) 233ms ✓ src/msw/__tests__/runs-handler.test.ts > runs MSW handler > filters by created_after (24 hours) 85ms ✓ src/msw/__tests__/runs-handler.test.ts > runs MSW handler > handles invalid created_after gracefully 43ms ✓ src/msw/__tests__/runs-handler.test.ts > runs MSW handler > handles today shorthand gracefully 140ms ✓ src/msw/__tests__/runs-handler.test.ts > runs MSW handler > filters by project_id 233ms ✓ src/msw/__tests__/runs-handler.test.ts > runs MSW handler > filters by multiple project_ids 285ms ✓ src/msw/__tests__/runs-handler.test.ts > runs MSW handler > sorts by tokens desc 386ms ✓ src/msw/__tests__/runs-handler.test.ts > runs MSW handler > sorts by tokens asc 28ms (node:589) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:558) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:582) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) stderr | src/features/bot-accounts/BotAccountsListTab.test.tsx > BotAccountsListTab > renders DataTable with mock bot account names ⚠️ 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/bot-accounts/BotAccountsListTab.test.tsx > BotAccountsListTab > renders DataTable with mock bot account names 1466ms ✓ src/features/bot-accounts/BotAccountsListTab.test.tsx > BotAccountsListTab > displays Name, Description, Created columns 417ms ✓ src/features/bot-accounts/BotAccountsListTab.test.tsx > BotAccountsListTab > name links do NOT contain ?tab=accounts 742ms ✓ src/features/bot-accounts/BotAccountsListTab.test.tsx > BotAccountsListTab > shows create button with label "+ New Bot Account" 1158ms ✓ src/features/bot-accounts/BotAccountsListTab.test.tsx > BotAccountsListTab > createTarget leads to /repositories/bot-accounts/add 667ms ✓ src/features/bot-accounts/BotAccountsListTab.test.tsx > BotAccountsListTab > renders Crud component 569ms (node:629) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:598) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:612) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) stderr | src/features/bot-accounts/BotAccountDetailPage.test.tsx > BotAccountDetailPage > renders account name in the page title ⚠️ 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. (node:622) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) stderr | src/lib/__tests__/useOfflineState.test.tsx > useOfflineState > window online event updates isOnline 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/lib/__tests__/useOfflineState.test.tsx > useOfflineState > pendingCount matches getOutboxEntries length 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/lib/__tests__/useOfflineState.test.tsx > useOfflineState > isOnline === false when navigator.onLine is false 1036ms ✓ src/lib/__tests__/useOfflineState.test.tsx > useOfflineState > isOnline === true by default 11ms ✓ src/lib/__tests__/useOfflineState.test.tsx > useOfflineState > window online event updates isOnline 32ms stderr | src/lib/__tests__/useOfflineState.test.tsx > useOfflineState > lastSynced is null when cache is empty 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/lib/__tests__/useOfflineState.test.tsx > useOfflineState > lastSynced reflects max dataUpdatedAt 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/lib/__tests__/useOfflineState.test.tsx > useOfflineState > lastSynced reflects max dataUpdatedAt 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/lib/__tests__/useOfflineState.test.tsx > useOfflineState > pendingCount matches getOutboxEntries length 15ms ✓ src/lib/__tests__/useOfflineState.test.tsx > useOfflineState > lastSynced is null when cache is empty 17ms stderr | src/lib/__tests__/useOfflineState.test.tsx > useOfflineState > queryClient.invalidateQueries updates lastSynced 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/lib/__tests__/useOfflineState.test.tsx > useOfflineState > queryClient.invalidateQueries updates lastSynced 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/lib/__tests__/useOfflineState.test.tsx > useOfflineState > lastSynced reflects max dataUpdatedAt 103ms ✓ src/lib/__tests__/useOfflineState.test.tsx > useOfflineState > queryClient.invalidateQueries updates lastSynced 36ms × src/features/bot-accounts/BotAccountDetailPage.test.tsx > BotAccountDetailPage > renders account name in the page title 5961ms  → 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/bot-accounts/BotAccountDetailPage.test.tsx > BotAccountDetailPage > renders edit dialog with "Edit Bot Account" title when edit route activated 1492ms ✓ src/lib/__tests__/queryCacheEviction.test.tsx > startCacheEviction > removes inactive queries older than retention threshold 177ms ✓ src/lib/__tests__/queryCacheEviction.test.tsx > startCacheEviction > does not remove queries under retention threshold accounting for interval delay 36ms ✓ src/layers/L1/contracts/pipelines.test.ts > pipelinesContract request normalizers > request.create is defined 228ms ✓ src/layers/L1/contracts/pipelines.test.ts > pipelinesContract request normalizers > request.update is defined 62ms ✓ src/lib/__tests__/queryCacheEviction.test.tsx > startCacheEviction > does not remove active queries with observers 1258ms ✓ src/lib/__tests__/queryCacheEviction.test.tsx > startCacheEviction > removes only exact matching query keys 68ms ✓ src/lib/__tests__/queryCacheEviction.test.tsx > startCacheEviction > skips eviction entirely when offline 65ms ✓ src/lib/__tests__/queryCacheEviction.test.tsx > startCacheEviction > returns a cleanup function that stops the interval 26ms ✓ src/layers/L1/contracts/pipelines.test.ts > pipelinesContract request normalizers > request.create > parses a YAML-string config into an object 255ms ✓ src/layers/L1/contracts/pipelines.test.ts > pipelinesContract request normalizers > request.create > omits an empty config value 15ms ✓ src/layers/L1/contracts/pipelines.test.ts > pipelinesContract request normalizers > request.create > leaves an object config unchanged 2ms ✓ src/layers/L1/contracts/pipelines.test.ts > pipelinesContract request normalizers > request.create > lets an invalid YAML config throw instead of silently dropping it 164ms ✓ src/lib/__tests__/queryCacheEviction.test.tsx > startCacheEviction > evicts only queries older than threshold across multiple entity paths 69ms ✓ src/layers/L1/contracts/pipelines.test.ts > pipelinesContract request normalizers > request.create > leaves other fields untouched 100ms ✓ src/layers/L1/contracts/pipelines.test.ts > pipelinesContract request normalizers > request.create > omits any webhook_secret value — create can never set the secret 46ms ✓ src/layers/L1/contracts/pipelines.test.ts > pipelinesContract request normalizers > request.create > omits an empty pm_bot_account_id value 33ms ✓ src/layers/L1/contracts/pipelines.test.ts > pipelinesContract request normalizers > request.create > keeps a non-empty pm_bot_account_id value 13ms ✓ src/layers/L1/contracts/pipelines.test.ts > pipelinesContract request normalizers > request.update > parses a YAML-string config into an object 61ms ✓ src/layers/L1/contracts/pipelines.test.ts > pipelinesContract request normalizers > request.update > omits an empty config value 19ms ✓ src/layers/L1/contracts/pipelines.test.ts > pipelinesContract request normalizers > request.update > leaves an object config unchanged 26ms ✓ src/layers/L1/contracts/pipelines.test.ts > pipelinesContract request normalizers > request.update > lets an invalid YAML config throw instead of silently dropping it 31ms ✓ src/layers/L1/contracts/pipelines.test.ts > pipelinesContract request normalizers > request.update > leaves other fields untouched 21ms ✓ src/layers/L1/contracts/pipelines.test.ts > pipelinesContract request normalizers > request.update > omits an empty webhook_secret value so edits never wipe an existing secret 1ms ✓ src/layers/L1/contracts/pipelines.test.ts > pipelinesContract request normalizers > request.update > keeps a non-empty webhook_secret value 1ms ✓ src/features/bot-accounts/BotAccountDetailPage.test.tsx > BotAccountDetailPage > breadcrumb Bot Accounts link does NOT contain ?tab=accounts 1220ms ✓ src/features/bot-accounts/BotAccountDetailPage.test.tsx > BotAccountDetailPage > breadcrumb Repositories link points to /repositories/repos 1207ms stderr | src/features/container-registries/ContainerRegistryDetailPage.test.tsx > ContainerRegistryDetailPage > renders registry name in the page title ⚠️ 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. (node:605) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) ✓ src/shared/components/EntitySelectList.test.tsx > EntitySelectList > renders rows from ref-shaped value with resolved labels 2255ms ✓ src/shared/components/EntitySelectList.test.tsx > EntitySelectList > renders rows from string value with resolved labels 682ms ✓ src/shared/components/EntitySelectList.test.tsx > EntitySelectList > renders empty state with an add button 265ms ✓ src/shared/components/EntitySelectList.test.tsx > EntitySelectList > renders readOnly mode as plain labels 165ms ✓ src/shared/components/EntitySelectList.test.tsx > EntitySelectList > normalizes ref-shaped value into the form via onChange on mount 475ms ✓ src/features/container-registries/ContainerRegistryDetailPage.test.tsx > ContainerRegistryDetailPage > renders registry name in the page title 2399ms stderr | src/features/repositories/RepositoriesPage.test.tsx > RepositoriesPage layout > renders Tabs component with Repositories and Bot Accounts ⚠️ 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/repositories/RepositoriesPage.test.tsx > RepositoriesPage layout > renders Tabs component with Repositories and Bot Accounts 3189ms ✓ src/features/repositories/RepositoriesPage.test.tsx > RepositoriesPage layout > active tab is determined from URL pathname, not React state 108ms ✓ src/features/repositories/RepositoriesPage.test.tsx > RepositoriesPage layout > bot-accounts tab is active when URL contains /bot-accounts 187ms ✓ src/features/container-registries/ContainerRegistryDetailPage.test.tsx > ContainerRegistryDetailPage > renders the registry URL and username in the detail card 2316ms ✓ src/features/repositories/RepositoriesPage.test.tsx > RepositoriesPage layout > clicking Repositories tab navigates to /repositories/repos 813ms (node:637) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) ✓ src/features/repositories/RepositoriesPage.test.tsx > RepositoriesPage layout > clicking Bot Accounts tab navigates to /repositories/bot-accounts 762ms ✓ src/features/container-registries/ContainerRegistryDetailPage.test.tsx > ContainerRegistryDetailPage > renders edit dialog with "Edit Container Registry" title when edit route is activated 2036ms ✓ src/features/container-registries/ContainerRegistryDetailPage.test.tsx > ContainerRegistryDetailPage > shows the token field empty in edit mode (write-only, never populated) 724ms ✓ src/features/repositories/RepositoriesPage.test.tsx > RepositoriesPage layout > does NOT render DataTable directly (only via Outlet) 742ms ✓ src/features/repositories/RepositoriesPage.test.tsx > RepositoriesPage layout > does NOT render Crud directly (only via child routes) 461ms × src/shared/components/EntitySelectList.test.tsx > EntitySelectList > adds a row and emits the selected repository id 5225ms  → 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/EntitySelectList.test.tsx > EntitySelectList > removes a row and emits the remaining ids 794ms ✓ src/shared/components/EntitySelectList.test.tsx > EntitySelectList > emits [] when all rows are removed 708ms ✓ src/shared/components/EntitySelectList.test.tsx > EntitySelectList > reorders rows with up and down buttons preserving priority order 1413ms ✓ src/shared/components/EntitySelectList.test.tsx > EntitySelectList > disables up on the first row and down on the last row 69ms ✓ src/shared/components/EntitySelectList.test.tsx > EntitySelectList > disables add when the cap of 16 rows is reached 519ms stderr | src/features/container-registries/ContainerRegistriesListPage.test.tsx > ContainerRegistriesListPage > renders the page title and registry rows ⚠️ 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. (node:646) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) × src/features/container-registries/ContainerRegistriesListPage.test.tsx > ContainerRegistriesListPage > renders the page title and registry rows 6035ms  → 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". stderr | src/layers/__tests__/L1/useDataAge.test.tsx > useDataAge > returns ageMs for data that is N ms old 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__/L1/useDataAge.test.tsx > useDataAge > isStale === true when ageMs > AGE_THRESHOLD 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/useDataAge.test.tsx > useDataAge > returns ageMs for data that is N ms old 289ms ✓ src/layers/__tests__/L1/useDataAge.test.tsx > useDataAge > isStale === true when ageMs > AGE_THRESHOLD 16ms stderr | src/layers/__tests__/L1/useDataAge.test.tsx > useDataAge > isStale === false when ageMs <= AGE_THRESHOLD 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__/L1/useDataAge.test.tsx > useDataAge > updates when cache subscription fires 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__/L1/useDataAge.test.tsx > useDataAge > updates when cache subscription fires 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/useDataAge.test.tsx > useDataAge > isStale === false when ageMs <= AGE_THRESHOLD 123ms stderr | src/layers/__tests__/L1/useDataAge.test.tsx > useDataAge > updates when cache subscription fires 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/useDataAge.test.tsx > useDataAge > updates when cache subscription fires 115ms stderr | src/layers/__tests__/L1/useDataAge.test.tsx > useDataAge > updates on minute tick (fakeTimers) 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/useDataAge.test.tsx > useDataAge > updates on minute tick (fakeTimers) 303ms ✓ src/features/container-registries/ContainerRegistriesListPage.test.tsx > ContainerRegistriesListPage > renders the Add Registry action with the expected label 1326ms ✓ src/features/container-registries/ContainerRegistriesListPage.test.tsx > ContainerRegistriesListPage > clicking Add Registry navigates to the create route 1450ms ✓ src/features/container-registries/ContainerRegistriesListPage.test.tsx > ContainerRegistriesListPage > clicking a row navigates to the registry detail route 510ms (node:661) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:654) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:668) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:674) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) ✓ src/shared/components/CrudModal.test.tsx > CrudModal > 1. open=false renders nothing 2055ms × src/shared/components/CrudModal.test.tsx > CrudModal > 2. open=true renders title, children, footer 5943ms  → 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". (node:685) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) ✓ src/shared/components/CrudModal.test.tsx > CrudModal > 3. Backdrop click does not close dialog 2104ms ✓ src/shared/components/CrudModal.test.tsx > CrudModal > 4. Cancel pristine calls onClose 463ms stderr | src/features/repositories/RepositoriesList.test.tsx > RepositoriesList > renders DataTable with columns ⚠️ 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/repositories/RepositoriesList.test.tsx > RepositoriesList > renders DataTable with columns 1253ms (node:702) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) ✓ src/features/repositories/RepositoriesList.test.tsx > RepositoriesList > renders Crud component 260ms ✓ src/lib/__tests__/mutationOutbox.test.ts > replayOutbox > triggers refetchQueries({ stale: true }) after successful drain 492ms ✓ src/lib/__tests__/mutationOutbox.test.ts > replayOutbox > does NOT call refetchQueries({ stale: true }) when failed > 0 87ms ✓ src/lib/__tests__/mutationOutbox.test.ts > replayOutbox > refetchQueries is called after delete replay drain 46ms ✓ src/lib/__tests__/mutationOutbox.test.ts > replayOutbox > skips refetchQueries when outbox is empty 10ms ✓ src/features/repositories/RepositoriesList.test.tsx > RepositoriesList > create button label is "+ New Repository" 381ms stderr | src/layers/__tests__/L2W/routes/CrudRoute.test.tsx > CrudRoute > sets route context on mount with id (detail page) ⚠️ React Router Future Flag Warning: React Router will begin wrapping state updates in `React.startTransition` in v7. You can use the `v7_startTransition` future flag to opt-in early. For more information, see https://reactrouter.com/v6/upgrading/future#v7_starttransition. ⚠️ React Router Future Flag Warning: Relative route resolution within Splat routes is changing in v7. You can use the `v7_relativeSplatPath` future flag to opt-in early. For more information, see https://reactrouter.com/v6/upgrading/future#v7_relativesplatpath. ✓ src/layers/__tests__/L2W/routes/CrudRoute.test.tsx > CrudRoute > sets route context on mount with id (detail page) 161ms ✓ src/layers/__tests__/L2W/routes/CrudRoute.test.tsx > CrudRoute > sets route context on mount without id (collection page) 12ms ✓ src/layers/__tests__/L2W/routes/CrudRoute.test.tsx > CrudRoute > sets route context with prefix when provided 37ms ✓ src/features/repositories/RepositoriesList.test.tsx > RepositoriesList > renders data table with repository rows 204ms (node:710) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) ✓ src/layers/__tests__/L2W/routes/CrudRoute.test.tsx > CrudRoute > cleans up (sets null) on unmount 34ms ✓ src/layers/__tests__/L2W/routes/CrudRoute.test.tsx > CrudRoute > does not re-set context on re-render with same props 29ms ✓ src/layers/__tests__/L2W/routes/CrudRoute.test.tsx > CrudRoute > re-sets context when id changes 20ms stderr | src/features/auth/CallbackPage.test.tsx > CallbackPage > navigates to dashboard when session fetch succeeds ⚠️ 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 session fetch succeeds 1332ms ✓ src/features/auth/CallbackPage.test.tsx > CallbackPage > sets auth store with session data when fetch succeeds 103ms ✓ src/features/auth/CallbackPage.test.tsx > CallbackPage > navigates to returnUrl when set in sessionStorage 404ms ✓ src/shared/components/CrudModal.test.tsx > CrudModal > 5. Cancel dirty opens DiscardDialog 2431ms ✓ src/features/auth/CallbackPage.test.tsx > CallbackPage > shows error when session fetch fails 347ms ✓ src/layers/__tests__/L1/RefCountStore.test.ts > refCountStore > incrementRefCount > increases count and notifies subscribed listener 87ms ✓ src/layers/__tests__/L1/RefCountStore.test.ts > refCountStore > decrementRefCount > decreases count and notifies subscribed listener 4ms ✓ src/layers/__tests__/L1/RefCountStore.test.ts > refCountStore > decrementRefCount > removes key when count reaches 0 3ms ✓ src/layers/__tests__/L1/RefCountStore.test.ts > refCountStore > decrementRefCount > returns 0 when decrementing a non-existent key 2ms ✓ src/layers/__tests__/L1/RefCountStore.test.ts > refCountStore > subscribeRefCount > returns an unsubscribe function that stops notifications 2ms ✓ src/layers/__tests__/L1/RefCountStore.test.ts > refCountStore > key isolation > notifies only the subscribed key, not other keys 3ms ✓ src/layers/__tests__/L1/RefCountStore.test.ts > refCountStore > refCountKey > produces idempotent keys for same entityPath and params 2ms ✓ src/features/auth/CallbackPage.test.tsx > CallbackPage > shows redirecting message and redirects to login on error 260ms × src/shared/components/CrudModal.test.tsx > CrudModal > 6. Discard → onClose, Keep → dialog stays 5103ms  → 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/formBridge.test.ts > useFormBridge > starts with dirty=false and pending=false 421ms ✓ src/layers/__tests__/L2W/formBridge.test.ts > useFormBridge > setDirty(true) sets dirty=true on bridge 69ms ✓ src/layers/__tests__/L2W/formBridge.test.ts > useFormBridge > setDirty(false) sets dirty=false on bridge 34ms ✓ src/layers/__tests__/L2W/formBridge.test.ts > useFormBridge > setPending(true) sets pending=true on bridge 9ms ✓ src/layers/__tests__/L2W/formBridge.test.ts > useFormBridge > setPending(false) sets pending=false on bridge 25ms ✓ src/layers/__tests__/L2W/formBridge.test.ts > useFormBridge > markDirty() sets dirty=true 48ms ✓ src/layers/__tests__/L2W/formBridge.test.ts > useFormBridge > reset() clears both dirty and pending 45ms ✓ src/layers/__tests__/L2W/formBridge.test.ts > useFormBridge > supports dirty → pending transition (submit start) 93ms ✓ src/layers/__tests__/L2W/formBridge.test.ts > useFormBridge > supports pending → not pending transition while dirty stays (failure case) 122ms ✓ src/layers/__tests__/L2W/formBridge.test.ts > useFormBridge > bridge object reflects current state 159ms ✓ src/shared/components/EntitySelect.test.tsx > EntitySelect > shows loading state 3881ms stderr | src/layers/__tests__/L2R/CrudSurface.pipelineSave.test.tsx > pipeline config save path > sends the YAML config as a JSON object in the PUT body, never a string ⚠️ 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. ✓ src/shared/components/EntitySelect.test.tsx > EntitySelect > shows empty state 310ms ✓ src/shared/components/EntitySelect.test.tsx > EntitySelect > shows error state 222ms ✓ src/shared/components/CrudModal.test.tsx > CrudModal > 7. ESC dirty opens DiscardDialog 1490ms (node:693) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) ✓ src/shared/components/CrudModal.test.tsx > CrudModal > 8. ESC pristine calls onClose 1880ms ✓ src/shared/components/EntitySelect.test.tsx > EntitySelect > supports single select 3238ms ✓ src/shared/components/CrudModal.test.tsx > CrudModal > 9. Save calls onSave 668ms ✓ src/layers/__tests__/L2R/defaultEditNav.test.ts > createDefaultEditNavHandler > returns a function when edit target is present 94ms ✓ src/layers/__tests__/L2R/defaultEditNav.test.ts > createDefaultEditNavHandler > calls navigate with edit target and replaced id 10ms ✓ src/layers/__tests__/L2R/defaultEditNav.test.ts > createDefaultEditNavHandler > falls back to pathname + /edit when actionTargets is undefined 3ms ✓ src/layers/__tests__/L2R/defaultEditNav.test.ts > createDefaultEditNavHandler > falls back to pathname + /edit when actionTargets.edit is undefined 2ms ✓ src/layers/__tests__/L2R/defaultEditNav.test.ts > createDefaultEditNavHandler > falls back to pathname + /edit when actionTargets.edit is missing 2ms ✓ src/layers/__tests__/L2R/defaultEditNav.test.ts > createDefaultEditNavHandler > calls navigate with the replaced id correctly 1ms ✓ src/layers/__tests__/L2R/defaultEditNav.test.ts > createDefaultEditNavHandler > explicit edit target takes precedence over derived default 1ms ✓ src/layers/__tests__/L2R/defaultEditNav.test.ts > createDefaultEditNavHandler > derives default from the provided pathname 1ms ✓ src/layers/__tests__/L2R/defaultEditNav.test.ts > createDefaultEditNavHandler > editTargetOverride takes precedence over actionTargets.edit 9ms ✓ src/shared/components/CrudModal.test.tsx > CrudModal > 10. isPending disables Save + Cancel and shows spinner 1189ms ✓ src/shared/components/CrudModal.test.tsx > CrudModal > 11. cancelLabel prop overrides the cancel button text 1093ms (node:717) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) ✓ src/shared/components/EntitySelect.test.tsx > EntitySelect > supports multi select 2540ms ✓ src/shared/components/EntitySelect.test.tsx > EntitySelect > displays placeholder when value is undefined 169ms ✓ src/shared/components/EntitySelect.test.tsx > EntitySelect > renders readOnly single mode as text 187ms ✓ src/shared/components/EntitySelect.test.tsx > EntitySelect > renders readOnly multi mode as comma-separated labels 140ms ✓ src/shared/components/EntitySelect.test.tsx > EntitySelect > renders raw value in readOnly when no match 211ms ✓ src/shared/components/EntitySelect.test.tsx > EntitySelect > disables the trigger when disabled prop is true 421ms × src/layers/__tests__/L2R/CrudSurface.pipelineSave.test.tsx > pipeline config save path > sends the YAML config as a JSON object in the PUT body, never a string 7883ms  → 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/hooks/useDirtyGuard.test.ts > useDirtyGuard > 1. isDirty=false → blocker ei estä 316ms ✓ src/shared/hooks/useDirtyGuard.test.ts > useDirtyGuard > 2. isDirty=true → blocker estää (isBlocked=true) 129ms ✓ src/shared/hooks/useDirtyGuard.test.ts > useDirtyGuard > 3. submitted=true → blocker ei estä vaikka isDirty 26ms ✓ src/shared/hooks/useDirtyGuard.test.ts > useDirtyGuard > 4. confirmNavigation → blocker.proceed() → nav jatkuu 49ms stderr | src/layers/__tests__/L2R/CrudSurface.pipelineSave.test.tsx > pipeline config save path > omits the config field from the PUT body when the field is emptied No routes matched location "/pipelines/pipeline-proj-1-1" Error handled by React Router default ErrorBoundary: ErrorResponseImpl { status: 404, statusText: 'Not Found', internal: true, data: 'Error: No route matches URL "/pipelines/pipeline-proj-1-1"', error: Error: No route matches URL "/pipelines/pipeline-proj-1-1" at getInternalRouterError (/workspace/node_modules/@remix-run/router/dist/router.cjs.js:5324:59) at handleNavigational404 (/workspace/node_modules/@remix-run/router/dist/router.cjs.js:3564:17) at startNavigation (/workspace/node_modules/@remix-run/router/dist/router.cjs.js:2432:11) at Object.navigate (/workspace/node_modules/@remix-run/router/dist/router.cjs.js:2336:18) at /workspace/node_modules/react-router/dist/umd/react-router.development.js:934:18 at /workspace/niko/agent-platform/frontend/src/layers/L2R/slots/Crud.tsx:66:7 at /workspace/niko/agent-platform/frontend/src/layers/L2R/surfaces/CrudSurface.tsx:318:7 at Object.react_stack_bottom_frame (/workspace/node_modules/react-dom/cjs/react-dom-client.development.js:25989:20) at runWithFiberInDEV (/workspace/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) at commitHookEffectListMount (/workspace/node_modules/react-dom/cjs/react-dom-client.development.js:13249:29) } ✓ src/shared/hooks/useDirtyGuard.test.ts > useDirtyGuard > 5. cancelNavigation → blocker.reset() → formi jää 163ms ✓ src/shared/hooks/useDirtyGuard.test.ts > useDirtyGuard > 6. beforeunload estetään kun isDirty && !submitted 119ms (node:738) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) ✓ src/shared/hooks/useDirtyGuard.test.ts > useDirtyGuard > 7. beforeunload EI estetä kun submitted 124ms × src/layers/__tests__/L2R/CrudSurface.pipelineSave.test.tsx > pipeline config save path > omits the config field from the PUT body when the field is emptied 6543ms  → 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". (node:727) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:765) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:753) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:747) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) ✓ src/lib/__tests__/onlineDetector.test.ts > OnlineDetector > isOnline > returns navigator.onLine value 150ms ✓ src/lib/__tests__/onlineDetector.test.ts > OnlineDetector > isOnline > returns true when navigator is undefined (SSR safety) 2ms ✓ src/lib/__tests__/onlineDetector.test.ts > OnlineDetector > subscribe > registers listener that is called on online event 7ms ✓ src/lib/__tests__/onlineDetector.test.ts > OnlineDetector > subscribe > registers listener that is called on offline event 3ms ✓ src/lib/__tests__/onlineDetector.test.ts > OnlineDetector > subscribe > calls all active listeners on event 3ms ✓ src/lib/__tests__/onlineDetector.test.ts > OnlineDetector > subscribe > unsub prevents further calls 3ms ✓ src/lib/__tests__/onlineDetector.test.ts > OnlineDetector > getOnlineDetector singleton > returns the same instance on every call 5ms (node:726) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) ✓ src/layers/__tests__/L2R/defaultRowNav.test.ts > createDefaultRowNavHandler > returns a function that accepts an id 13ms ✓ src/layers/__tests__/L2R/defaultRowNav.test.ts > createDefaultRowNavHandler > calls navigate with rowTarget where :id is replaced 9ms ✓ src/layers/__tests__/L2R/defaultRowNav.test.ts > createDefaultRowNavHandler > replaces :id with the provided id string 5ms ✓ src/layers/__tests__/L2R/defaultRowNav.test.ts > createDefaultRowNavHandler > falls back to pathname + /:id when rowTarget is undefined 2ms ✓ src/layers/__tests__/L2R/defaultRowNav.test.ts > createDefaultRowNavHandler > does not throw when rowTarget is undefined (derived default used) 6ms ✓ 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/layers/__tests__/L2R/defaultRowNav.test.ts > createDefaultRowNavHandler > explicit rowTarget takes precedence over derived default 1ms ✓ src/layers/__tests__/L2R/defaultRowNav.test.ts > createDefaultRowNavHandler > derives default from the provided pathname 2ms (node:774) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) ✓ src/shared/utils/schemaHelp.test.ts > schemaToHelp > returns an empty list for a non-object schema 15ms ✓ src/shared/utils/schemaHelp.test.ts > schemaToHelp > returns an empty list for a schema without properties 2ms ✓ src/shared/utils/schemaHelp.test.ts > schemaToHelp > maps flat top-level properties to help nodes 3ms ✓ src/shared/utils/schemaHelp.test.ts > schemaToHelp > marks required keys from the root required array 1ms ✓ src/shared/utils/schemaHelp.test.ts > schemaToHelp > recurses into object-typed properties and marks their required keys 2ms ✓ src/shared/utils/schemaHelp.test.ts > schemaToHelp > does not recurse into non-object properties but keeps them as nodes 1ms ✓ src/shared/utils/schemaHelp.test.ts > schemaToHelp > carries the title when the schema declares one 1ms ✓ src/shared/utils/schemaHelp.test.ts > schemaToHelp > skips malformed property entries instead of throwing 2ms ✓ src/layers/L1/contracts/projects.test.ts > projectsContract request normalizers > request.create is defined 10ms ✓ src/layers/L1/contracts/projects.test.ts > projectsContract request normalizers > request.update is defined 2ms ✓ src/layers/L1/contracts/projects.test.ts > projectsContract request normalizers > request.create > parses a YAML-string config into an object 26ms ✓ src/layers/L1/contracts/projects.test.ts > projectsContract request normalizers > request.create > leaves other fields untouched 2ms ✓ src/layers/L1/contracts/projects.test.ts > projectsContract request normalizers > request.update > leaves an object config unchanged 2ms ✓ src/layers/L1/contracts/projects.test.ts > projectsContract request normalizers > request.update > parses a YAML-string config into an object 2ms ✓ src/layers/L1/contracts/projects.test.ts > projectsContract request normalizers > request.update > omits an empty config value 1ms ✓ src/layers/L1/contracts/projects.test.ts > projectsContract request normalizers > request.update > leaves other fields untouched 2ms (node:782) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:789) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) ✓ src/shared/components/MetadataCard.test.tsx > MetadataCard > shows loading skeleton 424ms ✓ src/shared/components/MetadataCard.test.tsx > MetadataCard > shows error state with retry button 1070ms ✓ src/shared/components/MetadataCard.test.tsx > MetadataCard > renders labels and values in grid 185ms ✓ src/shared/components/MetadataCard.test.tsx > MetadataCard > renders field with spanFull as col-span-full 224ms ✓ src/shared/components/MetadataCard.test.tsx > MetadataCard > shows em dash for empty value 48ms 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/shared/components/MetadataCard.test.tsx > MetadataCard > uses render callback over value 23ms ✓ src/shared/components/MetadataCard.test.tsx > MetadataCard > renders children instead of default layout 16ms ✓ src/layouts/healthStore.test.ts > healthStore > defaults > has healthy status by default 152ms ✓ src/layouts/healthStore.test.ts > healthStore > defaults > has null responseTime by default 21ms ✓ src/layouts/healthStore.test.ts > healthStore > defaults > has null lastChecked by default 6ms ✓ src/layouts/healthStore.test.ts > healthStore > defaults > has null apiVersion by default 3ms ✓ src/layouts/healthStore.test.ts > healthStore > fetchHealth > sets healthy status on success 4ms ✓ src/layouts/healthStore.test.ts > healthStore > fetchHealth > sets degraded status when services report issues 3ms ✓ src/layouts/healthStore.test.ts > healthStore > fetchHealth > sets unhealthy status on network error 3ms ✓ src/features/auth/LoginPage.test.tsx > LoginPage > shows login heading, description and button 2396ms ✓ src/features/auth/LoginPage.test.tsx > LoginPage > shows session expired message when expired query param is set 254ms ✓ src/features/auth/LoginPage.test.tsx > LoginPage > does not show expired message without expired param 97ms ✓ src/features/auth/LoginPage.test.tsx > LoginPage > shows error toast when error query param is set 78ms ✓ src/shared/components/KeyValueEditor.test.tsx > KeyValueEditor > adds a blank row on [+ Add row] click 2840ms ✓ src/features/auth/LoginPage.test.tsx > LoginPage > redirects to dashboard when already authenticated 290ms ✓ src/shared/components/KeyValueEditor.test.tsx > KeyValueEditor > removes a row and emits without it 532ms ✓ src/shared/components/KeyValueEditor.test.tsx > KeyValueEditor > shows duplicate key error but still emits onChange 256ms ✓ src/shared/components/KeyValueEditor.test.tsx > KeyValueEditor > sanitizes empty keys from payload 117ms ✓ src/shared/components/KeyValueEditor.test.tsx > KeyValueEditor > renders readOnly mode as static key: value lines 153ms ✓ src/shared/components/KeyValueEditor.test.tsx > KeyValueEditor > shows empty state text when value is undefined in readOnly 18ms ✓ src/shared/components/KeyValueEditor.test.tsx > KeyValueEditor > shows skeleton when isLoading 32ms (node:798) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) ✓ src/features/auth/LoginPage.test.tsx > LoginPage > performs mock login in dev mode and navigates to dashboard 1092ms (node:805) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:830) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:814) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) ✓ src/shared/components/DiscardDialog.test.tsx > DiscardDialog > does not render when closed 799ms ✓ src/features/container-registries/containerRegistriesCrudConfig.test.ts > containerRegistriesCrudConfig > fieldSet validations > name requires 3-100 characters 84ms ✓ src/features/container-registries/containerRegistriesCrudConfig.test.ts > containerRegistriesCrudConfig > fieldSet validations > url is required and validated as an absolute URL with scheme and host 20ms ✓ src/features/container-registries/containerRegistriesCrudConfig.test.ts > containerRegistriesCrudConfig > fieldSet validations > username is optional without validation constraints 16ms ✓ src/features/container-registries/containerRegistriesCrudConfig.test.ts > containerRegistriesCrudConfig > fieldSet validations > token is write-only with an encrypted-at-rest description hint 31ms ✓ src/features/container-registries/containerRegistriesCrudConfig.test.ts > containerRegistriesCrudConfig > fieldTypes > token is password 2ms ✓ src/layouts/uiStore.test.ts > uiStore > defaults > has sidebar open by default 118ms ✓ src/layouts/uiStore.test.ts > uiStore > defaults > has dark theme by default 18ms ✓ src/layouts/uiStore.test.ts > uiStore > toggleSidebar > closes sidebar when open 15ms ✓ src/layouts/uiStore.test.ts > uiStore > toggleSidebar > opens sidebar when closed 18ms ✓ src/layouts/uiStore.test.ts > uiStore > setSidebarOpen > sets sidebar to false 1ms ✓ src/layouts/uiStore.test.ts > uiStore > setSidebarOpen > sets sidebar to true 46ms ✓ src/layouts/uiStore.test.ts > uiStore > setTheme > sets theme to light 78ms ✓ src/layouts/uiStore.test.ts > uiStore > setTheme > sets theme to high-contrast 1ms ✓ src/layouts/uiStore.test.ts > uiStore > setTheme > sets theme to dark 83ms ✓ src/layouts/uiStore.test.ts > uiStore > resetSession > restores defaults 60ms (node:821) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) ✓ src/shared/components/DiscardDialog.test.tsx > DiscardDialog > renders with default title and description 1352ms ✓ src/features/auth/authStore.test.ts > authStore > starts unauthenticated 222ms ✓ src/features/auth/authStore.test.ts > authStore > setAuth sets authenticated state with TTL fields 97ms ✓ src/features/auth/authStore.test.ts > authStore > clearAuth clears all auth state including TTL fields 39ms ✓ src/shared/components/DiscardDialog.test.tsx > DiscardDialog > calls onDiscard when Discard button clicked 3232ms ✓ src/shared/components/DiscardDialog.test.tsx > DiscardDialog > calls onKeepEditing when Keep Editing button clicked 2544ms ✓ src/layers/__tests__/L2R/defaultAddNav.test.ts > createDefaultAddNavHandler > returns a function 21ms ✓ src/layers/__tests__/L2R/defaultAddNav.test.ts > createDefaultAddNavHandler > calls navigate with createTarget when invoked 9ms ✓ src/layers/__tests__/L2R/defaultAddNav.test.ts > createDefaultAddNavHandler > throws when invoked without createTarget (no fallback allowed) 7ms ✓ src/layers/__tests__/L2R/defaultAddNav.test.ts > createDefaultAddNavHandler > calls navigate with the exact createTarget string when set 2ms ✓ src/layers/__tests__/L2R/defaultAddNav.test.ts > createDefaultAddNavHandler > empty-string createTarget is treated as missing (throws) 2ms ✓ src/shared/components/DiscardDialog.test.tsx > DiscardDialog > renders custom title and description 1234ms ✓ src/shared/components/DiscardDialog.test.tsx > DiscardDialog > calls onKeepEditing on dialog dismiss (ESC) 1546ms (node:847) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:837) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:846) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) ✓ src/features/bot-accounts/botAccountsCrudConfig.test.ts > botAccountsCrudConfig > fieldSet validations > name requires 3-100 characters 79ms ✓ src/features/bot-accounts/botAccountsCrudConfig.test.ts > botAccountsCrudConfig > fieldSet validations > description allows max 5000 characters 26ms ✓ src/features/bot-accounts/botAccountsCrudConfig.test.ts > botAccountsCrudConfig > fieldSet validations > token_encrypted has description hint 4ms ✓ src/features/bot-accounts/botAccountsCrudConfig.test.ts > botAccountsCrudConfig > fieldTypes > description is textarea 2ms ✓ src/features/bot-accounts/botAccountsCrudConfig.test.ts > botAccountsCrudConfig > fieldTypes > token_encrypted is password 2ms ✓ src/shared/components/Page.test.tsx > PageHeader > renders title 408ms ✓ src/shared/components/Page.test.tsx > PageHeader > renders breadcrumbs 125ms ✓ src/shared/components/Page.test.tsx > PageHeader > renders actions slot 466ms ✓ src/shared/components/Page.test.tsx > Page > renders children 18ms ✓ src/shared/components/Page.test.tsx > Page > passes className to root div 17ms ✓ src/shared/components/Page.test.tsx > Page > renders header slot 28ms (node:861) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) × src/shared/components/ConfirmDialog.test.tsx > ConfirmDialog > renders with title and message 5668ms  → 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/L1/contracts/container-registries.test.ts > containerRegistriesContract > resolves the entity id from the standard id field 130ms ✓ src/layers/L1/contracts/container-registries.test.ts > containerRegistriesContract > declares entityPath and CRUD endpoints matching the API 14ms ✓ src/layers/L1/contracts/container-registries.test.ts > containerRegistriesContract > does not carry request normalizers (no mapping logic for this entity) 28ms ✓ src/layers/__tests__/architecture-contracts.test.ts > architecture contracts > type-level assertions are verified by npm run typecheck:arch 12ms (node:869) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) ✓ src/shared/components/ConfirmDialog.test.tsx > ConfirmDialog > calls onConfirm when confirm button is clicked 2988ms ✓ src/shared/components/ConfirmDialog.test.tsx > ConfirmDialog > calls onCancel when cancel button is clicked 1672ms ✓ src/shared/components/ConfirmDialog.test.tsx > ConfirmDialog > does not render when closed 104ms (node:878) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) ✓ src/shared/components/TokenDisplay.test.tsx > TokenDisplay > renders 0 as "0" 373ms ✓ src/shared/components/TokenDisplay.test.tsx > TokenDisplay > renders 500 as "500" 30ms ✓ src/shared/components/TokenDisplay.test.tsx > TokenDisplay > renders 1500 as "1.5K" 33ms ✓ src/shared/components/TokenDisplay.test.tsx > TokenDisplay > renders 890123 as "890.1K" 14ms ✓ src/shared/components/TokenDisplay.test.tsx > TokenDisplay > renders 1234567 as "1.2M" 26ms ✓ src/shared/components/TokenDisplay.test.tsx > TokenDisplay > renders 999500 as "999.5K" 12ms (node:885) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) ✓ src/shared/components/TokenDisplay.test.tsx > TokenDisplay > renders with label when provided 94ms ✓ src/shared/components/DurationDisplay.test.tsx > DurationDisplay > renders 0ms as "0s" 755ms ✓ src/shared/components/DurationDisplay.test.tsx > DurationDisplay > renders 5000ms as "5s" 94ms ✓ src/shared/components/DurationDisplay.test.tsx > DurationDisplay > renders 65000ms as "1m 5s" 77ms ✓ src/shared/components/DurationDisplay.test.tsx > DurationDisplay > renders 3661000ms as "1h 1m" 42ms ✓ src/shared/components/DurationDisplay.test.tsx > DurationDisplay > renders 3723000ms as "1h 2m" 28ms ✓ src/shared/components/DurationDisplay.test.tsx > DurationDisplay > renders null as "—" 17ms (node:892) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:908) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:900) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:925) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) (node:918) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) ✓ src/shared/components/RunPhaseIcon.test.tsx > RunPhaseIcon > renders pending with correct label 231ms ✓ src/shared/components/RunPhaseIcon.test.tsx > RunPhaseIcon > renders running with correct label 14ms ✓ src/shared/components/RunPhaseIcon.test.tsx > RunPhaseIcon > renders succeeded with correct label 13ms ✓ src/shared/components/RunPhaseIcon.test.tsx > RunPhaseIcon > renders failed with correct label 14ms ✓ src/shared/components/Breadcrumb.test.tsx > Breadcrumb > renders items with separators 248ms ✓ src/shared/components/Breadcrumb.test.tsx > Breadcrumb > renders links for items with href 1068ms ✓ src/shared/components/Breadcrumb.test.tsx > Breadcrumb > renders last item as plain text 129ms ✓ src/shared/components/SourceBadge.test.tsx > SourceBadge > renders manual badge 450ms ✓ src/shared/components/SourceBadge.test.tsx > SourceBadge > renders webhook badge 32ms ✓ src/shared/components/SourceBadge.test.tsx > SourceBadge > renders schedule badge 15ms ✓ src/shared/components/SourceBadge.test.tsx > SourceBadge > renders api badge 34ms 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 231ms ✓ src/shared/components/ErrorBoundary.test.tsx > ErrorBoundary > renders fallback on error 248ms ✓ src/shared/components/StatsCard.test.tsx > StatsCard > renders label and value 443ms ✓ src/shared/components/StatsCard.test.tsx > StatsCard > renders large values with abbreviation 39ms ✓ src/shared/components/StatsCard.test.tsx > StatsCard > renders accent color border 46ms stderr | src/App.test.tsx > App > shows login page when unauthenticated ⚠️ React Router Future Flag Warning: React Router will begin wrapping state updates in `React.startTransition` in v7. You can use the `v7_startTransition` future flag to opt-in early. For more information, see https://reactrouter.com/v6/upgrading/future#v7_starttransition. stderr | src/App.test.tsx > App > shows login page when unauthenticated ReferenceError: indexedDB is not defined at getDB (file:///workspace/node_modules/idb-keyval/dist/index.js:14:25) at file:///workspace/node_modules/idb-keyval/dist/index.js:24:34 at Object.get [as getItem] (file:///workspace/node_modules/idb-keyval/dist/index.js:40:12) at Object.restoreClient (file:///workspace/node_modules/@tanstack/query-async-storage-persister/build/modern/index.js:43:43) at persistQueryClientRestore (file:///workspace/node_modules/@tanstack/query-persist-client-core/build/modern/persist.js:15:45) at file:///workspace/node_modules/@tanstack/react-query-persist-client/build/modern/PersistQueryClientProvider.js:31:7 at Object.react_stack_bottom_frame (/workspace/node_modules/react-dom/cjs/react-dom-client.development.js:25989:20) at runWithFiberInDEV (/workspace/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) at commitHookEffectListMount (/workspace/node_modules/react-dom/cjs/react-dom-client.development.js:13249:29) at commitHookPassiveMountEffects (/workspace/node_modules/react-dom/cjs/react-dom-client.development.js:13336:11) Encountered an error attempting to restore client cache from persisted location. As a precaution, the persisted cache will be discarded. ✓ src/App.test.tsx > App > shows login page when unauthenticated 1584ms ⎯⎯⎯⎯⎯⎯⎯ Failed Tests 8 ⎯⎯⎯⎯⎯⎯⎯  FAIL  src/features/bot-accounts/BotAccountDetailPage.test.tsx > BotAccountDetailPage > renders account name in the page title 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/bot-accounts/BotAccountDetailPage.test.tsx:93:3  91| })  92|  93| it('renders account name in the page title', () => {  | ^  94| render(  95| ContainerRegistriesListPage > renders the page title and registry rows 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/container-registries/ContainerRegistriesListPage.test.tsx:84:3  82| })  83|  84| it('renders the page title and registry rows', () => {  | ^  85| render(  86| <MemoryRouter initialEntries={['/container-registries']}> ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/8]⎯  FAIL  src/shared/components/ConfirmDialog.test.tsx > ConfirmDialog > renders with title and message 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/ConfirmDialog.test.tsx:7:3  5|  6| describe('ConfirmDialog', () => {  7| it('renders with title and message', () => {  | ^  8| render(  9| <ConfirmDialog ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[3/8]⎯  FAIL  src/shared/components/CrudModal.test.tsx > CrudModal > 2. open=true renders title, children, footer 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/CrudModal.test.tsx:25:3  23| })  24|  25| it('2. open=true renders title, children, footer', () => {  | ^  26| renderModal()  27| expect(screen.getByText('Test Modal')).toBeInTheDocument() ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[4/8]⎯  FAIL  src/shared/components/CrudModal.test.tsx > CrudModal > 6. Discard → onClose, Keep → dialog stays 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/CrudModal.test.tsx:66:3  64| })  65|  66| it('6. Discard → onClose, Keep → dialog stays', async () => {  | ^  67| const onClose = vi.fn()  68| renderModal({ isDirty: true, onClose }) ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[5/8]⎯  FAIL  src/shared/components/EntitySelectList.test.tsx > EntitySelectList > adds a row and emits the selected repository id 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/EntitySelectList.test.tsx:57:3  55| })  56|  57| it('adds a row and emits the selected repository id', async () => {  | ^  58| const onChange = vi.fn()  59| render( pipeline config save path > sends the YAML config as a JSON object in the PUT body, never a string 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.pipelineSave.test.tsx:80:3  78| }  79|  80| it('sends the YAML config as a JSON object in the PUT body, never a …  | ^  81| renderEditForm()  82| ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[7/8]⎯  FAIL  src/layers/__tests__/L2R/CrudSurface.pipelineSave.test.tsx > pipeline config save path > omits the config field from the PUT body when the field is emptied 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.pipelineSave.test.tsx:98:3  96| })  97|  98| it('omits the config field from the PUT body when the field is empti…  | ^  99| renderEditForm() 100| ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[8/8]⎯  Test Files  6 failed | 69 passed (75)  Tests  8 failed | 832 passed | 2 skipped (842)  Start at  04:53:47  Duration  220.10s (transform 87.09s, setup 629.92s, import 274.42s, tests 330.47s, environment 662.29s) JUNIT report written to /workspace/niko/agent-platform/reports/front-unit/junit.xml