<testsuites id="" name="" tests="1093" failures="0" skipped="0" errors="0" time="215.205537109375">
<testsuite name="activity-persistence.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="2" failures="0" skipped="0" time="1.88" errors="0">
<testcase name="the Activity list across a reload › finished and queued entries are still listed after a reload, until Clear finished" classname="activity-persistence.spec.ts" time="1.195">
</testcase>
<testcase name="the Activity list across a reload › with storage blocked the page works as before, with an empty list" classname="activity-persistence.spec.ts" time="0.685">
</testcase>
</testsuite>
<testsuite name="admin-requests.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="2" failures="0" skipped="0" time="4.397" errors="0">
<testcase name="admin area — outbound request log › a real outbound request shows up in the admin request log, filterable by forge and account, with a matching CSV export" classname="admin-requests.spec.ts" time="1.558">
</testcase>
<testcase name="admin area — outbound request log › the admin page itself narrows to nothing for an unrecognized account filter, with no axe-core violations on the empty state" classname="admin-requests.spec.ts" time="2.839">
</testcase>
</testsuite>
<testsuite name="admin.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="5" failures="0" skipped="0" time="3.63" errors="0">
<testcase name="admin area › a non-admin who navigates here directly is bounced to the dashboard" classname="admin.spec.ts" time="0.431">
</testcase>
<testcase name="admin area › lists every user, and lets an admin revoke or remove one" classname="admin.spec.ts" time="0.701">
</testcase>
<testcase name="admin area › has no axe-core violations at desktop width" classname="admin.spec.ts" time="0.787">
</testcase>
<testcase name="admin area › has no axe-core violations and no horizontal scroll at phone width" classname="admin.spec.ts" time="0.792">
</testcase>
<testcase name="admin area › generates an invite, lists it as outstanding with no axe-core violations, and revoking it removes it from the list" classname="admin.spec.ts" time="0.919">
</testcase>
</testsuite>
<testsuite name="allowed-actions.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="11" failures="0" skipped="0" time="5.158" errors="0">
<testcase name="the row follows allowedActions (#805) › a blocked Merge shows the server&apos;s own reason and what unlocks it" classname="allowed-actions.spec.ts" time="0.468">
</testcase>
<testcase name="the row follows allowedActions (#805) › an unblocked Merge is clickable even where the raw fields said blocked" classname="allowed-actions.spec.ts" time="0.452">
</testcase>
<testcase name="the row follows allowedActions (#805) › Update branch shows only when listed, whatever the raw fields say" classname="allowed-actions.spec.ts" time="0.499">
</testcase>
<testcase name="the row follows allowedActions (#805) › a behind pull request with no update_branch entry has no Update branch" classname="allowed-actions.spec.ts" time="0.477">
</testcase>
<testcase name="the row follows allowedActions (#805) › Update branch listed as blocked is locked with the server&apos;s reason" classname="allowed-actions.spec.ts" time="0.439">
</testcase>
<testcase name="the row follows allowedActions (#805) › Enable auto-merge shows only when listed" classname="allowed-actions.spec.ts" time="0.469">
</testcase>
<testcase name="the row follows allowedActions (#805) › no auto_merge entry means no Enable auto-merge" classname="allowed-actions.spec.ts" time="0.432">
</testcase>
<testcase name="the row follows allowedActions (#805) › Dependabot actions show for whoever the server lists them for" classname="allowed-actions.spec.ts" time="0.511">
</testcase>
<testcase name="the row follows allowedActions (#805) › a Dependabot-authored pull request with none listed has no Dependabot actions" classname="allowed-actions.spec.ts" time="0.443">
</testcase>
<testcase name="the row follows allowedActions (#805) › Renovate rebase shows only when listed" classname="allowed-actions.spec.ts" time="0.485">
</testcase>
<testcase name="the row follows allowedActions (#805) › Close shows only when listed" classname="allowed-actions.spec.ts" time="0.483">
</testcase>
</testsuite>
<testsuite name="auth.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="11" failures="0" skipped="0" time="4.084" errors="0">
<testcase name="passkey login › an unauthenticated visitor is redirected to the login page" classname="auth.spec.ts" time="0.141">
</testcase>
<testcase name="passkey login › dark mode chosen in Settings while signed in still applies on the login page after logging out" classname="auth.spec.ts" time="0.583">
</testcase>
<testcase name="passkey login › the login page shows the running version with no session at all" classname="auth.spec.ts" time="0.167">
</testcase>
<testcase name="passkey login › register a passkey via an admin-issued invite, then reach the dashboard" classname="auth.spec.ts" time="0.337">
</testcase>
<testcase name="passkey login › log out, then log back in with the same passkey" classname="auth.spec.ts" time="0.601">
</testcase>
<testcase name="passkey login › a wrong username at login fails without a session being issued" classname="auth.spec.ts" time="0.233">
</testcase>
<testcase name="passkey login › the register button is absent once a user exists and no invite is present" classname="auth.spec.ts" time="0.137">
</testcase>
<testcase name="passkey login › visiting /login?invite=&lt;token&gt; from a freshly created invite shows the invite-scoped form and completes registration" classname="auth.spec.ts" time="0.296">
</testcase>
<testcase name="passkey login › an expired or already-consumed invite link shows an error and does not register" classname="auth.spec.ts" time="0.452">
</testcase>
<testcase name="passkey login › has no axe-core violations at desktop width" classname="auth.spec.ts" time="0.564">
</testcase>
<testcase name="passkey login › has no axe-core violations and no horizontal scroll at phone width" classname="auth.spec.ts" time="0.573">
</testcase>
</testsuite>
<testsuite name="auto-merge-filter.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="10" failures="0" skipped="0" time="7.954" errors="0">
<testcase name="CI pills and the auto-merge filter (#1455) › Passing CI and Running CI keep only the pull requests in that CI state" classname="auto-merge-filter.spec.ts" time="0.536">
</testcase>
<testcase name="CI pills and the auto-merge filter (#1455) › Auto-merge On and Off keep only what the forge says; an unknown one is in neither" classname="auto-merge-filter.spec.ts" time="0.592">
</testcase>
<testcase name="CI pills and the auto-merge filter (#1455) › a CI pill and Auto-merge Off combine" classname="auto-merge-filter.spec.ts" time="0.534">
</testcase>
<testcase name="CI pills and the auto-merge filter (#1455) › a pill or an option nothing matches is not offered, and the segment goes when neither is" classname="auto-merge-filter.spec.ts" time="0.574">
</testcase>
<testcase name="CI pills and the auto-merge filter (#1455) › the choice survives a reload, stays offered when nothing matches it, and Clear filters resets it" classname="auto-merge-filter.spec.ts" time="0.658">
</testcase>
<testcase name="CI pills and the auto-merge filter (#1455) › on a 360px phone the segment is in the Filters sheet and the CI pills stay in the row" classname="auto-merge-filter.spec.ts" time="0.538">
</testcase>
<testcase name="CI pills and the auto-merge filter (#1455) › on a 360px phone the sheet draws no segment when nothing is on or off, and its buttons are 44px" classname="auto-merge-filter.spec.ts" time="1.282">
</testcase>
<testcase name="CI pills and the auto-merge filter (#1455) › a saved choice that is not on or off reads as Any" classname="auto-merge-filter.spec.ts" time="0.699">
</testcase>
<testcase name="CI pills and the auto-merge filter (#1455) › has no axe-core violations in the light theme, with a CI pill and the segment active" classname="auto-merge-filter.spec.ts" time="1.28">
</testcase>
<testcase name="CI pills and the auto-merge filter (#1455) › has no axe-core violations in the dark theme, with a CI pill and the segment active" classname="auto-merge-filter.spec.ts" time="1.261">
</testcase>
</testsuite>
<testsuite name="awaiting-approval.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="5" failures="0" skipped="0" time="2.557" errors="0">
<testcase name="Awaiting workflow approval (#1280) › a held row says so and links to its checks page" classname="awaiting-approval.spec.ts" time="0.27">
</testcase>
<testcase name="Awaiting workflow approval (#1280) › a failing row without the flag is unchanged" classname="awaiting-approval.spec.ts" time="0.217">
</testcase>
<testcase name="Awaiting workflow approval (#1280) › the link is a 44px target on a phone" classname="awaiting-approval.spec.ts" time="0.226">
</testcase>
<testcase name="Awaiting workflow approval (#1280) › has no axe violations in light mode" classname="awaiting-approval.spec.ts" time="0.928">
</testcase>
<testcase name="Awaiting workflow approval (#1280) › has no axe violations in dark mode" classname="awaiting-approval.spec.ts" time="0.916">
</testcase>
</testsuite>
<testsuite name="bot-rebase-pickup.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="17" failures="0" skipped="0" time="9.285" errors="0">
<testcase name="bot rebase pickup: Dependabot › a requested rebase shows a disabled button, what happens next and how long ago" classname="bot-rebase-pickup.spec.ts" time="0.307">
</testcase>
<testcase name="bot rebase pickup: Dependabot › the age keeps ticking and is not read out" classname="bot-rebase-pickup.spec.ts" time="1.574">
</testcase>
<testcase name="bot rebase pickup: Dependabot › a reload mid-wait still shows the request" classname="bot-rebase-pickup.spec.ts" time="0.403">
</testcase>
<testcase name="bot rebase pickup: Dependabot › a request seen only in the snapshot counts its age from requestedAt" classname="bot-rebase-pickup.spec.ts" time="0.293">
</testcase>
<testcase name="bot rebase pickup: Dependabot › a request that is rebasing in the snapshot shows Rebasing after a reload" classname="bot-rebase-pickup.spec.ts" time="0.276">
</testcase>
<testcase name="bot rebase pickup: Dependabot › expired in the snapshot shows the timed-out line and a toast, once" classname="bot-rebase-pickup.spec.ts" time="0.358">
</testcase>
<testcase name="bot rebase pickup: Dependabot › the chip survives a stream push that still shows it queued" classname="bot-rebase-pickup.spec.ts" time="0.344">
</testcase>
<testcase name="bot rebase pickup: Dependabot › a refresh already in flight at the click does not clear the queued state, the next one does" classname="bot-rebase-pickup.spec.ts" time="0.383">
</testcase>
<testcase name="bot rebase pickup: Dependabot › a CI run already under way at pickup needs no Rebasing step" classname="bot-rebase-pickup.spec.ts" time="0.338">
</testcase>
<testcase name="bot rebase pickup: Dependabot › has no axe violations when requested or rebasing, and none relies on colour alone" classname="bot-rebase-pickup.spec.ts" time="1.667">
</testcase>
<testcase name="bot rebase pickup: Renovate › a requested rebase shows a disabled button, what happens next and how long ago" classname="bot-rebase-pickup.spec.ts" time="0.3">
</testcase>
<testcase name="bot rebase pickup: Renovate › a reload mid-wait still shows the request" classname="bot-rebase-pickup.spec.ts" time="0.43">
</testcase>
<testcase name="bot rebase pickup: Renovate › a request that is rebasing in the snapshot shows Rebasing after a reload" classname="bot-rebase-pickup.spec.ts" time="0.274">
</testcase>
<testcase name="bot rebase pickup: Renovate › expired in the snapshot shows the timed-out line and a toast, once" classname="bot-rebase-pickup.spec.ts" time="0.362">
</testcase>
<testcase name="bot rebase pickup: Renovate › a refresh already in flight at the click does not clear the queued state, the next one does" classname="bot-rebase-pickup.spec.ts" time="0.373">
</testcase>
<testcase name="bot rebase pickup: Renovate › once the bot has rebased it the chip says Rebasing until CI restarts" classname="bot-rebase-pickup.spec.ts" time="1.191">
</testcase>
<testcase name="bot rebase pickup with another row still queued › the row that was picked up drops Out of date while the other stays put" classname="bot-rebase-pickup.spec.ts" time="0.412">
</testcase>
</testsuite>
<testsuite name="bots-page.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="6" failures="0" skipped="0" time="2.79" errors="0">
<testcase name="Bots page (#1192) › lists only dependency pull requests, from both bots" classname="bots-page.spec.ts" time="0.23">
</testcase>
<testcase name="Bots page (#1192) › rows keep their actions" classname="bots-page.spec.ts" time="0.235">
</testcase>
<testcase name="Bots page (#1192) › says there is nothing to review when no bot pull request is open" classname="bots-page.spec.ts" time="0.203">
</testcase>
<testcase name="Bots page (#1192) › the pull request page lists no bot or release pull requests, and has no Bot PRs filter" classname="bots-page.spec.ts" time="0.243">
</testcase>
<testcase name="Bots page (#1192) › the nav counts each: Pull requests without bots, Bots on its own, in header and tab bar" classname="bots-page.spec.ts" time="0.249">
</testcase>
<testcase name="Bots page (#1192) › has no axe-core violations and no horizontal scroll at desktop and 390px" classname="bots-page.spec.ts" time="1.63">
</testcase>
</testsuite>
<testsuite name="card-spacing.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="2" failures="0" skipped="0" time="1.474" errors="0">
<testcase name="settings and admin cards have no tall empty space (#1109) › /settings.html: nothing but the card&apos;s own padding trails the content" classname="card-spacing.spec.ts" time="0.747">
</testcase>
<testcase name="settings and admin cards have no tall empty space (#1109) › /admin.html: nothing but the card&apos;s own padding trails the content" classname="card-spacing.spec.ts" time="0.727">
</testcase>
</testsuite>
<testsuite name="changelog.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="9" failures="0" skipped="0" time="5.316" errors="0">
<testcase name="release history page › reachable without a session, unlike the dashboard itself" classname="changelog.spec.ts" time="0.148">
</testcase>
<testcase name="release history page › makes no request to GitHub and reads one same-origin JSON file" classname="changelog.spec.ts" time="0.198">
</testcase>
<testcase name="release history page › lists every release in CHANGELOG.md, newest first, with its notes" classname="changelog.spec.ts" time="1.049">
</testcase>
<testcase name="release history page › keeps the DOM small on load and reveals older releases on request" classname="changelog.spec.ts" time="1.029">
</testcase>
<testcase name="release history page › a link in the release notes cannot run script or add an attribute" classname="changelog.spec.ts" time="0.19">
</testcase>
<testcase name="release history page › a missing changelog file says so plainly and falls back to nothing" classname="changelog.spec.ts" time="0.19">
</testcase>
<testcase name="release history page › signed in › the footer version links here from other pages, and is plain text on this one" classname="changelog.spec.ts" time="0.369">
</testcase>
<testcase name="release history page › has no axe-core violations at desktop width" classname="changelog.spec.ts" time="1.047">
</testcase>
<testcase name="release history page › has no axe-core violations and no horizontal scroll at phone width" classname="changelog.spec.ts" time="1.096">
</testcase>
</testsuite>
<testsuite name="ci-pill-actions.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="5" failures="0" skipped="0" time="3.122" errors="0">
<testcase name="CI pill opens the pipeline (#1139) › the pill is a button naming the status and the destination, and opens the panel" classname="ci-pill-actions.spec.ts" time="0.288">
</testcase>
<testcase name="CI pill opens the pipeline (#1139) › the pill opens the panel from the keyboard and focus returns to it" classname="ci-pill-actions.spec.ts" time="0.73">
</testcase>
<testcase name="CI pill opens the pipeline (#1139) › a row with no CI draws no pill button" classname="ci-pill-actions.spec.ts" time="0.188">
</testcase>
<testcase name="CI pill opens the pipeline (#1139) › Close sits in More actions beside the Hide items" classname="ci-pill-actions.spec.ts" time="0.974">
</testcase>
<testcase name="CI pill opens the pipeline (#1139) › a row with two or more extra actions keeps More actions" classname="ci-pill-actions.spec.ts" time="0.942">
</testcase>
</testsuite>
<testsuite name="close-neutral.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="5" failures="0" skipped="0" time="3.992" errors="0">
<testcase name="Close is neutral, and says what it closes (#1223) › on a pull request with nothing to merge it is not green, and looks like Close elsewhere" classname="close-neutral.spec.ts" time="0.49">
</testcase>
<testcase name="Close is neutral, and says what it closes (#1223) › it is not red until the confirm step" classname="close-neutral.spec.ts" time="0.268">
</testcase>
<testcase name="Close is neutral, and says what it closes (#1223) › the button and its confirm name the object, and the confirm carries the warning tone" classname="close-neutral.spec.ts" time="0.308">
</testcase>
<testcase name="Close is neutral, and says what it closes (#1223) › has no axe-core violations with Close and its confirm showing, light" classname="close-neutral.spec.ts" time="1.462">
</testcase>
<testcase name="Close is neutral, and says what it closes (#1223) › has no axe-core violations with Close and its confirm showing, dark" classname="close-neutral.spec.ts" time="1.464">
</testcase>
</testsuite>
<testsuite name="conflicts-filter.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="6" failures="0" skipped="0" time="3.949" errors="0">
<testcase name="Conflicts quick filter (#1215) › lists only the conflicting pull requests, a draft that conflicts included" classname="conflicts-filter.spec.ts" time="0.499">
</testcase>
<testcase name="Conflicts quick filter (#1215) › choosing another pill replaces it, and All clears it" classname="conflicts-filter.spec.ts" time="0.587">
</testcase>
<testcase name="Conflicts quick filter (#1215) › it survives a reload like the other quick filters" classname="conflicts-filter.spec.ts" time="0.595">
</testcase>
<testcase name="Conflicts quick filter (#1215) › when the conflicts clear while the pill is active, the pill stays and the list says nothing matches" classname="conflicts-filter.spec.ts" time="0.625">
</testcase>
<testcase name="Conflicts quick filter (#1215) › a pill nothing matches is not offered" classname="conflicts-filter.spec.ts" time="0.425">
</testcase>
<testcase name="Conflicts quick filter (#1215) › has no axe-core violations with the pill active" classname="conflicts-filter.spec.ts" time="1.218">
</testcase>
</testsuite>
<testsuite name="copy-failure.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="21" failures="0" skipped="0" time="13.165" errors="0">
<testcase name="Copy error details on a failed action (#1323) › Merge: a Copy button sits beside the failure on the row" classname="copy-failure.spec.ts" time="0.579">
</testcase>
<testcase name="Copy error details on a failed action (#1323) › Close: a Copy button sits beside the failure on the row" classname="copy-failure.spec.ts" time="0.581">
</testcase>
<testcase name="Copy error details on a failed action (#1323) › Update branch: a Copy button sits beside the failure on the row" classname="copy-failure.spec.ts" time="0.318">
</testcase>
<testcase name="Copy error details on a failed action (#1323) › Enable auto-merge: a Copy button sits beside the failure on the row" classname="copy-failure.spec.ts" time="0.333">
</testcase>
<testcase name="Copy error details on a failed action (#1323) › Renovate: Rebase: a Copy button sits beside the failure on the row" classname="copy-failure.spec.ts" time="0.354">
</testcase>
<testcase name="Copy error details on a failed action (#1323) › Dependabot Rebase copies which command it was" classname="copy-failure.spec.ts" time="0.592">
</testcase>
<testcase name="Copy error details on a failed action (#1323) › Dependabot Recreate copies which command it was" classname="copy-failure.spec.ts" time="0.585">
</testcase>
<testcase name="Copy error details on a failed action (#1323) › the row keeps showing the plain sentence, never the raw text" classname="copy-failure.spec.ts" time="0.343">
</testcase>
<testcase name="Copy error details on a failed action (#1323) › Copy puts one JSON object on the clipboard: status, the body as received, the action, the pull request and a time" classname="copy-failure.spec.ts" time="0.449">
</testcase>
<testcase name="Copy error details on a failed action (#1323) › the button says Copied, then Copy again" classname="copy-failure.spec.ts" time="2.752">
</testcase>
<testcase name="Copy error details on a failed action (#1323) › a failure with only the network has Copy too, holding the action and the browser’s error" classname="copy-failure.spec.ts" time="0.521">
</testcase>
<testcase name="Copy error details on a failed action (#1323) › a body that is not JSON is copied as the text it was" classname="copy-failure.spec.ts" time="0.494">
</testcase>
<testcase name="Copy error details on a failed action (#1323) › the error toast has Copy too" classname="copy-failure.spec.ts" time="0.62">
</testcase>
<testcase name="Copy error details on a failed action (#1323) › it is reachable by keyboard and Enter copies" classname="copy-failure.spec.ts" time="0.435">
</testcase>
<testcase name="Copy error details on a failed action (#1323) › has no axe-core violations in the failure journey" classname="copy-failure.spec.ts" time="1.258">
</testcase>
<testcase name="Copy error details on a failed Rerun failed checks (#1323) › the refusal shows its plain sentence with a Copy button beside it" classname="copy-failure.spec.ts" time="0.383">
</testcase>
<testcase name="Copy error details on a failed Rerun failed checks (#1323) › Copy holds the status, the body as received and the pull request" classname="copy-failure.spec.ts" time="0.462">
</testcase>
<testcase name="Copy error details on a failed Rerun failed checks (#1323) › a rerun that goes through has no Copy" classname="copy-failure.spec.ts" time="0.359">
</testcase>
<testcase name="Copy error details on a failed Rerun failed checks (#1323) › trying again clears the earlier Copy" classname="copy-failure.spec.ts" time="0.468">
</testcase>
<testcase name="Copy error details on a failed Rerun failed checks (#1323) › has no axe-core violations with the failure showing" classname="copy-failure.spec.ts" time="0.826">
</testcase>
<testcase name="Copy error details without a clipboard (#1323) › the details show in a selectable box instead of failing silently" classname="copy-failure.spec.ts" time="0.453">
</testcase>
</testsuite>
<testsuite name="css-bundle.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="2" failures="0" skipped="0" time="0.018" errors="0">
<testcase name="style.css is served minified" classname="css-bundle.spec.ts" time="0.011">
</testcase>
<testcase name="pages still link style.css before their own styles" classname="css-bundle.spec.ts" time="0.007">
</testcase>
</testsuite>
<testsuite name="dashboard.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="119" failures="0" skipped="0" time="70.636" errors="0">
<testcase name="dashboard page › renders the board and answers real data from /api/dashboard" classname="dashboard.spec.ts" time="0.374">
</testcase>
<testcase name="dashboard page › a user with no background refresh running yet still sees the dashboard, with no error banner" classname="dashboard.spec.ts" time="0.341">
</testcase>
<testcase name="dashboard page › the footer shows the running version, fetched from /api/version" classname="dashboard.spec.ts" time="0.363">
</testcase>
<testcase name="dashboard page › the footer links the repository as GitHub, with the mark, and has no Source link" classname="dashboard.spec.ts" time="0.343">
</testcase>
<testcase name="dashboard page › the footer links a real released version to the changelog, with no separate release history link" classname="dashboard.spec.ts" time="0.419">
</testcase>
<testcase name="dashboard page › the footer shows nothing version-related while /api/version is unresolved or fails" classname="dashboard.spec.ts" time="0.408">
</testcase>
<testcase name="dashboard page › an unreachable forge shows a friendly reason, not the raw technical string" classname="dashboard.spec.ts" time="0.467">
</testcase>
<testcase name="dashboard page › a rate-limited forge does not repeat the exceeded-budget banner underneath its own chip" classname="dashboard.spec.ts" time="0.447">
</testcase>
<testcase name="dashboard page › an unreachable forge with no recognized error kind still shows a friendly, forge-named reason" classname="dashboard.spec.ts" time="0.455">
</testcase>
<testcase name="dashboard page › a forge reporting a healthy rate-limit budget does not show the numeric gauge here — that lives on Insights — nor the exceeded banner" classname="dashboard.spec.ts" time="0.441">
</testcase>
<testcase name="dashboard page › rate-limit-exceeded banner (#361) › an exhausted budget shows a prominent banner at the top with a live countdown" classname="dashboard.spec.ts" time="2.309">
</testcase>
<testcase name="dashboard page › rate-limit-exceeded banner (#361) › says it once per forge when both REST and GraphQL are out (#755)" classname="dashboard.spec.ts" time="0.453">
</testcase>
<testcase name="dashboard page › rate-limit-exceeded banner (#361) › clears once a fresh snapshot reports the budget recovered" classname="dashboard.spec.ts" time="0.511">
</testcase>
<testcase name="dashboard page › rate-limit-exceeded banner (#361) › a budget under 5% but not yet exhausted shows a distinct &quot;running low&quot; row, not &quot;exceeded&quot;" classname="dashboard.spec.ts" time="0.483">
</testcase>
<testcase name="dashboard page › rate-limit-exceeded banner (#361) › a budget at or above 5% shows no row at all" classname="dashboard.spec.ts" time="0.433">
</testcase>
<testcase name="dashboard page › rate-limit-exceeded banner (#361) › an exceeded budget and a low-but-not-exhausted budget both show at once, distinctly" classname="dashboard.spec.ts" time="0.457">
</testcase>
<testcase name="dashboard page › has no axe-core violations at desktop width" classname="dashboard.spec.ts" time="0.904">
</testcase>
<testcase name="dashboard page › has no axe-core violations and no horizontal scroll at phone width" classname="dashboard.spec.ts" time="0.998">
</testcase>
<testcase name="dashboard page › a non-admin user never sees the Admin link, not just in the DOM but actually rendered" classname="dashboard.spec.ts" time="0.328">
</testcase>
<testcase name="dashboard page › a long title with several label chips wraps as a block instead of collapsing to single-word lines" classname="dashboard.spec.ts" time="0.47">
</testcase>
<testcase name="dashboard page › a truncated repo name reveals its full text on hover, via a title attribute" classname="dashboard.spec.ts" time="0.442">
</testcase>
<testcase name="dashboard page › an ordinary owner/repo name is not truncated at desktop width" classname="dashboard.spec.ts" time="0.437">
</testcase>
<testcase name="dashboard page › the forge filter narrows the list to one forge" classname="dashboard.spec.ts" time="0.532">
</testcase>
<testcase name="dashboard page › the pull request count reflects the active filter, not just the raw total" classname="dashboard.spec.ts" time="0.535">
</testcase>
<testcase name="dashboard page › theme and filters persist across a reload › a chosen theme survives a reload" classname="dashboard.spec.ts" time="0.674">
</testcase>
<testcase name="dashboard page › theme and filters persist across a reload › a select filter survives a reload, both in state and visibly in the control" classname="dashboard.spec.ts" time="0.675">
</testcase>
<testcase name="dashboard page › theme and filters persist across a reload › the free-text title filter survives a reload" classname="dashboard.spec.ts" time="0.583">
</testcase>
<testcase name="dashboard page › theme and filters persist across a reload › the shared forge filter persists and applies to both pages, while CI status stays scoped to pull requests only" classname="dashboard.spec.ts" time="1.081">
</testcase>
<testcase name="dashboard page › theme and filters persist across a reload › a discrete filter change saves to the server immediately, not just the cookie" classname="dashboard.spec.ts" time="0.466">
</testcase>
<testcase name="dashboard page › theme and filters persist across a reload › typing in the Title filter debounces the server save, but the local cookie updates on every keystroke" classname="dashboard.spec.ts" time="1.391">
</testcase>
<testcase name="dashboard page › theme and filters persist across a reload › a filter set with no local cookie present still applies once the server value loads — a new browser, same account" classname="dashboard.spec.ts" time="0.6">
</testcase>
<testcase name="dashboard page › grouping › off by default: the flat list is unchanged" classname="dashboard.spec.ts" time="0.429">
</testcase>
<testcase name="dashboard page › grouping › group by repo clusters rows under a real heading per repo, alphabetically, with a count" classname="dashboard.spec.ts" time="0.479">
</testcase>
<testcase name="dashboard page › grouping › a filter combined with grouping only clusters the repos that still have matches — no empty headings" classname="dashboard.spec.ts" time="0.473">
</testcase>
<testcase name="dashboard page › grouping › switching back to no grouping returns to the flat list" classname="dashboard.spec.ts" time="0.512">
</testcase>
<testcase name="dashboard page › grouping › group by forge › clusters rows under a real heading per forge, using the display label, alphabetically, with a count" classname="dashboard.spec.ts" time="0.586">
</testcase>
<testcase name="dashboard page › grouping › group by forge › picking a forge while grouped by forge resets grouping to none, instead of clustering into one no-op heading" classname="dashboard.spec.ts" time="0.613">
</testcase>
<testcase name="dashboard page › repo and author filters are selects, title is autocomplete › the repo select lists repos actually on screen, and picking one filters to it" classname="dashboard.spec.ts" time="0.489">
</testcase>
<testcase name="dashboard page › repo and author filters are selects, title is autocomplete › the author select lists authors actually on screen, and picking one filters to it" classname="dashboard.spec.ts" time="0.445">
</testcase>
<testcase name="dashboard page › repo and author filters are selects, title is autocomplete › the title filter offers suggestions from what is on screen, but still accepts free text" classname="dashboard.spec.ts" time="0.44">
</testcase>
<testcase name="dashboard page › the repo/author/label filters and group-by stay consistent with the active forge › the repo select groups options by forge when a repo name is shared, and resolves each to exactly one forge" classname="dashboard.spec.ts" time="0.513">
</testcase>
<testcase name="dashboard page › the repo/author/label filters and group-by stay consistent with the active forge › picking a forge narrows the repo, author, and label selects to that forge only, ungrouped" classname="dashboard.spec.ts" time="0.48">
</testcase>
<testcase name="dashboard page › the repo/author/label filters and group-by stay consistent with the active forge › clearing the forge filter widens the repo, author, and label options back out" classname="dashboard.spec.ts" time="0.516">
</testcase>
<testcase name="dashboard page › the repo/author/label filters and group-by stay consistent with the active forge › a repo selection that no longer exists once the forge filter narrows clears itself, not just the control" classname="dashboard.spec.ts" time="0.489">
</testcase>
<testcase name="dashboard page › the repo/author/label filters and group-by stay consistent with the active forge › an author selection that no longer exists once the forge filter narrows clears itself" classname="dashboard.spec.ts" time="0.514">
</testcase>
<testcase name="dashboard page › the repo/author/label filters and group-by stay consistent with the active forge › &quot;Group by forge&quot; disappears once a forge is picked, and resets an active forge grouping to none" classname="dashboard.spec.ts" time="0.563">
</testcase>
<testcase name="dashboard page › the repo/author/label filters and group-by stay consistent with the active forge › picking a repo narrows the author and label selects to that repo only, still respecting an active forge" classname="dashboard.spec.ts" time="0.496">
</testcase>
<testcase name="dashboard page › the repo/author/label filters and group-by stay consistent with the active forge › picking an author narrows the repo and label selects to that author only" classname="dashboard.spec.ts" time="0.462">
</testcase>
<testcase name="dashboard page › the repo/author/label filters and group-by stay consistent with the active forge › picking a label narrows the repo and author selects to that label only" classname="dashboard.spec.ts" time="0.475">
</testcase>
<testcase name="dashboard page › the repo/author/label filters and group-by stay consistent with the active forge › a repo+author combination that stops co-occurring clears both selections, not just one" classname="dashboard.spec.ts" time="0.567">
</testcase>
<testcase name="dashboard page › the repo/author/label filters and group-by stay consistent with the active forge › a PR-only filter like CI status is not part of the shared repo/author/label narrowing" classname="dashboard.spec.ts" time="0.572">
</testcase>
<testcase name="dashboard page › pagination › a filtered set under one page shows no pagination controls" classname="dashboard.spec.ts" time="0.414">
</testcase>
<testcase name="dashboard page › pagination › a set over one page paginates, and changing the page size re-pages from page 1" classname="dashboard.spec.ts" time="0.545">
</testcase>
<testcase name="dashboard page › pagination › a filter narrowing the set below one page hides pagination and resets to page 1" classname="dashboard.spec.ts" time="0.468">
</testcase>
<testcase name="dashboard page › CI status click-to-filter › clicking the Failing CI pill filters to failing pull requests, and All clears the filter" classname="dashboard.spec.ts" time="0.511">
</testcase>
<testcase name="dashboard page › CI status click-to-filter › clicking anywhere else in a row still opens the pull request, same as before the row stopped being one big &lt;a&gt;" classname="dashboard.spec.ts" time="0.559">
</testcase>
<testcase name="dashboard page › CI status click-to-filter › has no axe-core violations with real rows rendered, including nested-interactive checks" classname="dashboard.spec.ts" time="1.147">
</testcase>
<testcase name="dashboard page › CI pill wording for a passed pipeline › shows &quot;Passing&quot; when a Merge button is also on the row" classname="dashboard.spec.ts" time="0.478">
</testcase>
<testcase name="dashboard page › CI pill wording for a passed pipeline › shows &quot;Passed&quot; once Merge is locked on the row" classname="dashboard.spec.ts" time="0.429">
</testcase>
<testcase name="dashboard page › CI pill wording for a passed pipeline › a failing or running pipeline is worded the same regardless of the Merge button" classname="dashboard.spec.ts" time="0.442">
</testcase>
<testcase name="dashboard page › merge status and auto-merge pills › a clean, non-auto-merge pull request shows neither pill" classname="dashboard.spec.ts" time="0.459">
</testcase>
<testcase name="dashboard page › merge status and auto-merge pills › a conflicting pull request shows the blocked/conflict pill" classname="dashboard.spec.ts" time="0.422">
</testcase>
<testcase name="dashboard page › merge status and auto-merge pills › a blocked pull request shows the blocked pill" classname="dashboard.spec.ts" time="0.426">
</testcase>
<testcase name="dashboard page › merge status and auto-merge pills › a blocked pull request whose CI is still running shows no blocked pill" classname="dashboard.spec.ts" time="0.415">
</testcase>
<testcase name="dashboard page › merge status and auto-merge pills › a blocked pull request whose CI is failing shows the failing CI pill and no blocked pill" classname="dashboard.spec.ts" time="1.077">
</testcase>
<testcase name="dashboard page › merge status and auto-merge pills › a blocked pull request with no CI still shows the blocked pill" classname="dashboard.spec.ts" time="0.447">
</testcase>
<testcase name="dashboard page › merge status and auto-merge pills › a conflicting pull request shows the conflict pill even while CI is still running — a real conflict, not a completion gate" classname="dashboard.spec.ts" time="0.425">
</testcase>
<testcase name="dashboard page › merge status and auto-merge pills › a pull request with auto-merge enabled shows the auto-merge pill" classname="dashboard.spec.ts" time="0.423">
</testcase>
<testcase name="dashboard page › merge status and auto-merge pills › auto-merge not reported by the forge shows no pill, not a false &quot;not enabled&quot;" classname="dashboard.spec.ts" time="0.423">
</testcase>
<testcase name="dashboard page › merge status and auto-merge pills › has no axe-core violations with both pills and a Forgejo badge rendered" classname="dashboard.spec.ts" time="1.241">
</testcase>
<testcase name="dashboard page › merge status and auto-merge pills › a behind Dependabot pull request shows the Out of date pill" classname="dashboard.spec.ts" time="0.42">
</testcase>
<testcase name="dashboard page › merge status and auto-merge pills › a behind Renovate pull request shows the Out of date pill" classname="dashboard.spec.ts" time="0.419">
</testcase>
<testcase name="dashboard page › merge status and auto-merge pills › a behind, non-bot-managed pull request shows the Update-branch button but no Out of date pill" classname="dashboard.spec.ts" time="0.447">
</testcase>
<testcase name="dashboard page › merge status and auto-merge pills › a Dependabot pull request that is not behind shows no Out of date pill" classname="dashboard.spec.ts" time="0.434">
</testcase>
<testcase name="dashboard page › merge status and auto-merge pills › an empty, behind Dependabot pull request shows no Out of date pill" classname="dashboard.spec.ts" time="0.433">
</testcase>
<testcase name="dashboard page › force-refresh button › clicking it calls the endpoint and updates the dashboard from its response" classname="dashboard.spec.ts" time="0.509">
</testcase>
<testcase name="dashboard page › force-refresh button › disables itself immediately, and re-enables after the Retry-After the server gave once the response has landed" classname="dashboard.spec.ts" time="2.952">
</testcase>
<testcase name="dashboard page › force-refresh button › a failed refresh shows the existing error banner rather than failing silently" classname="dashboard.spec.ts" time="0.352">
</testcase>
<testcase name="dashboard page › force-refresh button › is hidden while viewing a dashboard someone else shared" classname="dashboard.spec.ts" time="0.43">
</testcase>
<testcase name="dashboard page › label click-to-filter › clicking a label chip filters to that label, marks the chip active, and clicking it again clears the filter" classname="dashboard.spec.ts" time="0.531">
</testcase>
<testcase name="dashboard page › label click-to-filter › clicking a label chip does not also open the issue" classname="dashboard.spec.ts" time="0.463">
</testcase>
<testcase name="dashboard page › label click-to-filter › label filtering is shared: clicking a chip on the issues page also filters the pull requests page" classname="dashboard.spec.ts" time="0.83">
</testcase>
<testcase name="dashboard page › label click-to-filter › has no axe-core violations with real label chips rendered" classname="dashboard.spec.ts" time="1.097">
</testcase>
<testcase name="dashboard page › label click-to-filter › the label select lists labels actually on screen, and picking one filters and marks the matching chip active" classname="dashboard.spec.ts" time="0.458">
</testcase>
<testcase name="dashboard page › label click-to-filter › clicking a label chip keeps the select in sync" classname="dashboard.spec.ts" time="0.506">
</testcase>
<testcase name="dashboard page › label click-to-filter › a label beyond the first three chips on an item is still clearable via the select, even with no chip on screen to click" classname="dashboard.spec.ts" time="0.594">
</testcase>
<testcase name="dashboard page › label colors › a label chip renders with its real background color and a contrasting text color" classname="dashboard.spec.ts" time="0.425">
</testcase>
<testcase name="dashboard page › Dependency Dashboard filter › is hidden from the issues board by default, without hiding a real issue" classname="dashboard.spec.ts" time="0.45">
</testcase>
<testcase name="dashboard page › Dependency Dashboard filter › unchecking the toggle brings it back, and checking it again hides it" classname="dashboard.spec.ts" time="0.486">
</testcase>
<testcase name="dashboard page › Dependency Dashboard filter › has no effect on the pull requests board" classname="dashboard.spec.ts" time="0.541">
</testcase>
<testcase name="dashboard page › Dependency Dashboard filter › the choice persists across a reload" classname="dashboard.spec.ts" time="0.59">
</testcase>
<testcase name="dashboard page › Clear filters button (#354) › is visible but disabled with no filters active" classname="dashboard.spec.ts" time="0.444">
</testcase>
<testcase name="dashboard page › Clear filters button (#354) › becomes enabled once a shared filter is active, and stays enabled for CI status/Hide Dependency Dashboard alone too" classname="dashboard.spec.ts" time="0.489">
</testcase>
<testcase name="dashboard page › Clear filters button (#354) › clicking resets every shared filter, group-by and CI status in one action, re-renders the board, resets pagination, and disables itself again" classname="dashboard.spec.ts" time="0.551">
</testcase>
<testcase name="dashboard page › Clear filters button (#354) › on the issues page, clicking it also re-checks Hide Dependency Dashboard" classname="dashboard.spec.ts" time="0.566">
</testcase>
<testcase name="dashboard page › Clear filters button (#354) › the cleared state persists across a reload" classname="dashboard.spec.ts" time="0.638">
</testcase>
<testcase name="dashboard page › Clear filters button (#354) › has no axe-core violations with the button enabled" classname="dashboard.spec.ts" time="1.126">
</testcase>
<testcase name="login page › has no axe-core violations at desktop width" classname="dashboard.spec.ts" time="0.547">
</testcase>
<testcase name="login page › has no axe-core violations and no horizontal scroll at phone width" classname="dashboard.spec.ts" time="0.548">
</testcase>
<testcase name="quick filter pills and &quot;/&quot; shortcut (#678) › shows the pills something matches in a labelled group with exactly one active" classname="dashboard.spec.ts" time="0.454">
</testcase>
<testcase name="quick filter pills and &quot;/&quot; shortcut (#678) › Failing CI keeps only ci=failure pull requests" classname="dashboard.spec.ts" time="0.58">
</testcase>
<testcase name="quick filter pills and &quot;/&quot; shortcut (#678) › Ready to Merge keeps mergeable, passing, non-draft pull requests" classname="dashboard.spec.ts" time="0.51">
</testcase>
<testcase name="quick filter pills and &quot;/&quot; shortcut (#678) › Needs Review keeps non-draft pull requests with a review outstanding" classname="dashboard.spec.ts" time="0.524">
</testcase>
<testcase name="quick filter pills and &quot;/&quot; shortcut (#678) › Needs Review has no axe-core violations" classname="dashboard.spec.ts" time="1.247">
</testcase>
<testcase name="quick filter pills and &quot;/&quot; shortcut (#678) › there is no Bot PRs filter, and bot and release pull requests are not listed" classname="dashboard.spec.ts" time="0.475">
</testcase>
<testcase name="quick filter pills and &quot;/&quot; shortcut (#678) › choosing a pill clears the previous one, All clears everything" classname="dashboard.spec.ts" time="0.595">
</testcase>
<testcase name="quick filter pills and &quot;/&quot; shortcut (#678) › quick filters leave the issues page alone, forge pills do not" classname="dashboard.spec.ts" time="0.639">
</testcase>
<testcase name="quick filter pills and &quot;/&quot; shortcut (#678) › the active pill survives a reload" classname="dashboard.spec.ts" time="0.594">
</testcase>
<testcase name="quick filter pills and &quot;/&quot; shortcut (#678) › &quot;/&quot; focuses the title search, but types a slash once an input has focus" classname="dashboard.spec.ts" time="0.507">
</testcase>
<testcase name="quick filter pills and &quot;/&quot; shortcut (#678) › &quot;/&quot; with a modifier held does not steal focus" classname="dashboard.spec.ts" time="0.473">
</testcase>
<testcase name="repo group headers: host and sync status (#679) › the flat list shows no host chip or status pill" classname="dashboard.spec.ts" time="0.437">
</testcase>
<testcase name="repo group headers: host and sync status (#679) › a group header shows forge badge, host chip, repo name and status" classname="dashboard.spec.ts" time="0.478">
</testcase>
<testcase name="repo group headers: host and sync status (#679) › a repo missing from repos[] gets no host or status guess" classname="dashboard.spec.ts" time="0.476">
</testcase>
<testcase name="repo group headers: host and sync status (#679) › grouping is reachable and switchable by keyboard alone" classname="dashboard.spec.ts" time="0.478">
</testcase>
<testcase name="repo group headers: host and sync status (#679) › the options read &quot;Flat list&quot; and &quot;Group by repository&quot;" classname="dashboard.spec.ts" time="0.468">
</testcase>
<testcase name="repo group headers: host and sync status (#679) › has no axe-core violations with grouped headers, light theme" classname="dashboard.spec.ts" time="1.366">
</testcase>
<testcase name="repo group headers: host and sync status (#679) › has no axe-core violations with grouped headers, dark theme" classname="dashboard.spec.ts" time="1.35">
</testcase>
<testcase name="time cells say what they are (#1109) › each pull request row captions its created and updated time" classname="dashboard.spec.ts" time="0.513">
</testcase>
<testcase name="time cells say what they are (#1109) › each issue row captions its created and updated time" classname="dashboard.spec.ts" time="0.512">
</testcase>
</testsuite>
<testsuite name="dependabot-ack.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="6" failures="0" skipped="0" time="3.593" errors="0">
<testcase name="Dependabot acknowledgment (#1082) › before Dependabot reacts the row only says it was requested" classname="dependabot-ack.spec.ts" time="0.281">
</testcase>
<testcase name="Dependabot acknowledgment (#1082) › a thumbs-up from Dependabot shows as acknowledged, in words, and is announced once" classname="dependabot-ack.spec.ts" time="1.064">
</testcase>
<testcase name="Dependabot acknowledgment (#1082) › a reload while acknowledged still shows it" classname="dependabot-ack.spec.ts" time="0.276">
</testcase>
<testcase name="Dependabot acknowledgment (#1082) › no reply after the wait says so, with Ask again and a link to the comment" classname="dependabot-ack.spec.ts" time="1.011">
</testcase>
<testcase name="Dependabot acknowledgment (#1082) › Ask again sends the rebase command once more" classname="dependabot-ack.spec.ts" time="0.646">
</testcase>
<testcase name="Dependabot acknowledgment (#1082) › no comment link is offered when the server has not found the comment" classname="dependabot-ack.spec.ts" time="0.315">
</testcase>
</testsuite>
<testsuite name="error-pages.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="10" failures="0" skipped="0" time="3.529" errors="0">
<testcase name="expectNoInternals (#1069) › allows a scoped-class hash but still catches real leaks" classname="error-pages.spec.ts" time="0.005">
</testcase>
<testcase name="error pages (#1175) › the 404 page says what happened, in plain words, and links home" classname="error-pages.spec.ts" time="0.139">
</testcase>
<testcase name="error pages (#1175) › the 404 page has no axe-core violations at desktop and 375px, and no horizontal scroll" classname="error-pages.spec.ts" time="0.878">
</testcase>
<testcase name="error pages (#1175) › the 404 page follows the dark theme" classname="error-pages.spec.ts" time="0.564">
</testcase>
<testcase name="error pages (#1175) › the 500 page says what happened, in plain words, and links home" classname="error-pages.spec.ts" time="0.163">
</testcase>
<testcase name="error pages (#1175) › the 500 page has no axe-core violations at desktop and 375px, and no horizontal scroll" classname="error-pages.spec.ts" time="0.871">
</testcase>
<testcase name="error pages (#1175) › the 500 page follows the dark theme" classname="error-pages.spec.ts" time="0.561">
</testcase>
<testcase name="error pages (#1175) › the 500 page offers Try again, a link back to the same address" classname="error-pages.spec.ts" time="0.118">
</testcase>
<testcase name="error pages (#1175) › the 404 page offers no Try again, since the address is the problem" classname="error-pages.spec.ts" time="0.115">
</testcase>
<testcase name="error pages (#1175) › neither page starts the app, so a router never swaps it for another page" classname="error-pages.spec.ts" time="0.115">
</testcase>
</testsuite>
<testsuite name="failure-line-stays.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="5" failures="0" skipped="0" time="2.948" errors="0">
<testcase name="a failure line stays until dismissed (#918) › the line survives snapshots, including ones that change the row" classname="failure-line-stays.spec.ts" time="0.504">
</testcase>
<testcase name="a failure line stays until dismissed (#918) › the line survives a snapshot that leaves the pull request out for a moment" classname="failure-line-stays.spec.ts" time="0.349">
</testcase>
<testcase name="a failure line stays until dismissed (#918) › a permission refusal locks only that action on that pull request, across snapshots" classname="failure-line-stays.spec.ts" time="0.34">
</testcase>
<testcase name="a failure line stays until dismissed (#918) › dismissing the line frees the action without a reload" classname="failure-line-stays.spec.ts" time="0.474">
</testcase>
<testcase name="a failure line stays until dismissed (#918) › at phone width the line wraps, has no axe violations and stays through snapshots" classname="failure-line-stays.spec.ts" time="1.281">
</testcase>
</testsuite>
<testsuite name="filter-choices-pills.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="7" failures="0" skipped="0" time="3.984" errors="0">
<testcase name="quick pills offer only what would show something (#1427) › only the pills some pull request matches are offered" classname="filter-choices-pills.spec.ts" time="0.45">
</testcase>
<testcase name="quick pills offer only what would show something (#1427) › the pills follow the CI filter" classname="filter-choices-pills.spec.ts" time="0.45">
</testcase>
<testcase name="quick pills offer only what would show something (#1427) › the active pill stays offered after a reload that finds nothing for it" classname="filter-choices-pills.spec.ts" time="0.598">
</testcase>
<testcase name="quick pills offer only what would show something (#1427) › the Issues page offers only the forges its issues are on" classname="filter-choices-pills.spec.ts" time="0.441">
</testcase>
<testcase name="quick pills offer only what would show something (#1427) › the forge pills in the Filters sheet follow the same rule on a phone" classname="filter-choices-pills.spec.ts" time="0.457">
</testcase>
<testcase name="quick pills offer only what would show something (#1427) › a pill that becomes useful once a pick clears is offered at once" classname="filter-choices-pills.spec.ts" time="0.487">
</testcase>
<testcase name="quick pills offer only what would show something (#1427) › has no axe-core violations with pills hidden" classname="filter-choices-pills.spec.ts" time="1.101">
</testcase>
</testsuite>
<testsuite name="filter-choices-static.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="11" failures="0" skipped="0" time="5.742" errors="0">
<testcase name="CI status and age choices on the pull request page (#1427) › offer only the CI states that exist and the age ranges something falls in" classname="filter-choices-static.spec.ts" time="0.423">
</testcase>
<testcase name="CI status and age choices on the pull request page (#1427) › the CI choices follow the other filters, and a CI pick that no longer matches is cleared" classname="filter-choices-static.spec.ts" time="0.484">
</testcase>
<testcase name="CI status and age choices on the pull request page (#1427) › picking Created refreshes the CI choices to what is left" classname="filter-choices-static.spec.ts" time="0.472">
</testcase>
<testcase name="CI status and age choices on the pull request page (#1427) › typing a title narrows the CI choices as it is typed, and clears a CI pick it leaves nothing for" classname="filter-choices-static.spec.ts" time="0.464">
</testcase>
<testcase name="CI status and age choices on the pull request page (#1427) › picking a CI state leaves only the age ranges that state is in" classname="filter-choices-static.spec.ts" time="0.443">
</testcase>
<testcase name="CI status and age choices on the pull request page (#1427) › a quick pill narrows the age ranges too" classname="filter-choices-static.spec.ts" time="0.473">
</testcase>
<testcase name="CI status and age choices on the pull request page (#1427) › has no axe-core violations with the narrowed choices" classname="filter-choices-static.spec.ts" time="1.17">
</testcase>
<testcase name="forge buttons on Insights (#1427) › a forge with nothing to chart is not offered" classname="filter-choices-static.spec.ts" time="0.413">
</testcase>
<testcase name="forge buttons on Insights (#1427) › picking a repo narrows the forge buttons to the forge it is on" classname="filter-choices-static.spec.ts" time="0.434">
</testcase>
<testcase name="forge buttons on Insights (#1427) › a forge you picked stays offered after a reload that finds nothing on it" classname="filter-choices-static.spec.ts" time="0.557">
</testcase>
<testcase name="forge buttons on Insights (#1427) › both are offered when both forges have pull requests" classname="filter-choices-static.spec.ts" time="0.409">
</testcase>
</testsuite>
<testsuite name="filter-options.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="7" failures="0" skipped="0" time="5.141" errors="0">
<testcase name="filter choices on /issues.html (#1427) › offer only repos, authors and labels the page can show" classname="filter-options.spec.ts" time="1.404">
</testcase>
<testcase name="filter choices on /issues.html (#1427) › unticking Hide Dependency Dashboard makes what it hid a choice, and ticking it again takes it away" classname="filter-options.spec.ts" time="0.583">
</testcase>
<testcase name="filter choices on /insights.html (#1427) › offer only repos, authors and labels the page can show" classname="filter-options.spec.ts" time="0.47">
</testcase>
<testcase name="filter choices on /insights.html (#1427) › unticking Hide Dependency Dashboard makes what it hid a choice, and ticking it again takes it away" classname="filter-options.spec.ts" time="0.56">
</testcase>
<testcase name="filter choices follow the other filters on the Issues page (#1427) › picking an author narrows the repo choices to that author, and the author keeps its siblings" classname="filter-options.spec.ts" time="0.478">
</testcase>
<testcase name="filter choices follow the other filters on the Issues page (#1427) › a picked repo that only has hidden issues is cleared when they are hidden again, and the list shows everything" classname="filter-options.spec.ts" time="0.546">
</testcase>
<testcase name="filter choices follow the other filters on the Issues page (#1427) › has no axe-core violations with the narrowed choices" classname="filter-options.spec.ts" time="1.1">
</testcase>
</testsuite>
<testsuite name="font-preload.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="2" failures="0" skipped="0" time="0.026" errors="0">
<testcase name="/login.html preloads the latin fonts its first paint uses" classname="font-preload.spec.ts" time="0.015">
</testcase>
<testcase name="/disclaimer.html preloads the latin fonts its first paint uses" classname="font-preload.spec.ts" time="0.011">
</testcase>
</testsuite>
<testsuite name="fonts.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="4" failures="0" skipped="0" time="0.506" errors="0">
<testcase name="self-hosted fonts (#797) › the login page requests no other host, for CSS or fonts" classname="fonts.spec.ts" time="0.11">
</testcase>
<testcase name="self-hosted fonts (#797) › IBM Plex Sans and Mono load from the app, with font-display swap" classname="fonts.spec.ts" time="0.134">
</testcase>
<testcase name="self-hosted fonts on the dashboard (#797) › the dashboard requests no other host either" classname="fonts.spec.ts" time="0.14">
</testcase>
<testcase name="render-blocking stylesheets (#1069) › the login page blocks first paint on /style.css alone" classname="fonts.spec.ts" time="0.122">
</testcase>
</testsuite>
<testsuite name="forge-health-budgets.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="5" failures="0" skipped="0" time="1.686" errors="0">
<testcase name="the budget text under the forge pill (#1433) › a spent GraphQL budget shows next to a healthy REST one, each labelled" classname="forge-health-budgets.spec.ts" time="0.217">
</testcase>
<testcase name="the budget text under the forge pill (#1433) › a forge with one budget still says which one it is" classname="forge-health-budgets.spec.ts" time="0.214">
</testcase>
<testcase name="the budget text under the forge pill (#1433) › a Forgejo forge labels its budget with its own short name" classname="forge-health-budgets.spec.ts" time="0.202">
</testcase>
<testcase name="the budget text under the forge pill (#1433) › a remaining count above its limit is never shown against that limit" classname="forge-health-budgets.spec.ts" time="0.207">
</testcase>
<testcase name="the budget text under the forge pill (#1433) › each text stays out of the live region, and the page has no axe violations" classname="forge-health-budgets.spec.ts" time="0.846">
</testcase>
</testsuite>
<testsuite name="forgejo-auto-merge.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="10" failures="0" skipped="0" time="7.02" errors="0">
<testcase name="Forgejo auto-merge on a pull request row › a Forgejo pull request offers Enable auto-merge, which posts for that pull request" classname="forgejo-auto-merge.spec.ts" time="0.559">
</testcase>
<testcase name="Forgejo auto-merge on a pull request row › an armed pull request says in words that Forge Dashboard does the merging, and why it waits" classname="forgejo-auto-merge.spec.ts" time="0.466">
</testcase>
<testcase name="Forgejo auto-merge on a pull request row › a stopped pull request says it needs a person, in text" classname="forgejo-auto-merge.spec.ts" time="0.417">
</testcase>
<testcase name="Forgejo auto-merge on a pull request row › Disarm posts for that pull request and the pill goes" classname="forgejo-auto-merge.spec.ts" time="0.495">
</testcase>
<testcase name="Forgejo auto-merge on a pull request row › a pull request the app auto-merged is announced once, as a toast" classname="forgejo-auto-merge.spec.ts" time="0.473">
</testcase>
<testcase name="Forgejo auto-merge on a pull request row › an armed row has no axe-core violations" classname="forgejo-auto-merge.spec.ts" time="1.126">
</testcase>
<testcase name="Forgejo auto-merge explained where it is used › a grouped Forgejo repo says who handles auto-merge and links to Settings" classname="forgejo-auto-merge.spec.ts" time="0.436">
</testcase>
<testcase name="Forgejo auto-merge explained where it is used › a GitHub repo group has no such callout" classname="forgejo-auto-merge.spec.ts" time="0.45">
</testcase>
<testcase name="Forgejo auto-merge explained where it is used › the callout has no axe-core violations" classname="forgejo-auto-merge.spec.ts" time="1.182">
</testcase>
<testcase name="Forgejo auto-merge explained where it is used › Settings explains Forgejo auto-merge in plain words, with no axe-core violations" classname="forgejo-auto-merge.spec.ts" time="1.416">
</testcase>
</testsuite>
<testsuite name="hide-pull-request.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="15" failures="0" skipped="0" time="10.952" errors="0">
<testcase name="hiding one pull request (#841) › More actions offers Hide this pull request and Hide for 7 days" classname="hide-pull-request.spec.ts" time="0.46">
</testcase>
<testcase name="hiding one pull request (#841) › Hide posts for that pull request with no days, and the row leaves at once" classname="hide-pull-request.spec.ts" time="0.559">
</testcase>
<testcase name="hiding one pull request (#841) › Hide for 7 days posts days: 7" classname="hide-pull-request.spec.ts" time="0.548">
</testcase>
<testcase name="hiding one pull request (#841) › a status message says what was hidden and has a focusable Undo, and it does not go away" classname="hide-pull-request.spec.ts" time="0.638">
</testcase>
<testcase name="hiding one pull request (#841) › Undo brings the row back" classname="hide-pull-request.spec.ts" time="0.633">
</testcase>
<testcase name="hiding one pull request (#841) › with nothing hidden there is no Hidden link" classname="hide-pull-request.spec.ts" time="0.485">
</testcase>
<testcase name="hiding one pull request (#841) › hiding makes a Hidden (N) link appear, counting what the server counts" classname="hide-pull-request.spec.ts" time="0.557">
</testcase>
<testcase name="the Hidden list (#841) › opens a list with repo, number, title and when each comes back" classname="hide-pull-request.spec.ts" time="0.499">
</testcase>
<testcase name="the Hidden list (#841) › the toggle says whether the list is open" classname="hide-pull-request.spec.ts" time="0.484">
</testcase>
<testcase name="the Hidden list (#841) › Restore posts for that pull request and the row returns" classname="hide-pull-request.spec.ts" time="0.609">
</testcase>
<testcase name="the Hidden list (#841) › restoring the last one removes the link" classname="hide-pull-request.spec.ts" time="0.604">
</testcase>
<testcase name="the Hidden list (#841) › a Restore button names the pull request it restores" classname="hide-pull-request.spec.ts" time="0.519">
</testcase>
<testcase name="hiding is accessible (#841) › the menu items, the status message and the Hidden list have no axe violations (light)" classname="hide-pull-request.spec.ts" time="1.879">
</testcase>
<testcase name="hiding is accessible (#841) › the menu items, the status message and the Hidden list have no axe violations (dark)" classname="hide-pull-request.spec.ts" time="1.852">
</testcase>
<testcase name="hiding is accessible (#841) › the Undo, toggle and Restore targets are at least 24px" classname="hide-pull-request.spec.ts" time="0.626">
</testcase>
</testsuite>
<testsuite name="inline-feedback.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="19" failures="0" skipped="0" time="13.238" errors="0">
<testcase name="inline feedback, toasts and the activity panel › two pull requests in flight each show their own waiting chip" classname="inline-feedback.spec.ts" time="0.295">
</testcase>
<testcase name="inline feedback, toasts and the activity panel › the chip shows a countdown outside the announced text, then Refreshing…" classname="inline-feedback.spec.ts" time="0.531">
</testcase>
<testcase name="inline feedback, toasts and the activity panel › a queued request raises a success toast with the reference, message, Show row and dismiss" classname="inline-feedback.spec.ts" time="0.732">
</testcase>
<testcase name="inline feedback, toasts and the activity panel › a success toast dismisses itself after about 6 seconds, and holds while hovered" classname="inline-feedback.spec.ts" time="0.763">
</testcase>
<testcase name="inline feedback, toasts and the activity panel › a success toast holds while focus is inside it" classname="inline-feedback.spec.ts" time="0.547">
</testcase>
<testcase name="inline feedback, toasts and the activity panel › an error toast stays until it is dismissed, and the row keeps a Failed line with Retry" classname="inline-feedback.spec.ts" time="1.054">
</testcase>
<testcase name="inline feedback, toasts and the activity panel › at most three toasts show, newest first; the rest stay in Activity" classname="inline-feedback.spec.ts" time="1.542">
</testcase>
<testcase name="inline feedback, toasts and the activity panel › Show row scrolls to the row and focuses it" classname="inline-feedback.spec.ts" time="0.783">
</testcase>
<testcase name="inline feedback, toasts and the activity panel › Show row moves the list to the page the row is on (#723)" classname="inline-feedback.spec.ts" time="0.785">
</testcase>
<testcase name="inline feedback, toasts and the activity panel › Show row says so when the pull request is merged or closed (#723)" classname="inline-feedback.spec.ts" time="0.612">
</testcase>
<testcase name="inline feedback, toasts and the activity panel › the Activity panel lists every action with its state, Show row, and Clear finished" classname="inline-feedback.spec.ts" time="0.627">
</testcase>
<testcase name="inline feedback, toasts and the activity panel › the activity control is sticky while the page scrolls" classname="inline-feedback.spec.ts" time="0.212">
</testcase>
<testcase name="inline feedback, toasts and the activity panel › one polite live region announces each event once, never the countdown" classname="inline-feedback.spec.ts" time="0.549">
</testcase>
<testcase name="inline feedback, toasts and the activity panel › inline lines, toasts and the activity list survive a snapshot and a forced refresh" classname="inline-feedback.spec.ts" time="0.571">
</testcase>
<testcase name="inline feedback, toasts and the activity panel › a snapshot that shows the update landed finishes the entry with a toast" classname="inline-feedback.spec.ts" time="0.567">
</testcase>
<testcase name="inline feedback, toasts and the activity panel › the banner still reports a global condition" classname="inline-feedback.spec.ts" time="0.254">
</testcase>
<testcase name="inline feedback, toasts and the activity panel › with prefers-reduced-motion, toasts appear without animation" classname="inline-feedback.spec.ts" time="0.472">
</testcase>
<testcase name="inline feedback, toasts and the activity panel › has no axe violations with a toast and the panel open" classname="inline-feedback.spec.ts" time="1.405">
</testcase>
<testcase name="inline feedback and a saved filter › Show row clears the filter that hides the row, says which, and focuses it (#723)" classname="inline-feedback.spec.ts" time="0.937">
</testcase>
</testsuite>
<testsuite name="insights.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="24" failures="0" skipped="0" time="14.227" errors="0">
<testcase name="insights page › is reachable from a link in the dashboard header" classname="insights.spec.ts" time="0.43">
</testcase>
<testcase name="insights page › reads its data from /api/dashboard alone, next to the layout&apos;s own settings calls" classname="insights.spec.ts" time="0.867">
</testcase>
<testcase name="insights page › charts the CI status mix across open pull requests, with a data table alongside" classname="insights.spec.ts" time="0.455">
</testcase>
<testcase name="insights page › each chart keeps its table for screen readers only, not shown twice" classname="insights.spec.ts" time="0.451">
</testcase>
<testcase name="insights page › shows an explicit empty state with no open pull requests, not a blank or all-zero chart" classname="insights.spec.ts" time="0.422">
</testcase>
<testcase name="insights page › busiest repos › ranks issues separately from pull requests, not conflated into one number" classname="insights.spec.ts" time="0.467">
</testcase>
<testcase name="insights page › busiest repos › says how many more repos exist once the ranking is capped" classname="insights.spec.ts" time="0.435">
</testcase>
<testcase name="insights page › busiest repos › shows an explicit empty state for each list independently" classname="insights.spec.ts" time="0.403">
</testcase>
<testcase name="insights page › pull request age › shows an explicit empty state with no open pull requests" classname="insights.spec.ts" time="0.408">
</testcase>
<testcase name="insights page › issue age › buckets open issues by age, each bar directly labeled with its count, separately from pull request age" classname="insights.spec.ts" time="0.441">
</testcase>
<testcase name="insights page › issue age › shows an explicit empty state with no open issues" classname="insights.spec.ts" time="0.434">
</testcase>
<testcase name="insights page › rate-limit headroom › shows remaining/limit as a proportion, directly labeled, for each budget a forge reports" classname="insights.spec.ts" time="0.464">
</testcase>
<testcase name="insights page › rate-limit headroom › shows the last poll&apos;s own point cost for a GraphQL budget (#440), not just what&apos;s left" classname="insights.spec.ts" time="0.464">
</testcase>
<testcase name="insights page › rate-limit headroom › says a budget isn&apos;t reported, rather than showing a broken or zero-looking bar" classname="insights.spec.ts" time="0.424">
</testcase>
<testcase name="insights page › rate-limit headroom › shows a live countdown to when the budget resets" classname="insights.spec.ts" time="2.304">
</testcase>
<testcase name="insights page › rate-limit headroom › an exhausted budget is called out as exceeded, styled distinctly from a merely low one" classname="insights.spec.ts" time="0.425">
</testcase>
<testcase name="insights page › filters › the shared repo filter scopes both the pull request and issue charts at once" classname="insights.spec.ts" time="0.488">
</testcase>
<testcase name="insights page › filters › the shared author filter scopes both the pull request and issue charts at once" classname="insights.spec.ts" time="0.463">
</testcase>
<testcase name="insights page › filters › repo, author, and label options are populated from the combined pull request and issue data" classname="insights.spec.ts" time="0.437">
</testcase>
<testcase name="insights page › filters › a filter set on the main dashboard already applies here — the same cookie, not a separate preference" classname="insights.spec.ts" time="0.429">
</testcase>
<testcase name="insights page › filters › a status/created/updated filter left in the cookie by the main dashboard has no effect here" classname="insights.spec.ts" time="0.429">
</testcase>
<testcase name="insights page › filters › the Hide Dependency Dashboard checkbox defaults on, toggles both ways, and persists across a reload" classname="insights.spec.ts" time="0.564">
</testcase>
<testcase name="insights page › has no axe-core violations at desktop width, with real chart content present" classname="insights.spec.ts" time="1.069">
</testcase>
<testcase name="insights page › has no axe-core violations and no horizontal scroll at phone width" classname="insights.spec.ts" time="1.054">
</testcase>
</testsuite>
<testsuite name="issues-page.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="11" failures="0" skipped="0" time="8.889" errors="0">
<testcase name="issues page (#827) › the nav has an Issues item with a count badge, on both pages" classname="issues-page.spec.ts" time="0.643">
</testcase>
<testcase name="issues page (#827) › the mobile navigation has the Issues item too" classname="issues-page.spec.ts" time="0.427">
</testcase>
<testcase name="issues page (#827) › the pull request page no longer lists issues" classname="issues-page.spec.ts" time="0.436">
</testcase>
<testcase name="issues page (#827) › /issues.html lists the open issues and not the pull requests" classname="issues-page.spec.ts" time="0.525">
</testcase>
<testcase name="issues page (#827) › the issues page filters like pull requests: repo, title, author, label, forge" classname="issues-page.spec.ts" time="0.574">
</testcase>
<testcase name="issues page (#827) › each page offers only the repos, authors and labels it actually lists (#1071)" classname="issues-page.spec.ts" time="0.675">
</testcase>
<testcase name="issues page (#827) › a filter set on one page is still set on the other, and survives a reload" classname="issues-page.spec.ts" time="0.629">
</testcase>
<testcase name="issues page (#827) › /pull-requests.html has no axe violations at desktop width" classname="issues-page.spec.ts" time="1.231">
</testcase>
<testcase name="issues page (#827) › /issues.html has no axe violations at desktop width" classname="issues-page.spec.ts" time="1.319">
</testcase>
<testcase name="issues page (#827) › /pull-requests.html has no axe violations at phone width" classname="issues-page.spec.ts" time="1.159">
</testcase>
<testcase name="issues page (#827) › /issues.html has no axe violations at phone width" classname="issues-page.spec.ts" time="1.271">
</testcase>
</testsuite>
<testsuite name="issues-steady.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="16" failures="0" skipped="0" time="10.131" errors="0">
<testcase name="steady issues refresh (#827, #718) › a snapshot that changes only pull requests raises no bar on the issues page" classname="issues-steady.spec.ts" time="0.438">
</testcase>
<testcase name="steady issues refresh (#827, #718) › the same holds while updates are paused" classname="issues-steady.spec.ts" time="0.477">
</testcase>
<testcase name="steady issues refresh (#827, #718) › a hidden housekeeping issue moving raises no bar" classname="issues-steady.spec.ts" time="0.475">
</testcase>
<testcase name="steady issues refresh (#827, #718) › an issue the filters hide being added raises no bar" classname="issues-steady.spec.ts" time="0.463">
</testcase>
<testcase name="steady issues refresh (#827, #718) › an issue the filters show being added still raises the bar" classname="issues-steady.spec.ts" time="1.208">
</testcase>
<testcase name="steady issues refresh (#827, #718) › an issue added alongside a pull request change is counted as the one issue" classname="issues-steady.spec.ts" time="0.444">
</testcase>
<testcase name="steady issues refresh (#827, #718) › a snapshot with no change renders no issue row again" classname="issues-steady.spec.ts" time="0.468">
</testcase>
<testcase name="steady issues refresh (#827, #718) › at the top with nothing focused, an added issue appears at once" classname="issues-steady.spec.ts" time="0.476">
</testcase>
<testcase name="steady issues refresh (#827, #718) › scrolled below the top, a new issue is held behind the bar and the scroll position stays" classname="issues-steady.spec.ts" time="0.512">
</testcase>
<testcase name="steady issues refresh (#827, #718) › scrolled below the top, a removed issue and a reordering are held too" classname="issues-steady.spec.ts" time="0.448">
</testcase>
<testcase name="steady issues refresh (#827, #718) › with focus inside the list, changes are held until focus leaves" classname="issues-steady.spec.ts" time="0.451">
</testcase>
<testcase name="steady issues refresh (#827, #718) › a row whose own content changed updates in place, even while scrolled" classname="issues-steady.spec.ts" time="0.473">
</testcase>
<testcase name="steady issues refresh (#827, #718) › pausing live updates holds structural changes at the top too" classname="issues-steady.spec.ts" time="0.499">
</testcase>
<testcase name="steady issues refresh (#827, #718) › the sort control orders issues, and only a change to it or Show updates moves rows" classname="issues-steady.spec.ts" time="0.456">
</testcase>
<testcase name="steady issues refresh (#827, #718) › the updates bar has no axe violations while showing, at desktop width" classname="issues-steady.spec.ts" time="1.46">
</testcase>
<testcase name="steady issues refresh (#827, #718) › the updates bar has no axe violations while showing, at phone width" classname="issues-steady.spec.ts" time="1.383">
</testcase>
</testsuite>
<testsuite name="label-in-name.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="7" failures="0" skipped="0" time="1.177" errors="0">
<testcase name="the check itself (#1315) › flags an icon link whose name leaves out its numbers" classname="label-in-name.spec.ts" time="0.149">
</testcase>
<testcase name="the check itself (#1315) › passes an icon link whose name says them" classname="label-in-name.spec.ts" time="0.153">
</testcase>
<testcase name="the check itself (#1315) › a longer number is not taken for a shorter one" classname="label-in-name.spec.ts" time="0.168">
</testcase>
<testcase name="the check itself (#1315) › a running or passing count missing from the name is caught (#1439)" classname="label-in-name.spec.ts" time="0.147">
</testcase>
<testcase name="the check itself (#1315) › swapped numbers are caught" classname="label-in-name.spec.ts" time="0.145">
</testcase>
<testcase name="visible text is part of the accessible name (#1135) › /pull-requests.html has no label that leaves out its visible text" classname="label-in-name.spec.ts" time="0.199">
</testcase>
<testcase name="visible text is part of the accessible name (#1135) › /issues.html has no label that leaves out its visible text" classname="label-in-name.spec.ts" time="0.216">
</testcase>
</testsuite>
<testsuite name="legal.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="9" failures="0" skipped="0" time="3.375" errors="0">
<testcase name="disclaimer and privacy pages › /disclaimer.html is reachable without a session" classname="legal.spec.ts" time="0.145">
</testcase>
<testcase name="disclaimer and privacy pages › /disclaimer.html has no axe-core violations at desktop width" classname="legal.spec.ts" time="0.573">
</testcase>
<testcase name="disclaimer and privacy pages › /disclaimer.html has no axe-core violations and no horizontal scroll at phone width" classname="legal.spec.ts" time="0.598">
</testcase>
<testcase name="disclaimer and privacy pages › /privacy.html is reachable without a session" classname="legal.spec.ts" time="0.145">
</testcase>
<testcase name="disclaimer and privacy pages › /privacy.html has no axe-core violations at desktop width" classname="legal.spec.ts" time="0.589">
</testcase>
<testcase name="disclaimer and privacy pages › /privacy.html has no axe-core violations and no horizontal scroll at phone width" classname="legal.spec.ts" time="0.629">
</testcase>
<testcase name="disclaimer and privacy pages › the footer separates its items with a space on each side" classname="legal.spec.ts" time="0.147">
</testcase>
<testcase name="disclaimer and privacy pages › the footer links to both from another page, but not from themselves" classname="legal.spec.ts" time="0.36">
</testcase>
<testcase name="disclaimer and privacy pages › disclaimer links to the licence, privacy names the webhook credentials doc" classname="legal.spec.ts" time="0.189">
</testcase>
</testsuite>
<testsuite name="main-branches-choices.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="6" failures="0" skipped="0" time="3.468" errors="0">
<testcase name="Branches pills offer only what would show something (#1427) › a status and a forge nothing is in are not offered" classname="main-branches-choices.spec.ts" time="0.424">
</testcase>
<testcase name="Branches pills offer only what would show something (#1427) › everything is offered when everything is there" classname="main-branches-choices.spec.ts" time="0.432">
</testcase>
<testcase name="Branches pills offer only what would show something (#1427) › the status pills follow the forge pill and the search" classname="main-branches-choices.spec.ts" time="0.518">
</testcase>
<testcase name="Branches pills offer only what would show something (#1427) › the forge pills follow the status pill" classname="main-branches-choices.spec.ts" time="0.522">
</testcase>
<testcase name="Branches pills offer only what would show something (#1427) › the active pill stays offered after a reload that finds nothing for it" classname="main-branches-choices.spec.ts" time="0.602">
</testcase>
<testcase name="Branches pills offer only what would show something (#1427) › has no axe-core violations with pills hidden" classname="main-branches-choices.spec.ts" time="0.97">
</testcase>
</testsuite>
<testsuite name="main-branches-page.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="16" failures="0" skipped="0" time="10.602" errors="0">
<testcase name="Main branches page (#1224, #1279) › the nav links to it, first, in the header and the phone tab bar" classname="main-branches-page.spec.ts" time="0.489">
</testcase>
<testcase name="Main branches page (#1224, #1279) › is hidden from a signed-out visitor" classname="main-branches-page.spec.ts" time="0.432">
</testcase>
<testcase name="Main branches page (#1224, #1279) › lists one row per repo in the server order, with a summary and pill counts" classname="main-branches-page.spec.ts" time="0.451">
</testcase>
<testcase name="Main branches page (#1224, #1279) › a pill lists only its status, and the filter is remembered across a reload" classname="main-branches-page.spec.ts" time="0.686">
</testcase>
<testcase name="Main branches page (#1224, #1279) › the forge pill is the same badge the pull requests page uses (#1364)" classname="main-branches-page.spec.ts" time="0.735">
</testcase>
<testcase name="Main branches page (#1224, #1279) › the forge toggle and the search narrow the list further, and are remembered" classname="main-branches-page.spec.ts" time="0.699">
</testcase>
<testcase name="Main branches page (#1224, #1279) › a failed row links to its run, expands to its failing jobs and offers no re-run" classname="main-branches-page.spec.ts" time="0.459">
</testcase>
<testcase name="Main branches page (#1224, #1279) › the repo and View run links open in a new tab and say so (#1266)" classname="main-branches-page.spec.ts" time="0.468">
</testcase>
<testcase name="Main branches page (#1224, #1279) › a repo with no pipeline says no run was found and has no commit to show" classname="main-branches-page.spec.ts" time="0.42">
</testcase>
<testcase name="Main branches page (#1224, #1279) › stale rows sit under one banner and offer nothing to write" classname="main-branches-page.spec.ts" time="0.449">
</testcase>
<testcase name="Main branches page (#1224, #1279) › says so when every default branch is passing" classname="main-branches-page.spec.ts" time="0.436">
</testcase>
<testcase name="Main branches page (#1224, #1279) › says nothing matches, and offers to reset the filters" classname="main-branches-page.spec.ts" time="0.479">
</testcase>
<testcase name="Main branches page (#1224, #1279) › says there are no tracked repositories when the read is empty" classname="main-branches-page.spec.ts" time="0.435">
</testcase>
<testcase name="Main branches page (#1224, #1279) › a failed read shows an error with a retry that recovers" classname="main-branches-page.spec.ts" time="0.482">
</testcase>
<testcase name="Main branches page (#1224, #1279) › has no axe violations in light and dark, desktop and 390px, and no horizontal scroll" classname="main-branches-page.spec.ts" time="3.037">
</testcase>
<testcase name="Main branches page (#1224, #1279) › on a phone each row is a card with a primary action at least 44px tall" classname="main-branches-page.spec.ts" time="0.445">
</testcase>
</testsuite>
<testsuite name="meta-description.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="5" failures="0" skipped="0" time="0.828" errors="0">
<testcase name="meta descriptions (#1135) › /login.html describes itself" classname="meta-description.spec.ts" time="0.111">
</testcase>
<testcase name="meta descriptions (#1135) › /changelog.html describes itself" classname="meta-description.spec.ts" time="0.115">
</testcase>
<testcase name="meta descriptions (#1135) › /disclaimer.html describes itself" classname="meta-description.spec.ts" time="0.117">
</testcase>
<testcase name="meta descriptions (#1135) › /privacy.html describes itself" classname="meta-description.spec.ts" time="0.118">
</testcase>
<testcase name="meta descriptions (#1135) › signed in › every signed-in page describes itself, each differently" classname="meta-description.spec.ts" time="0.367">
</testcase>
</testsuite>
<testsuite name="mobile-filters.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="19" failures="0" skipped="0" time="12.734" errors="0">
<testcase name="mobile filters at 390x844 (#828) › the first pull request row is on the first screen and the closed filter area is small" classname="mobile-filters.spec.ts" time="0.483">
</testcase>
<testcase name="mobile filters at 390x844 (#828) › closed, it is a search row and one scrolling row of quick filters, with no forge pills" classname="mobile-filters.spec.ts" time="0.495">
</testcase>
<testcase name="mobile filters at 390x844 (#828) › Filters opens a bottom sheet with the other controls, and Escape closes it and returns focus" classname="mobile-filters.spec.ts" time="0.56">
</testcase>
<testcase name="mobile filters at 390x844 (#828) › changing a filter in the sheet narrows the results and updates the count and the button" classname="mobile-filters.spec.ts" time="0.581">
</testcase>
<testcase name="mobile filters at 390x844 (#828) › an active filter shows as a removable chip with a 44px target, without opening the sheet" classname="mobile-filters.spec.ts" time="0.609">
</testcase>
<testcase name="mobile filters at 390x844 (#828) › Clear all resets the filters" classname="mobile-filters.spec.ts" time="0.547">
</testcase>
<testcase name="mobile filters at 390x844 (#828) › a refresh does not change a filter being edited in the sheet" classname="mobile-filters.spec.ts" time="0.539">
</testcase>
<testcase name="mobile filters at 390x844 (#828) › has no axe violations with the sheet closed" classname="mobile-filters.spec.ts" time="1.286">
</testcase>
<testcase name="mobile filters at 390x844 (#828) › has no axe violations with the sheet open" classname="mobile-filters.spec.ts" time="1.117">
</testcase>
<testcase name="mobile filters at 360x740 (#828) › the first pull request row is on the first screen and the closed filter area is small" classname="mobile-filters.spec.ts" time="0.482">
</testcase>
<testcase name="mobile filters at 360x740 (#828) › closed, it is a search row and one scrolling row of quick filters, with no forge pills" classname="mobile-filters.spec.ts" time="0.497">
</testcase>
<testcase name="mobile filters at 360x740 (#828) › Filters opens a bottom sheet with the other controls, and Escape closes it and returns focus" classname="mobile-filters.spec.ts" time="0.557">
</testcase>
<testcase name="mobile filters at 360x740 (#828) › changing a filter in the sheet narrows the results and updates the count and the button" classname="mobile-filters.spec.ts" time="0.568">
</testcase>
<testcase name="mobile filters at 360x740 (#828) › an active filter shows as a removable chip with a 44px target, without opening the sheet" classname="mobile-filters.spec.ts" time="0.585">
</testcase>
<testcase name="mobile filters at 360x740 (#828) › Clear all resets the filters" classname="mobile-filters.spec.ts" time="0.54">
</testcase>
<testcase name="mobile filters at 360x740 (#828) › a refresh does not change a filter being edited in the sheet" classname="mobile-filters.spec.ts" time="0.52">
</testcase>
<testcase name="mobile filters at 360x740 (#828) › has no axe violations with the sheet closed" classname="mobile-filters.spec.ts" time="1.279">
</testcase>
<testcase name="mobile filters at 360x740 (#828) › has no axe violations with the sheet open" classname="mobile-filters.spec.ts" time="1.045">
</testcase>
<testcase name="the desktop filter bar is unchanged (#828) › no Filters button, no sheet, every control in the bar" classname="mobile-filters.spec.ts" time="0.444">
</testcase>
</testsuite>
<testsuite name="nav-branches-pills.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="5" failures="0" skipped="0" time="6.477" errors="0">
<testcase name="the Branches nav pill shows failing, running and passing (#1458) › shows the total, then failed, running and passed, each with its glyph" classname="nav-branches-pills.spec.ts" time="0.546">
</testcase>
<testcase name="the Branches nav pill shows failing, running and passing (#1458) › a count of zero is not drawn, and no branches means no pill" classname="nav-branches-pills.spec.ts" time="0.577">
</testcase>
<testcase name="the Branches nav pill shows failing, running and passing (#1458) › on a 360px phone every tab fits and the pill stays inside its tab" classname="nav-branches-pills.spec.ts" time="0.533">
</testcase>
<testcase name="the Branches nav pill shows failing, running and passing (#1458) › has no axe-core violations in the light theme, on desktop and on a phone" classname="nav-branches-pills.spec.ts" time="2.447">
</testcase>
<testcase name="the Branches nav pill shows failing, running and passing (#1458) › has no axe-core violations in the dark theme, on desktop and on a phone" classname="nav-branches-pills.spec.ts" time="2.374">
</testcase>
</testsuite>
<testsuite name="nav-empty-links.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="11" failures="0" skipped="0" time="6.621" errors="0">
<testcase name="empty pages leave the navigation (#1228) › with nothing to show, the Pull requests link is gone too, from the header and the tab bar (#1415)" classname="nav-empty-links.spec.ts" time="0.248">
</testcase>
<testcase name="empty pages leave the navigation (#1228) › with nothing to show, the three links are gone from the header and the tab bar, and Pull requests stays while it has one" classname="nav-empty-links.spec.ts" time="0.337">
</testcase>
<testcase name="empty pages leave the navigation (#1228) › each link shows on its own count" classname="nav-empty-links.spec.ts" time="0.387">
</testcase>
<testcase name="empty pages leave the navigation (#1228) › while the counts are not loaded the links stay, then go once they say zero" classname="nav-empty-links.spec.ts" time="0.258">
</testcase>
<testcase name="empty pages leave the navigation (#1228) › the page you are on keeps its link at zero, marked current, and loses it when you leave" classname="nav-empty-links.spec.ts" time="0.421">
</testcase>
<testcase name="empty pages leave the navigation (#1228) › the Pull requests page keeps its link at zero, marked current, and loses it when you leave (#1415)" classname="nav-empty-links.spec.ts" time="0.386">
</testcase>
<testcase name="empty pages leave the navigation (#1228) › a count that rises brings its link in without a reload" classname="nav-empty-links.spec.ts" time="0.288">
</testcase>
<testcase name="empty pages leave the navigation (#1228) › the Pull requests link comes back without a reload when a pull request opens (#1415)" classname="nav-empty-links.spec.ts" time="0.296">
</testcase>
<testcase name="empty pages leave the navigation (#1228) › a page typed into the address bar with a count of zero still opens with its own empty state" classname="nav-empty-links.spec.ts" time="0.331">
</testcase>
<testcase name="empty pages leave the navigation (#1228) › the Pull requests page typed into the address bar with none open still opens with its own empty state (#1415)" classname="nav-empty-links.spec.ts" time="0.161">
</testcase>
<testcase name="empty pages leave the navigation (#1228) › has no axe-core violations with and without the links, and the tab bar fits at 390px" classname="nav-empty-links.spec.ts" time="3.508">
</testcase>
</testsuite>
<testsuite name="nav-pills.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="22" failures="0" skipped="0" time="12.774" errors="0">
<testcase name="nav counts: a total and a red failed count (#1315) › Branches shows the total and a red failed count, and says both in its name" classname="nav-pills.spec.ts" time="0.565">
</testcase>
<testcase name="nav counts: a total and a red failed count (#1315) › Pull requests, Releases and Bots each show a total and, when some fail, a failed count" classname="nav-pills.spec.ts" time="0.583">
</testcase>
<testcase name="nav counts: a total and a red failed count (#1315) › Issues has no failing notion, so it shows the total only" classname="nav-pills.spec.ts" time="0.569">
</testcase>
<testcase name="nav counts: a total and a red failed count (#1315) › nothing failing shows no red number, and no empty pill" classname="nav-pills.spec.ts" time="0.495">
</testcase>
<testcase name="nav counts: a total and a red failed count (#1315) › a zero is never drawn: Branches with no rows has no pill at all" classname="nav-pills.spec.ts" time="0.489">
</testcase>
<testcase name="nav counts: a total and a red failed count (#1315) › a page with nothing to show leaves the nav, as before (#1228)" classname="nav-pills.spec.ts" time="0.527">
</testcase>
<testcase name="nav counts: a total and a red failed count (#1315) › red is never alone: every failed pill carries a warning glyph" classname="nav-pills.spec.ts" time="0.505">
</testcase>
<testcase name="nav counts: a total and a red failed count (#1315) › a refresh changes the numbers without a reload" classname="nav-pills.spec.ts" time="0.534">
</testcase>
<testcase name="nav counts: a total and a red failed count (#1315) › /settings.html keeps the numbers current without a reload" classname="nav-pills.spec.ts" time="0.534">
</testcase>
<testcase name="nav counts: a total and a red failed count (#1315) › /insights.html keeps the numbers current without a reload" classname="nav-pills.spec.ts" time="0.627">
</testcase>
<testcase name="nav counts: a total and a red failed count (#1315) › the Branches page keeps the numbers current without a reload" classname="nav-pills.spec.ts" time="0.507">
</testcase>
<testcase name="nav counts: a total and a red failed count (#1315) › a hidden tab does not poll, and showing it again reads at once" classname="nav-pills.spec.ts" time="0.593">
</testcase>
<testcase name="nav counts: a total and a red failed count (#1315) › a page that loads its own snapshot does not poll the counts a second time" classname="nav-pills.spec.ts" time="0.876">
</testcase>
<testcase name="nav counts: a total and a red failed count (#1315) › a three-digit total with a failed count fits the bar without clipping" classname="nav-pills.spec.ts" time="0.529">
</testcase>
<testcase name="nav counts: a total and a red failed count (#1315) › the header stays inside a 768px window" classname="nav-pills.spec.ts" time="0.46">
</testcase>
<testcase name="the real server serves what the nav reads (#1315) › /api/dashboard carries navCounts in the shape the page reads" classname="nav-pills.spec.ts" time="0.322">
</testcase>
<testcase name="the real server serves what the nav reads (#1315) › a user with nothing tracked sees only the Branches link and no pills" classname="nav-pills.spec.ts" time="0.431">
</testcase>
<testcase name="nav counts on a phone (#1315) › the tab bar keeps both numbers, above the icon, and every tab fits" classname="nav-pills.spec.ts" time="0.61">
</testcase>
<testcase name="nav counts on a phone (#1315) › a tab’s name carries its visible words and both numbers" classname="nav-pills.spec.ts" time="0.488">
</testcase>
<testcase name="nav counts on a phone (#1315) › with three digits and a failed count, no pill spills out of its tab" classname="nav-pills.spec.ts" time="0.495">
</testcase>
<testcase name="nav counts on a phone (#1315) › every failed pill on the tab bar keeps its glyph" classname="nav-pills.spec.ts" time="0.508">
</testcase>
<testcase name="nav counts are accessible (#1315) › no axe violations with the pills, including contrast (phone, dark)" classname="nav-pills.spec.ts" time="1.527">
</testcase>
</testsuite>
<testsuite name="nav-public-pages.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="7" failures="0" skipped="0" time="3.086" errors="0">
<testcase name="/changelog.html › a signed-in user gets the same nav as elsewhere: empty links hidden" classname="nav-public-pages.spec.ts" time="1.055">
</testcase>
<testcase name="/changelog.html › links with something behind them show their number" classname="nav-public-pages.spec.ts" time="0.205">
</testcase>
<testcase name="/disclaimer.html › a signed-in user gets the same nav as elsewhere: empty links hidden" classname="nav-public-pages.spec.ts" time="0.657">
</testcase>
<testcase name="/disclaimer.html › links with something behind them show their number" classname="nav-public-pages.spec.ts" time="0.181">
</testcase>
<testcase name="/privacy.html › a signed-in user gets the same nav as elsewhere: empty links hidden" classname="nav-public-pages.spec.ts" time="0.67">
</testcase>
<testcase name="/privacy.html › links with something behind them show their number" classname="nav-public-pages.spec.ts" time="0.181">
</testcase>
<testcase name="signed out › signed out, the changelog asks for no counts and still renders" classname="nav-public-pages.spec.ts" time="0.137">
</testcase>
</testsuite>
<testsuite name="nav-telemetry-pills.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="12" failures="0" skipped="0" time="7.617" errors="0">
<testcase name="the nav pill shows failing, running and passing (#1439) › Pull requests shows the total, then failed, running and passed, each with its glyph" classname="nav-telemetry-pills.spec.ts" time="0.336">
</testcase>
<testcase name="the nav pill shows failing, running and passing (#1439) › the link says it in words, in the same order, and the pills stay hidden from a screen reader" classname="nav-telemetry-pills.spec.ts" time="0.248">
</testcase>
<testcase name="the nav pill shows failing, running and passing (#1439) › a count of zero is not drawn" classname="nav-telemetry-pills.spec.ts" time="0.316">
</testcase>
<testcase name="the nav pill shows failing, running and passing (#1439) › Bots and Releases show the same pill for their own counts" classname="nav-telemetry-pills.spec.ts" time="0.308">
</testcase>
<testcase name="the nav pill shows failing, running and passing (#1439) › large numbers are shown whole" classname="nav-telemetry-pills.spec.ts" time="0.316">
</testcase>
<testcase name="the nav pill shows failing, running and passing (#1439) › a page with nothing in it shows no pill" classname="nav-telemetry-pills.spec.ts" time="0.181">
</testcase>
<testcase name="the nav pill shows failing, running and passing (#1439) › under reduced motion the running glyph is still, and otherwise it spins" classname="nav-telemetry-pills.spec.ts" time="0.317">
</testcase>
<testcase name="the nav pill shows failing, running and passing (#1439) › on a 360px phone every tab still fits, and the pill stays inside its tab" classname="nav-telemetry-pills.spec.ts" time="0.328">
</testcase>
<testcase name="the nav pill shows failing, running and passing (#1439) › on a 360px phone three digits still fit their tab, and the bar is at most 112px (a known cost: one count per line)" classname="nav-telemetry-pills.spec.ts" time="0.329">
</testcase>
<testcase name="the nav pill shows failing, running and passing (#1439) › on a 360px phone four digits still fit their tab, and the bar is at most 120px (a known cost: one count per line)" classname="nav-telemetry-pills.spec.ts" time="0.342">
</testcase>
<testcase name="the nav pill shows failing, running and passing (#1439) › has no axe-core violations in the light theme, on desktop and on a phone" classname="nav-telemetry-pills.spec.ts" time="2.321">
</testcase>
<testcase name="the nav pill shows failing, running and passing (#1439) › has no axe-core violations in the dark theme, on desktop and on a phone" classname="nav-telemetry-pills.spec.ts" time="2.275">
</testcase>
</testsuite>
<testsuite name="nav.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="27" failures="0" skipped="0" time="11.274" errors="0">
<testcase name="persistent top nav › on /, every nav icon is present and Branches is marked current" classname="nav.spec.ts" time="0.362">
</testcase>
<testcase name="persistent top nav › on /pull-requests.html, every nav icon is present and Pull requests is marked current" classname="nav.spec.ts" time="0.399">
</testcase>
<testcase name="persistent top nav › on /releases.html, every nav icon is present and Releases is marked current" classname="nav.spec.ts" time="0.413">
</testcase>
<testcase name="persistent top nav › on /bots.html, every nav icon is present and Bots is marked current" classname="nav.spec.ts" time="0.391">
</testcase>
<testcase name="persistent top nav › on /issues.html, every nav icon is present and Issues is marked current" classname="nav.spec.ts" time="0.394">
</testcase>
<testcase name="persistent top nav › on /insights.html, every nav icon is present and Insights is marked current" classname="nav.spec.ts" time="0.408">
</testcase>
<testcase name="persistent top nav › on /webhooks.html, every nav icon is present and Webhooks is marked current" classname="nav.spec.ts" time="0.378">
</testcase>
<testcase name="persistent top nav › on /settings.html, every nav icon is present and Settings is marked current" classname="nav.spec.ts" time="0.429">
</testcase>
<testcase name="persistent top nav › the header menu runs Branches, Pull requests, Releases, Bots, Issues (#1321)" classname="nav.spec.ts" time="0.47">
</testcase>
<testcase name="persistent top nav › the phone tab bar runs in the same order (#1321)" classname="nav.spec.ts" time="0.518">
</testcase>
<testcase name="persistent top nav › /main-branches.html still works: it sends you to the Branches page (#1279)" classname="nav.spec.ts" time="0.386">
</testcase>
<testcase name="persistent top nav › the Admin icon stays hidden for a non-admin session, on every page with the nav" classname="nav.spec.ts" time="0.839">
</testcase>
<testcase name="persistent top nav › /changelog.html renders the nav without the empty links, and marks nothing current" classname="nav.spec.ts" time="0.4">
</testcase>
<testcase name="persistent top nav › /disclaimer.html renders the nav without the empty links, and marks nothing current" classname="nav.spec.ts" time="0.404">
</testcase>
<testcase name="persistent top nav › /privacy.html renders the nav without the empty links, and marks nothing current" classname="nav.spec.ts" time="0.381">
</testcase>
<testcase name="mobile bottom tab bar › on / at mobile width, the bottom tab bar shows every tab and only Branches is current" classname="nav.spec.ts" time="0.383">
</testcase>
<testcase name="mobile bottom tab bar › on /pull-requests.html at mobile width, the bottom tab bar shows every tab and only Pull requests is current" classname="nav.spec.ts" time="0.409">
</testcase>
<testcase name="mobile bottom tab bar › on /releases.html at mobile width, the bottom tab bar shows every tab and only Releases is current" classname="nav.spec.ts" time="0.396">
</testcase>
<testcase name="mobile bottom tab bar › on /bots.html at mobile width, the bottom tab bar shows every tab and only Bots is current" classname="nav.spec.ts" time="0.392">
</testcase>
<testcase name="mobile bottom tab bar › on /issues.html at mobile width, the bottom tab bar shows every tab and only Issues is current" classname="nav.spec.ts" time="0.382">
</testcase>
<testcase name="mobile bottom tab bar › on /insights.html at mobile width, the bottom tab bar shows every tab and only Insights is current" classname="nav.spec.ts" time="0.378">
</testcase>
<testcase name="mobile bottom tab bar › on /webhooks.html at mobile width, the bottom tab bar shows every tab and only Webhooks is current" classname="nav.spec.ts" time="0.382">
</testcase>
<testcase name="mobile bottom tab bar › on /settings.html at mobile width, the bottom tab bar shows every tab and only Settings is current" classname="nav.spec.ts" time="0.432">
</testcase>
<testcase name="mobile bottom tab bar › at desktop width, the bottom tab bar is hidden and not in the tab order" classname="nav.spec.ts" time="0.355">
</testcase>
<testcase name="mobile bottom tab bar › every bottom tab is keyboard-reachable and Enter activates it" classname="nav.spec.ts" time="0.459">
</testcase>
<testcase name="mobile bottom tab bar › focus is visible on a bottom tab, same convention as the header nav" classname="nav.spec.ts" time="0.379">
</testcase>
<testcase name="persistent top nav, admin session › the Admin icon appears for an admin session on a non-dashboard page too, and is marked current on admin.html" classname="nav.spec.ts" time="0.355">
</testcase>
</testsuite>
<testsuite name="noindex.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="3" failures="0" skipped="0" time="0.47" errors="0">
<testcase name="/login.html says noindex in the HTML" classname="noindex.spec.ts" time="0.139">
</testcase>
<testcase name="/changelog.html says noindex in the HTML" classname="noindex.spec.ts" time="0.184">
</testcase>
<testcase name="/privacy.html says noindex in the HTML" classname="noindex.spec.ts" time="0.147">
</testcase>
</testsuite>
<testsuite name="page-tops.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="20" failures="0" skipped="0" time="9.688" errors="0">
<testcase name="the pages start with the list (#1325) › /pull-requests.html has no stat tiles" classname="page-tops.spec.ts" time="0.226">
</testcase>
<testcase name="the pages start with the list (#1325) › /releases.html has no stat tiles" classname="page-tops.spec.ts" time="0.224">
</testcase>
<testcase name="the pages start with the list (#1325) › /bots.html has no stat tiles" classname="page-tops.spec.ts" time="0.221">
</testcase>
<testcase name="the pages start with the list (#1325) › /issues.html has no stat tiles" classname="page-tops.spec.ts" time="0.214">
</testcase>
<testcase name="the banners sit above the filter bar (#1325) › the unreachable-forge banner comes before the filter bar" classname="page-tops.spec.ts" time="0.237">
</testcase>
<testcase name="one line says how many are shown (#1325) › unfiltered it gives the total" classname="page-tops.spec.ts" time="0.473">
</testcase>
<testcase name="one line says how many are shown (#1325) › a filter that hides rows says &quot;Showing 1 of 2&quot;" classname="page-tops.spec.ts" time="0.499">
</testcase>
<testcase name="one line says how many are shown (#1325) › the Failing pill filters to failing pull requests, and All clears it" classname="page-tops.spec.ts" time="0.562">
</testcase>
<testcase name="one line says how many are shown (#1325) › issues say it the same way" classname="page-tops.spec.ts" time="0.478">
</testcase>
<testcase name="an empty page says so (#1325) › the pull request page with none open says nothing is open" classname="page-tops.spec.ts" time="0.178">
</testcase>
<testcase name="an empty page says so (#1325) › Releases, Bots and Issues, hidden from the nav at zero, still say it when typed in" classname="page-tops.spec.ts" time="0.433">
</testcase>
<testcase name="the Branches page drops its summary line (#1325) › no &quot;N tracked: …&quot; line, and the pills keep their counts" classname="page-tops.spec.ts" time="0.207">
</testcase>
<testcase name="the repo count lives on Insights (#1325) › Insights says how many repositories are tracked, across forges" classname="page-tops.spec.ts" time="0.22">
</testcase>
<testcase name="the repo count lives on Insights (#1325) › one repository is singular" classname="page-tops.spec.ts" time="0.244">
</testcase>
<testcase name="the pages without tiles are accessible (#1325) › /pull-requests.html has no axe violations (light)" classname="page-tops.spec.ts" time="0.975">
</testcase>
<testcase name="the pages without tiles are accessible (#1325) › /issues.html has no axe violations (light)" classname="page-tops.spec.ts" time="0.849">
</testcase>
<testcase name="the pages without tiles are accessible (#1325) › /insights.html has no axe violations (light)" classname="page-tops.spec.ts" time="0.837">
</testcase>
<testcase name="the pages without tiles are accessible (#1325) › /pull-requests.html has no axe violations (dark)" classname="page-tops.spec.ts" time="0.925">
</testcase>
<testcase name="the pages without tiles are accessible (#1325) › /issues.html has no axe violations (dark)" classname="page-tops.spec.ts" time="0.855">
</testcase>
<testcase name="the pages without tiles are accessible (#1325) › /insights.html has no axe violations (dark)" classname="page-tops.spec.ts" time="0.831">
</testcase>
</testsuite>
<testsuite name="page-widths.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="1" failures="0" skipped="0" time="0.766" errors="0">
<testcase name="narrow pages share one width (#1109) › every narrow page is 720px wide on a wide screen" classname="page-widths.spec.ts" time="0.766">
</testcase>
</testsuite>
<testsuite name="pipeline-check-states.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="7" failures="0" skipped="0" time="2.972" errors="0">
<testcase name="pipeline check states (#1473) › each state has its own glyph and label" classname="pipeline-check-states.spec.ts" time="0.436">
</testcase>
<testcase name="pipeline check states (#1473) › queued is not amber and running is" classname="pipeline-check-states.spec.ts" time="0.296">
</testcase>
<testcase name="pipeline check states (#1473) › running shows a still clock under reduced motion" classname="pipeline-check-states.spec.ts" time="0.352">
</testcase>
<testcase name="pipeline check states (#1473) › running spins an arc otherwise" classname="pipeline-check-states.spec.ts" time="0.241">
</testcase>
<testcase name="pipeline check states (#1473) › a failed required check keeps its Blocking badge" classname="pipeline-check-states.spec.ts" time="0.239">
</testcase>
<testcase name="pipeline check states (#1473) › has no axe-core violations and clears contrast, light" classname="pipeline-check-states.spec.ts" time="0.686">
</testcase>
<testcase name="pipeline check states (#1473) › has no axe-core violations and clears contrast, dark" classname="pipeline-check-states.spec.ts" time="0.722">
</testcase>
</testsuite>
<testsuite name="pr-details-dialog.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="27" failures="0" skipped="0" time="9.603" errors="0">
<testcase name="pull request details dialog › opens from the row trigger by mouse, fetches once and shows the header and description" classname="pr-details-dialog.spec.ts" time="0.271">
</testcase>
<testcase name="pull request details dialog › opens with Enter, Escape closes it and focus returns to the trigger" classname="pr-details-dialog.spec.ts" time="0.179">
</testcase>
<testcase name="pull request details dialog › shows a loading skeleton, then the content" classname="pr-details-dialog.spec.ts" time="0.261">
</testcase>
<testcase name="pull request details dialog › reaction pills show a count, name who gave them and say &quot;and N more&quot;" classname="pr-details-dialog.spec.ts" time="0.396">
</testcase>
<testcase name="pull request details dialog › Escape dismisses the reaction list first and closes the dialog on the second press" classname="pr-details-dialog.spec.ts" time="0.246">
</testcase>
<testcase name="pull request details dialog › Escape dismisses a list opened by hover, too" classname="pr-details-dialog.spec.ts" time="0.285">
</testcase>
<testcase name="pull request details dialog › comments show oldest first with avatar, login, relative time and edited; a deleted author reads ghost" classname="pr-details-dialog.spec.ts" time="0.278">
</testcase>
<testcase name="pull request details dialog › an avatar that fails to load falls back to an initial" classname="pr-details-dialog.spec.ts" time="0.286">
</testcase>
<testcase name="pull request details dialog › past 50 comments it says so and links to the forge" classname="pr-details-dialog.spec.ts" time="0.269">
</testcase>
<testcase name="pull request details dialog › a release pull request shows release notes in place of the description" classname="pr-details-dialog.spec.ts" time="0.241">
</testcase>
<testcase name="pull request details dialog › a bot pull request opens the same dialog with long generated text collapsed" classname="pr-details-dialog.spec.ts" time="0.272">
</testcase>
<testcase name="pull request details dialog › an error says why and Try again fetches again" classname="pr-details-dialog.spec.ts" time="0.326">
</testcase>
<testcase name="pull request details dialog › a slow answer for a closed dialog never lands in the next one" classname="pr-details-dialog.spec.ts" time="0.305">
</testcase>
<testcase name="pull request details dialog › raw HTML and javascript: links in a description or comment never become live markup" classname="pr-details-dialog.spec.ts" time="0.259">
</testcase>
<testcase name="pull request details dialog › on a 360px phone the dialog is a full-height sheet with no horizontal scroll and 44px targets" classname="pr-details-dialog.spec.ts" time="0.273">
</testcase>
<testcase name="pull request details dialog › a failed markdown chunk shows a plain error and Try again recovers once the network is back" classname="pr-details-dialog.spec.ts" time="0.322">
</testcase>
<testcase name="pull request details dialog › a network failure reads as plain words, a server error shows its reason" classname="pr-details-dialog.spec.ts" time="0.24">
</testcase>
<testcase name="pull request details dialog › an avatar is shown only from an https URL; other schemes fall back to the initial" classname="pr-details-dialog.spec.ts" time="0.333">
</testcase>
<testcase name="pull request details dialog › markdown links must be absolute http(s) or mailto; relative and protocol-relative ones are plain text" classname="pr-details-dialog.spec.ts" time="0.262">
</testcase>
<testcase name="pull request details dialog › the row Details button is at least 24px high on a desktop and 44px on a phone" classname="pr-details-dialog.spec.ts" time="0.171">
</testcase>
<testcase name="pull request details dialog › the header shows status chips from the row data, and the version on Releases" classname="pr-details-dialog.spec.ts" time="0.236">
</testcase>
<testcase name="pull request details dialog › has no axe-core violations with the dialog open (light)" classname="pr-details-dialog.spec.ts" time="0.625">
</testcase>
<testcase name="pull request details dialog › has no axe-core violations with the dialog open (dark)" classname="pr-details-dialog.spec.ts" time="0.632">
</testcase>
<testcase name="pull request details dialog › has no axe-core violations with a reaction list open (light, 1280px)" classname="pr-details-dialog.spec.ts" time="0.637">
</testcase>
<testcase name="pull request details dialog › has no axe-core violations with a reaction list open (light, 360px)" classname="pr-details-dialog.spec.ts" time="0.689">
</testcase>
<testcase name="pull request details dialog › has no axe-core violations with a reaction list open (dark, 1280px)" classname="pr-details-dialog.spec.ts" time="0.669">
</testcase>
<testcase name="pull request details dialog › has no axe-core violations with a reaction list open (dark, 360px)" classname="pr-details-dialog.spec.ts" time="0.64">
</testcase>
</testsuite>
<testsuite name="pull-request-action-refusals.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="24" failures="0" skipped="0" time="19.017" errors="0">
<testcase name="Close explains a refusal from the server code › already_merged: the row reads Merged and a polite toast says so" classname="pull-request-action-refusals.spec.ts" time="1.295">
</testcase>
<testcase name="Close explains a refusal from the server code › already_closed: the row reads Closed" classname="pull-request-action-refusals.spec.ts" time="0.715">
</testcase>
<testcase name="Close explains a refusal from the server code › an earlier failure line clears once the PR is found merged" classname="pull-request-action-refusals.spec.ts" time="1.166">
</testcase>
<testcase name="Close explains a refusal from the server code › rate_limited: locks with no Retry and says when it resets, from resetsAt" classname="pull-request-action-refusals.spec.ts" time="1.393">
</testcase>
<testcase name="Close explains a refusal from the server code › permission: locks with no Retry and points to Settings" classname="pull-request-action-refusals.spec.ts" time="0.803">
</testcase>
<testcase name="Close explains a refusal from the server code › unknown: shows the forge text and keeps the action clickable" classname="pull-request-action-refusals.spec.ts" time="1.402">
</testcase>
<testcase name="Close explains a refusal from the server code › a refusal with no code is treated as unknown and never says only &quot;failed&quot;" classname="pull-request-action-refusals.spec.ts" time="0.766">
</testcase>
<testcase name="Update branch explains a refusal from the server code › already_merged: the row reads Merged and a polite toast says so" classname="pull-request-action-refusals.spec.ts" time="0.434">
</testcase>
<testcase name="Update branch explains a refusal from the server code › rate_limited: locks with no Retry and says when it resets, from resetsAt" classname="pull-request-action-refusals.spec.ts" time="1.054">
</testcase>
<testcase name="Update branch explains a refusal from the server code › unknown: shows the forge text and keeps the action clickable" classname="pull-request-action-refusals.spec.ts" time="0.468">
</testcase>
<testcase name="Update branch explains a refusal from the server code › conflict: the server reason shows and the action locks" classname="pull-request-action-refusals.spec.ts" time="1.032">
</testcase>
<testcase name="Enable auto-merge explains a refusal from the server code › already_merged: the row reads Merged and a polite toast says so" classname="pull-request-action-refusals.spec.ts" time="0.643">
</testcase>
<testcase name="Enable auto-merge explains a refusal from the server code › rate_limited: locks with no Retry and says when it resets, from resetsAt" classname="pull-request-action-refusals.spec.ts" time="1.107">
</testcase>
<testcase name="Enable auto-merge explains a refusal from the server code › unknown: shows the forge text and keeps the action clickable" classname="pull-request-action-refusals.spec.ts" time="0.506">
</testcase>
<testcase name="Enable auto-merge explains a refusal from the server code › auto_merge_not_allowed: the server reason shows and the action locks" classname="pull-request-action-refusals.spec.ts" time="0.466">
</testcase>
<testcase name="Dependabot: Rebase explains a refusal from the server code › already_merged: the row reads Merged and a polite toast says so" classname="pull-request-action-refusals.spec.ts" time="0.508">
</testcase>
<testcase name="Dependabot: Rebase explains a refusal from the server code › rate_limited: locks with no Retry and says when it resets, from resetsAt" classname="pull-request-action-refusals.spec.ts" time="1.109">
</testcase>
<testcase name="Dependabot: Rebase explains a refusal from the server code › unknown: shows the forge text and keeps the action clickable" classname="pull-request-action-refusals.spec.ts" time="0.555">
</testcase>
<testcase name="Renovate: Rebase explains a refusal from the server code › already_merged: the row reads Merged and a polite toast says so" classname="pull-request-action-refusals.spec.ts" time="0.501">
</testcase>
<testcase name="Renovate: Rebase explains a refusal from the server code › rate_limited: locks with no Retry and says when it resets, from resetsAt" classname="pull-request-action-refusals.spec.ts" time="1.117">
</testcase>
<testcase name="Renovate: Rebase explains a refusal from the server code › unknown: shows the forge text and keeps the action clickable" classname="pull-request-action-refusals.spec.ts" time="0.505">
</testcase>
<testcase name="Renovate: Rebase explains a refusal from the server code › label_missing: the server reason shows and the action locks" classname="pull-request-action-refusals.spec.ts" time="0.49">
</testcase>
<testcase name="Enable auto-merge with a transient refusal › checks_pending keeps the button clickable: trying again once checks settle can work" classname="pull-request-action-refusals.spec.ts" time="0.523">
</testcase>
<testcase name="Enable auto-merge with a transient refusal › ready_to_merge points to Merge and locks" classname="pull-request-action-refusals.spec.ts" time="0.459">
</testcase>
</testsuite>
<testsuite name="pull-request-auto-merge.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="10" failures="0" skipped="0" time="2.959" errors="0">
<testcase name="pull request Enable auto-merge action › a GitHub pull request with checks still pending shows the button — this is the case auto-merge exists for" classname="pull-request-auto-merge.spec.ts" time="0.21">
</testcase>
<testcase name="pull request Enable auto-merge action › a pull request GitHub will not let auto-merge shows no button, and the rest of the row stays (#738)" classname="pull-request-auto-merge.spec.ts" time="0.801">
</testcase>
<testcase name="pull request Enable auto-merge action › a pull request GitHub reports auto-merge as allowed shows the button as before (#738)" classname="pull-request-auto-merge.spec.ts" time="0.196">
</testcase>
<testcase name="pull request Enable auto-merge action › a Forgejo pull request offers the button too, since this app holds that intent itself" classname="pull-request-auto-merge.spec.ts" time="0.204">
</testcase>
<testcase name="pull request Enable auto-merge action › a pull request already auto-merging shows no button — the Auto-merge pill already says so" classname="pull-request-auto-merge.spec.ts" time="0.238">
</testcase>
<testcase name="pull request Enable auto-merge action › a genuinely conflicting pull request shows no button — arming auto-merge could never succeed" classname="pull-request-auto-merge.spec.ts" time="0.208">
</testcase>
<testcase name="pull request Enable auto-merge action › a pull request that is already mergeable with green checks shows no button — there is nothing left to wait for (#662)" classname="pull-request-auto-merge.spec.ts" time="0.154">
</testcase>
<testcase name="pull request Enable auto-merge action › clicking calls the API immediately, with no confirm step" classname="pull-request-auto-merge.spec.ts" time="0.226">
</testcase>
<testcase name="pull request Enable auto-merge action › the Auto-merge pill appears once enabled, without a page reload" classname="pull-request-auto-merge.spec.ts" time="0.284">
</testcase>
<testcase name="pull request Enable auto-merge action › shows an in-progress status while enabling, then a success status" classname="pull-request-auto-merge.spec.ts" time="0.438">
</testcase>
</testsuite>
<testsuite name="pull-request-checks.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="21" failures="0" skipped="0" time="6.62" errors="0">
<testcase name="pull request pipeline checks panel › a pull request with CI reported shows the View pipeline button inline, not behind More actions" classname="pull-request-checks.spec.ts" time="0.151">
</testcase>
<testcase name="pull request pipeline checks panel › a pull request with no CI at all shows no button" classname="pull-request-checks.spec.ts" time="0.159">
</testcase>
<testcase name="pull request pipeline checks panel › clicking View pipeline requests checks for that exact pull request and lists them" classname="pull-request-checks.spec.ts" time="0.222">
</testcase>
<testcase name="pull request pipeline checks panel › a skipped check shows its status but no &quot;View run&quot; link" classname="pull-request-checks.spec.ts" time="0.231">
</testcase>
<testcase name="pull request pipeline checks panel › a check with no URL (a legacy commit status set with no target_url) shows no &quot;View run&quot; link" classname="pull-request-checks.spec.ts" time="0.24">
</testcase>
<testcase name="pull request pipeline checks panel › no checks at all shows a plain &quot;no CI configured&quot; message" classname="pull-request-checks.spec.ts" time="0.231">
</testcase>
<testcase name="pull request pipeline checks panel › checks with a known required flag are grouped Required first, then Advisory" classname="pull-request-checks.spec.ts" time="0.254">
</testcase>
<testcase name="pull request pipeline checks panel › a failing required check is flagged &quot;Blocking&quot; in text, an advisory failure is not" classname="pull-request-checks.spec.ts" time="0.244">
</testcase>
<testcase name="pull request pipeline checks panel › with no known required flag on any check the flat list shows unchanged" classname="pull-request-checks.spec.ts" time="0.224">
</testcase>
<testcase name="pull request pipeline checks panel › checks of unknown required status sit apart from known groups, never in Advisory" classname="pull-request-checks.spec.ts" time="0.251">
</testcase>
<testcase name="pull request pipeline checks panel › a failed check shows its failed step, how long it ran and the log excerpt as plain text" classname="pull-request-checks.spec.ts" time="0.633">
</testcase>
<testcase name="pull request pipeline checks panel › a failing GitHub pull request offers &quot;Rerun failed checks&quot;, which posts for that pull request and shows a queued state" classname="pull-request-checks.spec.ts" time="0.63">
</testcase>
<testcase name="pull request pipeline checks panel › a failing Forgejo pull request offers &quot;Rerun failed checks&quot; too, and a pull request with nothing to rerun shows the forge reason" classname="pull-request-checks.spec.ts" time="0.369">
</testcase>
<testcase name="pull request pipeline checks panel › a refused rerun shows the reason in the panel and leaves the button to try again" classname="pull-request-checks.spec.ts" time="0.298">
</testcase>
<testcase name="pull request pipeline checks panel › no &quot;Rerun failed checks&quot; where the server does not offer it" classname="pull-request-checks.spec.ts" time="0.232">
</testcase>
<testcase name="pull request pipeline checks panel › the grouped panel has no axe-core violations and Escape still closes it" classname="pull-request-checks.spec.ts" time="0.65">
</testcase>
<testcase name="pull request pipeline checks panel › at phone width the grouped panel is a bottom sheet, traps focus and has no axe-core violations" classname="pull-request-checks.spec.ts" time="0.656">
</testcase>
<testcase name="pull request pipeline checks panel › a failed fetch shows an error and a Retry that re-fetches" classname="pull-request-checks.spec.ts" time="0.287">
</testcase>
<testcase name="pull request pipeline checks panel › Escape closes the panel and returns focus to the row button" classname="pull-request-checks.spec.ts" time="0.219">
</testcase>
<testcase name="pull request pipeline checks panel › the close button closes the panel" classname="pull-request-checks.spec.ts" time="0.223">
</testcase>
<testcase name="pull request pipeline checks panel › the open panel is reachable by keyboard" classname="pull-request-checks.spec.ts" time="0.216">
</testcase>
</testsuite>
<testsuite name="pull-request-close.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="16" failures="0" skipped="0" time="6.935" errors="0">
<testcase name="pull request close button › Close is not a standalone row button, even when the pull request cannot be merged" classname="pull-request-close.spec.ts" time="0.153">
</testcase>
<testcase name="pull request close button › a pull request that cannot be merged still offers Close in More actions" classname="pull-request-close.spec.ts" time="0.251">
</testcase>
<testcase name="pull request close button › an empty pull request gets no special colour on Close" classname="pull-request-close.spec.ts" time="0.203">
</testcase>
<testcase name="pull request close button › clicking Close arms a confirm step instead of closing immediately" classname="pull-request-close.spec.ts" time="0.242">
</testcase>
<testcase name="pull request close button › clicking Close moves keyboard focus to the new Confirm close button" classname="pull-request-close.spec.ts" time="0.236">
</testcase>
<testcase name="pull request close button › Cancel returns to the plain Close button without calling the API" classname="pull-request-close.spec.ts" time="0.273">
</testcase>
<testcase name="pull request close button › the menu stays open while Close is being confirmed" classname="pull-request-close.spec.ts" time="0.23">
</testcase>
<testcase name="pull request close button › Escape drops the pending confirm and keeps the menu; a second Escape closes it" classname="pull-request-close.spec.ts" time="0.285">
</testcase>
<testcase name="pull request close button › confirm close has no axe-core violations inside the open menu" classname="pull-request-close.spec.ts" time="0.775">
</testcase>
<testcase name="pull request close button › confirming calls the close API with forge/fullName/number and refreshes the board" classname="pull-request-close.spec.ts" time="0.5">
</testcase>
<testcase name="pull request close button › confirming closes the menu so the refreshed board is not held back, and focus returns to the trigger" classname="pull-request-close.spec.ts" time="0.487">
</testcase>
<testcase name="pull request close button › shows an in-progress status while closing, then a success status" classname="pull-request-close.spec.ts" time="0.821">
</testcase>
<testcase name="pull request close button › a rejected close shows the forge&apos;s own reason, and returns to a re-clickable Close button" classname="pull-request-close.spec.ts" time="0.578">
</testcase>
<testcase name="pull request close button › a delayed menu-open frame does not pull focus off the item the user reached" classname="pull-request-close.spec.ts" time="0.212">
</testcase>
<testcase name="pull request close button › a delayed menu-open frame does not pull focus off a locked Close" classname="pull-request-close.spec.ts" time="0.544">
</testcase>
<testcase name="pull request close button › a refused Close shows a visible lock cue on the row without opening the menu" classname="pull-request-close.spec.ts" time="1.145">
</testcase>
</testsuite>
<testsuite name="pull-request-confirm.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="26" failures="0" skipped="0" time="13.289" errors="0">
<testcase name="confirm step: leaving it › Cancel has a 44px hit area and returns the row to idle without a request" classname="pull-request-confirm.spec.ts" time="0.436">
</testcase>
<testcase name="confirm step: leaving it › a click on another row’s Merge disarms the first and still arms the second on that one click" classname="pull-request-confirm.spec.ts" time="0.421">
</testcase>
<testcase name="confirm step: leaving it › a click on the page background disarms" classname="pull-request-confirm.spec.ts" time="0.426">
</testcase>
<testcase name="confirm step: leaving it › a click on another button does what that button does, and disarms" classname="pull-request-confirm.spec.ts" time="0.441">
</testcase>
<testcase name="confirm step: leaving it › Escape disarms Merge and returns focus to the Merge button" classname="pull-request-confirm.spec.ts" time="0.422">
</testcase>
<testcase name="confirm step: leaving it › Escape on an armed Close disarms it, keeps the menu and focuses Close; a second Escape closes the menu" classname="pull-request-confirm.spec.ts" time="0.423">
</testcase>
<testcase name="confirm step: leaving it › Cancel on an armed Close returns focus to Close inside the open menu" classname="pull-request-confirm.spec.ts" time="0.497">
</testcase>
<testcase name="confirm step: leaving it › a click outside the open menu disarms an armed Close" classname="pull-request-confirm.spec.ts" time="0.483">
</testcase>
<testcase name="confirm step: timeout › disarms itself after 8 seconds, with a countdown line hidden from screen readers" classname="pull-request-confirm.spec.ts" time="0.41">
</testcase>
<testcase name="confirm step: timeout › keyboard focus inside the group pauses the countdown" classname="pull-request-confirm.spec.ts" time="0.38">
</testcase>
<testcase name="confirm step: timeout › hover inside the group pauses the countdown, and leaving resumes it" classname="pull-request-confirm.spec.ts" time="0.477">
</testcase>
<testcase name="confirm step: timeout › a timeout releases a snapshot the armed row was holding back" classname="pull-request-confirm.spec.ts" time="0.453">
</testcase>
<testcase name="confirm step: one at a time and the double-click guard › arming Close in one row disarms Merge in another" classname="pull-request-confirm.spec.ts" time="0.575">
</testcase>
<testcase name="confirm step: one at a time and the double-click guard › a double-click on Merge arms but does not merge" classname="pull-request-confirm.spec.ts" time="0.415">
</testcase>
<testcase name="confirm step: one at a time and the double-click guard › a double-click on Close arms but does not close" classname="pull-request-confirm.spec.ts" time="0.438">
</testcase>
<testcase name="confirm step: one at a time and the double-click guard › Confirm still merges once the guard has passed" classname="pull-request-confirm.spec.ts" time="0.662">
</testcase>
<testcase name="confirm step: one at a time and the double-click guard › a repeated Enter on the focused Merge does not merge" classname="pull-request-confirm.spec.ts" time="0.352">
</testcase>
<testcase name="confirm step: state outside the DOM › an armed row survives a snapshot, and the held update lands when it disarms" classname="pull-request-confirm.spec.ts" time="0.405">
</testcase>
<testcase name="confirm step: state outside the DOM › an armed row survives the board being rebuilt" classname="pull-request-confirm.spec.ts" time="0.397">
</testcase>
<testcase name="confirm step: state outside the DOM › the armed state is dropped when its pull request leaves the board" classname="pull-request-confirm.spec.ts" time="0.418">
</testcase>
<testcase name="confirm step: screen readers › arming announces once, politely, and cancelling adds nothing" classname="pull-request-confirm.spec.ts" time="0.472">
</testcase>
<testcase name="confirm step: screen readers › arming Close announces the close wording" classname="pull-request-confirm.spec.ts" time="0.483">
</testcase>
<testcase name="confirm step: screen readers › an armed Merge and Close show how to back out, and the hint is not announced (#767)" classname="pull-request-confirm.spec.ts" time="1.08">
</testcase>
<testcase name="confirm step: screen readers › the hint fits a 390px phone without a horizontal scroll (#767)" classname="pull-request-confirm.spec.ts" time="0.404">
</testcase>
<testcase name="confirm step: screen readers › an armed Merge row has no axe-core violations" classname="pull-request-confirm.spec.ts" time="0.95">
</testcase>
<testcase name="confirm step: screen readers › an armed Close in the open menu has no axe-core violations" classname="pull-request-confirm.spec.ts" time="0.969">
</testcase>
</testsuite>
<testsuite name="pull-request-dependabot-action.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="20" failures="0" skipped="0" time="15.88" errors="0">
<testcase name="pull request Dependabot rebase/recreate buttons › a Dependabot-authored GitHub pull request shows both buttons" classname="pull-request-dependabot-action.spec.ts" time="0.393">
</testcase>
<testcase name="pull request Dependabot rebase/recreate buttons › the dependabot[bot] REST-fallback author form also shows both buttons" classname="pull-request-dependabot-action.spec.ts" time="0.404">
</testcase>
<testcase name="pull request Dependabot rebase/recreate buttons › a pull request not authored by Dependabot shows neither button" classname="pull-request-dependabot-action.spec.ts" time="0.384">
</testcase>
<testcase name="pull request Dependabot rebase/recreate buttons › a Dependabot-authored pull request on Forgejo shows no button — Dependabot only runs on GitHub" classname="pull-request-dependabot-action.spec.ts" time="0.389">
</testcase>
<testcase name="pull request Dependabot rebase/recreate buttons › clicking Rebase posts the exact rebase action, with no confirm step" classname="pull-request-dependabot-action.spec.ts" time="0.421">
</testcase>
<testcase name="pull request Dependabot rebase/recreate buttons › clicking Recreate posts the exact recreate action" classname="pull-request-dependabot-action.spec.ts" time="0.422">
</testcase>
<testcase name="pull request Dependabot rebase/recreate buttons › shows a queued status while requesting, which holds until the next refresh" classname="pull-request-dependabot-action.spec.ts" time="0.747">
</testcase>
<testcase name="pull request Dependabot rebase/recreate buttons › a queued action names itself and hides what it makes pointless › Recreate queued hides Rebase (in More actions) and reads Recreate requested" classname="pull-request-dependabot-action.spec.ts" time="0.471">
</testcase>
<testcase name="pull request Dependabot rebase/recreate buttons › a queued action names itself and hides what it makes pointless › Recreate queued hides Rebase (promoted inline) and reads Recreate requested" classname="pull-request-dependabot-action.spec.ts" time="0.535">
</testcase>
<testcase name="pull request Dependabot rebase/recreate buttons › a queued action names itself and hides what it makes pointless › Rebase queued keeps Recreate available" classname="pull-request-dependabot-action.spec.ts" time="0.491">
</testcase>
<testcase name="pull request Dependabot rebase/recreate buttons › a queued action names itself and hides what it makes pointless › once the bot has acted, Rebase comes back" classname="pull-request-dependabot-action.spec.ts" time="6.725">
</testcase>
<testcase name="pull request Dependabot rebase/recreate buttons › a transient failure shows an error and re-enables the button for another try" classname="pull-request-dependabot-action.spec.ts" time="0.476">
</testcase>
<testcase name="pull request Dependabot rebase/recreate buttons › a permission-denied failure locks the button for good instead of inviting another try" classname="pull-request-dependabot-action.spec.ts" time="0.474">
</testcase>
<testcase name="pull request Dependabot rebase/recreate buttons › a permission failure on Rebase locks Rebase only, and Recreate stays usable (#918)" classname="pull-request-dependabot-action.spec.ts" time="0.456">
</testcase>
<testcase name="pull request Dependabot rebase/recreate buttons › a rate-limited (429) failure locks the button for good" classname="pull-request-dependabot-action.spec.ts" time="0.471">
</testcase>
<testcase name="pull request Dependabot rebase/recreate buttons › promoted onto the row when out of date › a behind Dependabot pull request shows Rebase inline, with Recreate still behind More actions" classname="pull-request-dependabot-action.spec.ts" time="0.409">
</testcase>
<testcase name="pull request Dependabot rebase/recreate buttons › promoted onto the row when out of date › clicking the promoted Rebase button posts the same rebase action" classname="pull-request-dependabot-action.spec.ts" time="0.389">
</testcase>
<testcase name="pull request Dependabot rebase/recreate buttons › promoted onto the row when out of date › an empty, behind Dependabot pull request keeps both buttons behind More actions" classname="pull-request-dependabot-action.spec.ts" time="0.37">
</testcase>
<testcase name="pull request Dependabot rebase/recreate buttons › a locked button is reachable by keyboard and has no axe-core violations" classname="pull-request-dependabot-action.spec.ts" time="1.045">
</testcase>
<testcase name="pull request Dependabot rebase/recreate buttons › a GitHub App with no personal token locks both buttons with the reason, and clicking sends nothing (#666)" classname="pull-request-dependabot-action.spec.ts" time="0.408">
</testcase>
</testsuite>
<testsuite name="pull-request-merge-refusal.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="6" failures="0" skipped="0" time="2.925" errors="0">
<testcase name="a refused merge explains itself from the server code › already_merged: the row reads Merged, a polite toast says so, and the row is gone on the next snapshot" classname="pull-request-merge-refusal.spec.ts" time="0.501">
</testcase>
<testcase name="a refused merge explains itself from the server code › already_merged: the row drops off straight away when the refresh shows it gone" classname="pull-request-merge-refusal.spec.ts" time="0.261">
</testcase>
<testcase name="a refused merge explains itself from the server code › blocked_by_protection: the server reason shows and Merge is locked until a re-check" classname="pull-request-merge-refusal.spec.ts" time="0.494">
</testcase>
<testcase name="a refused merge explains itself from the server code › rate_limited: locks Merge with no Retry and says when it resets, from resetsAt" classname="pull-request-merge-refusal.spec.ts" time="0.303">
</testcase>
<testcase name="a refused merge explains itself from the server code › unknown: shows the forge text and keeps Merge clickable" classname="pull-request-merge-refusal.spec.ts" time="0.275">
</testcase>
<testcase name="a refused merge explains itself from the server code › a refused row has no axe-core violations" classname="pull-request-merge-refusal.spec.ts" time="1.091">
</testcase>
</testsuite>
<testsuite name="pull-request-merge-states.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="8" failures="0" skipped="0" time="3.253" errors="0">
<testcase name="Merge states on a pull request row › a blocked Merge is locked with the visible reason, described to assistive tech, focusable and inert" classname="pull-request-merge-states.spec.ts" time="0.227">
</testcase>
<testcase name="Merge states on a pull request row › ready: Merge is clickable and no reason is shown" classname="pull-request-merge-states.spec.ts" time="0.231">
</testcase>
<testcase name="Merge states on a pull request row › blocked Merge: Close is only in More actions" classname="pull-request-merge-states.spec.ts" time="0.224">
</testcase>
<testcase name="Merge states on a pull request row › ready: Close is in More actions, beside the Hide items" classname="pull-request-merge-states.spec.ts" time="0.206">
</testcase>
<testcase name="Merge states on a pull request row › a Renovate pull request waiting on CI keeps its bot layout, with Merge locked and Close in More actions" classname="pull-request-merge-states.spec.ts" time="0.189">
</testcase>
<testcase name="Merge states on a pull request row › blocked: no axe-core violations" classname="pull-request-merge-states.spec.ts" time="0.717">
</testcase>
<testcase name="Merge states on a pull request row › ready: no axe-core violations" classname="pull-request-merge-states.spec.ts" time="0.722">
</testcase>
<testcase name="Merge states on a pull request row › axe-core finds nothing with the overflow menu open on a waiting row" classname="pull-request-merge-states.spec.ts" time="0.737">
</testcase>
</testsuite>
<testsuite name="pull-request-merge.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="29" failures="0" skipped="0" time="11.776" errors="0">
<testcase name="pull request merge button › a mergeable pull request shows a Merge button" classname="pull-request-merge.spec.ts" time="0.221">
</testcase>
<testcase name="pull request merge button › a conflicting pull request shows a locked Merge button, not a clickable one" classname="pull-request-merge.spec.ts" time="0.218">
</testcase>
<testcase name="pull request merge button › a blocked pull request shows a locked Merge button, not a clickable one" classname="pull-request-merge.spec.ts" time="0.208">
</testcase>
<testcase name="pull request merge button › a mergeable pull request whose CI is still running shows a locked Merge button" classname="pull-request-merge.spec.ts" time="0.207">
</testcase>
<testcase name="pull request merge button › the Merge button unlocks once CI resolves, without a page reload" classname="pull-request-merge.spec.ts" time="0.276">
</testcase>
<testcase name="pull request merge button › a mergeable pull request whose CI already succeeded still shows a Merge button" classname="pull-request-merge.spec.ts" time="0.207">
</testcase>
<testcase name="pull request merge button › a mergeable pull request whose CI failed still shows a Merge button — unchanged, deliberately out of scope for #385" classname="pull-request-merge.spec.ts" time="0.216">
</testcase>
<testcase name="pull request merge button › an empty pull request has no Merge, and says why in its status area" classname="pull-request-merge.spec.ts" time="0.233">
</testcase>
<testcase name="pull request merge button › clicking Merge arms a confirm step instead of merging immediately" classname="pull-request-merge.spec.ts" time="0.255">
</testcase>
<testcase name="pull request merge button › clicking Merge moves keyboard focus to the new Confirm merge button" classname="pull-request-merge.spec.ts" time="0.253">
</testcase>
<testcase name="pull request merge button › a pull request being confirmed for merge stays in place even if a live refresh reorders the board" classname="pull-request-merge.spec.ts" time="0.338">
</testcase>
<testcase name="pull request merge button › Cancel returns to the plain Merge button without calling the API" classname="pull-request-merge.spec.ts" time="0.279">
</testcase>
<testcase name="pull request merge button › confirming calls the merge API with forge/fullName/number and refreshes the board" classname="pull-request-merge.spec.ts" time="0.332">
</testcase>
<testcase name="pull request merge button › shows an in-progress status while merging, then a success status" classname="pull-request-merge.spec.ts" time="0.712">
</testcase>
<testcase name="pull request merge button › a raw network failure whose refresh confirms the merge went through reports success, not a false failure" classname="pull-request-merge.spec.ts" time="0.306">
</testcase>
<testcase name="pull request merge button › a raw network failure whose refresh shows the pull request still there reports the real failure" classname="pull-request-merge.spec.ts" time="0.555">
</testcase>
<testcase name="pull request merge button › a transient failure shows an error and returns to a re-clickable Merge button" classname="pull-request-merge.spec.ts" time="0.57">
</testcase>
<testcase name="pull request merge button › a permission-denied failure locks the button with no Retry and points to Settings" classname="pull-request-merge.spec.ts" time="0.545">
</testcase>
<testcase name="pull request merge button › a not-mergeable (409) failure locks the button with a refresh-and-recheck reason" classname="pull-request-merge.spec.ts" time="0.365">
</testcase>
<testcase name="pull request merge button › a 409 caused by a disallowed merge method shows the real forge message, not a generic &quot;no longer mergeable&quot; guess" classname="pull-request-merge.spec.ts" time="0.346">
</testcase>
<testcase name="pull request merge button › a rate-limited (429) failure locks the button with no Retry and says when it resets" classname="pull-request-merge.spec.ts" time="0.542">
</testcase>
<testcase name="pull request merge button › clicking Retry re-fetches the dashboard, and a stale lock clears once the fresh data no longer justifies it" classname="pull-request-merge.spec.ts" time="0.606">
</testcase>
<testcase name="pull request merge button › a locked Merge button is reachable by keyboard and has no axe-core violations" classname="pull-request-merge.spec.ts" time="1.128">
</testcase>
<testcase name="pull request merge button › has no axe-core violations with a toast showing" classname="pull-request-merge.spec.ts" time="1.305">
</testcase>
<testcase name="pull request merge button › proactive locking, before any click › a mergeable PR on an unreachable forge draws no Merge button, Retry or pointer to a status line, and one banner says why (#1199)" classname="pull-request-merge.spec.ts" time="0.229">
</testcase>
<testcase name="pull request merge button › proactive locking, before any click › a behind PR on an unreachable forge draws no action, and the banner holds the one Retry (#516, #609, #1199)" classname="pull-request-merge.spec.ts" time="0.233">
</testcase>
<testcase name="pull request merge button › proactive locking, before any click › a mergeable PR on a forge with an exhausted rate-limit budget draws no Merge button (#755)" classname="pull-request-merge.spec.ts" time="0.242">
</testcase>
<testcase name="pull request merge button › proactive locking, before any click › a permission failure on one PR does not lock Merge for a different PR on the same forge (#918)" classname="pull-request-merge.spec.ts" time="0.63">
</testcase>
<testcase name="pull request merge button › the Merge button clears a comfortable target size, not just the bare WCAG 2.5.8 floor" classname="pull-request-merge.spec.ts" time="0.219">
</testcase>
</testsuite>
<testsuite name="pull-request-renovate-rebase.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="15" failures="0" skipped="0" time="4.388" errors="0">
<testcase name="pull request Renovate rebase button › a Renovate-authored GitHub pull request shows the button" classname="pull-request-renovate-rebase.spec.ts" time="0.202">
</testcase>
<testcase name="pull request Renovate rebase button › a Renovate-authored Forgejo pull request also shows the button — Renovate runs on both forges" classname="pull-request-renovate-rebase.spec.ts" time="0.192">
</testcase>
<testcase name="pull request Renovate rebase button › the renovate GitHub App author form (bare GraphQL slug) also shows the button" classname="pull-request-renovate-rebase.spec.ts" time="0.206">
</testcase>
<testcase name="pull request Renovate rebase button › a pull request not authored by Renovate shows no button" classname="pull-request-renovate-rebase.spec.ts" time="0.206">
</testcase>
<testcase name="pull request Renovate rebase button › clicking calls the API immediately, with no confirm step" classname="pull-request-renovate-rebase.spec.ts" time="0.239">
</testcase>
<testcase name="pull request Renovate rebase button › shows a queued status while requesting, which holds until the next refresh" classname="pull-request-renovate-rebase.spec.ts" time="0.552">
</testcase>
<testcase name="pull request Renovate rebase button › an already-ticked checkbox reads as requested, not as a failure" classname="pull-request-renovate-rebase.spec.ts" time="0.271">
</testcase>
<testcase name="pull request Renovate rebase button › a transient failure shows an error and re-enables the button for another try" classname="pull-request-renovate-rebase.spec.ts" time="0.279">
</testcase>
<testcase name="pull request Renovate rebase button › a 404 (the configured label doesn&apos;t exist) locks the button with its own reason" classname="pull-request-renovate-rebase.spec.ts" time="0.29">
</testcase>
<testcase name="pull request Renovate rebase button › a permission-denied failure locks the button for good instead of inviting another try" classname="pull-request-renovate-rebase.spec.ts" time="0.273">
</testcase>
<testcase name="pull request Renovate rebase button › a rate-limited (429) failure locks the button for good" classname="pull-request-renovate-rebase.spec.ts" time="0.271">
</testcase>
<testcase name="pull request Renovate rebase button › promoted onto the row when out of date › a behind Renovate pull request shows Rebase inline, not behind More actions" classname="pull-request-renovate-rebase.spec.ts" time="0.168">
</testcase>
<testcase name="pull request Renovate rebase button › promoted onto the row when out of date › clicking the promoted Rebase button posts the same request" classname="pull-request-renovate-rebase.spec.ts" time="0.182">
</testcase>
<testcase name="pull request Renovate rebase button › promoted onto the row when out of date › an empty, behind Renovate pull request keeps the button behind More actions" classname="pull-request-renovate-rebase.spec.ts" time="0.188">
</testcase>
<testcase name="pull request Renovate rebase button › a locked button is reachable by keyboard and has no axe-core violations" classname="pull-request-renovate-rebase.spec.ts" time="0.869">
</testcase>
</testsuite>
<testsuite name="pull-request-status-area.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="5" failures="0" skipped="0" time="2.103" errors="0">
<testcase name="the status area on a pull request row (#1375) › an empty pull request offers Close and no Merge, and says why in words" classname="pull-request-status-area.spec.ts" time="0.213">
</testcase>
<testcase name="the status area on a pull request row (#1375) › a pull request waiting on CI keeps its reason in the status area, not beside the button" classname="pull-request-status-area.spec.ts" time="0.179">
</testcase>
<testcase name="the status area on a pull request row (#1375) › a pull request nothing holds back has no status area" classname="pull-request-status-area.spec.ts" time="0.159">
</testcase>
<testcase name="the status area on a pull request row (#1375) › has no axe-core violations on desktop, and the area stays inside its row" classname="pull-request-status-area.spec.ts" time="0.81">
</testcase>
<testcase name="the status area on a pull request row (#1375) › has no axe-core violations on a 360px phone, and the area stays inside its row" classname="pull-request-status-area.spec.ts" time="0.742">
</testcase>
</testsuite>
<testsuite name="pull-request-update-branch.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="16" failures="0" skipped="0" time="4.57" errors="0">
<testcase name="pull request update-branch button › a pull request reported as behind shows an Update branch button" classname="pull-request-update-branch.spec.ts" time="0.19">
</testcase>
<testcase name="pull request update-branch button › a behind PR with no other merge problem shows the Update-branch button but no Blocked pill" classname="pull-request-update-branch.spec.ts" time="0.173">
</testcase>
<testcase name="pull request update-branch button › a behind PR with merge conflicts shows no active Update branch button, only the reason" classname="pull-request-update-branch.spec.ts" time="0.73">
</testcase>
<testcase name="pull request update-branch button › clicking calls the API immediately, with no confirm step, and refreshes the board" classname="pull-request-update-branch.spec.ts" time="0.186">
</testcase>
<testcase name="pull request update-branch button › shows a queued status while updating, then a success status" classname="pull-request-update-branch.spec.ts" time="0.497">
</testcase>
<testcase name="pull request update-branch button › a 202 (scheduled as a background job) is treated as success, not a failure" classname="pull-request-update-branch.spec.ts" time="0.198">
</testcase>
<testcase name="pull request update-branch button › a 202 whose immediate refresh still reports it behind keeps showing &quot;Queued…&quot;, not a fresh re-clickable button" classname="pull-request-update-branch.spec.ts" time="0.21">
</testcase>
<testcase name="pull request update-branch button › once a later refresh confirms the branch caught up, the button clears and the status reports success" classname="pull-request-update-branch.spec.ts" time="0.25">
</testcase>
<testcase name="pull request update-branch button › a Retry button reads as clickable, not as another dead end" classname="pull-request-update-branch.spec.ts" time="0.238">
</testcase>
<testcase name="pull request update-branch button › clicking Retry re-fetches the dashboard, and a stale lock clears once the fresh data no longer justifies it" classname="pull-request-update-branch.spec.ts" time="0.376">
</testcase>
<testcase name="pull request update-branch button › a locked Update branch button is reachable by keyboard" classname="pull-request-update-branch.spec.ts" time="0.266">
</testcase>
<testcase name="pull request update-branch button › bot-managed PRs › a behind release-please PR (autorelease label) shows Update branch (#728)" classname="pull-request-update-branch.spec.ts" time="0.182">
</testcase>
<testcase name="pull request update-branch button › bot-managed PRs › a conflicting release-please PR shows the locked Update branch button (#728, #701)" classname="pull-request-update-branch.spec.ts" time="0.152">
</testcase>
<testcase name="pull request update-branch button › proactive locking, before any click › a behind PR on an unreachable forge draws no Update branch button, and no Retry or pointer to a status line (#1199)" classname="pull-request-update-branch.spec.ts" time="0.209">
</testcase>
<testcase name="pull request update-branch button › proactive locking, before any click › a behind PR on a forge with an exhausted rate-limit budget draws no Update branch button (#755)" classname="pull-request-update-branch.spec.ts" time="0.179">
</testcase>
<testcase name="pull request update-branch button › proactive locking, before any click › a permission failure on Merge for one PR does not lock Update branch for a different PR on the same forge (#918)" classname="pull-request-update-branch.spec.ts" time="0.534">
</testcase>
</testsuite>
<testsuite name="queued-action-feedback.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="19" failures="0" skipped="0" time="17.725" errors="0">
<testcase name="queued state: Update branch › the button reads Queued… and is disabled right after the click, only one request is sent, and a menu closes with focus on its trigger" classname="queued-action-feedback.spec.ts" time="0.589">
</testcase>
<testcase name="queued state: Update branch › the queued button is aria-disabled, keeps focus across the re-render, ignores clicks and passes axe" classname="queued-action-feedback.spec.ts" time="1.21">
</testcase>
<testcase name="queued state: Update branch › the row says the action is waiting, with no banner" classname="queued-action-feedback.spec.ts" time="0.205">
</testcase>
<testcase name="queued state: Update branch › the countdown runs down to the real next poll" classname="queued-action-feedback.spec.ts" time="0.209">
</testcase>
<testcase name="queued state: Update branch › a toast confirms the request and Activity lists it as queued" classname="queued-action-feedback.spec.ts" time="1.059">
</testcase>
<testcase name="queued state: Update branch › the countdown is outside the live region, so it does not chatter" classname="queued-action-feedback.spec.ts" time="1.005">
</testcase>
<testcase name="queued state: Update branch › the queued state survives the re-render that follows the request completing" classname="queued-action-feedback.spec.ts" time="0.572">
</testcase>
<testcase name="queued state: Update branch › the chip survives well past a second and an unrelated stream push" classname="queued-action-feedback.spec.ts" time="0.51">
</testcase>
<testcase name="queued state: Update branch › the row says Refreshing… rather than vanishing when the countdown hits zero" classname="queued-action-feedback.spec.ts" time="0.98">
</testcase>
<testcase name="queued state: Update branch › a failure re-enables the button, fails the row line and raises an error toast" classname="queued-action-feedback.spec.ts" time="0.543">
</testcase>
<testcase name="queued state: Update branch › has no axe violations while queued" classname="queued-action-feedback.spec.ts" time="0.792">
</testcase>
<testcase name="queued state: Dependabot rebase › the button reads Queued… and is disabled right after the click, only one request is sent, and a menu closes with focus on its trigger" classname="queued-action-feedback.spec.ts" time="0.672">
</testcase>
<testcase name="queued state: Dependabot rebase › the row says the action is waiting, with no banner" classname="queued-action-feedback.spec.ts" time="0.255">
</testcase>
<testcase name="queued state: Dependabot rebase › a failure re-enables the button, fails the row line and raises an error toast" classname="queued-action-feedback.spec.ts" time="0.56">
</testcase>
<testcase name="queued state: Renovate rebase › the button reads Queued… and is disabled right after the click, only one request is sent, and a menu closes with focus on its trigger" classname="queued-action-feedback.spec.ts" time="0.639">
</testcase>
<testcase name="queued state: Renovate rebase › the row says the action is waiting, with no banner" classname="queued-action-feedback.spec.ts" time="0.242">
</testcase>
<testcase name="queued state: Renovate rebase › a failure re-enables the button, fails the row line and raises an error toast" classname="queued-action-feedback.spec.ts" time="0.568">
</testcase>
<testcase name="queued state: bot rebases move on once a snapshot shows pickup › a Renovate rebase stays queued after the request succeeds, then moves to Rebasing once a snapshot shows it landed" classname="queued-action-feedback.spec.ts" time="0.551">
</testcase>
<testcase name="queued state: bot rebases move on once a snapshot shows pickup › a bot rebase the server expired shows an error toast and frees the button" classname="queued-action-feedback.spec.ts" time="6.564">
</testcase>
</testsuite>
<testsuite name="queued-for-reset.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="7" failures="0" skipped="0" time="3.285" errors="0">
<testcase name="queue a safe action for the rate limit reset (#756) › a behind pull request on a limited forge offers Queue for the reset, never Merge or Close" classname="queued-for-reset.spec.ts" time="0.248">
</testcase>
<testcase name="queue a safe action for the rate limit reset (#756) › queueing stores it, and the row says it is queued with Cancel, and Activity lists it" classname="queued-for-reset.spec.ts" time="0.342">
</testcase>
<testcase name="queue a safe action for the rate limit reset (#756) › Cancel removes it and the control returns" classname="queued-for-reset.spec.ts" time="0.399">
</testcase>
<testcase name="queue a safe action for the rate limit reset (#756) › a bot pull request queues its rebase" classname="queued-for-reset.spec.ts" time="0.247">
</testcase>
<testcase name="queue a safe action for the rate limit reset (#756) › it is not offered where the action isn’t: a forge with budget, a pull request that is not behind" classname="queued-for-reset.spec.ts" time="0.312">
</testcase>
<testcase name="queue a safe action for the rate limit reset (#756) › an outcome arrives as a polite toast and stays in Activity, with why when it was skipped" classname="queued-for-reset.spec.ts" time="0.364">
</testcase>
<testcase name="queue a safe action for the rate limit reset (#756) › has no axe-core violations queued, with Activity open, at desktop and 375px" classname="queued-for-reset.spec.ts" time="1.373">
</testcase>
</testsuite>
<testsuite name="quick-filters-server.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="2" failures="0" skipped="0" time="0.834" errors="0">
<testcase name="the quick filters follow the server (#807) › Ready to Merge lists the pull requests the server marks ready" classname="quick-filters-server.spec.ts" time="0.416">
</testcase>
<testcase name="the quick filters follow the server (#807) › Needs Review lists the pull requests the server marks as needing one" classname="quick-filters-server.spec.ts" time="0.418">
</testcase>
</testsuite>
<testsuite name="rate-limit-actions.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="9" failures="0" skipped="0" time="4.97" errors="0">
<testcase name="rate-limited actions (#732) › grouped by repo, the reset time is stated once in the banner, not under each group" classname="rate-limit-actions.spec.ts" time="0.386">
</testcase>
<testcase name="rate-limited actions (#732) › read-only actions stay enabled while rate limited" classname="rate-limit-actions.spec.ts" time="0.391">
</testcase>
<testcase name="rate-limited actions (#732) › the header shows the remaining budget and reset time as text" classname="rate-limit-actions.spec.ts" time="0.34">
</testcase>
<testcase name="rate-limited actions (#732) › a 429 on merge locks the actions with the reset time and no Retry" classname="rate-limit-actions.spec.ts" time="0.476">
</testcase>
<testcase name="rate-limited actions (#732) › a 403 on merge locks the actions with no Retry and points to Settings" classname="rate-limit-actions.spec.ts" time="0.696">
</testcase>
<testcase name="rate-limited actions (#732) › a 502 on merge still offers Retry, and it works" classname="rate-limit-actions.spec.ts" time="0.965">
</testcase>
<testcase name="rate-limited actions (#732) › auto-merge, a GraphQL call, locks on the GraphQL budget and leaves REST actions alone" classname="rate-limit-actions.spec.ts" time="0.409">
</testcase>
<testcase name="rate-limited actions (#732) › has no axe-core violations while rate limited" classname="rate-limit-actions.spec.ts" time="0.895">
</testcase>
<testcase name="rate-limited actions (#732) › the ticking countdown is not announced every second" classname="rate-limit-actions.spec.ts" time="0.412">
</testcase>
</testsuite>
<testsuite name="rate-limit-readonly.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="9" failures="0" skipped="0" time="4.612" errors="0">
<testcase name="a rate-limited forge goes read-only (#755) › its rows draw no mutating control at all, and keep the read-only ones" classname="rate-limit-readonly.spec.ts" time="0.375">
</testcase>
<testcase name="a rate-limited forge goes read-only (#755) › one banner for the forge says it is read-only until the reset, and what still works" classname="rate-limit-readonly.spec.ts" time="0.294">
</testcase>
<testcase name="a rate-limited forge goes read-only (#755) › the banner has a Why? that explains the budget and links to GitHub’s own rules" classname="rate-limit-readonly.spec.ts" time="0.994">
</testcase>
<testcase name="a rate-limited forge goes read-only (#755) › for Forgejo the explanation names the proxy, not GitHub’s rules" classname="rate-limit-readonly.spec.ts" time="0.263">
</testcase>
<testcase name="a rate-limited forge goes read-only (#755) › another forge is unaffected: its rows stay interactive and no banner names it" classname="rate-limit-readonly.spec.ts" time="0.272">
</testcase>
<testcase name="a rate-limited forge goes read-only (#755) › only the GraphQL budget spent: Merge stays, auto-merge goes, and the banner names it" classname="rate-limit-readonly.spec.ts" time="0.272">
</testcase>
<testcase name="a rate-limited forge goes read-only (#755) › only the REST budget spent: Merge and Close go, auto-merge stays" classname="rate-limit-readonly.spec.ts" time="0.243">
</testcase>
<testcase name="a rate-limited forge goes read-only (#755) › controls return at the reset without a reload, with a polite toast, and the banner clears" classname="rate-limit-readonly.spec.ts" time="0.374">
</testcase>
<testcase name="a rate-limited forge goes read-only (#755) › has no axe-core violations and no horizontal scroll at desktop and 375px" classname="rate-limit-readonly.spec.ts" time="1.525">
</testcase>
</testsuite>
<testsuite name="rate-limit-severity.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="4" failures="0" skipped="0" time="1.286" errors="0">
<testcase name="rate limits follow the server (#806) › severity exceeded shows the banner even when the numbers look healthy" classname="rate-limit-severity.spec.ts" time="0.317">
</testcase>
<testcase name="rate limits follow the server (#806) › severity low shows the running-low banner" classname="rate-limit-severity.spec.ts" time="0.31">
</testcase>
<testcase name="rate limits follow the server (#806) › severity ok shows no banner even when the numbers look nearly spent" classname="rate-limit-severity.spec.ts" time="0.291">
</testcase>
<testcase name="rate limits follow the server (#806) › a coded refusal offers Retry whatever words its message holds" classname="rate-limit-severity.spec.ts" time="0.368">
</testcase>
</testsuite>
<testsuite name="refresh-interval.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="3" failures="0" skipped="0" time="0.861" errors="0">
<testcase name="refresh follows the server (#809) › polls at the interval the server states, not a fixed 30s" classname="refresh-interval.spec.ts" time="0.285">
</testcase>
<testcase name="refresh follows the server (#809) › a refresh inside the cooldown renders the snapshot and locks the button for Retry-After" classname="refresh-interval.spec.ts" time="0.285">
</testcase>
<testcase name="refresh follows the server (#809) › a refresh that fetched carries no Retry-After and leaves the button usable" classname="refresh-interval.spec.ts" time="0.291">
</testcase>
</testsuite>
<testsuite name="release-pr-behind.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="1" failures="0" skipped="0" time="1.106" errors="0">
<testcase name="a behind release-please pull request (#1104) › offers Update branch, and Merge says why it is waiting" classname="release-pr-behind.spec.ts" time="1.106">
</testcase>
</testsuite>
<testsuite name="releases-page.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="6" failures="0" skipped="0" time="2.87" errors="0">
<testcase name="Releases page (#1107) › lists release pull requests only, each with its version, repo and CI status" classname="releases-page.spec.ts" time="0.229">
</testcase>
<testcase name="Releases page (#1107) › a release that can merge offers Merge; one that cannot is greyed out with the reason" classname="releases-page.spec.ts" time="0.243">
</testcase>
<testcase name="Releases page (#1107) › a release that is behind offers Update branch and says why nothing else will update it" classname="releases-page.spec.ts" time="0.22">
</testcase>
<testcase name="Releases page (#1107) › says nothing is waiting to ship when no release pull request is open" classname="releases-page.spec.ts" time="0.217">
</testcase>
<testcase name="Releases page (#1107) › the header links to it, and it marks itself as the current page" classname="releases-page.spec.ts" time="0.335">
</testcase>
<testcase name="Releases page (#1107) › has no axe-core violations at desktop and phone width" classname="releases-page.spec.ts" time="1.626">
</testcase>
</testsuite>
<testsuite name="renovate-rebase-requested.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="10" failures="0" skipped="0" time="5.633" errors="0">
<testcase name="Renovate: Rebase while its box is ticked (#1349) › the button is disabled and says a rebase is already requested" classname="renovate-rebase-requested.spec.ts" time="0.385">
</testcase>
<testcase name="Renovate: Rebase while its box is ticked (#1349) › the reason is said once on screen, with what happens next under it" classname="renovate-rebase-requested.spec.ts" time="0.396">
</testcase>
<testcase name="Renovate: Rebase while its box is ticked (#1349) › a rebase asked for here shows the pending button, not the blocked note" classname="renovate-rebase-requested.spec.ts" time="0.544">
</testcase>
<testcase name="Renovate: Rebase while its box is ticked (#1349) › a rate-limited forge draws no Renovate control, blocked or not" classname="renovate-rebase-requested.spec.ts" time="0.378">
</testcase>
<testcase name="Renovate: Rebase while its box is ticked (#1349) › clicking it sends nothing" classname="renovate-rebase-requested.spec.ts" time="0.409">
</testcase>
<testcase name="Renovate: Rebase while its box is ticked (#1349) › the reason is the button’s description for assistive tech" classname="renovate-rebase-requested.spec.ts" time="0.358">
</testcase>
<testcase name="Renovate: Rebase while its box is ticked (#1349) › when the box is cleared the next snapshot offers the rebase again, without a reload" classname="renovate-rebase-requested.spec.ts" time="0.487">
</testcase>
<testcase name="Renovate: Rebase while its box is ticked (#1349) › an unblocked rebase still posts for that pull request" classname="renovate-rebase-requested.spec.ts" time="0.384">
</testcase>
<testcase name="Renovate: Rebase while its box is ticked (#1349) › has no axe violations with the blocked button (light)" classname="renovate-rebase-requested.spec.ts" time="1.149">
</testcase>
<testcase name="Renovate: Rebase while its box is ticked (#1349) › has no axe violations with the blocked button (dark)" classname="renovate-rebase-requested.spec.ts" time="1.143">
</testcase>
</testsuite>
<testsuite name="review-comments-pill.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="10" failures="0" skipped="0" time="5.868" errors="0">
<testcase name="the review comments pill (#1335) › draws nothing at zero comments, and nothing when the server sends no count" classname="review-comments-pill.spec.ts" time="0.279">
</testcase>
<testcase name="the review comments pill (#1335) › every thread resolved is a quiet pill with the count, named for what it counts" classname="review-comments-pill.spec.ts" time="0.262">
</testcase>
<testcase name="the review comments pill (#1335) › open threads turn it amber and say how many" classname="review-comments-pill.spec.ts" time="0.312">
</testcase>
<testcase name="the review comments pill (#1335) › a lone comment and a lone open thread read in the singular" classname="review-comments-pill.spec.ts" time="0.254">
</testcase>
<testcase name="the review comments pill (#1335) › a forge that cannot say which threads are open shows the count and no amber" classname="review-comments-pill.spec.ts" time="0.297">
</testcase>
<testcase name="the review comments pill (#1335) › opens the files and review view on the forge in a new tab" classname="review-comments-pill.spec.ts" time="0.329">
</testcase>
<testcase name="the review comments pill (#1335) › 128 comments and 24 open stay on one line without breaking the row" classname="review-comments-pill.spec.ts" time="0.281">
</testcase>
<testcase name="the review comments pill (#1335) › has no axe-core violations in the light theme" classname="review-comments-pill.spec.ts" time="1.303">
</testcase>
<testcase name="the review comments pill (#1335) › has no axe-core violations in the dark theme" classname="review-comments-pill.spec.ts" time="1.322">
</testcase>
<testcase name="the review comments pill (#1335) › on a 360px phone the pill is a 44px target, inside the card, with no axe violations" classname="review-comments-pill.spec.ts" time="1.229">
</testcase>
</testsuite>
<testsuite name="review-requested-pill.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="3" failures="0" skipped="0" time="2.649" errors="0">
<testcase name="the Review requested from me pill (#695) › keeps only the pull requests the server says ask me, on both forges" classname="review-requested-pill.spec.ts" time="0.596">
</testcase>
<testcase name="the Review requested from me pill (#695) › it is one of the exclusive pills and survives a reload" classname="review-requested-pill.spec.ts" time="0.696">
</testcase>
<testcase name="the Review requested from me pill (#695) › has no axe violations with the pill active" classname="review-requested-pill.spec.ts" time="1.357">
</testcase>
</testsuite>
<testsuite name="row-failure-lines.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="8" failures="0" skipped="0" time="4.162" errors="0">
<testcase name="row failure lines (#752) › a raw server error never reaches the row or the toast" classname="row-failure-lines.spec.ts" time="0.359">
</testcase>
<testcase name="row failure lines (#752) › an empty or unparsable answer reads as the same plain sentence" classname="row-failure-lines.spec.ts" time="0.324">
</testcase>
<testcase name="row failure lines (#752) › a failure line has a Dismiss button, and the line goes away" classname="row-failure-lines.spec.ts" time="0.421">
</testcase>
<testcase name="row failure lines (#752) › Clear finished in Activity clears the failure line too" classname="row-failure-lines.spec.ts" time="0.4">
</testcase>
<testcase name="row failure lines (#752) › the line clears by itself once a snapshot shows the pull request gone" classname="row-failure-lines.spec.ts" time="0.437">
</testcase>
<testcase name="row failure lines (#752) › acting on the row again clears the earlier failure line" classname="row-failure-lines.spec.ts" time="0.576">
</testcase>
<testcase name="row failure lines (#752) › Retry shows for a transient failure, not for one that cannot pass" classname="row-failure-lines.spec.ts" time="0.461">
</testcase>
<testcase name="row failure lines (#752) › on a phone the line wraps, its buttons are 44px tall and axe finds nothing" classname="row-failure-lines.spec.ts" time="1.184">
</testcase>
</testsuite>
<testsuite name="settings.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="40" failures="0" skipped="0" time="27.447" errors="0">
<testcase name="settings page › no visible text on the page is under 12px" classname="settings.spec.ts" time="0.59">
</testcase>
<testcase name="settings page › theme control (#352) › defaults to System, with no theme applied" classname="settings.spec.ts" time="0.439">
</testcase>
<testcase name="settings page › theme control (#352) › choosing Dark applies immediately, with no Save step" classname="settings.spec.ts" time="0.469">
</testcase>
<testcase name="settings page › theme control (#352) › a choice survives a reload and following to another page" classname="settings.spec.ts" time="0.643">
</testcase>
<testcase name="settings page › theme control (#352) › a choice survives a reload that outraces its own save" classname="settings.spec.ts" time="0.749">
</testcase>
<testcase name="settings page › theme control (#352) › switching back to Light removes the dark attribute" classname="settings.spec.ts" time="0.533">
</testcase>
<testcase name="settings page › the header settings link reaches the settings page" classname="settings.spec.ts" time="0.562">
</testcase>
<testcase name="settings page › saved settings persist across a reload, and the token never comes back" classname="settings.spec.ts" time="0.686">
</testcase>
<testcase name="settings page › the show/hide toggle reveals and re-masks a token field" classname="settings.spec.ts" time="0.538">
</testcase>
<testcase name="settings page › the Renovate rebase label persists across a reload" classname="settings.spec.ts" time="0.621">
</testcase>
<testcase name="settings page › a Forgejo username with no instance URL is refused by the server, which names the field" classname="settings.spec.ts" time="0.619">
</testcase>
<testcase name="settings page › the Forgejo token-settings link tracks the instance URL field and is inert when it is empty" classname="settings.spec.ts" time="0.439">
</testcase>
<testcase name="settings page › the GitHub App installation ID field is disabled with an explanatory hint when no App is configured (#620)" classname="settings.spec.ts" time="0.439">
</testcase>
<testcase name="settings page › a non-numeric GitHub App installation ID is sent to the server, which refuses it (#620, #810)" classname="settings.spec.ts" time="0.513">
</testcase>
<testcase name="settings page › the GitHub fine-grained permissions are a real list, not one run-on line" classname="settings.spec.ts" time="0.43">
</testcase>
<testcase name="settings page › the Forgejo permission list includes read:user, easy to leave out and silently break repo discovery" classname="settings.spec.ts" time="0.435">
</testcase>
<testcase name="settings page › webhook URLs and secret are populated, and the secret starts masked" classname="settings.spec.ts" time="0.508">
</testcase>
<testcase name="settings page › the webhook secret show/hide toggle works the same as the token fields" classname="settings.spec.ts" time="0.492">
</testcase>
<testcase name="settings page › copying the GitHub webhook URL confirms it in the status line" classname="settings.spec.ts" time="0.516">
</testcase>
<testcase name="settings page › copying the webhook secret confirms it in the status line" classname="settings.spec.ts" time="0.495">
</testcase>
<testcase name="settings page › webhook coverage summary is hidden with no tracked repos" classname="settings.spec.ts" time="0.426">
</testcase>
<testcase name="settings page › webhook coverage summary shows the count and links to the webhooks page" classname="settings.spec.ts" time="1.638">
</testcase>
<testcase name="settings page › Passkeys (#355) › the initial passkey from registration is already listed, with its Remove button disabled" classname="settings.spec.ts" time="0.449">
</testcase>
<testcase name="settings page › Passkeys (#355) › adding a second passkey lists both, and the Remove button becomes enabled" classname="settings.spec.ts" time="0.523">
</testcase>
<testcase name="settings page › Passkeys (#355) › removing a passkey when more than one exists removes just that one" classname="settings.spec.ts" time="0.624">
</testcase>
<testcase name="settings page › Passkeys (#355) › has no axe-core violations with two passkeys listed" classname="settings.spec.ts" time="1.612">
</testcase>
<testcase name="settings page › API tokens › no tokens yet shows the empty state, not a blank list" classname="settings.spec.ts" time="0.435">
</testcase>
<testcase name="settings page › API tokens › generating a token reveals it once, and lists it without the raw value" classname="settings.spec.ts" time="0.544">
</testcase>
<testcase name="settings page › API tokens › expiration (#356) › 30 days is pre-selected, and there is no &quot;never expires&quot; option" classname="settings.spec.ts" time="0.468">
</testcase>
<testcase name="settings page › API tokens › expiration (#356) › generating with the default 30-day preset shows an expiration date on the listed token" classname="settings.spec.ts" time="0.556">
</testcase>
<testcase name="settings page › API tokens › expiration (#356) › picking a preset other than 30 still creates and lists the token" classname="settings.spec.ts" time="0.531">
</testcase>
<testcase name="settings page › API tokens › expiration (#356) › choosing &quot;Custom date…&quot; reveals a date field capped at 366 days out, and requires a value before submitting" classname="settings.spec.ts" time="0.52">
</testcase>
<testcase name="settings page › API tokens › expiration (#356) › a custom date within range creates and lists the token" classname="settings.spec.ts" time="0.523">
</testcase>
<testcase name="settings page › API tokens › expiration (#356) › has no axe-core violations with the custom date field revealed" classname="settings.spec.ts" time="1.52">
</testcase>
<testcase name="settings page › API tokens › reloading no longer shows the raw token, only its metadata" classname="settings.spec.ts" time="0.641">
</testcase>
<testcase name="settings page › API tokens › revoking a token removes it from the list and stops it authenticating" classname="settings.spec.ts" time="0.59">
</testcase>
<testcase name="settings page › API tokens › copying the revealed token confirms it in the token status line" classname="settings.spec.ts" time="0.581">
</testcase>
<testcase name="settings page › API tokens › has no axe-core violations with a token generated and listed" classname="settings.spec.ts" time="1.583">
</testcase>
<testcase name="settings page › has no axe-core violations at desktop width" classname="settings.spec.ts" time="1.464">
</testcase>
<testcase name="settings page › has no axe-core violations and no horizontal scroll at phone width" classname="settings.spec.ts" time="1.503">
</testcase>
</testsuite>
<testsuite name="sharing.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="3" failures="0" skipped="0" time="4.366" errors="0">
<testcase name="dashboard sharing › sharing makes the owner selectable from the viewer header, and stopping sharing removes it from settings" classname="sharing.spec.ts" time="1.029">
</testcase>
<testcase name="dashboard sharing › has no axe-core violations on settings with an active share, at desktop and phone width" classname="sharing.spec.ts" time="2.916">
</testcase>
<testcase name="dashboard sharing › a user who never shared sees no dashboard selector" classname="sharing.spec.ts" time="0.421">
</testcase>
</testsuite>
<testsuite name="show-drafts.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="5" failures="0" skipped="0" time="4.762" errors="0">
<testcase name="show drafts (#791) › drafts are left out by default, with a muted hidden count on an off toggle" classname="show-drafts.spec.ts" time="0.502">
</testcase>
<testcase name="show drafts (#791) › turning it on shows the drafts, marked, and drops the count" classname="show-drafts.spec.ts" time="0.564">
</testcase>
<testcase name="show drafts (#791) › the choice survives a reload and goes on every fetch, refresh and the stream" classname="show-drafts.spec.ts" time="0.736">
</testcase>
<testcase name="show drafts (#791) › turning it off again reopens the stream without drafts" classname="show-drafts.spec.ts" time="0.618">
</testcase>
<testcase name="show drafts (#791) › the toggle has no axe-core violations, on or off" classname="show-drafts.spec.ts" time="2.342">
</testcase>
</testsuite>
<testsuite name="stable-rows.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="12" failures="0" skipped="0" time="10.092" errors="0">
<testcase name="stable rows (#710) › a snapshot that adds a row is held behind an updates bar until asked for" classname="stable-rows.spec.ts" time="0.554">
</testcase>
<testcase name="stable rows (#710) › a snapshot that reorders or removes rows is held too" classname="stable-rows.spec.ts" time="0.525">
</testcase>
<testcase name="stable rows (#710) › a content-only change updates the row in place and marks it Updated just now for a moment" classname="stable-rows.spec.ts" time="3.288">
</testcase>
<testcase name="stable rows (#710) › the Updated just now marker is text, with no animation under reduced motion" classname="stable-rows.spec.ts" time="0.519">
</testcase>
<testcase name="stable rows (#710) › Pause live updates stops everything from applying, and the choice persists" classname="stable-rows.spec.ts" time="0.7">
</testcase>
<testcase name="stable rows (#710) › the updates bar draws no box while nothing is held, and does once something is" classname="stable-rows.spec.ts" time="0.494">
</testcase>
<testcase name="stable rows (#710) › changing a filter applies the pending snapshot" classname="stable-rows.spec.ts" time="0.533">
</testcase>
<testcase name="stable rows (#710) › the sort control orders rows and a snapshot never re-sorts them" classname="stable-rows.spec.ts" time="0.616">
</testcase>
<testcase name="stable rows (#710) › nothing re-renders under focus in a row, and the change lands once focus leaves" classname="stable-rows.spec.ts" time="0.499">
</testcase>
<testcase name="stable rows (#710) › nothing re-renders while a More actions menu is open" classname="stable-rows.spec.ts" time="0.663">
</testcase>
<testcase name="stable rows (#710) › the bar announces politely, once per change in the count, not per poll" classname="stable-rows.spec.ts" time="0.491">
</testcase>
<testcase name="stable rows (#710) › has no axe violations with the updates bar showing" classname="stable-rows.spec.ts" time="1.21">
</testcase>
</testsuite>
<testsuite name="stacked-prs.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="8" failures="0" skipped="0" time="5.81" errors="0">
<testcase name="stacked pull requests (#861) › a stacked row has a chip with its place and what it waits for; others have none" classname="stacked-prs.spec.ts" time="0.518">
</testcase>
<testcase name="stacked pull requests (#861) › the members sit together in position order, at the slot of the first one, in a plain nested list" classname="stacked-prs.spec.ts" time="0.472">
</testcase>
<testcase name="stacked pull requests (#861) › a child says what it targets and shows the server&apos;s reason on Merge" classname="stacked-prs.spec.ts" time="0.485">
</testcase>
<testcase name="stacked pull requests (#861) › a filter that matches one member keeps the whole stack and dims the others" classname="stacked-prs.spec.ts" time="0.532">
</testcase>
<testcase name="stacked pull requests (#861) › tapping the chip lists the stack" classname="stacked-prs.spec.ts" time="0.534">
</testcase>
<testcase name="stacked pull requests (#861) › on a phone the chip is short, the dependency is on a second line, the title gives way and a rule replaces indentation" classname="stacked-prs.spec.ts" time="0.497">
</testcase>
<testcase name="stacked pull requests (#861) › a stacked list has no axe violations at desktop width" classname="stacked-prs.spec.ts" time="1.42">
</testcase>
<testcase name="stacked pull requests (#861) › a stacked list has no axe violations at phone width" classname="stacked-prs.spec.ts" time="1.352">
</testcase>
</testsuite>
<testsuite name="stale-dashboard-instance.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="1" failures="0" skipped="0" time="0.424" errors="0">
<testcase name="the pull request page stays free of release pull requests after leaving Releases" classname="stale-dashboard-instance.spec.ts" time="0.424">
</testcase>
</testsuite>
<testsuite name="stale-data-notice.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="4" failures="0" skipped="0" time="1.732" errors="0">
<testcase name="stale data notice (#933) › an unreachable forge with staleSince says how old its data is" classname="stale-data-notice.spec.ts" time="0.267">
</testcase>
<testcase name="stale data notice (#933) › a rate-limited forge says it too" classname="stale-data-notice.spec.ts" time="0.298">
</testcase>
<testcase name="stale data notice (#933) › no staleSince, no notice" classname="stale-data-notice.spec.ts" time="0.272">
</testcase>
<testcase name="stale data notice (#933) › on a phone it is plain text and axe finds nothing" classname="stale-data-notice.spec.ts" time="0.895">
</testcase>
</testsuite>
<testsuite name="stream-after-first-poll.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="5" failures="0" skipped="0" time="3.808" errors="0">
<testcase name="live stream start (#1569) › is not requested before the first poll has answered" classname="stream-after-first-poll.spec.ts" time="0.313">
</testcase>
<testcase name="live stream start (#1569) › a stream that answered 404 is reopened and its snapshots apply" classname="stream-after-first-poll.spec.ts" time="2.484">
</testcase>
<testcase name="live stream start (#1569) › a page with nothing configured does not open the stream, poll after poll" classname="stream-after-first-poll.spec.ts" time="0.354">
</testcase>
<testcase name="live stream start (#1569) › retries stop after five closes and a later poll starts them again" classname="stream-after-first-poll.spec.ts" time="0.38">
</testcase>
<testcase name="live stream start (#1569) › a shared dashboard does not retry the viewer&apos;s own stream" classname="stream-after-first-poll.spec.ts" time="0.277">
</testcase>
</testsuite>
<testsuite name="timezone.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="11" failures="0" skipped="0" time="5.493" errors="0">
<testcase name="times in the viewer zone (#996) › with no saved zone, the browser zone is used and named" classname="timezone.spec.ts" time="0.457">
</testcase>
<testcase name="times in the viewer zone (#996) › a saved zone shows its own time and name" classname="timezone.spec.ts" time="0.489">
</testcase>
<testcase name="times in the viewer zone (#996) › a time on another day carries its date" classname="timezone.spec.ts" time="0.509">
</testcase>
<testcase name="times in the viewer zone (#996) › a zone that arrives after the first draw redraws the time without a reload" classname="timezone.spec.ts" time="0.497">
</testcase>
<testcase name="times in the viewer zone (#996) › an answer that fails falls back to the browser zone" classname="timezone.spec.ts" time="0.468">
</testcase>
<testcase name="times in the viewer zone (#996) › the webhooks page names the zone too" classname="timezone.spec.ts" time="0.476">
</testcase>
<testcase name="a browser that reports UTC (#996) › a saved zone overrides it" classname="timezone.spec.ts" time="0.515">
</testcase>
<testcase name="the time zone control on Settings (#996) › defaults to the browser zone, named in the option" classname="timezone.spec.ts" time="0.419">
</testcase>
<testcase name="the time zone control on Settings (#996) › saves at once, previews the zone, and the dashboard picks it up" classname="timezone.spec.ts" time="0.697">
</testcase>
<testcase name="the time zone control on Settings (#996) › choosing the browser default saves an empty name" classname="timezone.spec.ts" time="0.45">
</testcase>
<testcase name="the time zone control on Settings (#996) › a refused name shows a failure line and keeps the old zone" classname="timezone.spec.ts" time="0.516">
</testcase>
</testsuite>
<testsuite name="transient-failure-clears.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="9" failures="0" skipped="0" time="4.285" errors="0">
<testcase name="a network failure line clears itself (#1206) › a merge that never reached the server says so in plain words, then clears after ten seconds and the row is read again" classname="transient-failure-clears.spec.ts" time="0.627">
</testcase>
<testcase name="a network failure line clears itself (#1206) › an update that never reached the server clears the same way" classname="transient-failure-clears.spec.ts" time="0.294">
</testcase>
<testcase name="a network failure line clears itself (#1206) › a forge that answered 502 is transient too" classname="transient-failure-clears.spec.ts" time="0.354">
</testcase>
<testcase name="a network failure line clears itself (#1206) › a refusal that needs a person stays until it is dismissed" classname="transient-failure-clears.spec.ts" time="0.404">
</testcase>
<testcase name="a network failure line clears itself (#1206) › hovering the line holds the timer, and it restarts when the pointer leaves" classname="transient-failure-clears.spec.ts" time="0.358">
</testcase>
<testcase name="a network failure line clears itself (#1206) › focus inside the line holds the timer too" classname="transient-failure-clears.spec.ts" time="0.299">
</testcase>
<testcase name="a network failure line clears itself (#1206) › the error toast is unchanged when the line clears" classname="transient-failure-clears.spec.ts" time="0.296">
</testcase>
<testcase name="a network failure line clears itself (#1206) › the failure is said once, nothing is said when it clears, and Activity keeps it" classname="transient-failure-clears.spec.ts" time="0.374">
</testcase>
<testcase name="a network failure line clears itself (#1206) › has no axe-core violations with the failure line showing" classname="transient-failure-clears.spec.ts" time="1.279">
</testcase>
</testsuite>
<testsuite name="unreachable-forge.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="10" failures="0" skipped="0" time="36.145" errors="0">
<testcase name="an unreachable forge goes read-only (#1199) › its rows draw no mutating control, no per-row Retry and no pointer to a status line" classname="unreachable-forge.spec.ts" time="0.368">
</testcase>
<testcase name="an unreachable forge goes read-only (#1199) › one banner says so, with the cause and the age of the data, and one Retry" classname="unreachable-forge.spec.ts" time="0.289">
</testcase>
<testcase name="an unreachable forge goes read-only (#1199) › the GitHub row links GitHub’s status page, in a new tab" classname="unreachable-forge.spec.ts" time="0.312">
</testcase>
<testcase name="an unreachable forge goes read-only (#1199) › Forgejo has no status page, so its row has no status link" classname="unreachable-forge.spec.ts" time="0.314">
</testcase>
<testcase name="an unreachable forge goes read-only (#1199) › with both down, only the GitHub row has the status link" classname="unreachable-forge.spec.ts" time="0.314">
</testcase>
<testcase name="an unreachable forge goes read-only (#1199) › Retry forces a refresh, and when the forge answers the controls return with a toast and the banner clears" classname="unreachable-forge.spec.ts" time="30.566">
<system-out>
<![CDATA[
[[ATTACHMENT|all-blob-reports/resources/fab3766be46f7a6f42fee0cf7307c48cda0d8c70.md]]
]]>
</system-out>
</testcase>
<testcase name="an unreachable forge goes read-only (#1199) › a forge going down while the list is open loses its controls without a reload" classname="unreachable-forge.spec.ts" time="0.398">
</testcase>
<testcase name="an unreachable forge goes read-only (#1199) › another forge is unaffected, and a reachable forge keeps the row’s own reason" classname="unreachable-forge.spec.ts" time="0.316">
</testcase>
<testcase name="an unreachable forge goes read-only (#1199) › a forge with no cause text still reads plainly" classname="unreachable-forge.spec.ts" time="0.309">
</testcase>
<testcase name="an unreachable forge goes read-only (#1199) › has no axe-core violations and no horizontal scroll at desktop and 375px, and the banner stays in view while scrolling" classname="unreachable-forge.spec.ts" time="2.959">
</testcase>
</testsuite>
<testsuite name="update-branch-request.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="9" failures="0" skipped="0" time="5.901" errors="0">
<testcase name="update branch request from the server › a reload mid-wait still shows the Updating branch chip" classname="update-branch-request.spec.ts" time="0.737">
</testcase>
<testcase name="update branch request from the server › a request seen only in the snapshot starts the row state" classname="update-branch-request.spec.ts" time="0.59">
</testcase>
<testcase name="update branch request from the server › a queued record on the next snapshot keeps the row Queued" classname="update-branch-request.spec.ts" time="0.581">
</testcase>
<testcase name="update branch request from the server › the row finishes once the record is gone and the pull request is no longer behind" classname="update-branch-request.spec.ts" time="0.56">
</testcase>
<testcase name="update branch request from the server › expired in the snapshot shows the timed-out line and a toast, once" classname="update-branch-request.spec.ts" time="0.606">
</testcase>
<testcase name="update branch request from the server › Retry on an expired request asks again" classname="update-branch-request.spec.ts" time="0.936">
</testcase>
<testcase name="update branch request from the server › a refresh answer older than a pushed snapshot cannot undo it" classname="update-branch-request.spec.ts" time="0.675">
</testcase>
<testcase name="update branch request from the server › an expired record found after a reload is not drawn as queued" classname="update-branch-request.spec.ts" time="0.553">
</testcase>
<testcase name="update branch request from the server › a refresh already in flight at the click does not clear Queued, the next one does" classname="update-branch-request.spec.ts" time="0.663">
</testcase>
</testsuite>
<testsuite name="wait-chip.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="24" failures="0" skipped="0" time="25.789" errors="0">
<testcase name="the waiting chip on a bot rebase › a requested rebase is one chip with the bot and its age, and the row does not move" classname="wait-chip.spec.ts" time="1.655">
</testcase>
<testcase name="the waiting chip on a bot rebase › picked up, then settled, then gone: each change is announced once, the clearing is silent, and nothing moves" classname="wait-chip.spec.ts" time="5.271">
</testcase>
<testcase name="the waiting chip on a bot rebase › two minutes with no change reads Still waiting, announced once, and Check again refetches the row" classname="wait-chip.spec.ts" time="1.674">
</testcase>
<testcase name="the waiting chip on a bot rebase › the explanation opens on keyboard focus and on hover" classname="wait-chip.spec.ts" time="0.388">
</testcase>
<testcase name="the waiting chip on a bot rebase › reduced motion makes the spinner a static icon" classname="wait-chip.spec.ts" time="0.293">
</testcase>
<testcase name="the waiting chip on a bot rebase › on a phone the chip sits in the card, the page does not widen, and the button is 44px" classname="wait-chip.spec.ts" time="1.676">
</testcase>
<testcase name="the waiting chip on a bot rebase › has no axe violations while waiting, still waiting and settled (light)" classname="wait-chip.spec.ts" time="4.08">
</testcase>
<testcase name="the waiting chip on a bot rebase › has no axe violations while waiting, still waiting and settled (dark)" classname="wait-chip.spec.ts" time="4.098">
</testcase>
<testcase name="the waiting chip on Update branch › Updating branch counts down to the refresh, with no layout shift and no old line" classname="wait-chip.spec.ts" time="0.431">
</testcase>
<testcase name="the waiting chip on a merge and a close › Merge in progress is a Merging chip, and the row does not move" classname="wait-chip.spec.ts" time="0.565">
</testcase>
<testcase name="the waiting chip on a merge and a close › Close in progress is a Closing chip, and the row does not move" classname="wait-chip.spec.ts" time="0.634">
</testcase>
<testcase name="the waiting chip on Forgejo auto-merge › an armed pull request reads Waiting for CI, with Disarm in the chip and the reason in the tooltip" classname="wait-chip.spec.ts" time="0.267">
</testcase>
<testcase name="the waiting chip on Forgejo auto-merge › the action area is the same size armed and not" classname="wait-chip.spec.ts" time="0.407">
</testcase>
<testcase name="the waiting chip on Forgejo auto-merge › Disarm posts for that pull request" classname="wait-chip.spec.ts" time="0.274">
</testcase>
<testcase name="the waiting chip on Forgejo auto-merge › a stopped auto-merge is not a wait: it stays a text line with no chip" classname="wait-chip.spec.ts" time="0.203">
</testcase>
<testcase name="the waiting chip on Forgejo auto-merge › has no axe violations with the chip (light)" classname="wait-chip.spec.ts" time="1.007">
</testcase>
<testcase name="the waiting chip on Forgejo auto-merge › has no axe violations with the chip (dark)" classname="wait-chip.spec.ts" time="0.994">
</testcase>
<testcase name="the waiting chip on an action queued for a reset (#756) › is one Queued chip with the reset time, Cancel inside, and the same slot size" classname="wait-chip.spec.ts" time="0.479">
</testcase>
<testcase name="the waiting chip on GitHub auto-merge › an armed GitHub pull request reads Waiting for CI, with Disarm in the chip" classname="wait-chip.spec.ts" time="0.24">
</testcase>
<testcase name="the waiting chip on GitHub auto-merge › Disarm posts for that GitHub pull request" classname="wait-chip.spec.ts" time="0.266">
</testcase>
<testcase name="the waiting chip on GitHub auto-merge › an armed, green github pull request reads Merging" classname="wait-chip.spec.ts" time="0.239">
</testcase>
<testcase name="the waiting chip on GitHub auto-merge › an armed, green forgejo pull request reads Merging next" classname="wait-chip.spec.ts" time="0.231">
</testcase>
<testcase name="the waiting chip on GitHub auto-merge › a stopped GitHub auto-merge stays a text line with no chip" classname="wait-chip.spec.ts" time="0.246">
</testcase>
<testcase name="the waiting chip on GitHub auto-merge › a GitHub pull request that is not armed has no chip" classname="wait-chip.spec.ts" time="0.171">
</testcase>
</testsuite>
<testsuite name="webhooks-filter-choices.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="6" failures="0" skipped="0" time="3.575" errors="0">
<testcase name="webhooks filter choices (#1427) › a forge with no tracked repo is not offered, and neither is a status no repo has" classname="webhooks-filter-choices.spec.ts" time="0.481">
</testcase>
<testcase name="webhooks filter choices (#1427) › both are offered when the repos have both" classname="webhooks-filter-choices.spec.ts" time="0.462">
</testcase>
<testcase name="webhooks filter choices (#1427) › the choices follow the other filters: typing a repo that only one forge has drops the other forge" classname="webhooks-filter-choices.spec.ts" time="0.52">
</testcase>
<testcase name="webhooks filter choices (#1427) › a forge you picked stays visible when the other filters leave it nothing, so you can clear it" classname="webhooks-filter-choices.spec.ts" time="0.529">
</testcase>
<testcase name="webhooks filter choices (#1427) › a status you picked stays visible when the other filters leave it nothing, so you can clear it" classname="webhooks-filter-choices.spec.ts" time="0.506">
</testcase>
<testcase name="webhooks filter choices (#1427) › has no axe-core violations with a single forge" classname="webhooks-filter-choices.spec.ts" time="1.077">
</testcase>
</testsuite>
<testsuite name="webhooks-page.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="56" failures="0" skipped="0" time="33.47" errors="0">
<testcase name="webhooks page › shows an empty state with no tracked repos" classname="webhooks-page.spec.ts" time="0.421">
</testcase>
<testcase name="webhooks page › lists every tracked repo with its live status, sorted by full name" classname="webhooks-page.spec.ts" time="0.454">
</testcase>
<testcase name="webhooks page › filters and sorting › the forge filter narrows the list to one forge" classname="webhooks-page.spec.ts" time="0.476">
</testcase>
<testcase name="webhooks page › filters and sorting › the repo text filter narrows the list, case-insensitively" classname="webhooks-page.spec.ts" time="0.444">
</testcase>
<testcase name="webhooks page › filters and sorting › the status filter narrows to confirmed or not-yet repos" classname="webhooks-page.spec.ts" time="0.479">
</testcase>
<testcase name="webhooks page › filters and sorting › combined filters narrow further than either alone" classname="webhooks-page.spec.ts" time="0.504">
</testcase>
<testcase name="webhooks page › filters and sorting › no results shows a message instead of an empty table" classname="webhooks-page.spec.ts" time="0.443">
</testcase>
<testcase name="webhooks page › filters and sorting › clicking the Repo header reverses sort direction, updating aria-sort" classname="webhooks-page.spec.ts" time="0.59">
</testcase>
<testcase name="webhooks page › filters and sorting › clicking the Webhook header sorts by status, and resets the Repo header to unsorted" classname="webhooks-page.spec.ts" time="0.52">
</testcase>
<testcase name="webhooks page › filters and sorting › a filter change resets to page 1" classname="webhooks-page.spec.ts" time="0.575">
</testcase>
<testcase name="webhooks page › filters and sorting › has no axe-core violations with the filter bar and a sorted table rendered" classname="webhooks-page.spec.ts" time="1.145">
</testcase>
<testcase name="webhooks page › clicking &quot;Add a webhook&quot; calls the API and flips the row to confirmed on success" classname="webhooks-page.spec.ts" time="0.503">
</testcase>
<testcase name="webhooks page › a transient failure shows a specific error and re-enables the button for another try" classname="webhooks-page.spec.ts" time="0.525">
</testcase>
<testcase name="webhooks page › a forge whose rate limit is already exhausted shows a disabled button with the reset time, not a clickable one" classname="webhooks-page.spec.ts" time="0.466">
</testcase>
<testcase name="webhooks page › a permission-denied failure disables the button for good instead of inviting another try" classname="webhooks-page.spec.ts" time="0.531">
</testcase>
<testcase name="webhooks page › a rate-limited failure disables the button for good, same as a known-exhausted budget" classname="webhooks-page.spec.ts" time="0.555">
</testcase>
<testcase name="webhooks page › the lock follows the response code, not the HTTP status (#762)" classname="webhooks-page.spec.ts" time="0.501">
</testcase>
<testcase name="webhooks page › an unknown code leaves the button usable, even on a 403 (#762)" classname="webhooks-page.spec.ts" time="1.206">
</testcase>
<testcase name="webhooks page › a locked button is reachable by keyboard and has no axe-core violations" classname="webhooks-page.spec.ts" time="1.066">
</testcase>
<testcase name="webhooks page › paginates at 25 per page, same convention as the pull request/issue boards" classname="webhooks-page.spec.ts" time="0.497">
</testcase>
<testcase name="webhooks page › a set under one page shows no pagination controls" classname="webhooks-page.spec.ts" time="0.402">
</testcase>
<testcase name="webhooks page › has no axe-core violations at desktop width" classname="webhooks-page.spec.ts" time="1.159">
</testcase>
<testcase name="webhooks page › has no axe-core violations and no horizontal scroll at phone width" classname="webhooks-page.spec.ts" time="1.132">
</testcase>
<testcase name="webhooks page › a repo the user lacks admin access to explains itself instead of showing a broken button" classname="webhooks-page.spec.ts" time="0.45">
</testcase>
<testcase name="webhooks page › a permission-denied repo has no axe-core violations" classname="webhooks-page.spec.ts" time="1.029">
</testcase>
<testcase name="webhooks page › the repo name links out to the repo on its forge" classname="webhooks-page.spec.ts" time="0.448">
</testcase>
<testcase name="webhooks page › bulk &quot;set up webhooks for all repos&quot; action (#380) › shows the count of repos actually missing a webhook" classname="webhooks-page.spec.ts" time="0.448">
</testcase>
<testcase name="webhooks page › bulk &quot;set up webhooks for all repos&quot; action (#380) › is not shown once every repo already has a webhook" classname="webhooks-page.spec.ts" time="0.409">
</testcase>
<testcase name="webhooks page › bulk &quot;set up webhooks for all repos&quot; action (#380) › does not count a repo the user lacks admin access to — nothing a bulk click could actually fix" classname="webhooks-page.spec.ts" time="0.415">
</testcase>
<testcase name="webhooks page › bulk &quot;set up webhooks for all repos&quot; action (#380) › prompts for confirmation with the real count, and does nothing if dismissed" classname="webhooks-page.spec.ts" time="0.491">
</testcase>
<testcase name="webhooks page › bulk &quot;set up webhooks for all repos&quot; action (#380) › confirming sets up a webhook on every eligible repo and reports a final count" classname="webhooks-page.spec.ts" time="0.528">
</testcase>
<testcase name="webhooks page › bulk &quot;set up webhooks for all repos&quot; action (#380) › a repo that fails during the batch is reported on its own row, without stopping the rest" classname="webhooks-page.spec.ts" time="0.555">
</testcase>
<testcase name="webhooks page › bulk &quot;set up webhooks for all repos&quot; action (#380) › has no axe-core violations with the bulk button visible" classname="webhooks-page.spec.ts" time="1.088">
</testcase>
<testcase name="webhooks page › ignoring a repo (#363, #511) › choosing &quot;Ignore both&quot; calls the API and moves the repo into the Ignored disclosure" classname="webhooks-page.spec.ts" time="0.487">
</testcase>
<testcase name="webhooks page › ignoring a repo (#363, #511) › choosing &quot;Ignore PRs&quot; sends prs:true, issues:false and shows the scope in the disclosure" classname="webhooks-page.spec.ts" time="0.448">
</testcase>
<testcase name="webhooks page › ignoring a repo (#363, #511) › choosing &quot;Ignore issues&quot; sends prs:false, issues:true and shows the scope in the disclosure" classname="webhooks-page.spec.ts" time="0.446">
</testcase>
<testcase name="webhooks page › ignoring a repo (#363, #511) › no repos ignored shows no disclosure at all" classname="webhooks-page.spec.ts" time="0.435">
</testcase>
<testcase name="webhooks page › ignoring a repo (#363, #511) › an already-ignored repo starts inside the disclosure, not the main table" classname="webhooks-page.spec.ts" time="0.483">
</testcase>
<testcase name="webhooks page › ignoring a repo (#363, #511) › clicking &quot;Un-ignore&quot; calls the API and moves the repo back into the main table" classname="webhooks-page.spec.ts" time="0.542">
</testcase>
<testcase name="webhooks page › ignoring a repo (#363, #511) › a failed ignore shows an error and leaves the repo in the main table" classname="webhooks-page.spec.ts" time="0.481">
</testcase>
<testcase name="webhooks page › ignoring a repo (#363, #511) › has no axe-core violations with the Ignored disclosure expanded" classname="webhooks-page.spec.ts" time="1.124">
</testcase>
<testcase name="webhooks page › per-repo auto-update-branch toggle (#365) › a repo with it off shows &quot;Enable auto-update&quot;; clicking calls the enable endpoint" classname="webhooks-page.spec.ts" time="0.511">
</testcase>
<testcase name="webhooks page › per-repo auto-update-branch toggle (#365) › a repo with it on shows &quot;Disable auto-update&quot;; clicking calls the disable endpoint" classname="webhooks-page.spec.ts" time="0.507">
</testcase>
<testcase name="webhooks page › per-repo auto-update-branch toggle (#365) › a failed toggle shows an error and leaves the row state unchanged" classname="webhooks-page.spec.ts" time="0.529">
</testcase>
<testcase name="webhooks page › bulk auto-update-branch on/off for all repos (#365) › shows an &quot;Enable auto-update&quot; bulk button counting repos with it off" classname="webhooks-page.spec.ts" time="0.495">
</testcase>
<testcase name="webhooks page › bulk auto-update-branch on/off for all repos (#365) › is not shown once every repo already matches" classname="webhooks-page.spec.ts" time="0.454">
</testcase>
<testcase name="webhooks page › bulk auto-update-branch on/off for all repos (#365) › prompts for confirmation with the real count, and does nothing if dismissed" classname="webhooks-page.spec.ts" time="0.491">
</testcase>
<testcase name="webhooks page › bulk auto-update-branch on/off for all repos (#365) › confirming enables auto-update-branch on every repo missing it and reports a final count" classname="webhooks-page.spec.ts" time="0.551">
</testcase>
<testcase name="webhooks page › bulk auto-update-branch on/off for all repos (#365) › confirming disables auto-update-branch on every repo that has it" classname="webhooks-page.spec.ts" time="0.531">
</testcase>
<testcase name="webhooks page › bulk auto-update-branch on/off for all repos (#365) › has no axe-core violations with both bulk buttons visible" classname="webhooks-page.spec.ts" time="1.103">
</testcase>
<testcase name="webhooks page › controls look consistent (#1109) › the forge filter shows only the pill, not native radio circles" classname="webhooks-page.spec.ts" time="0.494">
</testcase>
<testcase name="webhooks page › controls look consistent (#1109) › the row actions use the app font and one link style" classname="webhooks-page.spec.ts" time="0.473">
</testcase>
<testcase name="webhooks page › controls look consistent (#1109) › every action column has a header" classname="webhooks-page.spec.ts" time="0.466">
</testcase>
<testcase name="webhooks page › controls look consistent (#1109) › the repo search and status select sit on one row" classname="webhooks-page.spec.ts" time="0.46">
</testcase>
<testcase name="webhooks page › controls look consistent (#1109) › has no axe-core violations" classname="webhooks-page.spec.ts" time="1.07">
</testcase>
<testcase name="webhooks page › the persistent nav highlights Webhooks and still links to Settings" classname="webhooks-page.spec.ts" time="0.434">
</testcase>
</testsuite>
<testsuite name="webhooks.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="3" failures="0" skipped="0" time="2.041" errors="0">
<testcase name="webhook-triggered live updates › a verified webhook delivery pushes a live snapshot to the open dashboard over SSE" classname="webhooks.spec.ts" time="0.717">
</testcase>
<testcase name="webhook-triggered live updates › a webhook naming a repo pushes a newly created issue to the dashboard live, no reload" classname="webhooks.spec.ts" time="0.63">
</testcase>
<testcase name="webhook-triggered live updates › a newly created issue sorts to page 1 even with 25+ older issues already tracked" classname="webhooks.spec.ts" time="0.694">
</testcase>
</testsuite>
<testsuite name="webmcp.spec.ts" timestamp="2026-10-15T21:23:19.869Z" hostname="" tests="6" failures="0" skipped="0" time="1.174" errors="0">
<testcase name="WebMCP tools › registers its tools when document.modelContext is present" classname="webmcp.spec.ts" time="0.195">
</testcase>
<testcase name="WebMCP tools › registering it never breaks the page when document.modelContext is absent -- every browser but an Origin Trial one today" classname="webmcp.spec.ts" time="0.155">
</testcase>
<testcase name="WebMCP tools › get_dashboard&apos;s execute() fetches real data through the same /api/dashboard endpoint the page&apos;s own poll uses" classname="webmcp.spec.ts" time="0.21">
</testcase>
<testcase name="WebMCP tools › get_main_branches calls /api/main-branches and returns its JSON" classname="webmcp.spec.ts" time="0.205">
</testcase>
<testcase name="WebMCP tools › get_pull_request_checks calls /api/pull-requests/checks and returns its JSON" classname="webmcp.spec.ts" time="0.205">
</testcase>
<testcase name="WebMCP tools › get_pull_request_details calls /api/pull-requests/details and returns its JSON" classname="webmcp.spec.ts" time="0.204">
</testcase>
</testsuite>
</testsuites>