Skip to content

tooling: check.sh runs no browser suite, and the real-server cycle run was three times the only detector #314

Description

@JArmandoAnaya

The gap

bash scripts/check.sh — the canonical "before you say it works" invocation, named as such in CONTRIBUTING.md and CLAUDE.md — runs no Playwright suite at all. It covers pytest, vitest, ruff, mypy, import-linter, eslint, and the four drift gates (openapi, generated client, wire fixtures, mcp tools). It does not start a browser.

There are three suites. Two of them are invisible to check.sh:

Suite Command (from frontend/app) CI job
unit / drift bash scripts/check.sh (repo root) python, frontend
app + annotator e2e CI=1 npx playwright test annotator e2e (chromium)
full cycle, real server CI=1 npx playwright test -c playwright.cycle.config.ts browser cycle (chromium)

Why this matters more than it sounds

During the 2026-08 audit remediation run (PRs #304#313), the real-server cycle suite was three separate times the only suite to catch a regression:

In each case a reasonable person would have reported the work as verified on a green check.sh. One of them (#304) actually shipped that way and went red in CI.

Proposal

  1. check.sh runs all three suites by default, or — if the ~4 minutes of browser time is judged too expensive for the common case — offers them via a flag and prints a loud, unmissable line when it skips them. Silence is the problem: "All checks passed" currently means "all the checks this script knows about", and nothing says which those are.
  2. Document the CI=1 requirement in the script header and in CONTRIBUTING.md. playwright.config.ts sets reuseExistingServer: !process.env.CI, so a stale vite server on port 5273 answers instead of the build under test. During the run this produced six failures in unrelated demo scenarios that read as genuine code bugs and cost about fifteen minutes to diagnose.
  3. Consider a check.sh browser subset alongside the existing python|frontend|generated subsets, so the browser suites are addressable by name.

Notes

  • annotator bench (chromium, manual) is workflow_dispatch-only and must stay out of any default — it is deliberately not a required check.
  • The rule itself has been added to the refactor-protocol skill's testing section, so an agent or a person reading it before a task now runs all three. This issue is about making the script honest rather than relying on the reader remembering.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    ciCI, tooling, repo automationtoolingDeveloper tooling: scripts, checks, local workflow

    Type

    No type

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions