{"numTotalTestSuites":113,"numPassedTestSuites":113,"numFailedTestSuites":0,"numPendingTestSuites":0,"numTotalTests":399,"numPassedTests":399,"numFailedTests":0,"numPendingTests":0,"numTodoTests":0,"snapshot":{"added":0,"failure":false,"filesAdded":0,"filesRemoved":0,"filesRemovedList":[],"filesUnmatched":0,"filesUpdated":0,"matched":0,"total":0,"unchecked":0,"uncheckedKeysByFile":[],"unmatched":0,"updated":0,"didUpdate":false},"startTime":1786448937513,"success":true,"testResults":[{"assertionResults":[{"ancestorTitles":["collector client"],"fullName":"collector client uses exact hook-control routes and bodies","status":"passed","title":"uses exact hook-control routes and bodies","duration":8.792724000000135,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["collector client"],"fullName":"collector client forwards AbortSignal only for hook-control GET","status":"passed","title":"forwards AbortSignal only for hook-control GET","duration":2.263887000000068,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["collector client"],"fullName":"collector client uses bare fetch(url) for generic collector GET callers","status":"passed","title":"uses bare fetch(url) for generic collector GET callers","duration":1.1843179999998483,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["collector client"],"fullName":"collector client prefers server detail for hook-control POST errors","status":"passed","title":"prefers server detail for hook-control POST errors","duration":4.591533000000027,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["collector client"],"fullName":"collector client returns observed hook-control state on indeterminate persistence success","status":"passed","title":"returns observed hook-control state on indeterminate persistence success","duration":1.7327410000000327,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["collector client"],"fullName":"collector client rejects malformed hook-control GET payloads at the trust boundary","status":"passed","title":"rejects malformed hook-control GET payloads at the trust boundary","duration":0.9734100000000581,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["collector client"],"fullName":"collector client rejects null hook-control POST payloads at the trust boundary","status":"passed","title":"rejects null hook-control POST payloads at the trust boundary","duration":1.0792619999999715,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["collector client"],"fullName":"collector client rejects hook-control payloads missing controls","status":"passed","title":"rejects hook-control payloads missing controls","duration":0.6492950000001656,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["collector client"],"fullName":"collector client rejects confirmed hook-control persistence with persistenceDetail","status":"passed","title":"rejects confirmed hook-control persistence with persistenceDetail","duration":0.9303899999999885,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["collector client"],"fullName":"collector client rejects omitted hook-control persistence with persistenceDetail","status":"passed","title":"rejects omitted hook-control persistence with persistenceDetail","duration":0.8220470000001114,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["collector client"],"fullName":"collector client rejects indeterminate hook-control persistence without persistenceDetail","status":"passed","title":"rejects indeterminate hook-control persistence without persistenceDetail","duration":0.7684159999998883,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["collector client"],"fullName":"collector client normalizes null collector state collections at the HTTP trust boundary","status":"passed","title":"normalizes null collector state collections at the HTTP trust boundary","duration":0.607975000000124,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["collector client"],"fullName":"collector client maps factory panel ids to the factory adapter","status":"passed","title":"maps factory panel ids to the factory adapter","duration":0.2984920000001239,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["collector client"],"fullName":"collector client uses encoded authoritative harness URLs and preserves opaque event cursors","status":"passed","title":"uses encoded authoritative harness URLs and preserves opaque event cursors","duration":0.9905029999999897,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["collector client"],"fullName":"collector client follows opaque event cursors and deduplicates IDs","status":"passed","title":"follows opaque event cursors and deduplicates IDs","duration":0.7568400000000111,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["collector client"],"fullName":"collector client rejects a cursor that repeats explicit since without requesting it again","status":"passed","title":"rejects a cursor that repeats explicit since without requesting it again","duration":1.3906859999999597,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["collector client"],"fullName":"collector client fails closed when harness event pagination reaches its page limit","status":"passed","title":"fails closed when harness event pagination reaches its page limit","duration":8.564724999999953,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["collector client"],"fullName":"collector client serializes existing action callers without credentials and preserves actionable errors","status":"passed","title":"serializes existing action callers without credentials and preserves actionable errors","duration":0.9759770000000572,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["collector client"],"fullName":"collector client preserves action HTTP status in a typed error","status":"passed","title":"preserves action HTTP status in a typed error","duration":0.5726580000000467,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["collector client"],"fullName":"collector client serializes activity query params with URLSearchParams and omits absent values","status":"passed","title":"serializes activity query params with URLSearchParams and omits absent values","duration":3.333082999999988,"failureMessages":[],"meta":{},"tags":[]}],"startTime":1786448943930,"endTime":1786448943971.333,"status":"passed","message":"","name":"/home/user/actions-runner-overdeck-debian1/_work/overdeck/overdeck/apps/web/src/lib/collector-client.test.ts"},{"assertionResults":[{"ancestorTitles":["collector mutation proxy"],"fullName":"collector mutation proxy accepts only JSON media-type essence and returns stable known-route methods","status":"passed","title":"accepts only JSON media-type essence and returns stable known-route methods","duration":9.168141000000105,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["collector mutation proxy"],"fullName":"collector mutation proxy allows only the exact incident filing and dispatch mutation paths with same-origin proof","status":"passed","title":"allows only the exact incident filing and dispatch mutation paths with same-origin proof","duration":12.391783999999916,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["collector mutation proxy"],"fullName":"collector mutation proxy forwards artifact ranges and size metadata","status":"passed","title":"forwards artifact ranges and size metadata","duration":1.9165619999998853,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["collector mutation proxy"],"fullName":"collector mutation proxy proxies only exact harness read routes and preserves cursor headers","status":"passed","title":"proxies only exact harness read routes and preserves cursor headers","duration":1.49650900000006,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["collector mutation proxy"],"fullName":"collector mutation proxy proxies the session screen route and nothing else under /sessions","status":"passed","title":"proxies the session screen route and nothing else under /sessions","duration":1.369228000000021,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["collector mutation proxy"],"fullName":"collector mutation proxy proxies /activity as a read path","status":"passed","title":"proxies /activity as a read path","duration":1.0864500000000135,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["collector mutation proxy"],"fullName":"collector mutation proxy proxies only the exact cluster snapshot, node, and workload reads","status":"passed","title":"proxies only the exact cluster snapshot, node, and workload reads","duration":2.2446319999999105,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["collector mutation proxy"],"fullName":"collector mutation proxy accepts sessions.sendKeys only with same-origin proof","status":"passed","title":"accepts sessions.sendKeys only with same-origin proof","duration":1.357484999999997,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["collector mutation proxy"],"fullName":"collector mutation proxy requires same-origin CSRF proof and an explicit action verb","status":"passed","title":"requires same-origin CSRF proof and an explicit action verb","duration":2.2307590000000346,"failureMessages":[],"meta":{},"tags":[]}],"startTime":1786448945224,"endTime":1786448945258.2307,"status":"passed","message":"","name":"/home/user/actions-runner-overdeck-debian1/_work/overdeck/overdeck/apps/web/src/lib/collector-proxy.test.ts"},{"assertionResults":[{"ancestorTitles":["collector hook-controls queries"],"fullName":"collector hook-controls queries normalizes malformed persisted collector state before consumers read it","status":"passed","title":"normalizes malformed persisted collector state before consumers read it","duration":26.027041000000054,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["collector hook-controls queries"],"fullName":"collector hook-controls queries cancels focus/reconnect GET again before applying mutation response","status":"passed","title":"cancels focus/reconnect GET again before applying mutation response","duration":119.4828070000001,"failureMessages":[],"meta":{},"tags":[]}],"startTime":1786448953059,"endTime":1786448953204.483,"status":"passed","message":"","name":"/home/user/actions-runner-overdeck-debian1/_work/overdeck/overdeck/apps/web/src/lib/collector-queries.test.ts"},{"assertionResults":[{"ancestorTitles":["collector health mapping"],"fullName":"collector health mapping keeps the health page discoverable in shell navigation","status":"passed","title":"keeps the health page discoverable in shell navigation","duration":2.6395370000000185,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["collector health mapping"],"fullName":"collector health mapping keeps the factory page discoverable in shell navigation","status":"passed","title":"keeps the factory page discoverable in shell navigation","duration":0.3968130000000656,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["collector health mapping"],"fullName":"collector health mapping prioritizes errors over staleness and reports unknown without adapters","status":"passed","title":"prioritizes errors over staleness and reports unknown without adapters","duration":0.6437600000001567,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["collector health mapping"],"fullName":"collector health mapping derives reachability and gaps only from recorded adapter state","status":"passed","title":"derives reachability and gaps only from recorded adapter state","duration":1.3770030000000588,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["health chip never says only \"error\""],"fullName":"health chip never says only \"error\" names the failing adapter and its reason","status":"passed","title":"names the failing adapter and its reason","duration":0.7593689999998787,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["health chip never says only \"error\""],"fullName":"health chip never says only \"error\" says the collector itself is unreachable rather than blaming an adapter","status":"passed","title":"says the collector itself is unreachable rather than blaming an adapter","duration":0.32476100000008046,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["health chip never says only \"error\""],"fullName":"health chip never says only \"error\" names stale adapters and counts the ones it does not list","status":"passed","title":"names stale adapters and counts the ones it does not list","duration":0.27601400000003196,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["health chip never says only \"error\""],"fullName":"health chip never says only \"error\" reports healthy with the adapter count and no failing list","status":"passed","title":"reports healthy with the adapter count and no failing list","duration":0.23227899999983492,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["health chip never says only \"error\""],"fullName":"health chip never says only \"error\" says the collector has not answered yet instead of showing unknown bare","status":"passed","title":"says the collector has not answered yet instead of showing unknown bare","duration":0.46891199999981836,"failureMessages":[],"meta":{},"tags":[]}],"startTime":1786448951899,"endTime":1786448951906.469,"status":"passed","message":"","name":"/home/user/actions-runner-overdeck-debian1/_work/overdeck/overdeck/apps/web/src/lib/health.test.ts"},{"assertionResults":[{"ancestorTitles":["ciKvRows"],"fullName":"ciKvRows renders offline runners with err intent","status":"passed","title":"renders offline runners with err intent","duration":3.0843770000001314,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["sortPlanRunsForOverview"],"fullName":"sortPlanRunsForOverview puts running plans first, then most-recent activity","status":"passed","title":"puts running plans first, then most-recent activity","duration":0.8380940000001829,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["sortPlanRunsForOverview"],"fullName":"sortPlanRunsForOverview drops stale running plans with all tasks complete below active work","status":"passed","title":"drops stale running plans with all tasks complete below active work","duration":0.549054999999953,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["planKvRows"],"fullName":"planKvRows preserves the overview sort order","status":"passed","title":"preserves the overview sort order","duration":0.5297930000001543,"failureMessages":[],"meta":{},"tags":[]}],"startTime":1786448954149,"endTime":1786448954154.5298,"status":"passed","message":"","name":"/home/user/actions-runner-overdeck-debian1/_work/overdeck/overdeck/apps/web/src/lib/overview-mappers.test.ts"},{"assertionResults":[{"ancestorTitles":["panelFreshness"],"fullName":"panelFreshness reports a payload the browser stopped refreshing as stale","status":"passed","title":"reports a payload the browser stopped refreshing as stale","duration":3.048228999999992,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["panelFreshness"],"fullName":"panelFreshness stays quiet while the payload is within two poll intervals","status":"passed","title":"stays quiet while the payload is within two poll intervals","duration":0.5124349999998685,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["panelFreshness"],"fullName":"panelFreshness keeps the collector own stale verdict even on a fresh payload","status":"passed","title":"keeps the collector own stale verdict even on a fresh payload","duration":0.27796299999999974,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["panelFreshness"],"fullName":"panelFreshness falls back to the adapter when the panel carries no usable stamp","status":"passed","title":"falls back to the adapter when the panel carries no usable stamp","duration":0.43621699999994235,"failureMessages":[],"meta":{},"tags":[]}],"startTime":1786448955027,"endTime":1786448955031.4363,"status":"passed","message":"","name":"/home/user/actions-runner-overdeck-debian1/_work/overdeck/overdeck/apps/web/src/lib/panel-freshness.test.ts"},{"assertionResults":[{"ancestorTitles":["hostBreakdown"],"fullName":"hostBreakdown lists every registry host, the collector host, and any host only the ledger knows","status":"passed","title":"lists every registry host, the collector host, and any host only the ledger knows","duration":3.6070810000001075,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["hostBreakdown"],"fullName":"hostBreakdown renders observed zeros as zero and carries a failed probe reason","status":"passed","title":"renders observed zeros as zero and carries a failed probe reason","duration":1.4253969999999754,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["hostBreakdown"],"fullName":"hostBreakdown separates a probe that has not returned yet from one that failed","status":"passed","title":"separates a probe that has not returned yet from one that failed","duration":4.956658000000061,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["hostBreakdown"],"fullName":"hostBreakdown keeps a real zero on the recorder host, where zero is an observation","status":"passed","title":"keeps a real zero on the recorder host, where zero is an observation","duration":1.3659620000000814,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["hostBreakdown"],"fullName":"hostBreakdown reports what a remote host did enrol, without claiming it is everything","status":"passed","title":"reports what a remote host did enrol, without claiming it is everything","duration":0.5532259999999951,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["hostBreakdown"],"fullName":"hostBreakdown buckets sessions the recorder stamped no host on rather than dropping them","status":"passed","title":"buckets sessions the recorder stamped no host on rather than dropping them","duration":0.31696499999998196,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["hostBreakdown"],"fullName":"hostBreakdown sums to the same live/idle/reconnectable totals the summary shows","status":"passed","title":"sums to the same live/idle/reconnectable totals the summary shows","duration":0.40949399999999514,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["hostBreakdown"],"fullName":"hostBreakdown carries the registry verdict for a host the registry disables","status":"passed","title":"carries the registry verdict for a host the registry disables","duration":0.4516670000000431,"failureMessages":[],"meta":{},"tags":[]}],"startTime":1786448950539,"endTime":1786448950552.4517,"status":"passed","message":"","name":"/home/user/actions-runner-overdeck-debian1/_work/overdeck/overdeck/apps/web/src/lib/session-hosts.test.ts"},{"assertionResults":[{"ancestorTitles":["session state chips"],"fullName":"session state chips keeps detached-alive visually distinct from orphaned","status":"passed","title":"keeps detached-alive visually distinct from orphaned","duration":7.567399000000023,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["session state chips"],"fullName":"session state chips separates working from idle","status":"passed","title":"separates working from idle","duration":0.43292399999995723,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["toAgentSessionRow"],"fullName":"toAgentSessionRow maps the ledger vocabulary onto the pinned states without losing the detail one","status":"passed","title":"maps the ledger vocabulary onto the pinned states without losing the detail one","duration":0.73404000000005,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["toAgentSessionRow"],"fullName":"toAgentSessionRow keeps each cli distinct rather than flattening them to one runtime","status":"passed","title":"keeps each cli distinct rather than flattening them to one runtime","duration":0.5178079999998317,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["toAgentSessionRow"],"fullName":"toAgentSessionRow reports every absent field as null instead of a plausible substitute","status":"passed","title":"reports every absent field as null instead of a plausible substitute","duration":0.4592710000001716,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["toAgentSessionRow"],"fullName":"toAgentSessionRow never back-fills last activity from the session start time","status":"passed","title":"never back-fills last activity from the session start time","duration":0.2614579999999478,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["toAgentSessionRow"],"fullName":"toAgentSessionRow infers launchedBy only from a recorded parent, never from anything else","status":"passed","title":"infers launchedBy only from a recorded parent, never from anything else","duration":0.2472210000000814,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["toAgentSessionRow"],"fullName":"toAgentSessionRow refuses a launcher value outside the contract rather than showing it as fact","status":"passed","title":"refuses a launcher value outside the contract rather than showing it as fact","duration":0.1571920000001228,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["toAgentSessionRow"],"fullName":"toAgentSessionRow flags a resume command that carries no account","status":"passed","title":"flags a resume command that carries no account","duration":0.5260869999999613,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["toAgentSessionRow"],"fullName":"toAgentSessionRow carries the reconnect descriptor through untouched, reason included","status":"passed","title":"carries the reconnect descriptor through untouched, reason included","duration":0.3492220000000543,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["toAgentSessionRow"],"fullName":"toAgentSessionRow covers every attach kind in the contract","status":"passed","title":"covers every attach kind in the contract","duration":0.29275299999994786,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["toAgentSessionRow"],"fullName":"toAgentSessionRow gives every unreachable row a reason","status":"passed","title":"gives every unreachable row a reason","duration":0.4661389999998846,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["durationSince"],"fullName":"durationSince measures a real elapsed time","status":"passed","title":"measures a real elapsed time","duration":0.3579250000000229,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["durationSince"],"fullName":"durationSince reports an absent timestamp as unknown with no invented problem","status":"passed","title":"reports an absent timestamp as unknown with no invented problem","duration":0.17274499999984982,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["durationSince"],"fullName":"durationSince never returns a negative duration for a future timestamp — it names the data bug","status":"passed","title":"never returns a negative duration for a future timestamp — it names the data bug","duration":0.171746000000212,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["durationSince"],"fullName":"durationSince names an unparseable timestamp instead of rendering NaN","status":"passed","title":"names an unparseable timestamp instead of rendering NaN","duration":0.14854799999989154,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["groupSessionsByProject"],"fullName":"groupSessionsByProject groups every project, live groups first","status":"passed","title":"groups every project, live groups first","duration":0.6589420000000246,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["groupSessionsByProject"],"fullName":"groupSessionsByProject sorts live rows above finished ones inside a group","status":"passed","title":"sorts live rows above finished ones inside a group","duration":0.2443759999998747,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["groupSessionsByProject"],"fullName":"groupSessionsByProject sorts rows with no timestamps last instead of first","status":"passed","title":"sorts rows with no timestamps last instead of first","duration":0.3538340000000062,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["groupSessionsByProject"],"fullName":"groupSessionsByProject returns nothing for an empty ledger","status":"passed","title":"returns nothing for an empty ledger","duration":0.1584850000001552,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["projectLabel"],"fullName":"projectLabel names a worktree by its repo and slug so two worktrees never read alike","status":"passed","title":"names a worktree by its repo and slug so two worktrees never read alike","duration":0.23769199999992452,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["projectLabel"],"fullName":"projectLabel keeps a checkout and a build clone of one repo apart","status":"passed","title":"keeps a checkout and a build clone of one repo apart","duration":0.16346199999998134,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["projectLabel"],"fullName":"projectLabel strips the home prefix instead of printing it on every group","status":"passed","title":"strips the home prefix instead of printing it on every group","duration":0.11983299999997143,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["projectLabel"],"fullName":"projectLabel never names a group after the user, which is what a home-rooted repo walk produces","status":"passed","title":"never names a group after the user, which is what a home-rooted repo walk produces","duration":0.1935559999999441,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["runningTime and idleTime"],"fullName":"runningTime and idleTime ticks the running clock only while the session is running","status":"passed","title":"ticks the running clock only while the session is running","duration":0.3072589999999309,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["runningTime and idleTime"],"fullName":"runningTime and idleTime freezes the running clock of a finished session at its recorded end","status":"passed","title":"freezes the running clock of a finished session at its recorded end","duration":0.2263029999999162,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["runningTime and idleTime"],"fullName":"runningTime and idleTime measures an orphaned session to its last activity, since it has no end","status":"passed","title":"measures an orphaned session to its last activity, since it has no end","duration":0.1864780000000792,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["runningTime and idleTime"],"fullName":"runningTime and idleTime reports an idle clock only for a running session, and last-seen otherwise","status":"passed","title":"reports an idle clock only for a running session, and last-seen otherwise","duration":0.266503000000057,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["runningTime and idleTime"],"fullName":"runningTime and idleTime names the data bug rather than rendering a negative duration","status":"passed","title":"names the data bug rather than rendering a negative duration","duration":0.15992499999993015,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["runningTime and idleTime"],"fullName":"runningTime and idleTime says a finished session with no recorded end has an unknown run length","status":"passed","title":"says a finished session with no recorded end has an unknown run length","duration":0.16362699999990582,"failureMessages":[],"meta":{},"tags":[]}],"startTime":1786448946405,"endTime":1786448946423.1636,"status":"passed","message":"","name":"/home/user/actions-runner-overdeck-debian1/_work/overdeck/overdeck/apps/web/src/lib/session-types.test.ts"},{"assertionResults":[{"ancestorTitles":["session fixtures never reach a real user"],"fullName":"session fixtures never reach a real user is imported by no shipped source file","status":"passed","title":"is imported by no shipped source file","duration":7.654872999999952,"failureMessages":[],"meta":{},"tags":[]}],"startTime":1786448957433,"endTime":1786448957440.6548,"status":"passed","message":"","name":"/home/user/actions-runner-overdeck-debian1/_work/overdeck/overdeck/apps/web/src/lib/sessions-fixtures-containment.test.ts"},{"assertionResults":[{"ancestorTitles":["sidebarBadgesFromState"],"fullName":"sidebarBadgesFromState uses the live bot fleet count instead of static mockup values","status":"passed","title":"uses the live bot fleet count instead of static mockup values","duration":2.655954000000065,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["sidebarBadgesFromState"],"fullName":"sidebarBadgesFromState derives inbox and decision badges from collector items","status":"passed","title":"derives inbox and decision badges from collector items","duration":0.49734699999999066,"failureMessages":[],"meta":{},"tags":[]}],"startTime":1786448957355,"endTime":1786448957357.656,"status":"passed","message":"","name":"/home/user/actions-runner-overdeck-debian1/_work/overdeck/overdeck/apps/web/src/lib/sidebar-badges.test.ts"},{"assertionResults":[{"ancestorTitles":["buildOffloadActionArgs"],"fullName":"buildOffloadActionArgs maps every supported verb to exact T3 args","status":"passed","title":"maps every supported verb to exact T3 args","duration":3.5501210000002175,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["buildOffloadActionArgs"],"fullName":"buildOffloadActionArgs rejects unknown verbs and missing prerequisites","status":"passed","title":"rejects unknown verbs and missing prerequisites","duration":0.503114999999525,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["buildOffloadActionArgs"],"fullName":"buildOffloadActionArgs refuses host actions when the registry marks the host unreachable","status":"passed","title":"refuses host actions when the registry marks the host unreachable","duration":1.2781569999997373,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["ci-mappers panel honesty"],"fullName":"ci-mappers panel honesty labels every capability probe with the host it was taken on","status":"passed","title":"labels every capability probe with the host it was taken on","duration":0.6033109999998487,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["ci-mappers panel honesty"],"fullName":"ci-mappers panel honesty reports a stale remote-jobs panel as unknown rather than as no jobs","status":"passed","title":"reports a stale remote-jobs panel as unknown rather than as no jobs","duration":1.0870370000002367,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["ci-mappers panel honesty"],"fullName":"ci-mappers panel honesty maps structured KPI samples without scraping incident titles","status":"passed","title":"maps structured KPI samples without scraping incident titles","duration":0.43695299999944837,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["CiContent with an unreadable buildbox registry"],"fullName":"CiContent with an unreadable buildbox registry names the failure and claims no fleet, no jobs and no machine cards","status":"passed","title":"names the failure and claims no fleet, no jobs and no machine cards","duration":69.65823300000011,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["CiContent offload actions"],"fullName":"CiContent offload actions carries box-side guard facts from the collector payload into the detail modal","status":"passed","title":"carries box-side guard facts from the collector payload into the detail modal","duration":154.6093150000006,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["CiContent offload actions"],"fullName":"CiContent offload actions reads revision at confirm time after dialog opens","status":"passed","title":"reads revision at confirm time after dialog opens","duration":559.3433130000003,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["CiContent offload actions"],"fullName":"CiContent offload actions retains selected host when the detail modal closes","status":"passed","title":"retains selected host when the detail modal closes","duration":167.53671799999938,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["CiContent offload actions"],"fullName":"CiContent offload actions posts exact args for control and modal verbs with requestedBy overdeck-web","status":"passed","title":"posts exact args for control and modal verbs with requestedBy overdeck-web","duration":703.7562779999998,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["CiContent offload actions"],"fullName":"CiContent offload actions does not post when confirm is cancelled or verb is unsupported","status":"passed","title":"does not post when confirm is cancelled or verb is unsupported","duration":159.0582429999995,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["CiContent offload actions"],"fullName":"CiContent offload actions refetches collector-state after a successful action","status":"passed","title":"refetches collector-state after a successful action","duration":115.79467599999953,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["CiContent offload actions"],"fullName":"CiContent offload actions preserves selection, surfaces alert + danger toast, and retries after failure","status":"passed","title":"preserves selection, surfaces alert + danger toast, and retries after failure","duration":388.1772379999993,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["CiContent offload actions"],"fullName":"CiContent offload actions lists a registry host the controller never enrolled, and says so on the card","status":"passed","title":"lists a registry host the controller never enrolled, and says so on the card","duration":46.155024000000594,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["CiContent offload actions"],"fullName":"CiContent offload actions does not call an unreachable controller evidence of enrollment","status":"passed","title":"does not call an unreachable controller evidence of enrollment","duration":32.34013200000027,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["CiContent offload actions"],"fullName":"CiContent offload actions says the registry is unreadable rather than presenting a shorter fleet as complete","status":"passed","title":"says the registry is unreadable rather than presenting a shorter fleet as complete","duration":33.87862900000073,"failureMessages":[],"meta":{},"tags":[]}],"startTime":1786448941977,"endTime":1786448944415.8787,"status":"passed","message":"","name":"/home/user/actions-runner-overdeck-debian1/_work/overdeck/overdeck/apps/web/src/components/ci/CiContent.test.tsx"},{"assertionResults":[{"ancestorTitles":["ClusterContent"],"fullName":"ClusterContent uses the shared live Machines surface ahead of the cluster summary","status":"passed","title":"uses the shared live Machines surface ahead of the cluster summary","duration":148.84192900000016,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["ClusterPanel"],"fullName":"ClusterPanel uses only a recorded run id for the canonical observability link","status":"passed","title":"uses only a recorded run id for the canonical observability link","duration":0.5380029999996623,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["ClusterPanel"],"fullName":"ClusterPanel renders source reasons and never turns absent metrics into zero","status":"passed","title":"renders source reasons and never turns absent metrics into zero","duration":276.2230400000003,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["ClusterPanel"],"fullName":"ClusterPanel opens node detail through the node query route","status":"passed","title":"opens node detail through the node query route","duration":104.52905499999997,"failureMessages":[],"meta":{},"tags":[]}],"startTime":1786448952695,"endTime":1786448953225.529,"status":"passed","message":"","name":"/home/user/actions-runner-overdeck-debian1/_work/overdeck/overdeck/apps/web/src/components/cluster/ClusterContent.test.tsx"},{"assertionResults":[{"ancestorTitles":["design-system gallery registry"],"fullName":"design-system gallery registry registers every React component exported by the deck-ui barrel","status":"passed","title":"registers every React component exported by the deck-ui barrel","duration":6.99425599999995,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["design-system gallery registry"],"fullName":"design-system gallery registry renders plans attempt history gallery entries without throwing","status":"passed","title":"renders plans attempt history gallery entries without throwing","duration":43.90218399999958,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["design-system gallery registry"],"fullName":"design-system gallery registry keeps the gallery discoverable in shell navigation","status":"passed","title":"keeps the gallery discoverable in shell navigation","duration":0.9568790000002991,"failureMessages":[],"meta":{},"tags":[]}],"startTime":1786448957348,"endTime":1786448957399.9568,"status":"passed","message":"","name":"/home/user/actions-runner-overdeck-debian1/_work/overdeck/overdeck/apps/web/src/components/design-system/gallery-registry.test.ts"},{"assertionResults":[{"ancestorTitles":["BrowserApprovalToggle"],"fullName":"BrowserApprovalToggle turns approvals on and reports the wait the terminal falls back after","status":"passed","title":"turns approvals on and reports the wait the terminal falls back after","duration":171.03434700000025,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["BrowserApprovalToggle"],"fullName":"BrowserApprovalToggle shows the armed state while the collector window is open and turns it off again","status":"passed","title":"shows the armed state while the collector window is open and turns it off again","duration":20.726522999999816,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["BrowserApprovalToggle"],"fullName":"BrowserApprovalToggle treats a lapsed window as off rather than reporting a stale on","status":"passed","title":"treats a lapsed window as off rather than reporting a stale on","duration":9.05234100000007,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["BrowserApprovalToggle"],"fullName":"BrowserApprovalToggle says so instead of guessing when the collector reports no permission gate","status":"passed","title":"says so instead of guessing when the collector reports no permission gate","duration":3.18969799999968,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["BrowserApprovalToggle"],"fullName":"BrowserApprovalToggle lets a hidden page lapse instead of refreshing the window it cannot keep alive","status":"passed","title":"lets a hidden page lapse instead of refreshing the window it cannot keep alive","duration":8.136367000000064,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["BrowserApprovalToggle"],"fullName":"BrowserApprovalToggle surfaces a failed toggle instead of showing a state it did not reach","status":"passed","title":"surfaces a failed toggle instead of showing a state it did not reach","duration":14.439836999999898,"failureMessages":[],"meta":{},"tags":[]}],"startTime":1786448953544,"endTime":1786448953771.44,"status":"passed","message":"","name":"/home/user/actions-runner-overdeck-debian1/_work/overdeck/overdeck/apps/web/src/components/decisions/BrowserApprovalToggle.test.tsx"},{"assertionResults":[{"ancestorTitles":["DecisionsListBody"],"fullName":"DecisionsListBody answers a queued tool permission through the collector permission queue","status":"passed","title":"answers a queued tool permission through the collector permission queue","duration":248.66026799999963,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["DecisionsListBody"],"fullName":"DecisionsListBody denies through the same queue","status":"passed","title":"denies through the same queue","duration":31.970139999999446,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["DecisionsListBody"],"fullName":"DecisionsListBody reports an empty queue rather than inventing a pending decision","status":"passed","title":"reports an empty queue rather than inventing a pending decision","duration":3.904048999999759,"failureMessages":[],"meta":{},"tags":[]}],"startTime":1786448955826,"endTime":1786448956110.904,"status":"passed","message":"","name":"/home/user/actions-runner-overdeck-debian1/_work/overdeck/overdeck/apps/web/src/components/decisions/DecisionsApp.test.tsx"},{"assertionResults":[{"ancestorTitles":["decision mappers"],"fullName":"decision mappers separates decisions from halts","status":"passed","title":"separates decisions from halts","duration":2.283108000000084,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["decision mappers"],"fullName":"decision mappers renders options for both harness and factory answer verbs","status":"passed","title":"renders options for both harness and factory answer verbs","duration":1.2905120000000352,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["decision mappers"],"fullName":"decision mappers identifies factory decision items by id prefix and extracts the decision id","status":"passed","title":"identifies factory decision items by id prefix and extracts the decision id","duration":0.4751139999998486,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["decision mappers"],"fullName":"decision mappers renders allow/deny options for a queued tool permission and offers no free text","status":"passed","title":"renders allow/deny options for a queued tool permission and offers no free text","duration":0.7034449999998742,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["decision mappers"],"fullName":"decision mappers allows free text on factory items only when the decision declares it","status":"passed","title":"allows free text on factory items only when the decision declares it","duration":0.408476999999948,"failureMessages":[],"meta":{},"tags":[]}],"startTime":1786448951797,"endTime":1786448951802.4084,"status":"passed","message":"","name":"/home/user/actions-runner-overdeck-debian1/_work/overdeck/overdeck/apps/web/src/components/decisions/decision-mappers.test.ts"},{"assertionResults":[{"ancestorTitles":["FactoryContent"],"fullName":"FactoryContent renders a completed run with per-phase estimated spend","status":"passed","title":"renders a completed run with per-phase estimated spend","duration":363.67692499999976,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["FactoryContent"],"fullName":"FactoryContent opens the full prompt in a drawer and copies it while preserving the collapsed counter","status":"passed","title":"opens the full prompt in a drawer and copies it while preserving the collapsed counter","duration":302.29671400000007,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["FactoryContent"],"fullName":"FactoryContent renders tool calls in sequence with durations and opens the complete result excerpt","status":"passed","title":"renders tool calls in sequence with durations and opens the complete result excerpt","duration":206.786967,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["FactoryContent"],"fullName":"FactoryContent renders a killed tool call without inventing a zero duration","status":"passed","title":"renders a killed tool call without inventing a zero duration","duration":170.07710999999927,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["FactoryContent"],"fullName":"FactoryContent renders an explicit empty state when an attempt has no tool calls","status":"passed","title":"renders an explicit empty state when an attempt has no tool calls","duration":164.32311600000048,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["FactoryContent"],"fullName":"FactoryContent identifies an idle timeout as the no-output limit in the table and metadata","status":"passed","title":"identifies an idle timeout as the no-output limit in the table and metadata","duration":184.26205700000082,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["FactoryContent"],"fullName":"FactoryContent keeps the existing timeout wording when timeoutKind is null","status":"passed","title":"keeps the existing timeout wording when timeoutKind is null","duration":194.10228499999994,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["FactoryContent"],"fullName":"FactoryContent renders a partial running run with elapsed timing and stop command","status":"passed","title":"renders a partial running run with elapsed timing and stop command","duration":107.8458529999998,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["FactoryContent"],"fullName":"FactoryContent shows events when a run has events but no phases","status":"passed","title":"shows events when a run has events but no phases","duration":31.850945999999567,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["FactoryContent"],"fullName":"FactoryContent shows canonical repo name for legacy worktree paths without repoName","status":"passed","title":"shows canonical repo name for legacy worktree paths without repoName","duration":50.39808200000061,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["FactoryContent"],"fullName":"FactoryContent lists live runs before completed runs and shows multiple repos","status":"passed","title":"lists live runs before completed runs and shows multiple repos","duration":48.90845799999988,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["FactoryContent"],"fullName":"FactoryContent handles malformed and unknown fields without crashing","status":"passed","title":"handles malformed and unknown fields without crashing","duration":17.272313999999824,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["FactoryContent"],"fullName":"FactoryContent distinguishes an empty database from collector failure","status":"passed","title":"distinguishes an empty database from collector failure","duration":25.829039999999623,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["FactoryContent"],"fullName":"FactoryContent expands a run with a pending decision by default and answers it in place","status":"passed","title":"expands a run with a pending decision by default and answers it in place","duration":128.01044999999976,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["FactoryContent"],"fullName":"FactoryContent shows answered decision history with the chosen answer, rendered as relative time","status":"passed","title":"shows answered decision history with the chosen answer, rendered as relative time","duration":28.276154000000133,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["FactoryContent"],"fullName":"FactoryContent falls back to the raw string when answeredAt is unparseable","status":"passed","title":"falls back to the raw string when answeredAt is unparseable","duration":21.749861999999666,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["FactoryContent"],"fullName":"FactoryContent offers a rerun command on finished runs as the change-your-mind path","status":"passed","title":"offers a rerun command on finished runs as the change-your-mind path","duration":22.072451,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["FactoryContent"],"fullName":"FactoryContent keeps run summary text outside the expand toggle so identifiers stay selectable","status":"passed","title":"keeps run summary text outside the expand toggle so identifiers stay selectable","duration":35.20813400000043,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["FactoryContent"],"fullName":"FactoryContent stops a running run through the two-step confirm button","status":"passed","title":"stops a running run through the two-step confirm button","duration":127.47876799999995,"failureMessages":[],"meta":{},"tags":[]}],"startTime":1786448942127,"endTime":1786448944357.4788,"status":"passed","message":"","name":"/home/user/actions-runner-overdeck-debian1/_work/overdeck/overdeck/apps/web/src/components/factory/FactoryContent.test.tsx"},{"assertionResults":[{"ancestorTitles":["FactoryGateTable"],"fullName":"FactoryGateTable renders structured failing-check command metadata and the selectable command log path","status":"passed","title":"renders structured failing-check command metadata and the selectable command log path","duration":331.8523319999995,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["FactoryGateTable"],"fullName":"FactoryGateTable opens the complete long failure detail in a drawer","status":"passed","title":"opens the complete long failure detail in a drawer","duration":81.6100290000004,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["FactoryGateTable"],"fullName":"FactoryGateTable keeps a passing gate on the existing checks-only presentation","status":"passed","title":"keeps a passing gate on the existing checks-only presentation","duration":70.88872900000024,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["FactoryGateTable"],"fullName":"FactoryGateTable states explicitly when a failed gate has no violation details","status":"passed","title":"states explicitly when a failed gate has no violation details","duration":38.83133599999928,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["FactoryGateTable"],"fullName":"FactoryGateTable renders unknown gate and check verdicts honestly","status":"passed","title":"renders unknown gate and check verdicts honestly","duration":35.74892899999941,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["FactoryDiffTable"],"fullName":"FactoryDiffTable opens the full diff text and changed-file list for a phase","status":"passed","title":"opens the full diff text and changed-file list for a phase","duration":71.54030700000021,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["FactoryDiffTable"],"fullName":"FactoryDiffTable marks a truncated diff and says so when no diff text was recorded","status":"passed","title":"marks a truncated diff and says so when no diff text was recorded","duration":33.126860000000306,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["FactoryProcessTable"],"fullName":"FactoryProcessTable shows each owned process with its pid, command and liveness","status":"passed","title":"shows each owned process with its pid, command and liveness","duration":24.85754100000031,"failureMessages":[],"meta":{},"tags":[]}],"startTime":1786448948642,"endTime":1786448949330.8574,"status":"passed","message":"","name":"/home/user/actions-runner-overdeck-debian1/_work/overdeck/overdeck/apps/web/src/components/factory/FactoryTraceTables.test.tsx"},{"assertionResults":[{"ancestorTitles":["factory helpers"],"fullName":"factory helpers formats estimated spend and token counts honestly","status":"passed","title":"formats estimated spend and token counts honestly","duration":2.813346000000365,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["factory helpers"],"fullName":"factory helpers sorts live runs ahead of completed runs","status":"passed","title":"sorts live runs ahead of completed runs","duration":1.0398800000002666,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["factory helpers"],"fullName":"factory helpers filters pending decisions and summarizes answers by option label","status":"passed","title":"filters pending decisions and summarizes answers by option label","duration":0.6561289999999644,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["factory helpers"],"fullName":"factory helpers builds a rerun command from the run request and first adw token","status":"passed","title":"builds a rerun command from the run request and first adw token","duration":0.8758609999999862,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["factory helpers"],"fullName":"factory helpers prefers run slug for display name and keeps request as secondary context","status":"passed","title":"prefers run slug for display name and keeps request as secondary context","duration":0.45699500000000626,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["factory helpers"],"fullName":"factory helpers falls back to request and adw id for legacy runs without slug","status":"passed","title":"falls back to request and adw id for legacy runs without slug","duration":0.25923499999998967,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["factory helpers"],"fullName":"factory helpers prefers repoName for display and falls back for legacy worktree paths","status":"passed","title":"prefers repoName for display and falls back for legacy worktree paths","duration":0.31954499999983454,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["factory helpers"],"fullName":"factory helpers keeps the exact repo path in rerun commands","status":"passed","title":"keeps the exact repo path in rerun commands","duration":0.19266099999958897,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["factory helpers"],"fullName":"factory helpers falls back safely for unknown event and status labels","status":"passed","title":"falls back safely for unknown event and status labels","duration":0.6148659999998927,"failureMessages":[],"meta":{},"tags":[]}],"startTime":1786448950627,"endTime":1786448950634.6147,"status":"passed","message":"","name":"/home/user/actions-runner-overdeck-debian1/_work/overdeck/overdeck/apps/web/src/components/factory/factory-helpers.test.ts"},{"assertionResults":[{"ancestorTitles":["HealthContent"],"fullName":"HealthContent reorders adapters when the system header is activated","status":"passed","title":"reorders adapters when the system header is activated","duration":227.13658600000008,"failureMessages":[],"meta":{},"tags":[]}],"startTime":1786448958086,"endTime":1786448958313.1365,"status":"passed","message":"","name":"/home/user/actions-runner-overdeck-debian1/_work/overdeck/overdeck/apps/web/src/components/health/HealthContent.test.tsx"},{"assertionResults":[{"ancestorTitles":["HookControlToggle"],"fullName":"HookControlToggle is pessimistic while pending and announces a failed update","status":"passed","title":"is pessimistic while pending and announces a failed update","duration":197.4848649999999,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["HookControlToggle"],"fullName":"HookControlToggle links hint and error through aria-describedby","status":"passed","title":"links hint and error through aria-describedby","duration":14.28095200000007,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["HookControlToggle"],"fullName":"HookControlToggle retains the confirmed enabled state while pending","status":"passed","title":"retains the confirmed enabled state while pending","duration":4.274553000000196,"failureMessages":[],"meta":{},"tags":[]}],"startTime":1786448957025,"endTime":1786448957241.2747,"status":"passed","message":"","name":"/home/user/actions-runner-overdeck-debian1/_work/overdeck/overdeck/apps/web/src/components/hooks/HookControlToggle.test.tsx"},{"assertionResults":[{"ancestorTitles":["HooksContent"],"fullName":"HooksContent places the fetched control before hook counts","status":"passed","title":"places the fetched control before hook counts","duration":73.0061510000005,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["HooksContent"],"fullName":"HooksContent disables the control before the initial GET resolves and during mutation","status":"passed","title":"disables the control before the initial GET resolves and during mutation","duration":17.449987999999394,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["HooksContent"],"fullName":"HooksContent retains confirmed state and surfaces mutation errors","status":"passed","title":"retains confirmed state and surfaces mutation errors","duration":161.96929499999987,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["HooksContent"],"fullName":"HooksContent adopts observed state and offers reconfirm when persistence is indeterminate","status":"passed","title":"adopts observed state and offers reconfirm when persistence is indeterminate","duration":44.91085800000019,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["HooksContent"],"fullName":"HooksContent retains observed state and surfaces reconfirm errors","status":"passed","title":"retains observed state and surfaces reconfirm errors","duration":54.433938999999555,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["HooksContent"],"fullName":"HooksContent disables the toggle and offers repair when the config issue is non-null","status":"passed","title":"disables the toggle and offers repair when the config issue is non-null","duration":26.926134000000275,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["HooksContent"],"fullName":"HooksContent groups hooks by event and flags dead ones","status":"passed","title":"groups hooks by event and flags dead ones","duration":34.93777299999965,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["HooksContent"],"fullName":"HooksContent shows unresolved runtimes and the unobserved count","status":"passed","title":"shows unresolved runtimes and the unobserved count","duration":29.62015799999972,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["HooksContent"],"fullName":"HooksContent filters hooks across events","status":"passed","title":"filters hooks across events","duration":30.65365500000007,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["HooksContent"],"fullName":"HooksContent renders unchecked before hook controls load","status":"passed","title":"renders unchecked before hook controls load","duration":11.019516999999723,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["HooksContent"],"fullName":"HooksContent does not offer repair for nonrepairable issues but still surfaces issue detail","status":"passed","title":"does not offer repair for nonrepairable issues but still surfaces issue detail","duration":37.064926000000014,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["HooksContent"],"fullName":"HooksContent surfaces both issue and persistence detail when both are present","status":"passed","title":"surfaces both issue and persistence detail when both are present","duration":24.837931999999455,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["HooksContent"],"fullName":"HooksContent does not show reconfirm when config issue is non-null","status":"passed","title":"does not show reconfirm when config issue is non-null","duration":29.645659999999225,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["HooksContent"],"fullName":"HooksContent mutually excludes repair and reconfirm pending states","status":"passed","title":"mutually excludes repair and reconfirm pending states","duration":88.8394360000002,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["HooksContent"],"fullName":"HooksContent clears stale mutation error after successful toggle and confirmed GET","status":"passed","title":"clears stale mutation error after successful toggle and confirmed GET","duration":40.86030000000028,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["HooksContent"],"fullName":"HooksContent renders the empty state and source errors","status":"passed","title":"renders the empty state and source errors","duration":9.067001999999775,"failureMessages":[],"meta":{},"tags":[]}],"startTime":1786448941913,"endTime":1786448942629.067,"status":"passed","message":"","name":"/home/user/actions-runner-overdeck-debian1/_work/overdeck/overdeck/apps/web/src/components/hooks/HooksContent.test.tsx"},{"assertionResults":[{"ancestorTitles":["loadRecord"],"fullName":"loadRecord returns only string key/value entries","status":"passed","title":"returns only string key/value entries","duration":2.461426999999958,"failureMessages":[],"meta":{},"tags":[]}],"startTime":1786448958154,"endTime":1786448958156.4614,"status":"passed","message":"","name":"/home/user/actions-runner-overdeck-debian1/_work/overdeck/overdeck/apps/web/src/components/inbox/browser-storage.test.ts"},{"assertionResults":[{"ancestorTitles":["IncidentsContent"],"fullName":"IncidentsContent lists active incidents and keeps resolved ones in their own section","status":"passed","title":"lists active incidents and keeps resolved ones in their own section","duration":119.21356800000012,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["IncidentsContent"],"fullName":"IncidentsContent files an incident with the existing form controls and keeps authoritative response data","status":"passed","title":"files an incident with the existing form controls and keeps authoritative response data","duration":313.2725249999994,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["IncidentsContent"],"fullName":"IncidentsContent shows the empty-active copy only when the store answered with no active incidents","status":"passed","title":"shows the empty-active copy only when the store answered with no active incidents","duration":18.748116000000664,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["IncidentsContent"],"fullName":"IncidentsContent never reuses the empty copy for an unreachable store","status":"passed","title":"never reuses the empty copy for an unreachable store","duration":12.804909000000407,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["IncidentsContent"],"fullName":"IncidentsContent distinguishes an unconfigured store from an unreachable one","status":"passed","title":"distinguishes an unconfigured store from an unreachable one","duration":8.774857999999767,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["IncidentsContent"],"fullName":"IncidentsContent renders unknown priority and absent timestamps as em dashes","status":"passed","title":"renders unknown priority and absent timestamps as em dashes","duration":127.6902170000003,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["IncidentsContent"],"fullName":"IncidentsContent filters the list by the typed text","status":"passed","title":"filters the list by the typed text","duration":73.31427900000017,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["IncidentsContent"],"fullName":"IncidentsContent opens the detail drawer and shows lifecycle entries from the detail route","status":"passed","title":"opens the detail drawer and shows lifecycle entries from the detail route","duration":230.7436029999999,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["IncidentsContent"],"fullName":"IncidentsContent sorts lifecycle entries when the timestamp header is activated","status":"passed","title":"sorts lifecycle entries when the timestamp header is activated","duration":190.8117199999997,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["IncidentsContent"],"fullName":"IncidentsContent reports a failed detail fetch instead of claiming there is no history","status":"passed","title":"reports a failed detail fetch instead of claiming there is no history","duration":119.53226900000027,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["IncidentsContent"],"fullName":"IncidentsContent surfaces incomplete coverage instead of presenting the list as whole","status":"passed","title":"surfaces incomplete coverage instead of presenting the list as whole","duration":42.8093259999996,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["IncidentsContent"],"fullName":"IncidentsContent re-sorts by priority when the header is activated","status":"passed","title":"re-sorts by priority when the header is activated","duration":174.4112299999997,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["IncidentsContent"],"fullName":"IncidentsContent files an incident from the shared-control form","status":"passed","title":"files an incident from the shared-control form","duration":91.42316000000028,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["IncidentsContent"],"fullName":"IncidentsContent dispatches only a filed incident from its detail drawer","status":"passed","title":"dispatches only a filed incident from its detail drawer","duration":123.0278959999996,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["IncidentsContent"],"fullName":"IncidentsContent pre-selects the suggested type from title keywords and sends it when filing","status":"passed","title":"pre-selects the suggested type from title keywords and sends it when filing","duration":117.47178500000064,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["IncidentsContent"],"fullName":"IncidentsContent lets the owner override or clear the suggested type","status":"passed","title":"lets the owner override or clear the suggested type","duration":84.15720899999997,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["IncidentsContent"],"fullName":"IncidentsContent hides the type dropdown when the options endpoint is unavailable","status":"passed","title":"hides the type dropdown when the options endpoint is unavailable","duration":18.027240000000347,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["IncidentsContent"],"fullName":"IncidentsContent renders the persisted dispatch brief read-only in the drawer","status":"passed","title":"renders the persisted dispatch brief read-only in the drawer","duration":81.44620299999951,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["IncidentsContent"],"fullName":"IncidentsContent omits the brief section when no brief was persisted","status":"passed","title":"omits the brief section when no brief was persisted","duration":64.63312099999985,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["IncidentsContent"],"fullName":"IncidentsContent disables dispatch filing while options are loading","status":"passed","title":"disables dispatch filing while options are loading","duration":34.007000999999946,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["IncidentsContent"],"fullName":"IncidentsContent keeps narrative input and retries when dispatch options are unavailable","status":"passed","title":"keeps narrative input and retries when dispatch options are unavailable","duration":40.72607699999935,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["IncidentsContent"],"fullName":"IncidentsContent treats POST incident-assets-unavailable as stale options with retry, not store unavailable","status":"passed","title":"treats POST incident-assets-unavailable as stale options with retry, not store unavailable","duration":86.60956700000042,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["IncidentsContent"],"fullName":"IncidentsContent treats POST incident-accounts-unavailable as stale options with retry, not store unavailable","status":"passed","title":"treats POST incident-accounts-unavailable as stale options with retry, not store unavailable","duration":103.50966799999969,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["IncidentsContent"],"fullName":"IncidentsContent treats a malformed options payload missing clis as unavailable without throwing","status":"passed","title":"treats a malformed options payload missing clis as unavailable without throwing","duration":50.376374999999825,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["IncidentsContent"],"fullName":"IncidentsContent clears incompatible model, effort, and account when the CLI changes","status":"passed","title":"clears incompatible model, effort, and account when the CLI changes","duration":60.65997900000002,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["IncidentsContent"],"fullName":"IncidentsContent resets effort on model change while leaving account intact","status":"passed","title":"resets effort on model change while leaving account intact","duration":57.144835999999486,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["IncidentsContent"],"fullName":"IncidentsContent populates authoritative selectors from options even when the incident store is empty","status":"passed","title":"populates authoritative selectors from options even when the incident store is empty","duration":71.1919369999996,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["IncidentsContent"],"fullName":"IncidentsContent surfaces the named brief refusal and offers the explicit without-brief dispatch","status":"passed","title":"surfaces the named brief refusal and offers the explicit without-brief dispatch","duration":142.788861,"failureMessages":[],"meta":{},"tags":[]}],"startTime":1786448941971,"endTime":1786448944630.7888,"status":"passed","message":"","name":"/home/user/actions-runner-overdeck-debian1/_work/overdeck/overdeck/apps/web/src/components/incidents/IncidentsContent.test.tsx"},{"assertionResults":[{"ancestorTitles":["sortIncidents"],"fullName":"sortIncidents puts active incidents ahead of resolved ones","status":"passed","title":"puts active incidents ahead of resolved ones","duration":2.688350999999784,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["sortIncidents"],"fullName":"sortIncidents orders P0 before P3 and sorts unknown priority last","status":"passed","title":"orders P0 before P3 and sorts unknown priority last","duration":0.49634999999989304,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["sortIncidents"],"fullName":"sortIncidents breaks priority ties by most recent update, absent updates last","status":"passed","title":"breaks priority ties by most recent update, absent updates last","duration":0.35946400000011636,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["incidentTimestamp"],"fullName":"incidentTimestamp renders an em dash rather than a fabricated time when the stamp is absent","status":"passed","title":"renders an em dash rather than a fabricated time when the stamp is absent","duration":0.47770600000012564,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["incidentTimestamp"],"fullName":"incidentTimestamp renders an em dash for an unparseable stamp","status":"passed","title":"renders an em dash for an unparseable stamp","duration":0.35294900000008056,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["incidentTimestamp"],"fullName":"incidentTimestamp pairs a relative label with the absolute ISO instant","status":"passed","title":"pairs a relative label with the absolute ISO instant","duration":0.574619999999868,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["matchesIncidentFilter"],"fullName":"matchesIncidentFilter matches on id, title and cli, case-insensitively","status":"passed","title":"matches on id, title and cli, case-insensitively","duration":0.5059180000002925,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["matchesIncidentFilter"],"fullName":"matchesIncidentFilter keeps every incident when the filter is blank","status":"passed","title":"keeps every incident when the filter is blank","duration":0.1771929999999884,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["matchesIncidentFilter"],"fullName":"matchesIncidentFilter excludes non-matching incidents","status":"passed","title":"excludes non-matching incidents","duration":0.4417910000001939,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["cliAndModel"],"fullName":"cliAndModel renders an em dash when neither is recorded","status":"passed","title":"renders an em dash when neither is recorded","duration":0.3440860000000612,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["cliAndModel"],"fullName":"cliAndModel joins cli and model, and degrades to whichever is known","status":"passed","title":"joins cli and model, and degrades to whichever is known","duration":0.2781419999996615,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["incidentKvRows"],"fullName":"incidentKvRows renders unknown fields as em dashes rather than zeroes or blanks","status":"passed","title":"renders unknown fields as em dashes rather than zeroes or blanks","duration":0.46765700000014476,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["incidentKvRows"],"fullName":"incidentKvRows flags a non-zero exit code and a failure class as errors","status":"passed","title":"flags a non-zero exit code and a failure class as errors","duration":0.26382399999965855,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["incidentKvRows"],"fullName":"incidentKvRows leaves a clean exit code unflagged","status":"passed","title":"leaves a clean exit code unflagged","duration":0.2156079999999747,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["incidentStatusToken"],"fullName":"incidentStatusToken maps every incident state onto a token StatusChip already categorises","status":"passed","title":"maps every incident state onto a token StatusChip already categorises","duration":0.1979510000001028,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["priorityRank"],"fullName":"priorityRank ranks P0 highest and leaves unknown priority unranked","status":"passed","title":"ranks P0 highest and leaves unknown priority unranked","duration":0.21631100000013248,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["typeFilingOptions"],"fullName":"typeFilingOptions leads with an explicit None so the field is clearable","status":"passed","title":"leads with an explicit None so the field is clearable","duration":0.23022200000013981,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["suggestIncidentType"],"fullName":"suggestIncidentType picks the type with the most distinct keyword hits","status":"passed","title":"picks the type with the most distinct keyword hits","duration":0.23303900000018984,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["suggestIncidentType"],"fullName":"suggestIncidentType is case-insensitive and matches across title and description","status":"passed","title":"is case-insensitive and matches across title and description","duration":0.1914849999998296,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["suggestIncidentType"],"fullName":"suggestIncidentType suggests nothing when no keyword matches","status":"passed","title":"suggests nothing when no keyword matches","duration":0.11714399999982561,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["suggestIncidentType"],"fullName":"suggestIncidentType keeps taxonomy order on a tie","status":"passed","title":"keeps taxonomy order on a tie","duration":0.12068700000008903,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["suggestIncidentType"],"fullName":"suggestIncidentType ignores empty keyword entries","status":"passed","title":"ignores empty keyword entries","duration":0.1208440000000337,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["dispatchFailure"],"fullName":"dispatchFailure surfaces the named brief refusal verbatim and flags the degraded path","status":"passed","title":"surfaces the named brief refusal verbatim and flags the degraded path","duration":0.3134230000000571,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["dispatchFailure"],"fullName":"dispatchFailure names an unavailable store without offering the degraded path","status":"passed","title":"names an unavailable store without offering the degraded path","duration":0.35924599999998463,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["dispatchFailure"],"fullName":"dispatchFailure falls back to a generic message for unknown errors","status":"passed","title":"falls back to a generic message for unknown errors","duration":0.18526999999994587,"failureMessages":[],"meta":{},"tags":[]}],"startTime":1786448950259,"endTime":1786448950270.3591,"status":"passed","message":"","name":"/home/user/actions-runner-overdeck-debian1/_work/overdeck/overdeck/apps/web/src/components/incidents/incident-view.test.ts"},{"assertionResults":[{"ancestorTitles":["LogsContentBody"],"fullName":"LogsContentBody reports events-in-range KPI from total and not from visible row count","status":"passed","title":"reports events-in-range KPI from total and not from visible row count","duration":98.85570800000005,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["LogsContentBody"],"fullName":"LogsContentBody uses the second query total for Errors in range and suppresses the tile while pending/error","status":"passed","title":"uses the second query total for Errors in range and suppresses the tile while pending/error","duration":66.08001299999978,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["LogsContentBody"],"fullName":"LogsContentBody renders category facets only for categories present in counts","status":"passed","title":"renders category facets only for categories present in counts","duration":371.721356,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["LogsContentBody"],"fullName":"LogsContentBody links each source row to that source individual entries page","status":"passed","title":"links each source row to that source individual entries page","duration":50.36333900000045,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["LogsContentBody"],"fullName":"LogsContentBody renders coverage absent and error states honestly","status":"passed","title":"renders coverage absent and error states honestly","duration":88.99917000000005,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["LogsContentBody"],"fullName":"LogsContentBody uses project → host → runtime → session for the Context column","status":"passed","title":"uses project → host → runtime → session for the Context column","duration":122.7358750000003,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["LogsContentBody"],"fullName":"LogsContentBody shows the account in the row and the detail, and an em dash when absent","status":"passed","title":"shows the account in the row and the detail, and an em dash when absent","duration":145.5553630000004,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["LogsContentBody"],"fullName":"LogsContentBody passes D1 by re-rendering an absent time into a present time without throwing","status":"passed","title":"passes D1 by re-rendering an absent time into a present time without throwing","duration":22.88484100000005,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["LogsContentBody"],"fullName":"LogsContentBody reports a group span as a forward duration, never a negative one","status":"passed","title":"reports a group span as a forward duration, never a negative one","duration":37.458723000000646,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["LogsContentBody"],"fullName":"LogsContentBody groups by dedupeKey only, keeps no-dedupe events separate, and respects the toggle","status":"passed","title":"groups by dedupeKey only, keeps no-dedupe events separate, and respects the toggle","duration":53.67294999999922,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["LogsContentBody"],"fullName":"LogsContentBody sorts by Time and Severity using DataTable headers","status":"passed","title":"sorts by Time and Severity using DataTable headers","duration":146.440611,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["LogsContentBody"],"fullName":"LogsContentBody renders event severity values through StatusChip with deck-ui category","status":"passed","title":"renders event severity values through StatusChip with deck-ui category","duration":35.89158299999963,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["LogsContentBody"],"fullName":"LogsContentBody opens a detail drawer with grouped and flattened event data","status":"passed","title":"opens a detail drawer with grouped and flattened event data","duration":107.35845900000004,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["LogsContentBody"],"fullName":"LogsContentBody shows truncation notice only when data is truncated","status":"passed","title":"shows truncation notice only when data is truncated","duration":74.07393400000001,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["LogsContentBody"],"fullName":"LogsContentBody renders the suppressed-notifications table and its drill-down caption","status":"passed","title":"renders the suppressed-notifications table and its drill-down caption","duration":85.38269599999967,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["LogsContentBody"],"fullName":"LogsContentBody renders zero-event and zero-suppressed copy instead of blank tables","status":"passed","title":"renders zero-event and zero-suppressed copy instead of blank tables","duration":27.95483299999978,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["LogsContentBody"],"fullName":"LogsContentBody keeps source coverage absent/error visible and does not fabricate values","status":"passed","title":"keeps source coverage absent/error visible and does not fabricate values","duration":94.59649499999978,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["LogsContentBody"],"fullName":"LogsContentBody omits undefined event fields from the details panel and context fallback shows a dash","status":"passed","title":"omits undefined event fields from the details panel and context fallback shows a dash","duration":54.70211199999994,"failureMessages":[],"meta":{},"tags":[]}],"startTime":1786448941962,"endTime":1786448943652.7021,"status":"passed","message":"","name":"/home/user/actions-runner-overdeck-debian1/_work/overdeck/overdeck/apps/web/src/components/logs/LogsContent.test.tsx"},{"assertionResults":[{"ancestorTitles":["SourceEntriesBody"],"fullName":"SourceEntriesBody renders each individual entry of the source","status":"passed","title":"renders each individual entry of the source","duration":92.70769599999994,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["SourceEntriesBody"],"fullName":"SourceEntriesBody sorts entries by their raw timestamp","status":"passed","title":"sorts entries by their raw timestamp","duration":279.1098270000002,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["SourceEntriesBody"],"fullName":"SourceEntriesBody opens the selected entry details in a drawer","status":"passed","title":"opens the selected entry details in a drawer","duration":106.7490259999995,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["SourceEntriesBody"],"fullName":"SourceEntriesBody explains skipped records instead of only counting them","status":"passed","title":"explains skipped records instead of only counting them","duration":21.040321000000404,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["SourceEntriesBody"],"fullName":"SourceEntriesBody shows an em dash rather than a fabricated line number when the skip has no locator","status":"passed","title":"shows an em dash rather than a fabricated line number when the skip has no locator","duration":21.0773650000001,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["SourceEntriesBody"],"fullName":"SourceEntriesBody pages forward and back over the source total","status":"passed","title":"pages forward and back over the source total","duration":83.01741200000015,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["SourceEntriesBody"],"fullName":"SourceEntriesBody reports an absent source as absent rather than as an empty log","status":"passed","title":"reports an absent source as absent rather than as an empty log","duration":13.22603700000036,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["SourceEntriesBody"],"fullName":"SourceEntriesBody surfaces a read error with the collector message","status":"passed","title":"surfaces a read error with the collector message","duration":10.491885999999795,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["SourceEntriesBody"],"fullName":"SourceEntriesBody links back to the sources list","status":"passed","title":"links back to the sources list","duration":20.544206000000486,"failureMessages":[],"meta":{},"tags":[]}],"startTime":1786448951099,"endTime":1786448951747.5442,"status":"passed","message":"","name":"/home/user/actions-runner-overdeck-debian1/_work/overdeck/overdeck/apps/web/src/components/logs/SourceEntriesContent.test.tsx"},{"assertionResults":[{"ancestorTitles":["BotsCard"],"fullName":"BotsCard renders bot rows from the collector bots panel","status":"passed","title":"renders bot rows from the collector bots panel","duration":39.410473999999795,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["BotsCard"],"fullName":"BotsCard shows an unavailable message when the bots panel is missing","status":"passed","title":"shows an unavailable message when the bots panel is missing","duration":2.46071000000029,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["BotsCard"],"fullName":"BotsCard shows an empty snapshot message when the panel has no bots","status":"passed","title":"shows an empty snapshot message when the panel has no bots","duration":2.2669429999996282,"failureMessages":[],"meta":{},"tags":[]}],"startTime":1786448959050,"endTime":1786448959094.2668,"status":"passed","message":"","name":"/home/user/actions-runner-overdeck-debian1/_work/overdeck/overdeck/apps/web/src/components/overview/BotsCard.test.tsx"},{"assertionResults":[{"ancestorTitles":["CollectorRealtimeBridge"],"fullName":"CollectorRealtimeBridge normalizes stale null collections before merging a panel delta","status":"passed","title":"normalizes stale null collections before merging a panel delta","duration":17.411407000000054,"failureMessages":[],"meta":{},"tags":[]}],"startTime":1786448956189,"endTime":1786448956206.4114,"status":"passed","message":"","name":"/home/user/actions-runner-overdeck-debian1/_work/overdeck/overdeck/apps/web/src/components/overview/CollectorRealtimeBridge.test.tsx"},{"assertionResults":[{"ancestorTitles":["MorningDigestBanner"],"fullName":"MorningDigestBanner renders the paragraph visibly when the collector omits sections","status":"passed","title":"renders the paragraph visibly when the collector omits sections","duration":79.46961400000009,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["MorningDigestBanner"],"fullName":"MorningDigestBanner renders section blocks when the collector supplies them","status":"passed","title":"renders section blocks when the collector supplies them","duration":25.591671000000133,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["MorningDigestBanner"],"fullName":"MorningDigestBanner shows the banner once per local day","status":"passed","title":"shows the banner once per local day","duration":11.584474999999884,"failureMessages":[],"meta":{},"tags":[]}],"startTime":1786448953149,"endTime":1786448953265.5845,"status":"passed","message":"","name":"/home/user/actions-runner-overdeck-debian1/_work/overdeck/overdeck/apps/web/src/components/overview/MorningDigestBanner.test.tsx"},{"assertionResults":[{"ancestorTitles":["abandonedPlanItemForRun"],"fullName":"abandonedPlanItemForRun maps persisted collector facts and prefers failClass","status":"passed","title":"maps persisted collector facts and prefers failClass","duration":2.2869590000000244,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["abandonedPlanItemForRun"],"fullName":"abandonedPlanItemForRun falls back to degraded reason and rejects missing timestamps","status":"passed","title":"falls back to degraded reason and rejects missing timestamps","duration":0.8221019999996315,"failureMessages":[],"meta":{},"tags":[]}],"startTime":1786448957904,"endTime":1786448957906.822,"status":"passed","message":"","name":"/home/user/actions-runner-overdeck-debian1/_work/overdeck/overdeck/apps/web/src/components/plans/AbandonedContent.test.tsx"},{"assertionResults":[{"ancestorTitles":["deriveAgentSnapshot"],"fullName":"deriveAgentSnapshot joins the agent to its task and chronological timeline segments","status":"passed","title":"joins the agent to its task and chronological timeline segments","duration":3.576057000000219,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["deriveAgentSnapshot"],"fullName":"deriveAgentSnapshot keeps paused tasks live and closes terminal tasks","status":"passed","title":"keeps paused tasks live and closes terminal tasks","duration":0.5682000000001608,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["deriveAgentSnapshot"],"fullName":"deriveAgentSnapshot returns known agent ids for an unknown agent without inventing identity","status":"passed","title":"returns known agent ids for an unknown agent without inventing identity","duration":0.5344620000000759,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["selectExecutingAccount"],"fullName":"selectExecutingAccount reads account from the latest dispatch.attempt payload","status":"passed","title":"reads account from the latest dispatch.attempt payload","duration":0.3856639999999061,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["selectExecutingAccount"],"fullName":"selectExecutingAccount returns null when no journaled account exists","status":"passed","title":"returns null when no journaled account exists","duration":0.33332900000004884,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["selectExecutingAccount"],"fullName":"selectExecutingAccount does not treat seat/provider as executing account","status":"passed","title":"does not treat seat/provider as executing account","duration":0.19800499999973908,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["selectExecutingAccount"],"fullName":"selectExecutingAccount reads account from attempt.reply when journaled by the wrapper","status":"passed","title":"reads account from attempt.reply when journaled by the wrapper","duration":0.18717500000002474,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["authoritative task events"],"fullName":"authoritative task events deduplicates replayed opaque SSE ids and retains latest bounded frames","status":"passed","title":"deduplicates replayed opaque SSE ids and retains latest bounded frames","duration":1.2132060000003548,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["authoritative task events"],"fullName":"authoritative task events maps hostile authoritative payload as text without interpreting markup","status":"passed","title":"maps hostile authoritative payload as text without interpreting markup","duration":1.2437079999999696,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["authoritative task events"],"fullName":"authoritative task events does not select or mix attempts when event contract lacks lifecycle correlation","status":"passed","title":"does not select or mix attempts when event contract lacks lifecycle correlation","duration":0.46206900000015594,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["authoritative task events"],"fullName":"authoritative task events selects only the latest explicit attempt lifecycle","status":"passed","title":"selects only the latest explicit attempt lifecycle","duration":0.40690300000005664,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["authoritative task events"],"fullName":"authoritative task events ignores lifecycle attempts with matching completion events","status":"passed","title":"ignores lifecycle attempts with matching completion events","duration":0.20282599999973172,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["authoritative task events"],"fullName":"authoritative task events does not infer an active attempt from an unambiguous historical event","status":"passed","title":"does not infer an active attempt from an unambiguous historical event","duration":0.16771699999981138,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["authoritative task events"],"fullName":"authoritative task events does not mix uncorrelated task history when lifecycle mapping is absent","status":"passed","title":"does not mix uncorrelated task history when lifecycle mapping is absent","duration":0.16104799999993702,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["AgentApp stream"],"fullName":"AgentApp stream starts exact task stream after authoritative state and events load","status":"passed","title":"starts exact task stream after authoritative state and events load","duration":79.64368100000002,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["AgentApp stream"],"fullName":"AgentApp stream renders journaled executing account and not-recorded fallback in the sidebar","status":"passed","title":"renders journaled executing account and not-recorded fallback in the sidebar","duration":124.50041899999997,"failureMessages":[],"meta":{},"tags":[]}],"startTime":1786448947735,"endTime":1786448947949.5005,"status":"passed","message":"","name":"/home/user/actions-runner-overdeck-debian1/_work/overdeck/overdeck/apps/web/src/components/plans/AgentApp.test.tsx"},{"assertionResults":[{"ancestorTitles":["AttemptDetailDrawer"],"fullName":"AttemptDetailDrawer renders cost and cached tokens when measured usage includes them","status":"passed","title":"renders cost and cached tokens when measured usage includes them","duration":62.72824400000036,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["AttemptDetailDrawer"],"fullName":"AttemptDetailDrawer omits cost and cached token lines when usage lacks them","status":"passed","title":"omits cost and cached token lines when usage lacks them","duration":10.63028199999917,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["AttemptDetailDrawer"],"fullName":"AttemptDetailDrawer renders verdict, measured usage, and activity counters","status":"passed","title":"renders verdict, measured usage, and activity counters","duration":21.79525199999989,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["AttemptDetailDrawer"],"fullName":"AttemptDetailDrawer renders unmetered usage when usage is unknown","status":"passed","title":"renders unmetered usage when usage is unknown","duration":10.407685999999558,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["AttemptDetailDrawer"],"fullName":"AttemptDetailDrawer shows honest unavailable states for in-progress attempts","status":"passed","title":"shows honest unavailable states for in-progress attempts","duration":12.853044999999838,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["AttemptDetailDrawer"],"fullName":"AttemptDetailDrawer omits failure class and fingerprint when absent","status":"passed","title":"omits failure class and fingerprint when absent","duration":10.41948500000035,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["AttemptDetailDrawer"],"fullName":"AttemptDetailDrawer renders secondary reply link with the correct href","status":"passed","title":"renders secondary reply link with the correct href","duration":29.852711000000454,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["AttemptDetailDrawer"],"fullName":"AttemptDetailDrawer renders secondary prompt link with the correct href","status":"passed","title":"renders secondary prompt link with the correct href","duration":149.96108000000004,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["AttemptDetailDrawer"],"fullName":"AttemptDetailDrawer expands prompt content on demand when provided via prop","status":"passed","title":"expands prompt content on demand when provided via prop","duration":42.42326400000002,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["AttemptDetailDrawer"],"fullName":"AttemptDetailDrawer fetches and renders inline prompt content collapsed by default","status":"passed","title":"fetches and renders inline prompt content collapsed by default","duration":67.50453199999993,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["AttemptDetailDrawer"],"fullName":"AttemptDetailDrawer fetches and renders inline reply content","status":"passed","title":"fetches and renders inline reply content","duration":36.74987200000032,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["AttemptDetailDrawer"],"fullName":"AttemptDetailDrawer does not show fetched artifacts from a previous attempt while a new attempt loads","status":"passed","title":"does not show fetched artifacts from a previous attempt while a new attempt loads","duration":37.05470400000013,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["AttemptDetailDrawer"],"fullName":"AttemptDetailDrawer shows not captured when prompt fetch fails","status":"passed","title":"shows not captured when prompt fetch fails","duration":14.339584000000286,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["AttemptDetailDrawer"],"fullName":"AttemptDetailDrawer shows not captured when reply fetch fails","status":"passed","title":"shows not captured when reply fetch fails","duration":10.293908999999985,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["AttemptDetailDrawer"],"fullName":"AttemptDetailDrawer returns null when closed","status":"passed","title":"returns null when closed","duration":1.466790000000401,"failureMessages":[],"meta":{},"tags":[]}],"startTime":1786448946685,"endTime":1786448947203.4668,"status":"passed","message":"","name":"/home/user/actions-runner-overdeck-debian1/_work/overdeck/overdeck/apps/web/src/components/plans/AttemptDetailDrawer.test.tsx"},{"assertionResults":[{"ancestorTitles":["AttemptTimeline"],"fullName":"AttemptTimeline renders one entry per attempt in journal order","status":"passed","title":"renders one entry per attempt in journal order","duration":204.58730100000002,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["AttemptTimeline"],"fullName":"AttemptTimeline visually distinguishes stalled attempts from healthy in-progress ones","status":"passed","title":"visually distinguishes stalled attempts from healthy in-progress ones","duration":6.715584999999919,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["AttemptTimeline"],"fullName":"AttemptTimeline forwards selection clicks","status":"passed","title":"forwards selection clicks","duration":8.849436000000424,"failureMessages":[],"meta":{},"tags":[]}],"startTime":1786448955652,"endTime":1786448955871.8494,"status":"passed","message":"","name":"/home/user/actions-runner-overdeck-debian1/_work/overdeck/overdeck/apps/web/src/components/plans/AttemptTimeline.test.tsx"},{"assertionResults":[{"ancestorTitles":["AutopsyStrip"],"fullName":"AutopsyStrip renders one marker per attempt in journal order for failed runs","status":"passed","title":"renders one marker per attempt in journal order for failed runs","duration":38.688270999999986,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["AutopsyStrip"],"fullName":"AutopsyStrip marks stalled attempts using isAttemptAlarmed","status":"passed","title":"marks stalled attempts using isAttemptAlarmed","duration":2.965752000000066,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["AutopsyStrip"],"fullName":"AutopsyStrip enters warning state at exactly three attempts","status":"passed","title":"enters warning state at exactly three attempts","duration":7.792269999999917,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["AutopsyStrip"],"fullName":"AutopsyStrip does not render for healthy running or succeeded runs even with attempts present","status":"passed","title":"does not render for healthy running or succeeded runs even with attempts present","duration":3.40883199999962,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["AutopsyStrip"],"fullName":"AutopsyStrip renders for blocked runs with attempt history","status":"passed","title":"renders for blocked runs with attempt history","duration":2.7761570000002393,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["AutopsyStrip quarantine"],"fullName":"AutopsyStrip quarantine renders the quarantine reason chip when a run is quarantined","status":"passed","title":"renders the quarantine reason chip when a run is quarantined","duration":4.8340039999998226,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["AutopsyStrip quarantine"],"fullName":"AutopsyStrip quarantine renders nothing for a healthy run without quarantine","status":"passed","title":"renders nothing for a healthy run without quarantine","duration":3.85927300000003,"failureMessages":[],"meta":{},"tags":[]}],"startTime":1786448951792,"endTime":1786448951856.8594,"status":"passed","message":"","name":"/home/user/actions-runner-overdeck-debian1/_work/overdeck/overdeck/apps/web/src/components/plans/AutopsyStrip.test.tsx"},{"assertionResults":[{"ancestorTitles":["BurnPanel"],"fullName":"BurnPanel alarms when the same failureFingerprint appears on two attempts","status":"passed","title":"alarms when the same failureFingerprint appears on two attempts","duration":36.62273400000004,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["BurnPanel"],"fullName":"BurnPanel alarms independently when attempt usage reaches at least 75% of budget","status":"passed","title":"alarms independently when attempt usage reaches at least 75% of budget","duration":5.048434999999927,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["BurnPanel"],"fullName":"BurnPanel names both alarm conditions when repeat failure and budget proximity fire together","status":"passed","title":"names both alarm conditions when repeat failure and budget proximity fire together","duration":4.781312999999955,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["BurnPanel"],"fullName":"BurnPanel renders task dispatch and usage totals when no alarm fires","status":"passed","title":"renders task dispatch and usage totals when no alarm fires","duration":4.748244999999997,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["BurnPanel"],"fullName":"BurnPanel does not alarm on plan-wide attempt count when every task stays under its own budget","status":"passed","title":"does not alarm on plan-wide attempt count when every task stays under its own budget","duration":4.808771999999863,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["BurnPanel"],"fullName":"BurnPanel alarms when any single task reaches 75% of its own budget","status":"passed","title":"alarms when any single task reaches 75% of its own budget","duration":3.4110769999999775,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["BurnPanel"],"fullName":"BurnPanel accumulates costUsd and cachedTokens in seat and model rollups with honest gaps","status":"passed","title":"accumulates costUsd and cachedTokens in seat and model rollups with honest gaps","duration":20.632920000000013,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["BurnPanel"],"fullName":"BurnPanel renders captured zero cost and cached-token values","status":"passed","title":"renders captured zero cost and cached-token values","duration":4.909661999999798,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["BurnPanel"],"fullName":"BurnPanel labels absent cost and cached-token values as not captured","status":"passed","title":"labels absent cost and cached-token values as not captured","duration":3.8289199999999255,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["BurnPanel"],"fullName":"BurnPanel uses each task own taskDispatchBudget and taskDispatchCount","status":"passed","title":"uses each task own taskDispatchBudget and taskDispatchCount","duration":5.1518069999999625,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["BurnPanel"],"fullName":"BurnPanel renders nothing for a single healthy attempt","status":"passed","title":"renders nothing for a single healthy attempt","duration":3.5578840000000582,"failureMessages":[],"meta":{},"tags":[]}],"startTime":1786448945702,"endTime":1786448945800.5579,"status":"passed","message":"","name":"/home/user/actions-runner-overdeck-debian1/_work/overdeck/overdeck/apps/web/src/components/plans/BurnPanel.test.tsx"},{"assertionResults":[{"ancestorTitles":["PlanRunApp attempt history"],"fullName":"PlanRunApp attempt history renders attempt history when the fetch succeeds","status":"passed","title":"renders attempt history when the fetch succeeds","duration":104.25102799999968,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["PlanRunApp attempt history"],"fullName":"PlanRunApp attempt history opens compiled prompt artifact from selected attempt","status":"passed","title":"opens compiled prompt artifact from selected attempt","duration":96.48486200000025,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["PlanRunApp attempt history"],"fullName":"PlanRunApp attempt history renders an honest not-captured state when the fetch returns empty","status":"passed","title":"renders an honest not-captured state when the fetch returns empty","duration":35.68449999999939,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["PlanRunApp attempt history"],"fullName":"PlanRunApp attempt history renders an honest not-captured state when the fetch fails","status":"passed","title":"renders an honest not-captured state when the fetch fails","duration":44.646026999999776,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["PlanRunApp attention: task failures"],"fullName":"PlanRunApp attention: task failures renders an attention item for a failed task with a failure reason","status":"passed","title":"renders an attention item for a failed task with a failure reason","duration":27.093088000000535,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["PlanRunApp attention: task failures"],"fullName":"PlanRunApp attention: task failures renders an attention item for a gated task with a failure reason","status":"passed","title":"renders an attention item for a gated task with a failure reason","duration":21.69086800000059,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["PlanRunApp attention: task failures"],"fullName":"PlanRunApp attention: task failures does not render an attention item for a running task even with a reason in the map","status":"passed","title":"does not render an attention item for a running task even with a reason in the map","duration":28.73997700000018,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["PlanRunApp attention: task failures"],"fullName":"PlanRunApp attention: task failures renders no task-failure item and does not throw when the events query is undefined","status":"passed","title":"renders no task-failure item and does not throw when the events query is undefined","duration":38.61481900000035,"failureMessages":[],"meta":{},"tags":[]}],"startTime":1786448948385,"endTime":1786448948782.6147,"status":"passed","message":"","name":"/home/user/actions-runner-overdeck-debian1/_work/overdeck/overdeck/apps/web/src/components/plans/PlanRunApp.attempts.test.tsx"},{"assertionResults":[{"ancestorTitles":["run observability projections"],"fullName":"run observability projections keeps acceptance and fix-loop values authoritative","status":"passed","title":"keeps acceptance and fix-loop values authoritative","duration":2.846799999999803,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["run observability projections"],"fullName":"run observability projections preserves enriched decision option meaning","status":"passed","title":"preserves enriched decision option meaning","duration":0.5440309999999045,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["run observability projections"],"fullName":"run observability projections enables only state-valid run controls","status":"passed","title":"enables only state-valid run controls","duration":0.5782890000000407,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["run observability projections"],"fullName":"run observability projections renders real rate-limit data without inferred fields","status":"passed","title":"renders real rate-limit data without inferred fields","duration":1.2534200000000055,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["run observability projections"],"fullName":"run observability projections keeps A9 Executing account gap when no journaled account exists","status":"passed","title":"keeps A9 Executing account gap when no journaled account exists","duration":0.520944999999756,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["run observability projections"],"fullName":"run observability projections clears A9 when at least one dispatch journals a truthful account","status":"passed","title":"clears A9 when at least one dispatch journals a truthful account","duration":0.21481500000027154,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["run observability projections"],"fullName":"run observability projections clears A9 when attempt.reply journals a wrapper-reported account","status":"passed","title":"clears A9 when attempt.reply journals a wrapper-reported account","duration":0.18403299999999945,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["run observability projections"],"fullName":"run observability projections keeps A9 when attempt.reply has no account","status":"passed","title":"keeps A9 when attempt.reply has no account","duration":0.16419500000029075,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["taskFailureReasons"],"fullName":"taskFailureReasons surfaces a quarantine reason for the task","status":"passed","title":"surfaces a quarantine reason for the task","duration":0.6895299999996496,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["taskFailureReasons"],"fullName":"taskFailureReasons maps review.verdict FAIL findings null-safely and drops non-object entries","status":"passed","title":"maps review.verdict FAIL findings null-safely and drops non-object entries","duration":0.3612399999997251,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["taskFailureReasons"],"fullName":"taskFailureReasons adds nothing for a PASS verdict","status":"passed","title":"adds nothing for a PASS verdict","duration":0.24651399999993373,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["taskFailureReasons"],"fullName":"taskFailureReasons surfaces the verify.failed command","status":"passed","title":"surfaces the verify.failed command","duration":0.20278000000007523,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["taskFailureReasons"],"fullName":"taskFailureReasons maps task-end failure to failClass and cause","status":"passed","title":"maps task-end failure to failClass and cause","duration":0.25351099999988946,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["taskFailureReasons"],"fullName":"taskFailureReasons adds nothing for task-end without a failure","status":"passed","title":"adds nothing for task-end without a failure","duration":0.13862699999981487,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["taskFailureReasons"],"fullName":"taskFailureReasons clears an accumulated reason on task-start (retry resets)","status":"passed","title":"clears an accumulated reason on task-start (retry resets)","duration":0.14107800000010684,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["taskFailureReasons"],"fullName":"taskFailureReasons ignores events with no task identity","status":"passed","title":"ignores events with no task identity","duration":0.13236199999983,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["taskFailureReasons"],"fullName":"taskFailureReasons falls back to payload.task when taskId is absent, and merges later events last-wins per field","status":"passed","title":"falls back to payload.task when taskId is absent, and merges later events last-wins per field","duration":0.22976399999970454,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["taskFailureDetail"],"fullName":"taskFailureDetail joins all lines in order: quarantine, cause, verify command, then findings","status":"passed","title":"joins all lines in order: quarantine, cause, verify command, then findings","duration":0.284682999999859,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["taskFailureDetail"],"fullName":"taskFailureDetail returns an empty string for an empty reason","status":"passed","title":"returns an empty string for an empty reason","duration":0.13018800000008923,"failureMessages":[],"meta":{},"tags":[]}],"startTime":1786448949686,"endTime":1786448949696.1301,"status":"passed","message":"","name":"/home/user/actions-runner-overdeck-debian1/_work/overdeck/overdeck/apps/web/src/components/plans/PlanRunApp.test.tsx"},{"assertionResults":[{"ancestorTitles":["plans project grouping"],"fullName":"plans project grouping pins a viewport-fit full-width horizontal split","status":"passed","title":"pins a viewport-fit full-width horizontal split","duration":2.360708999999588,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["plans project grouping"],"fullName":"plans project grouping propagates alarmed onto plan table items when the run is stalled","status":"passed","title":"propagates alarmed onto plan table items when the run is stalled","duration":2.2147159999994983,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["plans project grouping"],"fullName":"plans project grouping maps only recorded row fields and preserves needs-you separately from failure","status":"passed","title":"maps only recorded row fields and preserves needs-you separately from failure","duration":0.6741359999996348,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["plans project grouping"],"fullName":"plans project grouping uses honest project label fallbacks","status":"passed","title":"uses honest project label fallbacks","duration":0.6889320000000225,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["plans project grouping"],"fullName":"plans project grouping excludes abandoned runs and sorts groups attention-first","status":"passed","title":"excludes abandoned runs and sorts groups attention-first","duration":1.2321980000006079,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["plans project grouping"],"fullName":"plans project grouping folds one plan re-run across repo roots into a single row","status":"passed","title":"folds one plan re-run across repo roots into a single row","duration":1.4336080000002767,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["plans project grouping"],"fullName":"plans project grouping keeps distinct plans in one project apart","status":"passed","title":"keeps distinct plans in one project apart","duration":0.5002039999999397,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["plans project grouping"],"fullName":"plans project grouping sums engine-reported attempts across folded checkouts","status":"passed","title":"sums engine-reported attempts across folded checkouts","duration":0.29072199999973236,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["plans project grouping"],"fullName":"plans project grouping keeps concurrently live runs on their own rows and collapses their finished attempts","status":"passed","title":"keeps concurrently live runs on their own rows and collapses their finished attempts","duration":0.8322220000000016,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["plans project grouping"],"fullName":"plans project grouping lets the live run speak for its plan even when a finished attempt is stamped later","status":"passed","title":"lets the live run speak for its plan even when a finished attempt is stamped later","duration":0.4590330000000904,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["plans project grouping"],"fullName":"plans project grouping resolves detached checkouts to the project that owns them","status":"passed","title":"resolves detached checkouts to the project that owns them","duration":0.35391100000015285,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["plans project grouping"],"fullName":"plans project grouping returns active runs associated with a scoreboard repo, attention first","status":"passed","title":"returns active runs associated with a scoreboard repo, attention first","duration":0.38806099999965227,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["plans project grouping"],"fullName":"plans project grouping maps null and invalid activity timestamps to honest gaps","status":"passed","title":"maps null and invalid activity timestamps to honest gaps","duration":0.287347000000409,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["plans project grouping"],"fullName":"plans project grouping omits a zero sequence because the harness value is meaningless","status":"passed","title":"omits a zero sequence because the harness value is meaningless","duration":0.2421250000006694,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["plans project grouping"],"fullName":"plans project grouping counts every seat the engine reports as occupied, not just the v1 spelling","status":"passed","title":"counts every seat the engine reports as occupied, not just the v1 spelling","duration":0.161127000000306,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["plans project grouping"],"fullName":"plans project grouping never times a running plan from the plan authoring date","status":"passed","title":"never times a running plan from the plan authoring date","duration":0.28920000000016444,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["plans project grouping"],"fullName":"plans project grouping carries the collapsed-attempts count only when the plan relaunched","status":"passed","title":"carries the collapsed-attempts count only when the plan relaunched","duration":0.26682700000037585,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["plans project grouping"],"fullName":"plans project grouping sorts runs inside each group with active plans first","status":"passed","title":"sorts runs inside each group with active plans first","duration":0.24470600000040577,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["plans project grouping"],"fullName":"plans project grouping aggregates group counts from the same categories rendered by row chips","status":"passed","title":"aggregates group counts from the same categories rendered by row chips","duration":0.3077210000001287,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["plans project grouping"],"fullName":"plans project grouping preserves queue source order and source statuses before any plan runs exist","status":"passed","title":"preserves queue source order and source statuses before any plan runs exist","duration":1.6027039999999033,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["plans project grouping"],"fullName":"plans project grouping keeps queue optionals honest and does not create row actions","status":"passed","title":"keeps queue optionals honest and does not create row actions","duration":0.366490999999769,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["plans project grouping"],"fullName":"plans project grouping reorders queue rows when a sortable header is activated","status":"passed","title":"reorders queue rows when a sortable header is activated","duration":430.52442900000005,"failureMessages":[],"meta":{},"tags":[]}],"startTime":1786448941992,"endTime":1786448942438.5244,"status":"passed","message":"","name":"/home/user/actions-runner-overdeck-debian1/_work/overdeck/overdeck/apps/web/src/components/plans/PlansContent.test.tsx"},{"assertionResults":[{"ancestorTitles":["isAttemptAlarmed"],"fullName":"isAttemptAlarmed matches harness alarm thresholds","status":"passed","title":"matches harness alarm thresholds","duration":2.3511519999999564,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["extractQuarantine"],"fullName":"extractQuarantine returns null when no quarantine event exists","status":"passed","title":"returns null when no quarantine event exists","duration":0.4954210000000785,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["extractQuarantine"],"fullName":"extractQuarantine returns phase and reason of the latest quarantine event","status":"passed","title":"returns phase and reason of the latest quarantine event","duration":0.8175120000000788,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["extractQuarantine"],"fullName":"extractQuarantine labels missing payload fields as not recorded","status":"passed","title":"labels missing payload fields as not recorded","duration":0.3306849999999031,"failureMessages":[],"meta":{},"tags":[]}],"startTime":1786448954384,"endTime":1786448954388.3306,"status":"passed","message":"","name":"/home/user/actions-runner-overdeck-debian1/_work/overdeck/overdeck/apps/web/src/components/plans/attempt-record.test.ts"},{"assertionResults":[{"ancestorTitles":["SessionsContent"],"fullName":"SessionsContent shows an honest empty state naming the ledger directory","status":"passed","title":"shows an honest empty state naming the ledger directory","duration":107.97825299999931,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["SessionsContent"],"fullName":"SessionsContent renders every project the ledger knows, not just the current one","status":"passed","title":"renders every project the ledger knows, not just the current one","duration":1022.2348769999999,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["SessionsContent"],"fullName":"SessionsContent starts an all-finished project collapsed with only its summary visible","status":"passed","title":"starts an all-finished project collapsed with only its summary visible","duration":182.7811700000002,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["SessionsContent"],"fullName":"SessionsContent reveals an all-finished project table when its header is clicked","status":"passed","title":"reveals an all-finished project table when its header is clicked","duration":243.86330499999985,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["SessionsContent"],"fullName":"SessionsContent gives each row a real title and falls back to a named gap, never to the id","status":"passed","title":"gives each row a real title and falls back to a named gap, never to the id","duration":155.8173939999997,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["SessionsContent"],"fullName":"SessionsContent shows each cli and each launcher distinctly","status":"passed","title":"shows each cli and each launcher distinctly","duration":228.54974000000038,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["SessionsContent"],"fullName":"SessionsContent says whether a window is attached to the session","status":"passed","title":"says whether a window is attached to the session","duration":86.74680399999943,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["SessionsContent"],"fullName":"SessionsContent offers a reconnect action per reachable row and a reason instead of a dead button","status":"passed","title":"offers a reconnect action per reachable row and a reason instead of a dead button","duration":500.4056270000001,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["SessionsContent"],"fullName":"SessionsContent never renders a negative age for a session whose clock is wrong","status":"passed","title":"never renders a negative age for a session whose clock is wrong","duration":140.25676300000032,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["SessionsContent"],"fullName":"SessionsContent freezes the running time of a session that is no longer running","status":"passed","title":"freezes the running time of a session that is no longer running","duration":226.04842499999995,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["SessionsContent"],"fullName":"SessionsContent names each field the ledger does not carry yet rather than leaving a blank column","status":"passed","title":"names each field the ledger does not carry yet rather than leaving a blank column","duration":86.14307699999972,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["SessionsContent"],"fullName":"SessionsContent says why a session that recorded nothing ended, instead of showing an empty row","status":"passed","title":"says why a session that recorded nothing ended, instead of showing an empty row","duration":221.35275300000012,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["SessionsContent"],"fullName":"SessionsContent warns that a long tool call reads as idle rather than letting him misread the column","status":"passed","title":"warns that a long tool call reads as idle rather than letting him misread the column","duration":78.29780200000005,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["SessionsContent"],"fullName":"SessionsContent states that a session outside the ledger is invisible to the page","status":"passed","title":"states that a session outside the ledger is invisible to the page","duration":80.46533400000044,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["SessionsContent"],"fullName":"SessionsContent has no column for uncommitted files — it was on every row and actionable on none","status":"passed","title":"has no column for uncommitted files — it was on every row and actionable on none","duration":103.03547999999955,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["SessionsContent"],"fullName":"SessionsContent says a stopped session RAN for its length and a live one is still RUNNING","status":"passed","title":"says a stopped session RAN for its length and a live one is still RUNNING","duration":449.98691899999994,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["SessionsContent"],"fullName":"SessionsContent keeps an open terminal in step with the ledger instead of freezing the row it opened on","status":"passed","title":"keeps an open terminal in step with the ledger instead of freezing the row it opened on","duration":167.17933999999877,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["SessionsContent"],"fullName":"SessionsContent keeps the present tense for a live session whose run length cannot be measured","status":"passed","title":"keeps the present tense for a live session whose run length cannot be measured","duration":324.63311299999987,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["SessionsContent"],"fullName":"SessionsContent shows five runs per project and keeps the rest reachable behind an honest count","status":"passed","title":"shows five runs per project and keeps the rest reachable behind an honest count","duration":155.99521699999968,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["SessionsContent"],"fullName":"SessionsContent never truncates a running session away, whatever column the reader sorts by","status":"passed","title":"never truncates a running session away, whatever column the reader sorts by","duration":106.37572199999886,"failureMessages":[],"meta":{},"tags":[]},{"ancestorTitles":["SessionsContent"],"fullName":"SessionsContent states why attach is off when the collector is not on loopback","status":"passed","title":"states why attach is off when the collector is not on loopback","duration":59.772517999999764,"failureMessages":[],"meta":{},"tags":[]}],"startTime":1786448942003,"endTime":1786448946731.7725,"status":"passed","message":"","name":"/home/user/actions-runner-overdeck-debian1/_work/overdeck/overdeck/apps/web/src/components/sessions/SessionsContent.test.tsx"}]}