<?xml version="1.0" encoding="UTF-8"?>
<testsuites name="bun test" tests="519" assertions="1311" failures="0" skipped="0" time="14.332832064">
  <testsuite name="src/noindex.test.ts" file="src/noindex.test.ts" tests="5" assertions="5" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testcase name="app.html tells search engines not to index it" classname="" time="0.000154" file="src/noindex.test.ts" line="18" assertions="1" />
    <testcase name="error.html tells search engines not to index it" classname="" time="0.000045" file="src/noindex.test.ts" line="18" assertions="1" />
    <testcase name="404.html tells search engines not to index it" classname="" time="0.000032" file="src/noindex.test.ts" line="18" assertions="1" />
    <testcase name="500.html tells search engines not to index it" classname="" time="0.000025" file="src/noindex.test.ts" line="18" assertions="1" />
    <testcase name="robots.txt does not disallow crawling" classname="" time="0.000146" file="src/noindex.test.ts" line="24" assertions="1" />
  </testsuite>
  <testsuite name="src/errorPages.test.ts" file="src/errorPages.test.ts" tests="1" assertions="1" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testcase name="the SvelteKit fallback error page is the 500 page" classname="" time="0.000095" file="src/errorPages.test.ts" line="10" assertions="1" />
  </testsuite>
  <testsuite name="src/bundleAnalysis.test.ts" file="src/bundleAnalysis.test.ts" tests="2" assertions="3" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testcase name="uploads with the token from the environment" classname="" time="0.000086" file="src/bundleAnalysis.test.ts" line="7" assertions="1" />
    <testcase name="does a dry run without a token" classname="" time="0.00003" file="src/bundleAnalysis.test.ts" line="18" assertions="2" />
  </testsuite>
  <testsuite name="src/hooks.server.test.ts" file="src/hooks.server.test.ts" tests="3" assertions="7" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="preload" file="src/hooks.server.test.ts" line="4" tests="3" assertions="7" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="preloads the latin Inter subset" classname="preload" time="0.000065" file="src/hooks.server.test.ts" line="5" assertions="1" />
      <testcase name="leaves the other Inter subsets to load on demand" classname="preload" time="0.000087" file="src/hooks.server.test.ts" line="14" assertions="4" />
      <testcase name="keeps SvelteKit&apos;s own default for scripts and styles" classname="preload" time="0.000044" file="src/hooks.server.test.ts" line="25" assertions="2" />
    </testsuite>
  </testsuite>
  <testsuite name="src/lib/dashboardApi.test.ts" file="src/lib/dashboardApi.test.ts" tests="58" assertions="89" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="fetchPipelines" file="src/lib/dashboardApi.test.ts" line="34" tests="5" assertions="6" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="calls GET /api/pipelines with the given filter and pagination params" classname="fetchPipelines" time="0.000411" file="src/lib/dashboardApi.test.ts" line="35" assertions="2" />
      <testcase name="adds health and sort when given, so the server applies them across every pipeline" classname="fetchPipelines" time="0.000202" file="src/lib/dashboardApi.test.ts" line="65" assertions="1" />
      <testcase name="leaves health and sort off the URL when absent, the server defaults" classname="fetchPipelines" time="0.000153" file="src/lib/dashboardApi.test.ts" line="82" assertions="1" />
      <testcase name="omits forge and repoId when not given" classname="fetchPipelines" time="0.000156" file="src/lib/dashboardApi.test.ts" line="94" assertions="1" />
      <testcase name="throws an ApiError on a non-OK response" classname="fetchPipelines" time="0.000247" file="src/lib/dashboardApi.test.ts" line="106" assertions="1" />
    </testsuite>
    <testsuite name="fetchRepos" file="src/lib/dashboardApi.test.ts" line="116" tests="3" assertions="3" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="returns the parsed repo list" classname="fetchRepos" time="0.000189" file="src/lib/dashboardApi.test.ts" line="117" assertions="1" />
      <testcase name="resolves to an empty list on a non-OK response" classname="fetchRepos" time="0.00013" file="src/lib/dashboardApi.test.ts" line="130" assertions="1" />
      <testcase name="resolves to an empty list when the request itself fails" classname="fetchRepos" time="0.00011" file="src/lib/dashboardApi.test.ts" line="137" assertions="1" />
    </testsuite>
    <testsuite name="fetchPipeline" file="src/lib/dashboardApi.test.ts" line="144" tests="2" assertions="3" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="calls GET /api/pipelines/{id} and returns the parsed detail" classname="fetchPipeline" time="0.000243" file="src/lib/dashboardApi.test.ts" line="145" assertions="2" />
      <testcase name="throws an ApiError carrying the response status on a non-OK response" classname="fetchPipeline" time="0.00015" file="src/lib/dashboardApi.test.ts" line="166" assertions="1" />
    </testsuite>
    <testsuite name="fetchPipelineSteps" file="src/lib/dashboardApi.test.ts" line="180" tests="3" assertions="4" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="calls GET /api/pipelines/{id}/steps and returns the parsed step list" classname="fetchPipelineSteps" time="0.000238" file="src/lib/dashboardApi.test.ts" line="181" assertions="2" />
      <testcase name="sends the window when one is given" classname="fetchPipelineSteps" time="0.00011" file="src/lib/dashboardApi.test.ts" line="206" assertions="1" />
      <testcase name="throws an ApiError on a non-OK response" classname="fetchPipelineSteps" time="0.000149" file="src/lib/dashboardApi.test.ts" line="218" assertions="1" />
    </testsuite>
    <testsuite name="fetchRepoUsage" file="src/lib/dashboardApi.test.ts" line="228" tests="2" assertions="3" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="calls GET /api/repos/{repoId}/usage and returns the parsed usage list" classname="fetchRepoUsage" time="0.00019" file="src/lib/dashboardApi.test.ts" line="229" assertions="2" />
      <testcase name="throws an ApiError carrying the response status on a non-OK response" classname="fetchRepoUsage" time="0.000145" file="src/lib/dashboardApi.test.ts" line="243" assertions="1" />
    </testsuite>
    <testsuite name="fetchFailureInsights" file="src/lib/dashboardApi.test.ts" line="257" tests="6" assertions="8" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="calls GET /api/insights/failures with the window" classname="fetchFailureInsights" time="0.000288" file="src/lib/dashboardApi.test.ts" line="269" assertions="2" />
      <testcase name="leaves the window off when there is none, so the server uses its own default" classname="fetchFailureInsights" time="0.000136" file="src/lib/dashboardApi.test.ts" line="285" assertions="1" />
      <testcase name="returns the window the server reports it used" classname="fetchFailureInsights" time="0.000177" file="src/lib/dashboardApi.test.ts" line="297" assertions="1" />
      <testcase name="adds repoId and forge only when given" classname="fetchFailureInsights" time="0.000158" file="src/lib/dashboardApi.test.ts" line="306" assertions="1" />
      <testcase name="a missing passRate stays absent rather than becoming zero" classname="fetchFailureInsights" time="0.000133" file="src/lib/dashboardApi.test.ts" line="323" assertions="1" />
      <testcase name="throws an ApiError carrying the status on a non-2xx response" classname="fetchFailureInsights" time="0.000183" file="src/lib/dashboardApi.test.ts" line="334" assertions="2" />
    </testsuite>
    <testsuite name="fetchRuns" file="src/lib/dashboardApi.test.ts" line="348" tests="5" assertions="8" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="calls GET /api/runs with the status and pagination params" classname="fetchRuns" time="0.000278" file="src/lib/dashboardApi.test.ts" line="349" assertions="1" />
      <testcase name="omits status when it is &quot;all&quot;, the server default" classname="fetchRuns" time="0.000159" file="src/lib/dashboardApi.test.ts" line="364" assertions="1" />
      <testcase name="adds repoId, forge and pipeline scope only when given" classname="fetchRuns" time="0.000158" file="src/lib/dashboardApi.test.ts" line="379" assertions="1" />
      <testcase name="returns runs with their steps and optional commit fields" classname="fetchRuns" time="0.000209" file="src/lib/dashboardApi.test.ts" line="396" assertions="3" />
      <testcase name="throws an ApiError carrying the status on a non-2xx response" classname="fetchRuns" time="0.000168" file="src/lib/dashboardApi.test.ts" line="429" assertions="2" />
    </testsuite>
    <testsuite name="fetchFlakySteps" file="src/lib/dashboardApi.test.ts" line="442" tests="4" assertions="8" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="calls GET /api/steps/flaky with the window" classname="fetchFlakySteps" time="0.000363" file="src/lib/dashboardApi.test.ts" line="460" assertions="2" />
      <testcase name="leaves the window off when there is none, so the server uses its own default" classname="fetchFlakySteps" time="0.000137" file="src/lib/dashboardApi.test.ts" line="476" assertions="1" />
      <testcase name="sends the repo, forge and page it was given" classname="fetchFlakySteps" time="0.00023" file="src/lib/dashboardApi.test.ts" line="488" assertions="4" />
      <testcase name="throws an ApiError carrying the status on a failed response" classname="fetchFlakySteps" time="0.000158" file="src/lib/dashboardApi.test.ts" line="507" assertions="1" />
    </testsuite>
    <testsuite name="branch scoping" file="src/lib/dashboardApi.test.ts" line="516" tests="4" assertions="7" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="the three reads send the branch, encoded, only when one is chosen" classname="branch scoping" time="0.000299" file="src/lib/dashboardApi.test.ts" line="527" assertions="3" />
      <testcase name="fetchBranches asks for the window, forge and repo and returns the list" classname="branch scoping" time="0.000299" file="src/lib/dashboardApi.test.ts" line="559" assertions="2" />
      <testcase name="fetchBranches sends nothing for an unset window" classname="branch scoping" time="0.000109" file="src/lib/dashboardApi.test.ts" line="575" assertions="1" />
      <testcase name="fetchBranches throws an ApiError on a failed response" classname="branch scoping" time="0.000132" file="src/lib/dashboardApi.test.ts" line="583" assertions="1" />
    </testsuite>
    <testsuite name="fetchJobLog" file="src/lib/dashboardApi.test.ts" line="592" tests="4" assertions="6" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="asks for the last 200 lines of one job, with both ids escaped" classname="fetchJobLog" time="0.000294" file="src/lib/dashboardApi.test.ts" line="593" assertions="2" />
      <testcase name="asks for as many lines as it is given" classname="fetchJobLog" time="0.00021" file="src/lib/dashboardApi.test.ts" line="619" assertions="1" />
      <testcase name="an unavailable log is a normal answer that carries its reason" classname="fetchJobLog" time="0.000195" file="src/lib/dashboardApi.test.ts" line="639" assertions="1" />
      <testcase name="throws an ApiError carrying the status on a failed response" classname="fetchJobLog" time="0.000186" file="src/lib/dashboardApi.test.ts" line="656" assertions="2" />
    </testsuite>
    <testsuite name="quarantineStep" file="src/lib/dashboardApi.test.ts" line="672" tests="3" assertions="7" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="PUTs the note to the step, with the step name percent-encoded" classname="quarantineStep" time="0.000387" file="src/lib/dashboardApi.test.ts" line="679" assertions="5" />
      <testcase name="sends no body when there is no note" classname="quarantineStep" time="0.000219" file="src/lib/dashboardApi.test.ts" line="706" assertions="1" />
      <testcase name="throws an ApiError with the status when the server refuses" classname="quarantineStep" time="0.000135" file="src/lib/dashboardApi.test.ts" line="718" assertions="1" />
    </testsuite>
    <testsuite name="unquarantineStep" file="src/lib/dashboardApi.test.ts" line="727" tests="2" assertions="4" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="DELETEs the same path" classname="unquarantineStep" time="0.00028" file="src/lib/dashboardApi.test.ts" line="728" assertions="3" />
      <testcase name="throws an ApiError with the status on failure" classname="unquarantineStep" time="0.000143" file="src/lib/dashboardApi.test.ts" line="748" assertions="1" />
    </testsuite>
    <testsuite name="fetchRunSteps" file="src/lib/dashboardApi.test.ts" line="769" tests="2" assertions="4" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="calls GET /api/runs/{runId}/steps with the id escaped" classname="fetchRunSteps" time="0.000306" file="src/lib/dashboardApi.test.ts" line="770" assertions="2" />
      <testcase name="throws an ApiError carrying the status, so a page can tell a missing run" classname="fetchRunSteps" time="0.000192" file="src/lib/dashboardApi.test.ts" line="780" assertions="2" />
    </testsuite>
    <testsuite name="fetchFlakyRuns" file="src/lib/dashboardApi.test.ts" line="790" tests="3" assertions="4" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="calls GET /api/pipelines/{id}/flaky-runs with the step, both escaped" classname="fetchFlakyRuns" time="0.000258" file="src/lib/dashboardApi.test.ts" line="791" assertions="2" />
      <testcase name="adds the window when one is given" classname="fetchFlakyRuns" time="0.000133" file="src/lib/dashboardApi.test.ts" line="802" assertions="1" />
      <testcase name="throws an ApiError carrying the status" classname="fetchFlakyRuns" time="0.000145" file="src/lib/dashboardApi.test.ts" line="810" assertions="1" />
    </testsuite>
    <testsuite name="fetchUnhealthySteps" file="src/lib/dashboardApi.test.ts" line="821" tests="3" assertions="3" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="calls GET /api/steps/unhealthy with no query when nothing is given" classname="fetchUnhealthySteps" time="0.000288" file="src/lib/dashboardApi.test.ts" line="822" assertions="1" />
      <testcase name="sends the window and the paging it is given" classname="fetchUnhealthySteps" time="0.000134" file="src/lib/dashboardApi.test.ts" line="830" assertions="1" />
      <testcase name="throws an ApiError on a failed response" classname="fetchUnhealthySteps" time="0.000108" file="src/lib/dashboardApi.test.ts" line="838" assertions="1" />
    </testsuite>
    <testsuite name="window on the pipeline reads" file="src/lib/dashboardApi.test.ts" line="845" tests="3" assertions="3" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="fetchPipelines sends the window when one is given" classname="window on the pipeline reads" time="0.000198" file="src/lib/dashboardApi.test.ts" line="857" assertions="1" />
      <testcase name="fetchPipeline sends the window when one is given, and none otherwise" classname="window on the pipeline reads" time="0.000134" file="src/lib/dashboardApi.test.ts" line="867" assertions="1" />
      <testcase name="fetchRepoUsage sends the window when one is given, and none otherwise" classname="window on the pipeline reads" time="0.000151" file="src/lib/dashboardApi.test.ts" line="876" assertions="1" />
    </testsuite>
    <testsuite name="fetchVersion" file="src/lib/dashboardApi.test.ts" line="889" tests="2" assertions="4" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="reads the running build version" classname="fetchVersion" time="0.000261" file="src/lib/dashboardApi.test.ts" line="890" assertions="2" />
      <testcase name="throws an ApiError carrying the status on a failed response" classname="fetchVersion" time="0.000157" file="src/lib/dashboardApi.test.ts" line="904" assertions="2" />
    </testsuite>
    <testsuite name="fetchGitHubRateLimit" file="src/lib/dashboardApi.test.ts" line="916" tests="2" assertions="4" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="reads the per-token usage list" classname="fetchGitHubRateLimit" time="0.000259" file="src/lib/dashboardApi.test.ts" line="917" assertions="2" />
      <testcase name="throws an ApiError carrying the status on a failed response" classname="fetchGitHubRateLimit" time="0.000182" file="src/lib/dashboardApi.test.ts" line="934" assertions="2" />
    </testsuite>
  </testsuite>
  <testsuite name="src/lib/format.test.ts" file="src/lib/format.test.ts" tests="6" assertions="6" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="formatSeconds" file="src/lib/format.test.ts" line="4" tests="3" assertions="3" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="under a minute renders whole seconds" classname="formatSeconds" time="0.000078" file="src/lib/format.test.ts" line="5" assertions="1" />
      <testcase name="a minute or more renders one decimal of minutes" classname="formatSeconds" time="0.000042" file="src/lib/format.test.ts" line="9" assertions="1" />
      <testcase name="exactly 60 seconds is the minutes boundary" classname="formatSeconds" time="0.000027" file="src/lib/format.test.ts" line="13" assertions="1" />
    </testsuite>
    <testsuite name="formatRate" file="src/lib/format.test.ts" line="18" tests="3" assertions="3" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="renders a 0-1 rate as a rounded percentage" classname="formatRate" time="0.00004" file="src/lib/format.test.ts" line="19" assertions="1" />
      <testcase name="rounds to the nearest whole percent" classname="formatRate" time="0.000018" file="src/lib/format.test.ts" line="23" assertions="1" />
      <testcase name="zero renders as 0%" classname="formatRate" time="0.000023" file="src/lib/format.test.ts" line="27" assertions="1" />
    </testsuite>
  </testsuite>
  <testsuite name="src/lib/runActions.test.ts" file="src/lib/runActions.test.ts" tests="13" assertions="24" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="rerunRun" file="src/lib/runActions.test.ts" line="16" tests="8" assertions="11" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="posts to the run’s rerun endpoint and accepts a 202" classname="rerunRun" time="0.000332" file="src/lib/runActions.test.ts" line="17" assertions="3" />
      <testcase name="maps 403 forbidden to its own message" classname="rerunRun" time="0.000277" file="src/lib/runActions.test.ts" line="41" assertions="1" />
      <testcase name="maps 403 forbidden to its own message" classname="rerunRun" time="0.000028" file="src/lib/runActions.test.ts" line="41" assertions="1" />
      <testcase name="maps 409 not_actionable to its own message" classname="rerunRun" time="0.000017" file="src/lib/runActions.test.ts" line="41" assertions="1" />
      <testcase name="maps 501 unsupported to its own message" classname="rerunRun" time="0.000013" file="src/lib/runActions.test.ts" line="41" assertions="1" />
      <testcase name="maps 502 unreachable to its own message" classname="rerunRun" time="0.000014" file="src/lib/runActions.test.ts" line="41" assertions="1" />
      <testcase name="maps 404 not_found to its own message" classname="rerunRun" time="0.000009" file="src/lib/runActions.test.ts" line="41" assertions="1" />
      <testcase name="a network failure reads as the server being unreachable" classname="rerunRun" time="0.000228" file="src/lib/runActions.test.ts" line="50" assertions="2" />
    </testsuite>
    <testsuite name="offersRerun" file="src/lib/runActions.test.ts" line="61" tests="1" assertions="3" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="is true only when the server lists rerun" classname="offersRerun" time="0.000085" file="src/lib/runActions.test.ts" line="62" assertions="3" />
    </testsuite>
    <testsuite name="cancelRun" file="src/lib/runActions.test.ts" line="69" tests="3" assertions="7" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="posts to the run’s cancel endpoint and accepts a 202" classname="cancelRun" time="0.000204" file="src/lib/runActions.test.ts" line="70" assertions="3" />
      <testcase name="a 409 says the run has already finished, not that it can’t be re-run" classname="cancelRun" time="0.000172" file="src/lib/runActions.test.ts" line="87" assertions="2" />
      <testcase name="a 403 asks for Actions write permission" classname="cancelRun" time="0.000191" file="src/lib/runActions.test.ts" line="97" assertions="2" />
    </testsuite>
    <testsuite name="offersCancel" file="src/lib/runActions.test.ts" line="109" tests="1" assertions="3" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="is true only when the server lists cancel" classname="offersCancel" time="0.000072" file="src/lib/runActions.test.ts" line="110" assertions="3" />
    </testsuite>
  </testsuite>
  <testsuite name="src/lib/forgeFilter.initial.test.ts" file="src/lib/forgeFilter.initial.test.ts" tests="1" assertions="1" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testcase name="starts on &quot;all&quot;" classname="" time="0.000306" file="src/lib/forgeFilter.initial.test.ts" line="6" assertions="1" />
  </testsuite>
  <testsuite name="src/lib/webmcpSettings.test.ts" file="src/lib/webmcpSettings.test.ts" tests="19" assertions="26" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="get_settings" file="src/lib/webmcpSettings.test.ts" line="60" tests="2" assertions="3" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="reads the page&apos;s own settings request" classname="get_settings" time="0.000699" file="src/lib/webmcpSettings.test.ts" line="61" assertions="2" />
      <testcase name="fails with the status when the server refuses" classname="get_settings" time="0.000297" file="src/lib/webmcpSettings.test.ts" line="70" assertions="1" />
    </testsuite>
    <testsuite name="update_settings" file="src/lib/webmcpSettings.test.ts" line="79" tests="7" assertions="12" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="sends the PATCH the stores send, a null clearing a setting" classname="update_settings" time="0.000405" file="src/lib/webmcpSettings.test.ts" line="80" assertions="4" />
      <testcase name="asks nobody, as the theme toggle asks nobody" classname="update_settings" time="0.000146" file="src/lib/webmcpSettings.test.ts" line="97" assertions="1" />
      <testcase name="has the open page pick the new settings up" classname="update_settings" time="0.000147" file="src/lib/webmcpSettings.test.ts" line="105" assertions="1" />
      <testcase name="a page that cannot refresh does not fail the call" classname="update_settings" time="0.000251" file="src/lib/webmcpSettings.test.ts" line="113" assertions="1" />
      <testcase name="fails with the server&apos;s message and does not refresh when it refuses" classname="update_settings" time="0.000176" file="src/lib/webmcpSettings.test.ts" line="125" assertions="3" />
      <testcase name="sends a key the schema does not list, so the server decides" classname="update_settings" time="0.000162" file="src/lib/webmcpSettings.test.ts" line="137" assertions="1" />
      <testcase name="works without a refresh hook" classname="update_settings" time="0.000207" file="src/lib/webmcpSettings.test.ts" line="149" assertions="1" />
    </testsuite>
    <testsuite name="the update_settings schema" file="src/lib/webmcpSettings.test.ts" line="164" tests="8" assertions="9" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="lists every setting as optional" classname="the update_settings schema" time="0.000061" file="src/lib/webmcpSettings.test.ts" line="170" assertions="2" />
      <testcase name="lets a closed set take null, which clears it" classname="the update_settings schema" time="0.000039" file="src/lib/webmcpSettings.test.ts" line="182" assertions="1" />
      <testcase name="theme says what it controls and that null clears it" classname="the update_settings schema" time="0.000082" file="src/lib/webmcpSettings.test.ts" line="187" assertions="1" />
      <testcase name="forgeFilter says what it controls and that null clears it" classname="the update_settings schema" time="0.000007" file="src/lib/webmcpSettings.test.ts" line="187" assertions="1" />
      <testcase name="pipelinesHealthFilter says what it controls and that null clears it" classname="the update_settings schema" time="0.000005" file="src/lib/webmcpSettings.test.ts" line="187" assertions="1" />
      <testcase name="pipelinesRepoSelector says what it controls and that null clears it" classname="the update_settings schema" time="0.000007" file="src/lib/webmcpSettings.test.ts" line="187" assertions="1" />
      <testcase name="pipelinesSortOrder says what it controls and that null clears it" classname="the update_settings schema" time="0.000007" file="src/lib/webmcpSettings.test.ts" line="187" assertions="1" />
      <testcase name="telemetryWindow says what it controls and that null clears it" classname="the update_settings schema" time="0.000006" file="src/lib/webmcpSettings.test.ts" line="187" assertions="1" />
    </testsuite>
    <testsuite name="the settings tools are not marked destructive" file="src/lib/webmcpSettings.test.ts" line="194" tests="2" assertions="2" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="get_settings" classname="the settings tools are not marked destructive" time="0.000054" file="src/lib/webmcpSettings.test.ts" line="195" assertions="1" />
      <testcase name="update_settings" classname="the settings tools are not marked destructive" time="0.000015" file="src/lib/webmcpSettings.test.ts" line="195" assertions="1" />
    </testsuite>
  </testsuite>
  <testsuite name="src/lib/forgeFilter.svelte.test.ts" file="src/lib/forgeFilter.svelte.test.ts" tests="10" assertions="12" failures="0" skipped="0" time="0.001" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testcase name="a set value round-trips through its getter" classname="" time="0.001775" file="src/lib/forgeFilter.svelte.test.ts" line="61" assertions="2" />
    <testsuite name="initForgeFilter" file="src/lib/forgeFilter.svelte.test.ts" line="69" tests="2" assertions="2" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="a server-supplied filter wins" classname="initForgeFilter" time="0.000174" file="src/lib/forgeFilter.svelte.test.ts" line="70" assertions="1" />
      <testcase name="falls back to &quot;all&quot; when no server filter and nothing cached" classname="initForgeFilter" time="0.000171" file="src/lib/forgeFilter.svelte.test.ts" line="75" assertions="1" />
    </testsuite>
    <testsuite name="setForgeFilter" file="src/lib/forgeFilter.svelte.test.ts" line="81" tests="2" assertions="3" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="caches the value under &quot;forgeFilter&quot; and patches the server" classname="setForgeFilter" time="0.000147" file="src/lib/forgeFilter.svelte.test.ts" line="82" assertions="2" />
      <testcase name="still sets the value when storage is unavailable" classname="setForgeFilter" time="0.000138" file="src/lib/forgeFilter.svelte.test.ts" line="90" assertions="1" />
    </testsuite>
    <testsuite name="initForgeFilter from the cache" file="src/lib/forgeFilter.svelte.test.ts" line="99" tests="5" assertions="5" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="reads a cached &quot;github&quot;" classname="initForgeFilter from the cache" time="0.000129" file="src/lib/forgeFilter.svelte.test.ts" line="100" assertions="1" />
      <testcase name="reads a cached &quot;forgejo&quot;" classname="initForgeFilter from the cache" time="0.000068" file="src/lib/forgeFilter.svelte.test.ts" line="100" assertions="1" />
      <testcase name="ignores a cached value that is not a forge filter" classname="initForgeFilter from the cache" time="0.000076" file="src/lib/forgeFilter.svelte.test.ts" line="108" assertions="1" />
      <testcase name="writes the resolved value back to the cache" classname="initForgeFilter from the cache" time="0.000069" file="src/lib/forgeFilter.svelte.test.ts" line="116" assertions="1" />
      <testcase name="falls back to &quot;all&quot; when storage is unavailable" classname="initForgeFilter from the cache" time="0.000143" file="src/lib/forgeFilter.svelte.test.ts" line="122" assertions="1" />
    </testsuite>
  </testsuite>
  <testsuite name="src/lib/webmcpRepos.test.ts" file="src/lib/webmcpRepos.test.ts" tests="42" assertions="82" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="list_repos" file="src/lib/webmcpRepos.test.ts" line="56" tests="3" assertions="4" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="asks for 20 repos from offset 0 unless told otherwise" classname="list_repos" time="0.000599" file="src/lib/webmcpRepos.test.ts" line="57" assertions="2" />
      <testcase name="passes the page and the forge through" classname="list_repos" time="0.000201" file="src/lib/webmcpRepos.test.ts" line="68" assertions="1" />
      <testcase name="fails with the status when the server refuses" classname="list_repos" time="0.000202" file="src/lib/webmcpRepos.test.ts" line="81" assertions="1" />
    </testsuite>
    <testsuite name="get_repo" file="src/lib/webmcpRepos.test.ts" line="90" tests="5" assertions="7" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="fetches the repository by its id, encoded, and returns it" classname="get_repo" time="0.000344" file="src/lib/webmcpRepos.test.ts" line="91" assertions="2" />
      <testcase name="says the repository was not found when the server answers 404" classname="get_repo" time="0.000181" file="src/lib/webmcpRepos.test.ts" line="104" assertions="1" />
      <testcase name="fails with the status on any other refusal" classname="get_repo" time="0.000159" file="src/lib/webmcpRepos.test.ts" line="112" assertions="1" />
      <testcase name="says repoId is required before sending" classname="get_repo" time="0.000152" file="src/lib/webmcpRepos.test.ts" line="120" assertions="2" />
      <testcase name="tells the agent to pass the id unencoded, as the tool encodes it" classname="get_repo" time="0.000034" file="src/lib/webmcpRepos.test.ts" line="127" assertions="1" />
    </testsuite>
    <testsuite name="list_repo_identifiers" file="src/lib/webmcpRepos.test.ts" line="136" tests="2" assertions="4" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="sends the forge and the instance and wraps the identifiers" classname="list_repo_identifiers" time="0.000355" file="src/lib/webmcpRepos.test.ts" line="137" assertions="2" />
      <testcase name="says forge is required instead of sending &quot;undefined&quot;" classname="list_repo_identifiers" time="0.000139" file="src/lib/webmcpRepos.test.ts" line="153" assertions="2" />
    </testsuite>
    <testsuite name="discover_repos" file="src/lib/webmcpRepos.test.ts" line="161" tests="4" assertions="9" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="posts what the Repositories page posts and asks nobody" classname="discover_repos" time="0.000414" file="src/lib/webmcpRepos.test.ts" line="162" assertions="5" />
      <testcase name="sends no token when none is given, so the saved one is used" classname="discover_repos" time="0.000141" file="src/lib/webmcpRepos.test.ts" line="179" assertions="1" />
      <testcase name="says forge is required" classname="discover_repos" time="0.000134" file="src/lib/webmcpRepos.test.ts" line="187" assertions="2" />
      <testcase name="fails with the server&apos;s own message, which says what to fix" classname="discover_repos" time="0.000135" file="src/lib/webmcpRepos.test.ts" line="194" assertions="1" />
    </testsuite>
    <testsuite name="register_repo" file="src/lib/webmcpRepos.test.ts" line="203" tests="7" assertions="21" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="asks the person first, then posts what the page posts" classname="register_repo" time="0.000584" file="src/lib/webmcpRepos.test.ts" line="204" assertions="8" />
      <testcase name="does nothing when the person declines" classname="register_repo" time="0.000166" file="src/lib/webmcpRepos.test.ts" line="229" assertions="2" />
      <testcase name="does nothing when the page has no way to ask" classname="register_repo" time="0.000134" file="src/lib/webmcpRepos.test.ts" line="241" assertions="2" />
      <testcase name="asks through the agent when it offers requestUserInteraction" classname="register_repo" time="0.000155" file="src/lib/webmcpRepos.test.ts" line="254" assertions="1" />
      <testcase name="says {&quot;identifier&quot;:&quot;a/b&quot;} is missing forge before asking anyone" classname="register_repo" time="0.000151" file="src/lib/webmcpRepos.test.ts" line="271" assertions="3" />
      <testcase name="says {&quot;forge&quot;:&quot;github&quot;} is missing identifier before asking anyone" classname="register_repo" time="0.000038" file="src/lib/webmcpRepos.test.ts" line="271" assertions="3" />
      <testcase name="fails with the server&apos;s message and code when it refuses" classname="register_repo" time="0.000201" file="src/lib/webmcpRepos.test.ts" line="279" assertions="2" />
    </testsuite>
    <testsuite name="untrack_repo" file="src/lib/webmcpRepos.test.ts" line="296" tests="9" assertions="19" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="asks the person first, naming the repository, then sends the DELETE the page sends" classname="untrack_repo" time="0.000538" file="src/lib/webmcpRepos.test.ts" line="297" assertions="6" />
      <testcase name="names the id when the repository cannot be looked up" classname="untrack_repo" time="0.000219" file="src/lib/webmcpRepos.test.ts" line="322" assertions="2" />
      <testcase name="names the id when no repository is tracked under it" classname="untrack_repo" time="0.000238" file="src/lib/webmcpRepos.test.ts" line="332" assertions="2" />
      <testcase name="does not wait on a lookup that never answers" classname="untrack_repo" time="0.000184" file="src/lib/webmcpRepos.test.ts" line="342" assertions="1" />
      <testcase name="does nothing when the person declines" classname="untrack_repo" time="0.000235" file="src/lib/webmcpRepos.test.ts" line="351" assertions="2" />
      <testcase name="does nothing when the agent reports the person said no" classname="untrack_repo" time="0.00024" file="src/lib/webmcpRepos.test.ts" line="361" assertions="2" />
      <testcase name="says repoId is required before asking anyone" classname="untrack_repo" time="0.00011" file="src/lib/webmcpRepos.test.ts" line="376" assertions="2" />
      <testcase name="fails with the status when the repo is gone" classname="untrack_repo" time="0.000174" file="src/lib/webmcpRepos.test.ts" line="383" assertions="1" />
      <testcase name="tells the agent to pass the id unencoded, as the tool encodes it" classname="untrack_repo" time="0.000039" file="src/lib/webmcpRepos.test.ts" line="392" assertions="1" />
    </testsuite>
    <testsuite name="a forge that is neither github nor forgejo" file="src/lib/webmcpRepos.test.ts" line="401" tests="3" assertions="9" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="list_repo_identifiers fails before asking anyone or sending" classname="a forge that is neither github nor forgejo" time="0.000152" file="src/lib/webmcpRepos.test.ts" line="406" assertions="3" />
      <testcase name="discover_repos fails before asking anyone or sending" classname="a forge that is neither github nor forgejo" time="0.000041" file="src/lib/webmcpRepos.test.ts" line="406" assertions="3" />
      <testcase name="register_repo fails before asking anyone or sending" classname="a forge that is neither github nor forgejo" time="0.000031" file="src/lib/webmcpRepos.test.ts" line="406" assertions="3" />
    </testsuite>
    <testsuite name="the generated schemas tell an agent what to pass" file="src/lib/webmcpRepos.test.ts" line="415" tests="3" assertions="3" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="register_repo.identifier mentions discover_repos" classname="the generated schemas tell an agent what to pass" time="0.000066" file="src/lib/webmcpRepos.test.ts" line="420" assertions="1" />
      <testcase name="register_repo.forgejoInstanceUrl mentions Forgejo" classname="the generated schemas tell an agent what to pass" time="0.000015" file="src/lib/webmcpRepos.test.ts" line="420" assertions="1" />
      <testcase name="discover_repos.forgejoInstanceUrl mentions Forgejo" classname="the generated schemas tell an agent what to pass" time="0.000028" file="src/lib/webmcpRepos.test.ts" line="420" assertions="1" />
    </testsuite>
    <testsuite name="the write tools are marked destructive" file="src/lib/webmcpRepos.test.ts" line="430" tests="6" assertions="6" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="register_repo" classname="the write tools are marked destructive" time="0.000055" file="src/lib/webmcpRepos.test.ts" line="431" assertions="1" />
      <testcase name="untrack_repo" classname="the write tools are marked destructive" time="0.000015" file="src/lib/webmcpRepos.test.ts" line="431" assertions="1" />
      <testcase name="list_repos is not" classname="the write tools are marked destructive" time="0.00005" file="src/lib/webmcpRepos.test.ts" line="440" assertions="1" />
      <testcase name="get_repo is not" classname="the write tools are marked destructive" time="0.000021" file="src/lib/webmcpRepos.test.ts" line="440" assertions="1" />
      <testcase name="list_repo_identifiers is not" classname="the write tools are marked destructive" time="0.000011" file="src/lib/webmcpRepos.test.ts" line="440" assertions="1" />
      <testcase name="discover_repos is not" classname="the write tools are marked destructive" time="0.000012" file="src/lib/webmcpRepos.test.ts" line="440" assertions="1" />
    </testsuite>
  </testsuite>
  <testsuite name="src/lib/branchOptions.test.ts" file="src/lib/branchOptions.test.ts" tests="4" assertions="5" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="branchOptions" file="src/lib/branchOptions.test.ts" line="9" tests="4" assertions="5" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="leads with all branches, then the list in the order given" classname="branchOptions" time="0.00012" file="src/lib/branchOptions.test.ts" line="10" assertions="1" />
      <testcase name="keeps a chosen branch that has no runs in this window" classname="branchOptions" time="0.00011" file="src/lib/branchOptions.test.ts" line="18" assertions="1" />
      <testcase name="does not repeat a chosen branch the list already has" classname="branchOptions" time="0.000035" file="src/lib/branchOptions.test.ts" line="27" assertions="1" />
      <testcase name="offers only all branches for an empty or missing list" classname="branchOptions" time="0.000045" file="src/lib/branchOptions.test.ts" line="31" assertions="2" />
    </testsuite>
  </testsuite>
  <testsuite name="src/lib/statusModel.test.ts" file="src/lib/statusModel.test.ts" tests="22" assertions="23" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="outcomeTone" file="src/lib/statusModel.test.ts" line="4" tests="7" assertions="7" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="passed is pass" classname="outcomeTone" time="0.000038" file="src/lib/statusModel.test.ts" line="13" assertions="1" />
      <testcase name="failed is fail" classname="outcomeTone" time="0.000004" file="src/lib/statusModel.test.ts" line="13" assertions="1" />
      <testcase name="running is running" classname="outcomeTone" time="0.000002" file="src/lib/statusModel.test.ts" line="13" assertions="1" />
      <testcase name="queued is running" classname="outcomeTone" time="0.000002" file="src/lib/statusModel.test.ts" line="13" assertions="1" />
      <testcase name="cancelled is neutral" classname="outcomeTone" time="0.000002" file="src/lib/statusModel.test.ts" line="13" assertions="1" />
      <testcase name="skipped is neutral" classname="outcomeTone" time="0.000001" file="src/lib/statusModel.test.ts" line="13" assertions="1" />
      <testcase name="unknown is neutral" classname="outcomeTone" time="0.000001" file="src/lib/statusModel.test.ts" line="13" assertions="1" />
    </testsuite>
    <testsuite name="outcomeLabel" file="src/lib/statusModel.test.ts" line="18" tests="9" assertions="9" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="passed reads Passed" classname="outcomeLabel" time="0.000089" file="src/lib/statusModel.test.ts" line="26" assertions="1" />
      <testcase name="failed reads Failed" classname="outcomeLabel" time="0.000004" file="src/lib/statusModel.test.ts" line="26" assertions="1" />
      <testcase name="running reads Running" classname="outcomeLabel" time="0.000002" file="src/lib/statusModel.test.ts" line="26" assertions="1" />
      <testcase name="queued reads Queued" classname="outcomeLabel" time="0.000002" file="src/lib/statusModel.test.ts" line="26" assertions="1" />
      <testcase name="cancelled reads Cancelled" classname="outcomeLabel" time="0.000002" file="src/lib/statusModel.test.ts" line="26" assertions="1" />
      <testcase name="skipped reads Skipped" classname="outcomeLabel" time="0.000002" file="src/lib/statusModel.test.ts" line="26" assertions="1" />
      <testcase name="an unknown outcome shows the forge text it was given, so it is never blank" classname="outcomeLabel" time="0.000036" file="src/lib/statusModel.test.ts" line="30" assertions="1" />
      <testcase name="an unknown outcome with nothing to show says so" classname="outcomeLabel" time="0.000021" file="src/lib/statusModel.test.ts" line="34" assertions="1" />
      <testcase name="the fallback is only for unknown: a known outcome ignores it" classname="outcomeLabel" time="0.00002" file="src/lib/statusModel.test.ts" line="38" assertions="1" />
    </testsuite>
    <testsuite name="isPending" file="src/lib/statusModel.test.ts" line="43" tests="6" assertions="7" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="running and queued are work still to come, so a list should keep refreshing" classname="isPending" time="0.000038" file="src/lib/statusModel.test.ts" line="44" assertions="2" />
      <testcase name="passed is not pending" classname="isPending" time="0.00002" file="src/lib/statusModel.test.ts" line="50" assertions="1" />
      <testcase name="failed is not pending" classname="isPending" time="0.000005" file="src/lib/statusModel.test.ts" line="50" assertions="1" />
      <testcase name="cancelled is not pending" classname="isPending" time="0.000002" file="src/lib/statusModel.test.ts" line="50" assertions="1" />
      <testcase name="skipped is not pending" classname="isPending" time="0.000002" file="src/lib/statusModel.test.ts" line="50" assertions="1" />
      <testcase name="unknown is not pending" classname="isPending" time="0.000002" file="src/lib/statusModel.test.ts" line="50" assertions="1" />
    </testsuite>
  </testsuite>
  <testsuite name="src/lib/pipelinesFilters.initial.test.ts" file="src/lib/pipelinesFilters.initial.test.ts" tests="1" assertions="3" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testcase name="start unfiltered until the server answers" classname="" time="0.000127" file="src/lib/pipelinesFilters.initial.test.ts" line="9" assertions="3" />
  </testsuite>
  <testsuite name="src/lib/webmcpParity.test.ts" file="src/lib/webmcpParity.test.ts" tests="6" assertions="6" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="WebMCP parity with openapi.yaml" file="src/lib/webmcpParity.test.ts" line="73" tests="6" assertions="6" failures="0" skipped="0" time="0.013" hostname="runnervm8k3b6">
      <testcase name="every operation has an operationId" classname="WebMCP parity with openapi.yaml" time="0.005319" file="src/lib/webmcpParity.test.ts" line="74" assertions="1" />
      <testcase name="every operation has a tool or an exclusion reason" classname="WebMCP parity with openapi.yaml" time="0.002171" file="src/lib/webmcpParity.test.ts" line="82" assertions="1" />
      <testcase name="no operation is both a tool and excluded" classname="WebMCP parity with openapi.yaml" time="0.002081" file="src/lib/webmcpParity.test.ts" line="92" assertions="1" />
      <testcase name="an exclusion states its reason" classname="WebMCP parity with openapi.yaml" time="0.002371" file="src/lib/webmcpParity.test.ts" line="102" assertions="1" />
      <testcase name="every registered tool is mapped to operations the spec declares" classname="WebMCP parity with openapi.yaml" time="0.002079" file="src/lib/webmcpParity.test.ts" line="115" assertions="1" />
      <testcase name="every mapped tool is registered" classname="WebMCP parity with openapi.yaml" time="0.000118" file="src/lib/webmcpParity.test.ts" line="129" assertions="1" />
    </testsuite>
  </testsuite>
  <testsuite name="src/lib/webmcpRunActions.test.ts" file="src/lib/webmcpRunActions.test.ts" tests="22" assertions="44" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="rerun_run" file="src/lib/webmcpRunActions.test.ts" line="56" tests="11" assertions="22" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="asks the person first, then calls the same action the Runs page does" classname="rerun_run" time="0.00065" file="src/lib/webmcpRunActions.test.ts" line="57" assertions="4" />
      <testcase name="does nothing when the person declines" classname="rerun_run" time="0.000222" file="src/lib/webmcpRunActions.test.ts" line="68" assertions="2" />
      <testcase name="does nothing when the page has no way to ask" classname="rerun_run" time="0.000197" file="src/lib/webmcpRunActions.test.ts" line="77" assertions="2" />
      <testcase name="only a plain yes counts: a confirm that answers with a promise" classname="rerun_run" time="0.000204" file="src/lib/webmcpRunActions.test.ts" line="90" assertions="2" />
      <testcase name="only a plain yes counts: a confirm that answers with text" classname="rerun_run" time="0.000108" file="src/lib/webmcpRunActions.test.ts" line="90" assertions="2" />
      <testcase name="does nothing when the agent reports the person said no" classname="rerun_run" time="0.000217" file="src/lib/webmcpRunActions.test.ts" line="100" assertions="2" />
      <testcase name="does nothing when the agent answers with anything but true" classname="rerun_run" time="0.000269" file="src/lib/webmcpRunActions.test.ts" line="113" assertions="2" />
      <testcase name="asks through the agent when it offers requestUserInteraction" classname="rerun_run" time="0.000331" file="src/lib/webmcpRunActions.test.ts" line="126" assertions="2" />
      <testcase name="says runId is required instead of acting on &quot;undefined&quot;" classname="rerun_run" time="0.000172" file="src/lib/webmcpRunActions.test.ts" line="139" assertions="2" />
      <testcase name="raises the server&apos;s refusal in the page&apos;s own words" classname="rerun_run" time="0.000425" file="src/lib/webmcpRunActions.test.ts" line="146" assertions="1" />
      <testcase name="is marked destructive so an agent host can gate it too" classname="rerun_run" time="0.000064" file="src/lib/webmcpRunActions.test.ts" line="156" assertions="1" />
    </testsuite>
    <testsuite name="cancel_run" file="src/lib/webmcpRunActions.test.ts" line="56" tests="11" assertions="22" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="asks the person first, then calls the same action the Runs page does" classname="cancel_run" time="0.000098" file="src/lib/webmcpRunActions.test.ts" line="57" assertions="4" />
      <testcase name="does nothing when the person declines" classname="cancel_run" time="0.000046" file="src/lib/webmcpRunActions.test.ts" line="68" assertions="2" />
      <testcase name="does nothing when the page has no way to ask" classname="cancel_run" time="0.000033" file="src/lib/webmcpRunActions.test.ts" line="77" assertions="2" />
      <testcase name="only a plain yes counts: a confirm that answers with a promise" classname="cancel_run" time="0.000033" file="src/lib/webmcpRunActions.test.ts" line="90" assertions="2" />
      <testcase name="only a plain yes counts: a confirm that answers with text" classname="cancel_run" time="0.000038" file="src/lib/webmcpRunActions.test.ts" line="90" assertions="2" />
      <testcase name="does nothing when the agent reports the person said no" classname="cancel_run" time="0.000038" file="src/lib/webmcpRunActions.test.ts" line="100" assertions="2" />
      <testcase name="does nothing when the agent answers with anything but true" classname="cancel_run" time="0.000032" file="src/lib/webmcpRunActions.test.ts" line="113" assertions="2" />
      <testcase name="asks through the agent when it offers requestUserInteraction" classname="cancel_run" time="0.00004" file="src/lib/webmcpRunActions.test.ts" line="126" assertions="2" />
      <testcase name="says runId is required instead of acting on &quot;undefined&quot;" classname="cancel_run" time="0.000031" file="src/lib/webmcpRunActions.test.ts" line="139" assertions="2" />
      <testcase name="raises the server&apos;s refusal in the page&apos;s own words" classname="cancel_run" time="0.000052" file="src/lib/webmcpRunActions.test.ts" line="146" assertions="1" />
      <testcase name="is marked destructive so an agent host can gate it too" classname="cancel_run" time="0.000028" file="src/lib/webmcpRunActions.test.ts" line="156" assertions="1" />
    </testsuite>
  </testsuite>
  <testsuite name="src/lib/telemetryWindow.svelte.test.ts" file="src/lib/telemetryWindow.svelte.test.ts" tests="10" assertions="11" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="with nothing saved" file="src/lib/telemetryWindow.svelte.test.ts" line="44" tests="1" assertions="1" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="there is no window: the server chooses, and the page shows what it used" classname="with nothing saved" time="0.000304" file="src/lib/telemetryWindow.svelte.test.ts" line="45" assertions="1" />
    </testsuite>
    <testsuite name="setTelemetryWindow" file="src/lib/telemetryWindow.svelte.test.ts" line="50" tests="3" assertions="4" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="a set value round-trips through its getter" classname="setTelemetryWindow" time="0.000646" file="src/lib/telemetryWindow.svelte.test.ts" line="51" assertions="2" />
      <testcase name="sends the choice to the server as a settings patch" classname="setTelemetryWindow" time="0.000189" file="src/lib/telemetryWindow.svelte.test.ts" line="59" assertions="1" />
      <testcase name="caches the choice so a reload paints it before the server answers" classname="setTelemetryWindow" time="0.000157" file="src/lib/telemetryWindow.svelte.test.ts" line="65" assertions="1" />
    </testsuite>
    <testsuite name="initTelemetryWindow" file="src/lib/telemetryWindow.svelte.test.ts" line="72" tests="6" assertions="6" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="a server-supplied window wins" classname="initTelemetryWindow" time="0.000122" file="src/lib/telemetryWindow.svelte.test.ts" line="73" assertions="1" />
      <testcase name="falls back to the cached window when the server gave none" classname="initTelemetryWindow" time="0.000114" file="src/lib/telemetryWindow.svelte.test.ts" line="81" assertions="1" />
      <testcase name="is empty when nothing is cached either: the frontend holds no default" classname="initTelemetryWindow" time="0.000117" file="src/lib/telemetryWindow.svelte.test.ts" line="89" assertions="1" />
      <testcase name="ignores a cached value outside the documented set" classname="initTelemetryWindow" time="0.000102" file="src/lib/telemetryWindow.svelte.test.ts" line="95" assertions="1" />
      <testcase name="caches nothing when there is nothing to cache" classname="initTelemetryWindow" time="0.000067" file="src/lib/telemetryWindow.svelte.test.ts" line="103" assertions="1" />
      <testcase name="does not send a patch: it only reconciles with what the server already has" classname="initTelemetryWindow" time="0.0001" file="src/lib/telemetryWindow.svelte.test.ts" line="109" assertions="1" />
    </testsuite>
  </testsuite>
  <testsuite name="src/lib/failureCategory.test.ts" file="src/lib/failureCategory.test.ts" tests="5" assertions="5" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="categoryLabel" file="src/lib/failureCategory.test.ts" line="4" tests="5" assertions="5" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="infrastructure reads Infrastructure" classname="categoryLabel" time="0.000039" file="src/lib/failureCategory.test.ts" line="11" assertions="1" />
      <testcase name="code_tests reads Code and tests" classname="categoryLabel" time="0.000007" file="src/lib/failureCategory.test.ts" line="11" assertions="1" />
      <testcase name="network_timeouts reads Network and timeouts" classname="categoryLabel" time="0.000003" file="src/lib/failureCategory.test.ts" line="11" assertions="1" />
      <testcase name="config_secrets reads Config and secrets" classname="categoryLabel" time="0.000002" file="src/lib/failureCategory.test.ts" line="11" assertions="1" />
      <testcase name="uncategorised reads Uncategorised" classname="categoryLabel" time="0.000002" file="src/lib/failureCategory.test.ts" line="11" assertions="1" />
    </testsuite>
  </testsuite>
  <testsuite name="src/lib/lastForgeSelection.test.ts" file="src/lib/lastForgeSelection.test.ts" tests="9" assertions="12" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="the last forge selection" file="src/lib/lastForgeSelection.test.ts" line="71" tests="6" assertions="8" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="is nothing until one is remembered" classname="the last forge selection" time="0.000166" file="src/lib/lastForgeSelection.test.ts" line="72" assertions="1" />
      <testcase name="round-trips a GitHub selection" classname="the last forge selection" time="0.000149" file="src/lib/lastForgeSelection.test.ts" line="76" assertions="2" />
      <testcase name="round-trips a Forgejo selection with its instance" classname="the last forge selection" time="0.000062" file="src/lib/lastForgeSelection.test.ts" line="83" assertions="1" />
      <testcase name="drops an instance URL that is not Forgejo, and an empty one" classname="the last forge selection" time="0.000065" file="src/lib/lastForgeSelection.test.ts" line="92" assertions="2" />
      <testcase name="survives unavailable storage" classname="the last forge selection" time="0.00013" file="src/lib/lastForgeSelection.test.ts" line="100" assertions="1" />
      <testcase name="is nothing when the stored value is not JSON" classname="the last forge selection" time="0.000063" file="src/lib/lastForgeSelection.test.ts" line="108" assertions="1" />
    </testsuite>
    <testsuite name="purgeRememberedTokens" file="src/lib/lastForgeSelection.test.ts" line="115" tests="3" assertions="4" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="removes every token the browser remembered, and nothing else" classname="purgeRememberedTokens" time="0.000335" file="src/lib/lastForgeSelection.test.ts" line="116" assertions="2" />
      <testcase name="skips an index the storage cannot name" classname="purgeRememberedTokens" time="0.000152" file="src/lib/lastForgeSelection.test.ts" line="136" assertions="1" />
      <testcase name="does nothing when storage is unavailable" classname="purgeRememberedTokens" time="0.000102" file="src/lib/lastForgeSelection.test.ts" line="152" assertions="1" />
    </testsuite>
  </testsuite>
  <testsuite name="src/lib/branchFilter.svelte.test.ts" file="src/lib/branchFilter.svelte.test.ts" tests="3" assertions="4" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="the chosen branch" file="src/lib/branchFilter.svelte.test.ts" line="6" tests="3" assertions="4" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="starts as no selection, which means every branch" classname="the chosen branch" time="0.000227" file="src/lib/branchFilter.svelte.test.ts" line="7" assertions="1" />
      <testcase name="a set branch is read back, and clearing returns to no selection" classname="the chosen branch" time="0.000414" file="src/lib/branchFilter.svelte.test.ts" line="11" assertions="2" />
      <testcase name="an empty name is no selection" classname="the chosen branch" time="0.000144" file="src/lib/branchFilter.svelte.test.ts" line="19" assertions="1" />
    </testsuite>
  </testsuite>
  <testsuite name="src/lib/errors.test.ts" file="src/lib/errors.test.ts" tests="6" assertions="24" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="errorView" file="src/lib/errors.test.ts" line="4" tests="3" assertions="19" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="says a missing page is missing, in plain words" classname="errorView" time="0.000076" file="src/lib/errors.test.ts" line="5" assertions="3" />
      <testcase name="gives every other status the generic message" classname="errorView" time="0.000093" file="src/lib/errors.test.ts" line="13" assertions="12" />
      <testcase name="never puts a status code in the headline or chip" classname="errorView" time="0.000111" file="src/lib/errors.test.ts" line="25" assertions="4" />
    </testsuite>
    <testsuite name="shapeError" file="src/lib/errors.test.ts" line="35" tests="3" assertions="5" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="returns the generic message, whatever was thrown" classname="shapeError" time="0.000149" file="src/lib/errors.test.ts" line="40" assertions="1" />
      <testcase name="logs the detail for the operator" classname="shapeError" time="0.000073" file="src/lib/errors.test.ts" line="50" assertions="2" />
      <testcase name="keeps a missing page quiet and plain" classname="shapeError" time="0.000054" file="src/lib/errors.test.ts" line="59" assertions="2" />
    </testsuite>
  </testsuite>
  <testsuite name="src/lib/flakyRuns.test.ts" file="src/lib/flakyRuns.test.ts" tests="2" assertions="2" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="flakyRunsHref" file="src/lib/flakyRuns.test.ts" line="4" tests="2" assertions="2" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="links a step to its pipeline-scoped flaky-runs list" classname="flakyRunsHref" time="0.000057" file="src/lib/flakyRuns.test.ts" line="5" assertions="1" />
      <testcase name="encodes characters the step name may contain" classname="flakyRunsHref" time="0.000032" file="src/lib/flakyRuns.test.ts" line="11" assertions="1" />
    </testsuite>
  </testsuite>
  <testsuite name="src/lib/flakeMatrix.test.ts" file="src/lib/flakeMatrix.test.ts" tests="6" assertions="6" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="flakeCells" file="src/lib/flakeMatrix.test.ts" line="19" tests="3" assertions="3" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="gives each result a tone and a text label, oldest first" classname="flakeCells" time="0.000115" file="src/lib/flakeMatrix.test.ts" line="20" assertions="1" />
      <testcase name="an outcome the server could not classify reads Unknown, never a pass" classname="flakeCells" time="0.000038" file="src/lib/flakeMatrix.test.ts" line="28" assertions="1" />
      <testcase name="an empty history is an empty matrix" classname="flakeCells" time="0.000036" file="src/lib/flakeMatrix.test.ts" line="34" assertions="1" />
    </testsuite>
    <testsuite name="flakeSummary" file="src/lib/flakeMatrix.test.ts" line="39" tests="3" assertions="3" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="says how many of the shown runs failed, and the rate over the window" classname="flakeSummary" time="0.000168" file="src/lib/flakeMatrix.test.ts" line="40" assertions="1" />
      <testcase name="names the full run count when the matrix shows only the most recent" classname="flakeSummary" time="0.000298" file="src/lib/flakeMatrix.test.ts" line="53" assertions="1" />
      <testcase name="a single run reads in the singular" classname="flakeSummary" time="0.000097" file="src/lib/flakeMatrix.test.ts" line="64" assertions="1" />
    </testsuite>
  </testsuite>
  <testsuite name="src/lib/format.points.test.ts" file="src/lib/format.points.test.ts" tests="5" assertions="6" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="formatPercentagePoints" file="src/lib/format.points.test.ts" line="4" tests="5" assertions="6" failures="0" skipped="0" time="0.003" hostname="runnervm8k3b6">
      <testcase name="a drop reads with a minus sign and one decimal" classname="formatPercentagePoints" time="0.003135" file="src/lib/format.points.test.ts" line="5" assertions="1" />
      <testcase name="a rise reads with a plus sign" classname="formatPercentagePoints" time="0.00008" file="src/lib/format.points.test.ts" line="9" assertions="1" />
      <testcase name="no change reads as zero, signless" classname="formatPercentagePoints" time="0.000023" file="src/lib/format.points.test.ts" line="13" assertions="1" />
      <testcase name="a change that rounds to nothing reads as zero, not +0.0 or -0.0" classname="formatPercentagePoints" time="0.000024" file="src/lib/format.points.test.ts" line="17" assertions="2" />
      <testcase name="rounds to one decimal" classname="formatPercentagePoints" time="0.000032" file="src/lib/format.points.test.ts" line="22" assertions="1" />
    </testsuite>
  </testsuite>
  <testsuite name="src/lib/stageProgress.test.ts" file="src/lib/stageProgress.test.ts" tests="9" assertions="9" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="stageSegments" file="src/lib/stageProgress.test.ts" line="14" tests="3" assertions="3" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="maps each step to a segment with its tone and a text label" classname="stageSegments" time="0.000136" file="src/lib/stageProgress.test.ts" line="15" assertions="1" />
      <testcase name="an unknown step shows its forge text as the label" classname="stageSegments" time="0.000068" file="src/lib/stageProgress.test.ts" line="29" assertions="1" />
      <testcase name="no steps is no segments" classname="stageSegments" time="0.000051" file="src/lib/stageProgress.test.ts" line="42" assertions="1" />
    </testsuite>
    <testsuite name="stageSummary" file="src/lib/stageProgress.test.ts" line="47" tests="6" assertions="6" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="names the first failing stage and its position" classname="stageSummary" time="0.000153" file="src/lib/stageProgress.test.ts" line="48" assertions="1" />
      <testcase name="a failure outranks a later running stage" classname="stageSummary" time="0.000045" file="src/lib/stageProgress.test.ts" line="59" assertions="1" />
      <testcase name="names the first running stage when nothing has failed" classname="stageSummary" time="0.000046" file="src/lib/stageProgress.test.ts" line="65" assertions="1" />
      <testcase name="all passed reads as a count" classname="stageSummary" time="0.00006" file="src/lib/stageProgress.test.ts" line="75" assertions="1" />
      <testcase name="a skipped step is not counted as passed" classname="stageSummary" time="0.000048" file="src/lib/stageProgress.test.ts" line="81" assertions="1" />
      <testcase name="no steps says so rather than 0/0" classname="stageSummary" time="0.000018" file="src/lib/stageProgress.test.ts" line="87" assertions="1" />
    </testsuite>
  </testsuite>
  <testsuite name="src/lib/batches.test.ts" file="src/lib/batches.test.ts" tests="4" assertions="9" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="revealInBatches" file="src/lib/batches.test.ts" line="16" tests="4" assertions="9" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="reveals the first batch at once, then one step per tick" classname="revealInBatches" time="0.000268" file="src/lib/batches.test.ts" line="17" assertions="4" />
      <testcase name="reveals everything at once when it fits in the first batch" classname="revealInBatches" time="0.000087" file="src/lib/batches.test.ts" line="31" assertions="2" />
      <testcase name="reveals nothing for an empty list" classname="revealInBatches" time="0.000052" file="src/lib/batches.test.ts" line="41" assertions="2" />
      <testcase name="stops when cancelled" classname="revealInBatches" time="0.000084" file="src/lib/batches.test.ts" line="51" assertions="1" />
    </testsuite>
  </testsuite>
  <testsuite name="src/lib/webmcpBuildReads.test.ts" file="src/lib/webmcpBuildReads.test.ts" tests="4" assertions="6" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="get_version" file="src/lib/webmcpBuildReads.test.ts" line="44" tests="2" assertions="3" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="reads the footer&apos;s own version request" classname="get_version" time="0.000427" file="src/lib/webmcpBuildReads.test.ts" line="45" assertions="2" />
      <testcase name="fails with the status when the server refuses" classname="get_version" time="0.000201" file="src/lib/webmcpBuildReads.test.ts" line="54" assertions="1" />
    </testsuite>
    <testsuite name="get_github_rate_limit" file="src/lib/webmcpBuildReads.test.ts" line="63" tests="2" assertions="3" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="reads the Insights page&apos;s own request and wraps the list" classname="get_github_rate_limit" time="0.000243" file="src/lib/webmcpBuildReads.test.ts" line="64" assertions="2" />
      <testcase name="fails with the status when the server refuses" classname="get_github_rate_limit" time="0.000126" file="src/lib/webmcpBuildReads.test.ts" line="76" assertions="1" />
    </testsuite>
  </testsuite>
  <testsuite name="src/lib/relativeTime.test.ts" file="src/lib/relativeTime.test.ts" tests="9" assertions="9" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="formatRelativeTime" file="src/lib/relativeTime.test.ts" line="6" tests="9" assertions="9" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="under a minute still renders in minutes, never seconds" classname="formatRelativeTime" time="0.000168" file="src/lib/relativeTime.test.ts" line="7" assertions="1" />
      <testcase name="picks minutes as the coarsest unit under an hour" classname="formatRelativeTime" time="0.000085" file="src/lib/relativeTime.test.ts" line="12" assertions="1" />
      <testcase name="picks hours once at least one whole hour has passed" classname="formatRelativeTime" time="0.000091" file="src/lib/relativeTime.test.ts" line="17" assertions="1" />
      <testcase name="an exact unit boundary already counts as that unit" classname="formatRelativeTime" time="0.000068" file="src/lib/relativeTime.test.ts" line="22" assertions="1" />
      <testcase name="picks days once at least one whole day has passed" classname="formatRelativeTime" time="0.000041" file="src/lib/relativeTime.test.ts" line="27" assertions="1" />
      <testcase name="picks weeks once at least one whole week has passed" classname="formatRelativeTime" time="0.000036" file="src/lib/relativeTime.test.ts" line="32" assertions="1" />
      <testcase name="picks months once at least one whole month has passed" classname="formatRelativeTime" time="0.000033" file="src/lib/relativeTime.test.ts" line="37" assertions="1" />
      <testcase name="picks years once at least one whole year has passed" classname="formatRelativeTime" time="0.000035" file="src/lib/relativeTime.test.ts" line="42" assertions="1" />
      <testcase name="a future date renders in the future tense" classname="formatRelativeTime" time="0.000031" file="src/lib/relativeTime.test.ts" line="47" assertions="1" />
    </testsuite>
  </testsuite>
  <testsuite name="src/lib/webmcpSchemas.test.ts" file="src/lib/webmcpSchemas.test.ts" tests="3" assertions="4" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="WebMCP input schemas follow openapi.yaml" file="src/lib/webmcpSchemas.test.ts" line="51" tests="2" assertions="2" failures="0" skipped="0" time="0.009" hostname="runnervm8k3b6">
      <testcase name="every tool declares the schema generated from its operation" classname="WebMCP input schemas follow openapi.yaml" time="0.004097" file="src/lib/webmcpSchemas.test.ts" line="52" assertions="1" />
      <testcase name="the committed generated module is current, so a changed spec parameter fails here" classname="WebMCP input schemas follow openapi.yaml" time="0.005937" file="src/lib/webmcpSchemas.test.ts" line="72" assertions="1" />
    </testsuite>
    <testsuite name="WebMCP tool descriptions" file="src/lib/webmcpSchemas.test.ts" line="83" tests="1" assertions="2" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="list_runs and list_pipelines state their default paging" classname="WebMCP tool descriptions" time="0.00015" file="src/lib/webmcpSchemas.test.ts" line="84" assertions="2" />
    </testsuite>
  </testsuite>
  <testsuite name="src/lib/apiTokens.test.ts" file="src/lib/apiTokens.test.ts" tests="6" assertions="12" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="TTL_PRESETS" file="src/lib/apiTokens.test.ts" line="29" tests="2" assertions="2" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="offers 30 days, 90 days and 1 year, and nothing that never expires" classname="TTL_PRESETS" time="0.000046" file="src/lib/apiTokens.test.ts" line="30" assertions="1" />
      <testcase name="selects 90 days by default, not the longest" classname="TTL_PRESETS" time="0.00002" file="src/lib/apiTokens.test.ts" line="38" assertions="1" />
    </testsuite>
    <testsuite name="expiryFor" file="src/lib/apiTokens.test.ts" line="43" tests="1" assertions="2" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="is the preset lifetime after the given moment" classname="expiryFor" time="0.000094" file="src/lib/apiTokens.test.ts" line="44" assertions="2" />
    </testsuite>
    <testsuite name="createApiToken" file="src/lib/apiTokens.test.ts" line="54" tests="3" assertions="8" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="posts the preset lifetime as ttlSeconds and returns the token" classname="createApiToken" time="0.000451" file="src/lib/apiTokens.test.ts" line="62" assertions="6" />
      <testcase name="throws the server message when it refuses" classname="createApiToken" time="0.00014" file="src/lib/apiTokens.test.ts" line="80" assertions="1" />
      <testcase name="falls back to a generic message when the body has none" classname="createApiToken" time="0.000107" file="src/lib/apiTokens.test.ts" line="90" assertions="1" />
    </testsuite>
  </testsuite>
  <testsuite name="src/lib/settingsSync.test.ts" file="src/lib/settingsSync.test.ts" tests="7" assertions="14" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="loadSettings" file="src/lib/settingsSync.test.ts" line="22" tests="2" assertions="4" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="reads every setting" classname="loadSettings" time="0.00027" file="src/lib/settingsSync.test.ts" line="23" assertions="2" />
      <testcase name="throws an ApiError carrying the status" classname="loadSettings" time="0.000196" file="src/lib/settingsSync.test.ts" line="30" assertions="2" />
    </testsuite>
    <testsuite name="saveSettings" file="src/lib/settingsSync.test.ts" line="40" tests="2" assertions="7" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="patches the update, nulls included, and returns the result" classname="saveSettings" time="0.000279" file="src/lib/settingsSync.test.ts" line="41" assertions="5" />
      <testcase name="keeps the server&apos;s message when it rejects the update" classname="saveSettings" time="0.000189" file="src/lib/settingsSync.test.ts" line="59" assertions="2" />
    </testsuite>
    <testsuite name="the best-effort callers keep their old behaviour" file="src/lib/settingsSync.test.ts" line="72" tests="3" assertions="3" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="fetchSettings answers null on a refusal" classname="the best-effort callers keep their old behaviour" time="0.000215" file="src/lib/settingsSync.test.ts" line="73" assertions="1" />
      <testcase name="fetchSettings answers null when the request never arrives" classname="the best-effort callers keep their old behaviour" time="0.00015" file="src/lib/settingsSync.test.ts" line="77" assertions="1" />
      <testcase name="patchSettings swallows a refusal" classname="the best-effort callers keep their old behaviour" time="0.000205" file="src/lib/settingsSync.test.ts" line="83" assertions="1" />
    </testsuite>
  </testsuite>
  <testsuite name="src/lib/repoApi.test.ts" file="src/lib/repoApi.test.ts" tests="15" assertions="30" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="fetchRepoPage" file="src/lib/repoApi.test.ts" line="21" tests="3" assertions="5" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="asks for one page, filtered by forge when given" classname="fetchRepoPage" time="0.000347" file="src/lib/repoApi.test.ts" line="22" assertions="2" />
      <testcase name="leaves the forge out when there is no filter" classname="fetchRepoPage" time="0.00017" file="src/lib/repoApi.test.ts" line="36" assertions="1" />
      <testcase name="throws an ApiError carrying the status" classname="fetchRepoPage" time="0.000209" file="src/lib/repoApi.test.ts" line="44" assertions="2" />
    </testsuite>
    <testsuite name="fetchRepoIdentifiers" file="src/lib/repoApi.test.ts" line="55" tests="2" assertions="3" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="sends the forge and, for Forgejo, the instance" classname="fetchRepoIdentifiers" time="0.000192" file="src/lib/repoApi.test.ts" line="56" assertions="2" />
      <testcase name="sends only the forge when there is no instance" classname="fetchRepoIdentifiers" time="0.000131" file="src/lib/repoApi.test.ts" line="70" assertions="1" />
    </testsuite>
    <testsuite name="discoverRepos" file="src/lib/repoApi.test.ts" line="81" tests="4" assertions="11" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="posts the forge, the instance and the token" classname="discoverRepos" time="0.000238" file="src/lib/repoApi.test.ts" line="82" assertions="5" />
      <testcase name="sends no token key when there is none, so the saved one is used" classname="discoverRepos" time="0.000164" file="src/lib/repoApi.test.ts" line="102" assertions="1" />
      <testcase name="keeps the server&apos;s code and message on a refusal" classname="discoverRepos" time="0.000239" file="src/lib/repoApi.test.ts" line="111" assertions="2" />
      <testcase name="a refusal with no JSON body still carries the status" classname="discoverRepos" time="0.000197" file="src/lib/repoApi.test.ts" line="125" assertions="3" />
    </testsuite>
    <testsuite name="a refusal read as text" file="src/lib/repoApi.test.ts" line="137" tests="2" assertions="2" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="is the status followed by the server&apos;s message" classname="a refusal read as text" time="0.00021" file="src/lib/repoApi.test.ts" line="138" assertions="1" />
      <testcase name="is only the status when the server said nothing more" classname="a refusal read as text" time="0.000165" file="src/lib/repoApi.test.ts" line="147" assertions="1" />
    </testsuite>
    <testsuite name="registerRepo" file="src/lib/repoApi.test.ts" line="156" tests="2" assertions="5" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="posts the registration and returns the repo" classname="registerRepo" time="0.000208" file="src/lib/repoApi.test.ts" line="157" assertions="4" />
      <testcase name="an already tracked repo is a 409 with its code" classname="registerRepo" time="0.000177" file="src/lib/repoApi.test.ts" line="177" assertions="1" />
    </testsuite>
    <testsuite name="untrackRepo" file="src/lib/repoApi.test.ts" line="187" tests="2" assertions="4" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="sends a DELETE for the repo" classname="untrackRepo" time="0.000145" file="src/lib/repoApi.test.ts" line="188" assertions="2" />
      <testcase name="throws an ApiError when the repo is gone" classname="untrackRepo" time="0.000143" file="src/lib/repoApi.test.ts" line="198" assertions="2" />
    </testsuite>
  </testsuite>
  <testsuite name="src/lib/savedForgeTokens.test.ts" file="src/lib/savedForgeTokens.test.ts" tests="14" assertions="28" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="listForgeTokens" file="src/lib/savedForgeTokens.test.ts" line="46" tests="2" assertions="3" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="reads the masked tokens from GET /api/forge-tokens" classname="listForgeTokens" time="0.000337" file="src/lib/savedForgeTokens.test.ts" line="47" assertions="2" />
      <testcase name="throws on a failed response" classname="listForgeTokens" time="0.000158" file="src/lib/savedForgeTokens.test.ts" line="54" assertions="1" />
    </testsuite>
    <testsuite name="saveForgeToken" file="src/lib/savedForgeTokens.test.ts" line="63" tests="4" assertions="9" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="PUTs the forge, instance and token, and returns the masked one" classname="saveForgeToken" time="0.000366" file="src/lib/savedForgeTokens.test.ts" line="64" assertions="6" />
      <testcase name="sends no instance URL for GitHub" classname="saveForgeToken" time="0.000136" file="src/lib/savedForgeTokens.test.ts" line="90" assertions="1" />
      <testcase name="throws the server&apos;s own message when it refuses" classname="saveForgeToken" time="0.000138" file="src/lib/savedForgeTokens.test.ts" line="104" assertions="1" />
      <testcase name="falls back to a generic message when the refusal has none" classname="saveForgeToken" time="0.000128" file="src/lib/savedForgeTokens.test.ts" line="114" assertions="1" />
    </testsuite>
    <testsuite name="deleteForgeToken" file="src/lib/savedForgeTokens.test.ts" line="123" tests="2" assertions="4" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="DELETEs the token by id" classname="deleteForgeToken" time="0.000227" file="src/lib/savedForgeTokens.test.ts" line="124" assertions="3" />
      <testcase name="throws on a failed response" classname="deleteForgeToken" time="0.000101" file="src/lib/savedForgeTokens.test.ts" line="134" assertions="1" />
    </testsuite>
    <testsuite name="findSavedToken" file="src/lib/savedForgeTokens.test.ts" line="143" tests="5" assertions="10" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="finds the GitHub token whatever instance URL is passed" classname="findSavedToken" time="0.000093" file="src/lib/savedForgeTokens.test.ts" line="146" assertions="2" />
      <testcase name="finds a Forgejo token by instance, ignoring spacing and a trailing slash, as the server does" classname="findSavedToken" time="0.000108" file="src/lib/savedForgeTokens.test.ts" line="151" assertions="1" />
      <testcase name="ignores every trailing slash, as the server does" classname="findSavedToken" time="0.000039" file="src/lib/savedForgeTokens.test.ts" line="157" assertions="1" />
      <testcase name="never matches a Forgejo token that has no instance to an empty or missing one" classname="findSavedToken" time="0.000065" file="src/lib/savedForgeTokens.test.ts" line="163" assertions="3" />
      <testcase name="finds nothing for another instance, or a forge with no token" classname="findSavedToken" time="0.000038" file="src/lib/savedForgeTokens.test.ts" line="175" assertions="3" />
    </testsuite>
    <testsuite name="savedTokenLabel" file="src/lib/savedForgeTokens.test.ts" line="184" tests="1" assertions="2" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="names the forge, and the instance for Forgejo" classname="savedTokenLabel" time="0.000071" file="src/lib/savedForgeTokens.test.ts" line="185" assertions="2" />
    </testsuite>
  </testsuite>
  <testsuite name="src/lib/changelog.test.ts" file="src/lib/changelog.test.ts" tests="14" assertions="454" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="parseChangelog" file="src/lib/changelog.test.ts" line="29" tests="12" assertions="27" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="reads the version, tag, name, url and date from a release heading" classname="parseChangelog" time="0.00023" file="src/lib/changelog.test.ts" line="30" assertions="5" />
      <testcase name="keeps the file order, which is newest first" classname="parseChangelog" time="0.000109" file="src/lib/changelog.test.ts" line="40" assertions="1" />
      <testcase name="the body is the section without its own heading, trimmed" classname="parseChangelog" time="0.000087" file="src/lib/changelog.test.ts" line="47" assertions="3" />
      <testcase name="a release body keeps its own ### sections" classname="parseChangelog" time="0.000046" file="src/lib/changelog.test.ts" line="55" assertions="3" />
      <testcase name="a release body stops at the next release and does not leak it" classname="parseChangelog" time="0.00005" file="src/lib/changelog.test.ts" line="63" assertions="1" />
      <testcase name="the last release runs to the end of the file" classname="parseChangelog" time="0.000062" file="src/lib/changelog.test.ts" line="69" assertions="1" />
      <testcase name="a changelog with no release headings is an empty list, not an error" classname="parseChangelog" time="0.000052" file="src/lib/changelog.test.ts" line="75" assertions="2" />
      <testcase name="a release with no body has an empty one" classname="parseChangelog" time="0.00006" file="src/lib/changelog.test.ts" line="80" assertions="2" />
      <testcase name="a heading without a compare link is still a release" classname="parseChangelog" time="0.000056" file="src/lib/changelog.test.ts" line="90" assertions="2" />
      <testcase name="a heading that is not a release ends the previous section and is skipped" classname="parseChangelog" time="0.000071" file="src/lib/changelog.test.ts" line="100" assertions="3" />
      <testcase name="Windows line endings parse the same" classname="parseChangelog" time="0.000103" file="src/lib/changelog.test.ts" line="111" assertions="2" />
      <testcase name="a pre-release suffix stays part of the version" classname="parseChangelog" time="0.000064" file="src/lib/changelog.test.ts" line="121" assertions="2" />
    </testsuite>
    <testsuite name="this repository&apos;s own CHANGELOG.md" file="src/lib/changelog.test.ts" line="139" tests="2" assertions="427" failures="0" skipped="0" time="0.001" hostname="runnervm8k3b6">
      <testcase name="every release heading parses" classname="this repository&amp;apos;s own CHANGELOG.md" time="0.001464" file="src/lib/changelog.test.ts" line="145" assertions="1" />
      <testcase name="every release has a version, a date and a non-empty body" classname="this repository&amp;apos;s own CHANGELOG.md" time="0.000693" file="src/lib/changelog.test.ts" line="153" assertions="426" />
    </testsuite>
  </testsuite>
  <testsuite name="src/lib/runsFilters.svelte.test.ts" file="src/lib/runsFilters.svelte.test.ts" tests="10" assertions="14" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="defaults" file="src/lib/runsFilters.svelte.test.ts" line="17" tests="2" assertions="3" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="starts on every run, first page" classname="defaults" time="0.000145" file="src/lib/runsFilters.svelte.test.ts" line="18" assertions="2" />
      <testcase name="a page is 20 runs, like the Pipelines and Repos pages" classname="defaults" time="0.000031" file="src/lib/runsFilters.svelte.test.ts" line="23" assertions="1" />
    </testsuite>
    <testsuite name="setStatus" file="src/lib/runsFilters.svelte.test.ts" line="28" tests="3" assertions="4" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="a set status round-trips through its getter" classname="setStatus" time="0.000422" file="src/lib/runsFilters.svelte.test.ts" line="29" assertions="1" />
      <testcase name="changing the status returns to the first page" classname="setStatus" time="0.000382" file="src/lib/runsFilters.svelte.test.ts" line="35" assertions="2" />
      <testcase name="choosing the status already selected keeps the page" classname="setStatus" time="0.000156" file="src/lib/runsFilters.svelte.test.ts" line="45" assertions="1" />
    </testsuite>
    <testsuite name="paging" file="src/lib/runsFilters.svelte.test.ts" line="55" tests="3" assertions="3" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="next advances by one page" classname="paging" time="0.000138" file="src/lib/runsFilters.svelte.test.ts" line="56" assertions="1" />
      <testcase name="previous steps back one page" classname="paging" time="0.000241" file="src/lib/runsFilters.svelte.test.ts" line="62" assertions="1" />
      <testcase name="previous never goes below the first page" classname="paging" time="0.000127" file="src/lib/runsFilters.svelte.test.ts" line="71" assertions="1" />
    </testsuite>
    <testsuite name="resetRunsFilters" file="src/lib/runsFilters.svelte.test.ts" line="78" tests="1" assertions="2" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="restores the status and the page" classname="resetRunsFilters" time="0.000074" file="src/lib/runsFilters.svelte.test.ts" line="79" assertions="2" />
    </testsuite>
    <testsuite name="backToFirstPage" file="src/lib/runsFilters.svelte.test.ts" line="90" tests="1" assertions="2" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="returns to the first page and leaves the status alone" classname="backToFirstPage" time="0.000103" file="src/lib/runsFilters.svelte.test.ts" line="91" assertions="2" />
    </testsuite>
  </testsuite>
  <testsuite name="src/lib/ansi.test.ts" file="src/lib/ansi.test.ts" tests="9" assertions="9" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="parseAnsiLines" file="src/lib/ansi.test.ts" line="6" tests="9" assertions="9" failures="0" skipped="0" time="0.004" hostname="runnervm8k3b6">
      <testcase name="a plain line is one unstyled segment" classname="parseAnsiLines" time="0.004567" file="src/lib/ansi.test.ts" line="7" assertions="1" />
      <testcase name="a colour applies until it is reset" classname="parseAnsiLines" time="0.000243" file="src/lib/ansi.test.ts" line="11" assertions="1" />
      <testcase name="bright colours and bold are kept apart from the plain ones" classname="parseAnsiLines" time="0.000072" file="src/lib/ansi.test.ts" line="17" assertions="1" />
      <testcase name="a colour carries onto the next line until reset, as in a terminal" classname="parseAnsiLines" time="0.000079" file="src/lib/ansi.test.ts" line="26" assertions="1" />
      <testcase name="256-colour and truecolour sequences are skipped without eating the text" classname="parseAnsiLines" time="0.000161" file="src/lib/ansi.test.ts" line="34" assertions="1" />
      <testcase name="cursor movement, OSC titles and stray escapes are dropped" classname="parseAnsiLines" time="0.000052" file="src/lib/ansi.test.ts" line="40" assertions="1" />
      <testcase name="control characters are removed but a tab survives" classname="parseAnsiLines" time="0.00004" file="src/lib/ansi.test.ts" line="48" assertions="1" />
      <testcase name="markup stays text: a script tag is never interpreted" classname="parseAnsiLines" time="0.000093" file="src/lib/ansi.test.ts" line="54" assertions="1" />
      <testcase name="an empty line stays an empty line" classname="parseAnsiLines" time="0.000047" file="src/lib/ansi.test.ts" line="61" assertions="1" />
    </testsuite>
  </testsuite>
  <testsuite name="src/lib/webmcpQuarantine.test.ts" file="src/lib/webmcpQuarantine.test.ts" tests="8" assertions="17" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="quarantine_step" file="src/lib/webmcpQuarantine.test.ts" line="38" tests="5" assertions="10" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="sends the PUT the Flaky page sends, with the step escaped" classname="quarantine_step" time="0.000545" file="src/lib/webmcpQuarantine.test.ts" line="39" assertions="4" />
      <testcase name="sends no body when there is no note" classname="quarantine_step" time="0.000211" file="src/lib/webmcpQuarantine.test.ts" line="52" assertions="1" />
      <testcase name="says {&quot;step&quot;:&quot;unit&quot;} is missing pipelineId instead of sending &quot;undefined&quot;" classname="quarantine_step" time="0.000316" file="src/lib/webmcpQuarantine.test.ts" line="65" assertions="2" />
      <testcase name="says {&quot;pipelineId&quot;:&quot;p1&quot;} is missing step instead of sending &quot;undefined&quot;" classname="quarantine_step" time="0.000042" file="src/lib/webmcpQuarantine.test.ts" line="65" assertions="2" />
      <testcase name="fails with the server&apos;s status when it refuses" classname="quarantine_step" time="0.000257" file="src/lib/webmcpQuarantine.test.ts" line="74" assertions="1" />
    </testsuite>
    <testsuite name="unquarantine_step" file="src/lib/webmcpQuarantine.test.ts" line="88" tests="2" assertions="3" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="sends the DELETE the Flaky page sends" classname="unquarantine_step" time="0.000283" file="src/lib/webmcpQuarantine.test.ts" line="89" assertions="2" />
      <testcase name="says step is required instead of sending &quot;undefined&quot;" classname="unquarantine_step" time="0.000144" file="src/lib/webmcpQuarantine.test.ts" line="100" assertions="1" />
    </testsuite>
    <testsuite name="quarantine tool schemas" file="src/lib/webmcpQuarantine.test.ts" line="107" tests="1" assertions="4" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="tell an agent to pass the step name as listed, since the tool encodes it" classname="quarantine tool schemas" time="0.000231" file="src/lib/webmcpQuarantine.test.ts" line="108" assertions="4" />
    </testsuite>
  </testsuite>
  <testsuite name="src/lib/webmcpTools.test.ts" file="src/lib/webmcpTools.test.ts" tests="48" assertions="60" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="registerWebMCPTools" file="src/lib/webmcpTools.test.ts" line="153" tests="5" assertions="8" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="does not throw and registers nothing when modelContext is undefined" classname="registerWebMCPTools" time="0.000153" file="src/lib/webmcpTools.test.ts" line="154" assertions="1" />
      <testcase name="registers each tool under the name the MCP server uses" classname="registerWebMCPTools" time="0.000263" file="src/lib/webmcpTools.test.ts" line="158" assertions="1" />
      <testcase name="list_pipelines&apos; execute calls fetchPipelines and returns its result as the tool&apos;s content" classname="registerWebMCPTools" time="0.000538" file="src/lib/webmcpTools.test.ts" line="194" assertions="2" />
      <testcase name="get_pipeline&apos;s execute calls fetchPipeline with the pipelineId argument it&apos;s given" classname="registerWebMCPTools" time="0.000338" file="src/lib/webmcpTools.test.ts" line="215" assertions="2" />
      <testcase name="get_repo_usage&apos;s execute calls fetchRepoUsage with the repoId argument it&apos;s given" classname="registerWebMCPTools" time="0.000301" file="src/lib/webmcpTools.test.ts" line="233" assertions="2" />
    </testsuite>
    <testsuite name="advertised parameters" file="src/lib/webmcpTools.test.ts" line="291" tests="26" assertions="26" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="list_pipelines forwards every parameter its schema lists" classname="advertised parameters" time="0.000502" file="src/lib/webmcpTools.test.ts" line="304" assertions="1" />
      <testcase name="get_pipeline forwards every parameter its schema lists" classname="advertised parameters" time="0.000178" file="src/lib/webmcpTools.test.ts" line="304" assertions="1" />
      <testcase name="get_repo_usage forwards every parameter its schema lists" classname="advertised parameters" time="0.000099" file="src/lib/webmcpTools.test.ts" line="304" assertions="1" />
      <testcase name="list_pipeline_steps forwards every parameter its schema lists" classname="advertised parameters" time="0.000205" file="src/lib/webmcpTools.test.ts" line="304" assertions="1" />
      <testcase name="get_job_log forwards every parameter its schema lists" classname="advertised parameters" time="0.000242" file="src/lib/webmcpTools.test.ts" line="304" assertions="1" />
      <testcase name="get_failure_insights forwards every parameter its schema lists" classname="advertised parameters" time="0.000328" file="src/lib/webmcpTools.test.ts" line="304" assertions="1" />
      <testcase name="list_runs forwards every parameter its schema lists" classname="advertised parameters" time="0.000316" file="src/lib/webmcpTools.test.ts" line="304" assertions="1" />
      <testcase name="list_flaky_steps forwards every parameter its schema lists" classname="advertised parameters" time="0.000256" file="src/lib/webmcpTools.test.ts" line="304" assertions="1" />
      <testcase name="list_branches forwards every parameter its schema lists" classname="advertised parameters" time="0.000283" file="src/lib/webmcpTools.test.ts" line="304" assertions="1" />
      <testcase name="get_run_steps forwards every parameter its schema lists" classname="advertised parameters" time="0.000252" file="src/lib/webmcpTools.test.ts" line="304" assertions="1" />
      <testcase name="list_pipeline_flaky_runs forwards every parameter its schema lists" classname="advertised parameters" time="0.000224" file="src/lib/webmcpTools.test.ts" line="304" assertions="1" />
      <testcase name="list_unhealthy_steps forwards every parameter its schema lists" classname="advertised parameters" time="0.000171" file="src/lib/webmcpTools.test.ts" line="304" assertions="1" />
      <testcase name="rerun_run forwards every parameter its schema lists" classname="advertised parameters" time="0.000138" file="src/lib/webmcpTools.test.ts" line="304" assertions="1" />
      <testcase name="cancel_run forwards every parameter its schema lists" classname="advertised parameters" time="0.000078" file="src/lib/webmcpTools.test.ts" line="304" assertions="1" />
      <testcase name="quarantine_step forwards every parameter its schema lists" classname="advertised parameters" time="0.000089" file="src/lib/webmcpTools.test.ts" line="304" assertions="1" />
      <testcase name="unquarantine_step forwards every parameter its schema lists" classname="advertised parameters" time="0.000089" file="src/lib/webmcpTools.test.ts" line="304" assertions="1" />
      <testcase name="list_repos forwards every parameter its schema lists" classname="advertised parameters" time="0.000135" file="src/lib/webmcpTools.test.ts" line="304" assertions="1" />
      <testcase name="get_repo forwards every parameter its schema lists" classname="advertised parameters" time="0.00009" file="src/lib/webmcpTools.test.ts" line="304" assertions="1" />
      <testcase name="list_repo_identifiers forwards every parameter its schema lists" classname="advertised parameters" time="0.0001" file="src/lib/webmcpTools.test.ts" line="304" assertions="1" />
      <testcase name="register_repo forwards every parameter its schema lists" classname="advertised parameters" time="0.000126" file="src/lib/webmcpTools.test.ts" line="304" assertions="1" />
      <testcase name="discover_repos forwards every parameter its schema lists" classname="advertised parameters" time="0.000081" file="src/lib/webmcpTools.test.ts" line="304" assertions="1" />
      <testcase name="untrack_repo forwards every parameter its schema lists" classname="advertised parameters" time="0.000151" file="src/lib/webmcpTools.test.ts" line="304" assertions="1" />
      <testcase name="get_settings forwards every parameter its schema lists" classname="advertised parameters" time="0.000123" file="src/lib/webmcpTools.test.ts" line="304" assertions="1" />
      <testcase name="update_settings forwards every parameter its schema lists" classname="advertised parameters" time="0.0001" file="src/lib/webmcpTools.test.ts" line="304" assertions="1" />
      <testcase name="get_version forwards every parameter its schema lists" classname="advertised parameters" time="0.000091" file="src/lib/webmcpTools.test.ts" line="304" assertions="1" />
      <testcase name="get_github_rate_limit forwards every parameter its schema lists" classname="advertised parameters" time="0.000085" file="src/lib/webmcpTools.test.ts" line="304" assertions="1" />
    </testsuite>
    <testsuite name="read tools" file="src/lib/webmcpTools.test.ts" line="335" tests="17" assertions="26" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="list_pipeline_steps calls its fetch function with the arguments it is given" classname="read tools" time="0.000139" file="src/lib/webmcpTools.test.ts" line="389" assertions="2" />
      <testcase name="get_job_log calls its fetch function with the arguments it is given" classname="read tools" time="0.000031" file="src/lib/webmcpTools.test.ts" line="389" assertions="2" />
      <testcase name="get_failure_insights calls its fetch function with the arguments it is given" classname="read tools" time="0.000059" file="src/lib/webmcpTools.test.ts" line="389" assertions="2" />
      <testcase name="list_runs calls its fetch function with the arguments it is given" classname="read tools" time="0.000071" file="src/lib/webmcpTools.test.ts" line="389" assertions="2" />
      <testcase name="list_flaky_steps calls its fetch function with the arguments it is given" classname="read tools" time="0.000069" file="src/lib/webmcpTools.test.ts" line="389" assertions="2" />
      <testcase name="list_branches calls its fetch function with the arguments it is given" classname="read tools" time="0.000042" file="src/lib/webmcpTools.test.ts" line="389" assertions="2" />
      <testcase name="get_run_steps calls its fetch function with the arguments it is given" classname="read tools" time="0.000032" file="src/lib/webmcpTools.test.ts" line="389" assertions="2" />
      <testcase name="list_pipeline_flaky_runs calls its fetch function with the arguments it is given" classname="read tools" time="0.000051" file="src/lib/webmcpTools.test.ts" line="389" assertions="2" />
      <testcase name="list_unhealthy_steps calls its fetch function with the arguments it is given" classname="read tools" time="0.000023" file="src/lib/webmcpTools.test.ts" line="389" assertions="2" />
      <testcase name="get_run_steps says runId is required instead of sending &quot;undefined&quot;" classname="read tools" time="0.000159" file="src/lib/webmcpTools.test.ts" line="410" assertions="1" />
      <testcase name="list_pipeline_flaky_runs says pipelineId is required instead of sending &quot;undefined&quot;" classname="read tools" time="0.000045" file="src/lib/webmcpTools.test.ts" line="410" assertions="1" />
      <testcase name="list_pipeline_flaky_runs says step is required instead of sending &quot;undefined&quot;" classname="read tools" time="0.000028" file="src/lib/webmcpTools.test.ts" line="410" assertions="1" />
      <testcase name="list_pipeline_flaky_runs says step is required instead of sending &quot;undefined&quot;" classname="read tools" time="0.000027" file="src/lib/webmcpTools.test.ts" line="410" assertions="1" />
      <testcase name="list_runs asks for the first 20 when no paging is given" classname="read tools" time="0.000146" file="src/lib/webmcpTools.test.ts" line="422" assertions="1" />
      <testcase name="list_runs ignores a paging value that is not a number" classname="read tools" time="0.000135" file="src/lib/webmcpTools.test.ts" line="434" assertions="1" />
      <testcase name="list_flaky_steps sends no paging when none is a number" classname="read tools" time="0.00018" file="src/lib/webmcpTools.test.ts" line="446" assertions="1" />
      <testcase name="get_failure_insights invents no window, so the server keeps its default" classname="read tools" time="0.000118" file="src/lib/webmcpTools.test.ts" line="459" assertions="1" />
    </testsuite>
  </testsuite>
  <testsuite name="src/lib/screenshotRoutes.test.ts" file="src/lib/screenshotRoutes.test.ts" tests="22" assertions="54" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="routeOf" file="src/lib/screenshotRoutes.test.ts" line="40" tests="1" assertions="3" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="turns a page file into its route" classname="routeOf" time="0.000035" file="src/lib/screenshotRoutes.test.ts" line="41" assertions="3" />
    </testsuite>
    <testsuite name="README screenshots" file="src/lib/screenshotRoutes.test.ts" line="50" tests="19" assertions="49" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="every page under src/routes has one, except the footer pages" classname="README screenshots" time="0.000064" file="src/lib/screenshotRoutes.test.ts" line="51" assertions="1" />
      <testcase name="the footer pages have none" classname="README screenshots" time="0.000047" file="src/lib/screenshotRoutes.test.ts" line="57" assertions="3" />
      <testcase name="no entry names a page that no longer exists" classname="README screenshots" time="0.000035" file="src/lib/screenshotRoutes.test.ts" line="64" assertions="1" />
      <testcase name="/: screenshot-failure-overview.png exists, is captured, and has alt text" classname="README screenshots" time="0.000062" file="src/lib/screenshotRoutes.test.ts" line="71" assertions="3" />
      <testcase name="/login: screenshot-login.png exists, is captured, and has alt text" classname="README screenshots" time="0.000013" file="src/lib/screenshotRoutes.test.ts" line="71" assertions="3" />
      <testcase name="/pipelines: screenshot-overview.png exists, is captured, and has alt text" classname="README screenshots" time="0.000009" file="src/lib/screenshotRoutes.test.ts" line="71" assertions="3" />
      <testcase name="/pipelines/[id]: screenshot-pipeline-detail.png exists, is captured, and has alt text" classname="README screenshots" time="0.000009" file="src/lib/screenshotRoutes.test.ts" line="71" assertions="3" />
      <testcase name="/pipelines/[id]/flaky-runs: screenshot-flaky-runs.png exists, is captured, and has alt text" classname="README screenshots" time="0.000012" file="src/lib/screenshotRoutes.test.ts" line="71" assertions="3" />
      <testcase name="/failures: screenshot-root-cause.png exists, is captured, and has alt text" classname="README screenshots" time="0.000009" file="src/lib/screenshotRoutes.test.ts" line="71" assertions="3" />
      <testcase name="/flaky: screenshot-flaky.png exists, is captured, and has alt text" classname="README screenshots" time="0.00001" file="src/lib/screenshotRoutes.test.ts" line="71" assertions="3" />
      <testcase name="/insights: screenshot-insights.png exists, is captured, and has alt text" classname="README screenshots" time="0.000011" file="src/lib/screenshotRoutes.test.ts" line="71" assertions="3" />
      <testcase name="/repos: screenshot-repos.png exists, is captured, and has alt text" classname="README screenshots" time="0.000012" file="src/lib/screenshotRoutes.test.ts" line="71" assertions="3" />
      <testcase name="/repos/[id]/usage: screenshot-usage.png exists, is captured, and has alt text" classname="README screenshots" time="0.000008" file="src/lib/screenshotRoutes.test.ts" line="71" assertions="3" />
      <testcase name="/runs: screenshot-runs.png exists, is captured, and has alt text" classname="README screenshots" time="0.00001" file="src/lib/screenshotRoutes.test.ts" line="71" assertions="3" />
      <testcase name="/runs/[id]: screenshot-run-detail.png exists, is captured, and has alt text" classname="README screenshots" time="0.000011" file="src/lib/screenshotRoutes.test.ts" line="71" assertions="3" />
      <testcase name="/settings: screenshot-settings.png exists, is captured, and has alt text" classname="README screenshots" time="0.000024" file="src/lib/screenshotRoutes.test.ts" line="71" assertions="3" />
      <testcase name="screenshot-overview-dark.png exists and is captured" classname="README screenshots" time="0.000062" file="src/lib/screenshotRoutes.test.ts" line="79" assertions="2" />
      <testcase name="screenshot-pipeline-detail-dark.png exists and is captured" classname="README screenshots" time="0.000023" file="src/lib/screenshotRoutes.test.ts" line="79" assertions="2" />
      <testcase name="the README section is the generated one (bun scripts/update-readme-screenshots.ts)" classname="README screenshots" time="0.00024" file="src/lib/screenshotRoutes.test.ts" line="85" assertions="1" />
    </testsuite>
    <testsuite name="replaceScreenshotSection" file="src/lib/screenshotRoutes.test.ts" line="93" tests="2" assertions="2" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="swaps what is between the markers and keeps the rest" classname="replaceScreenshotSection" time="0.000201" file="src/lib/screenshotRoutes.test.ts" line="94" assertions="1" />
      <testcase name="refuses a README with no markers" classname="replaceScreenshotSection" time="0.000065" file="src/lib/screenshotRoutes.test.ts" line="102" assertions="1" />
    </testsuite>
  </testsuite>
  <testsuite name="src/lib/pipelinesFilters.svelte.test.ts" file="src/lib/pipelinesFilters.svelte.test.ts" tests="18" assertions="35" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="getters/setters" file="src/lib/pipelinesFilters.svelte.test.ts" line="86" tests="1" assertions="3" failures="0" skipped="0" time="0.001" hostname="runnervm8k3b6">
      <testcase name="a set value round-trips through its getter" classname="getters/setters" time="0.00122" file="src/lib/pipelinesFilters.svelte.test.ts" line="87" assertions="3" />
    </testsuite>
    <testsuite name="isAtDefaults" file="src/lib/pipelinesFilters.svelte.test.ts" line="99" tests="2" assertions="2" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="true when every filter is still its default" classname="isAtDefaults" time="0.000483" file="src/lib/pipelinesFilters.svelte.test.ts" line="100" assertions="1" />
      <testcase name="false once any single filter moves off its default" classname="isAtDefaults" time="0.000313" file="src/lib/pipelinesFilters.svelte.test.ts" line="104" assertions="1" />
    </testsuite>
    <testsuite name="isAtDefaults, against the server defaults" file="src/lib/pipelinesFilters.svelte.test.ts" line="110" tests="2" assertions="3" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="follows a default the server changed" classname="isAtDefaults, against the server defaults" time="0.000307" file="src/lib/pipelinesFilters.svelte.test.ts" line="111" assertions="2" />
      <testcase name="true when the defaults are unknown, so there is nothing to reset to" classname="isAtDefaults, against the server defaults" time="0.000368" file="src/lib/pipelinesFilters.svelte.test.ts" line="125" assertions="1" />
    </testsuite>
    <testsuite name="resetFilters" file="src/lib/pipelinesFilters.svelte.test.ts" line="133" tests="3" assertions="7" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="restores every filter to its documented default" classname="resetFilters" time="0.000352" file="src/lib/pipelinesFilters.svelte.test.ts" line="134" assertions="3" />
      <testcase name="restores the server defaults, not any value the client knows" classname="resetFilters" time="0.00027" file="src/lib/pipelinesFilters.svelte.test.ts" line="146" assertions="3" />
      <testcase name="still clears the server when the defaults are unknown" classname="resetFilters" time="0.000219" file="src/lib/pipelinesFilters.svelte.test.ts" line="167" assertions="1" />
    </testsuite>
    <testsuite name="initPipelinesFilters" file="src/lib/pipelinesFilters.svelte.test.ts" line="184" tests="2" assertions="6" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="server-supplied values win over the cache and the default" classname="initPipelinesFilters" time="0.000152" file="src/lib/pipelinesFilters.svelte.test.ts" line="185" assertions="3" />
      <testcase name="falls back to unfiltered when no server value is given" classname="initPipelinesFilters" time="0.000174" file="src/lib/pipelinesFilters.svelte.test.ts" line="199" assertions="3" />
    </testsuite>
    <testsuite name="isAtDefaults, one filter at a time" file="src/lib/pipelinesFilters.svelte.test.ts" line="208" tests="2" assertions="2" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="a repo selector off its default is not at defaults" classname="isAtDefaults, one filter at a time" time="0.000144" file="src/lib/pipelinesFilters.svelte.test.ts" line="209" assertions="1" />
      <testcase name="a sort order off its default is not at defaults" classname="isAtDefaults, one filter at a time" time="0.000133" file="src/lib/pipelinesFilters.svelte.test.ts" line="214" assertions="1" />
    </testsuite>
    <testsuite name="persistence" file="src/lib/pipelinesFilters.svelte.test.ts" line="220" tests="3" assertions="5" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="each setter caches under its own key and patches only its own setting" classname="persistence" time="0.000255" file="src/lib/pipelinesFilters.svelte.test.ts" line="221" assertions="2" />
      <testcase name="reset caches the defaults and clears all three on the server" classname="persistence" time="0.000368" file="src/lib/pipelinesFilters.svelte.test.ts" line="239" assertions="2" />
      <testcase name="setters still work when storage is unavailable" classname="persistence" time="0.000191" file="src/lib/pipelinesFilters.svelte.test.ts" line="262" assertions="1" />
    </testsuite>
    <testsuite name="initPipelinesFilters from the cache" file="src/lib/pipelinesFilters.svelte.test.ts" line="271" tests="3" assertions="7" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="reads each cached value under its own key" classname="initPipelinesFilters from the cache" time="0.000157" file="src/lib/pipelinesFilters.svelte.test.ts" line="272" assertions="3" />
      <testcase name="writes the resolved values back to the cache" classname="initPipelinesFilters from the cache" time="0.000144" file="src/lib/pipelinesFilters.svelte.test.ts" line="284" assertions="1" />
      <testcase name="falls back to unfiltered when storage is unavailable" classname="initPipelinesFilters from the cache" time="0.000267" file="src/lib/pipelinesFilters.svelte.test.ts" line="300" assertions="3" />
    </testsuite>
  </testsuite>
  <testsuite name="src/routes/layout.test.ts" file="src/routes/layout.test.ts" tests="5" assertions="6" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="root layout load" file="src/routes/layout.test.ts" line="26" tests="5" assertions="6" failures="0" skipped="0" time="0.006" hostname="runnervm8k3b6">
      <testcase name="skips both requests on /login" classname="root layout load" time="0.000358" file="src/routes/layout.test.ts" line="27" assertions="1" />
      <testcase name="reports hasRepos from a successful repos check" classname="root layout load" time="0.006924" file="src/routes/layout.test.ts" line="38" assertions="1" />
      <testcase name="reports no repos from a successful check of an empty list" classname="root layout load" time="0.000329" file="src/routes/layout.test.ts" line="57" assertions="1" />
      <testcase name="redirects to /login on a 401" classname="root layout load" time="0.000613" file="src/routes/layout.test.ts" line="74" assertions="2" />
      <testcase name="falls back to hasRepos: false when the repos check fails outright" classname="root layout load" time="0.000316" file="src/routes/layout.test.ts" line="93" assertions="1" />
    </testsuite>
  </testsuite>
  <testsuite name="src/routes/overview.dom.test.ts" file="src/routes/overview.dom.test.ts" tests="7" assertions="15" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="Overview page" file="src/routes/overview.dom.test.ts" line="95" tests="7" assertions="15" failures="0" skipped="0" time="0.283" hostname="runnervm8k3b6">
      <testcase name="with no repository registered it says how to start and asks for nothing" classname="Overview page" time="0.032918" file="src/routes/overview.dom.test.ts" line="96" assertions="2" />
      <testcase name="the window toggle asks the server for that window" classname="Overview page" time="0.117878" file="src/routes/overview.dom.test.ts" line="105" assertions="2" />
      <testcase name="a figure the server has no data for says so instead of showing zero" classname="Overview page" time="0.03062" file="src/routes/overview.dom.test.ts" line="115" assertions="3" />
      <testcase name="shows the latest failure when there is one" classname="Overview page" time="0.031895" file="src/routes/overview.dom.test.ts" line="133" assertions="2" />
      <testcase name="says so when the figures cannot load" classname="Overview page" time="0.025252" file="src/routes/overview.dom.test.ts" line="144" assertions="1" />
      <testcase name="a branch with no runs shows an empty state, not zeros" classname="Overview page" time="0.02368" file="src/routes/overview.dom.test.ts" line="154" assertions="3" />
      <testcase name="the figures still load when the branch list cannot" classname="Overview page" time="0.025626" file="src/routes/overview.dom.test.ts" line="178" assertions="2" />
    </testsuite>
  </testsuite>
  <testsuite name="src/routes/layout.dom.test.ts" file="src/routes/layout.dom.test.ts" tests="1" assertions="2" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="root layout" file="src/routes/layout.dom.test.ts" line="49" tests="1" assertions="2" failures="0" skipped="0" time="0.074" hostname="runnervm8k3b6">
      <testcase name="registers the WebMCP tools with the router&apos;s invalidateAll" classname="root layout" time="0.074931" file="src/routes/layout.dom.test.ts" line="50" assertions="2" />
    </testsuite>
  </testsuite>
  <testsuite name="src/lib/components/TabBar.dom.test.ts" file="src/lib/components/TabBar.dom.test.ts" tests="3" assertions="11" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="TabBar" file="src/lib/components/TabBar.dom.test.ts" line="66" tests="3" assertions="11" failures="0" skipped="0" time="0.054" hostname="runnervm8k3b6">
      <testcase name="with no repository registered, the tabs that need one are disabled like the top nav" classname="TabBar" time="0.040039" file="src/lib/components/TabBar.dom.test.ts" line="67" assertions="7" />
      <testcase name="with a repository every tab is a link to its view" classname="TabBar" time="0.009964" file="src/lib/components/TabBar.dom.test.ts" line="77" assertions="2" />
      <testcase name="marks the current view and no other" classname="TabBar" time="0.005875" file="src/lib/components/TabBar.dom.test.ts" line="88" assertions="2" />
    </testsuite>
  </testsuite>
  <testsuite name="src/lib/components/Footer.dom.test.ts" file="src/lib/components/Footer.dom.test.ts" tests="6" assertions="24" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="Footer" file="src/lib/components/Footer.dom.test.ts" line="73" tests="6" assertions="24" failures="0" skipped="0" time="0.11" hostname="runnervm8k3b6">
      <testcase name="a dev build says so and links nowhere" classname="Footer" time="0.032277" file="src/lib/components/Footer.dom.test.ts" line="74" assertions="3" />
      <testcase name="a release version links to the release history, with no second link to it" classname="Footer" time="0.016279" file="src/lib/components/Footer.dom.test.ts" line="82" assertions="3" />
      <testcase name="on the release page the version is not a link to itself" classname="Footer" time="0.015511" file="src/lib/components/Footer.dom.test.ts" line="93" assertions="2" />
      <testcase name="on the privacy page there is no link to itself" classname="Footer" time="0.019852" file="src/lib/components/Footer.dom.test.ts" line="103" assertions="1" />
      <testcase name="the GitHub and license links point at the repo, open in a new tab and say so" classname="Footer" time="0.014762" file="src/lib/components/Footer.dom.test.ts" line="111" assertions="11" />
      <testcase name="says nothing about a version when the version cannot be fetched" classname="Footer" time="0.014415" file="src/lib/components/Footer.dom.test.ts" line="135" assertions="4" />
    </testsuite>
  </testsuite>
  <testsuite name="src/lib/components/navActive.test.ts" file="src/lib/components/navActive.test.ts" tests="4" assertions="8" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="isActivePath" file="src/lib/components/navActive.test.ts" line="4" tests="4" assertions="8" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
      <testcase name="the root is active only on exactly the root" classname="isActivePath" time="0.000085" file="src/lib/components/navActive.test.ts" line="5" assertions="3" />
      <testcase name="any other link is active on its own path" classname="isActivePath" time="0.000031" file="src/lib/components/navActive.test.ts" line="11" assertions="1" />
      <testcase name="and on a path beneath it, so a detail page keeps its section lit" classname="isActivePath" time="0.000029" file="src/lib/components/navActive.test.ts" line="15" assertions="2" />
      <testcase name="but not on an unrelated path" classname="isActivePath" time="0.000057" file="src/lib/components/navActive.test.ts" line="20" assertions="2" />
    </testsuite>
  </testsuite>
  <testsuite name="src/routes/insights/insights.dom.test.ts" file="src/routes/insights/insights.dom.test.ts" tests="2" assertions="2" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="Insights page" file="src/routes/insights/insights.dom.test.ts" line="46" tests="2" assertions="2" failures="0" skipped="0" time="0.064" hostname="runnervm8k3b6">
      <testcase name="says so when the server refuses the rate-limit request" classname="Insights page" time="0.046247" file="src/routes/insights/insights.dom.test.ts" line="47" assertions="1" />
      <testcase name="says so when the server cannot be reached" classname="Insights page" time="0.018584" file="src/routes/insights/insights.dom.test.ts" line="57" assertions="1" />
    </testsuite>
  </testsuite>
  <testsuite name="src/routes/pipelines/pipelines.dom.test.ts" file="src/routes/pipelines/pipelines.dom.test.ts" tests="3" assertions="10" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="Pipelines page" file="src/routes/pipelines/pipelines.dom.test.ts" line="116" tests="3" assertions="10" failures="0" skipped="0" time="0.202" hostname="runnervm8k3b6">
      <testcase name="a filter that matches nothing says so and keeps the controls" classname="Pipelines page" time="0.121808" file="src/routes/pipelines/pipelines.dom.test.ts" line="117" assertions="4" />
      <testcase name="with no pipelines at all, it still says nothing has been ingested" classname="Pipelines page" time="0.020554" file="src/routes/pipelines/pipelines.dom.test.ts" line="141" assertions="2" />
      <testcase name="&quot;Reset filters&quot; follows the server&apos;s defaults, with no copy in the page" classname="Pipelines page" time="0.061868" file="src/routes/pipelines/pipelines.dom.test.ts" line="152" assertions="4" />
    </testsuite>
  </testsuite>
  <testsuite name="src/routes/flaky/flaky.dom.test.ts" file="src/routes/flaky/flaky.dom.test.ts" tests="7" assertions="14" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="Flaky page" file="src/routes/flaky/flaky.dom.test.ts" line="76" tests="5" assertions="9" failures="0" skipped="0" time="0.281" hostname="runnervm8k3b6">
      <testcase name="lists each flaky step it is given" classname="Flaky page" time="0.118774" file="src/routes/flaky/flaky.dom.test.ts" line="77" assertions="2" />
      <testcase name="the window toggle asks the server for that window" classname="Flaky page" time="0.066516" file="src/routes/flaky/flaky.dom.test.ts" line="84" assertions="2" />
      <testcase name="with no saved window it asks for none, and shows the one the server used" classname="Flaky page" time="0.029757" file="src/routes/flaky/flaky.dom.test.ts" line="94" assertions="2" />
      <testcase name="says so when nothing is flaky" classname="Flaky page" time="0.024649" file="src/routes/flaky/flaky.dom.test.ts" line="103" assertions="2" />
      <testcase name="says so when the list cannot load" classname="Flaky page" time="0.044376" file="src/routes/flaky/flaky.dom.test.ts" line="114" assertions="1" />
    </testsuite>
    <testsuite name="Flaky page quarantine" file="src/routes/flaky/flaky.dom.test.ts" line="136" tests="2" assertions="5" failures="0" skipped="0" time="0.133" hostname="runnervm8k3b6">
      <testcase name="marks the step when the quarantine is saved" classname="Flaky page quarantine" time="0.072892" file="src/routes/flaky/flaky.dom.test.ts" line="137" assertions="2" />
      <testcase name="says so when the quarantine could not be saved, and marks nothing" classname="Flaky page quarantine" time="0.061728" file="src/routes/flaky/flaky.dom.test.ts" line="162" assertions="3" />
    </testsuite>
  </testsuite>
  <testsuite name="src/routes/runs/runs.dom.test.ts" file="src/routes/runs/runs.dom.test.ts" tests="6" assertions="26" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="Runs page" file="src/routes/runs/runs.dom.test.ts" line="137" tests="4" assertions="15" failures="0" skipped="0" time="0.387" hostname="runnervm8k3b6">
      <testcase name="the status tabs ask the server for that status, from the first page" classname="Runs page" time="0.143221" file="src/routes/runs/runs.dom.test.ts" line="138" assertions="5" />
      <testcase name="paging asks for the next page of 20" classname="Runs page" time="0.046746" file="src/routes/runs/runs.dom.test.ts" line="160" assertions="3" />
      <testcase name="refreshes every 15 seconds while a run is going, then stops" classname="Runs page" time="0.155561" file="src/routes/runs/runs.dom.test.ts" line="172" assertions="5" />
      <testcase name="says so when nothing matches, and when the list cannot load" classname="Runs page" time="0.043651" file="src/routes/runs/runs.dom.test.ts" line="194" assertions="2" />
    </testsuite>
    <testsuite name="Runs page actions" file="src/routes/runs/runs.dom.test.ts" line="209" tests="2" assertions="11" failures="0" skipped="0" time="0.271" hostname="runnervm8k3b6">
      <testcase name="re-run is offered only where the server lists it, and a refusal is said" classname="Runs page actions" time="0.06949" file="src/routes/runs/runs.dom.test.ts" line="210" assertions="4" />
      <testcase name="cancel is sent only after confirmation, and a refusal is said" classname="Runs page actions" time="0.202856" file="src/routes/runs/runs.dom.test.ts" line="238" assertions="7" />
    </testsuite>
  </testsuite>
  <testsuite name="src/routes/failures/failures.dom.test.ts" file="src/routes/failures/failures.dom.test.ts" tests="5" assertions="8" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="Failures page" file="src/routes/failures/failures.dom.test.ts" line="68" tests="5" assertions="8" failures="0" skipped="0" time="0.308" hostname="runnervm8k3b6">
      <testcase name="the window toggle asks the server for that window" classname="Failures page" time="0.12249" file="src/routes/failures/failures.dom.test.ts" line="69" assertions="2" />
      <testcase name="with no saved window it asks for none, and shows the one the server used" classname="Failures page" time="0.044283" file="src/routes/failures/failures.dom.test.ts" line="80" assertions="2" />
      <testcase name="says so when nothing failed" classname="Failures page" time="0.041437" file="src/routes/failures/failures.dom.test.ts" line="89" assertions="2" />
      <testcase name="shows the category breakdown when something failed" classname="Failures page" time="0.047" file="src/routes/failures/failures.dom.test.ts" line="96" assertions="1" />
      <testcase name="says so when the figures cannot load" classname="Failures page" time="0.055463" file="src/routes/failures/failures.dom.test.ts" line="123" assertions="1" />
    </testsuite>
  </testsuite>
  <testsuite name="src/routes/runs/[id]/run.dom.test.ts" file="src/routes/runs/[id]/run.dom.test.ts" tests="4" assertions="6" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="Run page" file="src/routes/runs/[id]/run.dom.test.ts" line="75" tests="4" assertions="6" failures="0" skipped="0" time="0.126" hostname="runnervm8k3b6">
      <testcase name="asks for the run by its id, escaped, and lists its steps" classname="Run page" time="0.074452" file="src/routes/runs/[id]/run.dom.test.ts" line="76" assertions="3" />
      <testcase name="says so when the run does not exist" classname="Run page" time="0.018627" file="src/routes/runs/[id]/run.dom.test.ts" line="84" assertions="1" />
      <testcase name="says so when the run cannot be loaded" classname="Run page" time="0.017655" file="src/routes/runs/[id]/run.dom.test.ts" line="94" assertions="1" />
      <testcase name="says so when the server cannot be reached" classname="Run page" time="0.017103" file="src/routes/runs/[id]/run.dom.test.ts" line="104" assertions="1" />
    </testsuite>
  </testsuite>
  <testsuite name="src/routes/pipelines/[id]/flaky-runs/flaky-runs.dom.test.ts" file="src/routes/pipelines/[id]/flaky-runs/flaky-runs.dom.test.ts" tests="5" assertions="8" failures="0" skipped="0" time="0" hostname="runnervm8k3b6">
    <properties>
      <property name="ci" value="https://github.com/alrayyes/pipeline-analytics/actions/runs/40087913899" />
      <property name="commit" value="2392b60e2e5ddf16df342671571ffffb80e9831e" />
    </properties>
    <testsuite name="Flaky runs page" file="src/routes/pipelines/[id]/flaky-runs/flaky-runs.dom.test.ts" line="63" tests="5" assertions="8" failures="0" skipped="0" time="0.181" hostname="runnervm8k3b6">
      <testcase name="asks for the pipeline and step, escaped, and lists the runs" classname="Flaky runs page" time="0.081113" file="src/routes/pipelines/[id]/flaky-runs/flaky-runs.dom.test.ts" line="64" assertions="4" />
      <testcase name="says so when no run flaked" classname="Flaky runs page" time="0.031972" file="src/routes/pipelines/[id]/flaky-runs/flaky-runs.dom.test.ts" line="74" assertions="1" />
      <testcase name="says so when the pipeline does not exist" classname="Flaky runs page" time="0.02082" file="src/routes/pipelines/[id]/flaky-runs/flaky-runs.dom.test.ts" line="84" assertions="1" />
      <testcase name="says so when the runs cannot be loaded" classname="Flaky runs page" time="0.030049" file="src/routes/pipelines/[id]/flaky-runs/flaky-runs.dom.test.ts" line="92" assertions="1" />
      <testcase name="says so when the server cannot be reached" classname="Flaky runs page" time="0.019798" file="src/routes/pipelines/[id]/flaky-runs/flaky-runs.dom.test.ts" line="100" assertions="1" />
    </testsuite>
  </testsuite>
</testsuites>
