Run the feedback site's tests in CI (#675) #681

Closed
claude-bot wants to merge 0 commits from ci/feedback-site-tests into main
Collaborator

Closes #675.

The feedback site is where the whole redesign is reviewed (#659) — one page per lane, eight lanes planned, each needing a route in app.py. Nothing ran its tests. #673 shipped lane2.html and a link to it without the route, and /prototype/lane2 was a 404; the parametrised route test that would have failed already existed and was never executed.

What's here

A feedback-site job in ci.yml. Unconditional rather than path-gated, as the issue suggested — the suite takes about a second, and a paths filter is one more thing to get wrong.

Pinned dependencies. The issue said tools/feedback-site/requirements.txt exists; it did not. It does now, holding the versions the Dockerfile used to repeat inline, and the Dockerfile installs from it. requirements-dev.txt adds pytest and httpx on top. CI, the image and the README's local command are now one environment instead of three.

Two tests that can't go stale. This is the part that actually fixes the failure mode. The existing route list is hand-maintained, and "page added, route forgotten" is exactly the forgetting that leaves the list stale — so the new tests derive the expectation from the folder:

  • every static/prototype/*.html answers at its route (/prototype for index, /prototype/<stem> otherwise)
  • every file in static/prototype/shared/ is reachable through the whitelisted-extension route

Both were checked to fail as intended, not just to pass. A stray lane9.html and a notes.md produce:

AssertionError: lane9.html has no route: /prototype/lane9 -> 404. Add it to app.py.
AssertionError: notes.md is in static/prototype/shared/ but /prototype/shared/notes.md -> 404.
               Its extension is probably not on _PROTOTYPE_SHARED_MEDIA_TYPES.

Verification

82 passed in python:3.12-slim with the pinned requirements — the 80 that existed plus these two.

🤖 Generated with Claude Code

Closes #675. The feedback site is where the whole redesign is reviewed (#659) — one page per lane, eight lanes planned, each needing a route in `app.py`. Nothing ran its tests. #673 shipped `lane2.html` and a link to it without the route, and `/prototype/lane2` was a 404; the parametrised route test that would have failed already existed and was never executed. ## What's here **A `feedback-site` job in `ci.yml`.** Unconditional rather than path-gated, as the issue suggested — the suite takes about a second, and a paths filter is one more thing to get wrong. **Pinned dependencies.** The issue said `tools/feedback-site/requirements.txt` exists; it did not. It does now, holding the versions the Dockerfile used to repeat inline, and the Dockerfile installs from it. `requirements-dev.txt` adds pytest and httpx on top. CI, the image and the README's local command are now one environment instead of three. **Two tests that can't go stale.** This is the part that actually fixes the failure mode. The existing route list is hand-maintained, and "page added, route forgotten" is exactly the forgetting that leaves the list stale — so the new tests derive the expectation from the folder: - every `static/prototype/*.html` answers at its route (`/prototype` for `index`, `/prototype/<stem>` otherwise) - every file in `static/prototype/shared/` is reachable through the whitelisted-extension route Both were checked to fail as intended, not just to pass. A stray `lane9.html` and a `notes.md` produce: ``` AssertionError: lane9.html has no route: /prototype/lane9 -> 404. Add it to app.py. AssertionError: notes.md is in static/prototype/shared/ but /prototype/shared/notes.md -> 404. Its extension is probably not on _PROTOTYPE_SHARED_MEDIA_TYPES. ``` ## Verification `82 passed` in `python:3.12-slim` with the pinned requirements — the 80 that existed plus these two. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
fix(ci): run the feedback site's tests (#675)
All checks were successful
CI / Bot/backend version sync (pull_request) Successful in 25s
CI / Backend lint (ruff) (pull_request) Successful in 1m9s
CI / Feedback site tests (pull_request) Successful in 1m42s
CI / Summarisation accuracy eval harness (stub provider) (pull_request) Successful in 2m6s
CI / Bot tests and audit (pull_request) Successful in 3m15s
CI / Frontend tests, audit, and build (pull_request) Successful in 3m54s
CI / Docker image build (pull_request) Successful in 4m40s
CI / Synthetic session harness (no GPU, no LLM) (pull_request) Successful in 15m20s
CI / Backend migration, tests, and audit (pull_request) Successful in 15m56s
3c4737ac7f
The feedback site is where the whole redesign is reviewed (#659) — one page
per lane, eight lanes planned, each needing a route in app.py. Nothing ran
its tests. #673 shipped tools/feedback-site/static/prototype/lane2.html and
a link to it without the route, and /prototype/lane2 was a 404: the
parametrised route test that would have failed already existed.

Adds a "Feedback site tests" job to ci.yml, unconditional rather than
path-gated — the suite is about a second, and a paths filter is one more
thing to get wrong.

Pins the dependencies. requirements.txt holds the runtime versions the
Dockerfile used to repeat inline, and the Dockerfile now installs from it;
requirements-dev.txt adds pytest and httpx. CI, the image and the README's
local command are now one environment rather than three.

Adds two tests that derive what must answer from the folder rather than a
hand-maintained list, because the failure mode here was "file added, route
forgotten" and the list in the test is the same list someone forgets:

- every static/prototype/*.html answers at its route
- every file in static/prototype/shared/ is reachable through the
  whitelisted-extension route

Both were checked to fail as intended: a stray lane9.html and a notes.md
each produce a named assertion saying what to add and where.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Author
Collaborator

Merged to main in 6637d09. Closing by hand: the API merge returned 422 while CI was still running, so this was merged by pushing the merge commit, which does not auto-close the PR.

Merged to `main` in 6637d09. Closing by hand: the API merge returned 422 while CI was still running, so this was merged by pushing the merge commit, which does not auto-close the PR.
claude-bot closed this pull request 2026-09-17 21:21:55 +00:00
All checks were successful
CI / Bot/backend version sync (pull_request) Successful in 25s
Required
Details
CI / Backend lint (ruff) (pull_request) Successful in 1m9s
Required
Details
CI / Feedback site tests (pull_request) Successful in 1m42s
Required
Details
CI / Summarisation accuracy eval harness (stub provider) (pull_request) Successful in 2m6s
Required
Details
CI / Bot tests and audit (pull_request) Successful in 3m15s
Required
Details
CI / Frontend tests, audit, and build (pull_request) Successful in 3m54s
Required
Details
CI / Docker image build (pull_request) Successful in 4m40s
Required
Details
CI / Synthetic session harness (no GPU, no LLM) (pull_request) Successful in 15m20s
Required
Details
CI / Backend migration, tests, and audit (pull_request) Successful in 15m56s
Required
Details

Pull request closed

Sign in to join this conversation.
No description provided.