You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
After a conductor update, the web dashboard can fail to show a frontend change that is in the shipped package. Two independent causes:
Browser over-caches index.html.server.py served / with no Cache-Control, so a browser reuses a cached index.html that still references the previous build's version-hashed /assets/index-*.js bundle — pinning the dashboard to the old UI even though the new bundle is installed. (This is what happened when the v0.1.23 subworkflow expand/collapse feature "didn't show up" despite being present in the shipped bundle.)
CI never verified the committed static/ bundle. The Frontend job ran npm run build but discarded the result, so a frontend source change merged without a matching make build-frontend would ship a stale bundle silently.
Changes
src/conductor/web/server.py — serve index.html with Cache-Control: no-cache. The browser revalidates it on every load (cheap 304 via ETag/Last-Modified) and always picks up the current build's hashed bundle after an upgrade. The hashed /assets/* files remain cacheable (their names change whenever their contents do).
.github/workflows/ci.yml — after npm run build, fail the Frontend job if git status shows any uncommitted change under src/conductor/web/static, with an actionable message ("run make build-frontend and commit"). Scoped to static/ only (tsconfig.tsbuildinfo churns per build and is excluded).
tests/test_web/test_server.py — new test_index_sent_with_no_cache asserting the header.
Validation
git status --porcelain -- src/conductor/web/static is empty after a fresh npm run build (verified locally on Node 24 vs CI's Node 20 → byte-identical), so the guard is reliable, not flaky.
uv run pytest tests/test_web/test_server.py — 85 passed.
ruff check / ruff format --check clean on changed files.
Two independent fixes for "the dashboard doesn't show a shipped frontend
change after upgrading":
- server.py serves index.html with `Cache-Control: no-cache`, so browsers
revalidate it (cheap 304 via ETag/Last-Modified) instead of reusing a
cached copy that still points at the previous build's hashed asset
bundle. The hashed /assets/* files stay cacheable (names change on
content change).
- CI now fails the frontend job when the committed src/conductor/web/static
bundle is out of date with the frontend source: it runs `npm run build`
and checks `git status` for changes under static/. The build reproduces
static/ byte-identically, so this is reliable rather than flaky.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ion tests
- Fix inaccurate comment/docstring claims that revalidation yields a
cheap 304: FileResponse doesn't handle conditional requests, so
every load re-downloads the full index.html. The fix still solves
the stale-bundle bug; only the "cheap 304" framing was wrong.
- Add regression tests pinning that /favicon.svg and hashed /assets/*
files do NOT inherit index.html's Cache-Control: no-cache header,
guarding against the fix accidentally widening into a blanket
no-cache policy that would defeat asset caching.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
After a
conductor update, the web dashboard can fail to show a frontend change that is in the shipped package. Two independent causes:index.html.server.pyserved/with noCache-Control, so a browser reuses a cachedindex.htmlthat still references the previous build's version-hashed/assets/index-*.jsbundle — pinning the dashboard to the old UI even though the new bundle is installed. (This is what happened when the v0.1.23 subworkflow expand/collapse feature "didn't show up" despite being present in the shipped bundle.)static/bundle. The Frontend job rannpm run buildbut discarded the result, so a frontend source change merged without a matchingmake build-frontendwould ship a stale bundle silently.Changes
src/conductor/web/server.py— serveindex.htmlwithCache-Control: no-cache. The browser revalidates it on every load (cheap304via ETag/Last-Modified) and always picks up the current build's hashed bundle after an upgrade. The hashed/assets/*files remain cacheable (their names change whenever their contents do)..github/workflows/ci.yml— afternpm run build, fail the Frontend job ifgit statusshows any uncommitted change undersrc/conductor/web/static, with an actionable message ("runmake build-frontendand commit"). Scoped tostatic/only (tsconfig.tsbuildinfochurns per build and is excluded).tests/test_web/test_server.py— newtest_index_sent_with_no_cacheasserting the header.Validation
git status --porcelain -- src/conductor/web/staticis empty after a freshnpm run build(verified locally on Node 24 vs CI's Node 20 → byte-identical), so the guard is reliable, not flaky.uv run pytest tests/test_web/test_server.py— 85 passed.ruff check/ruff format --checkclean on changed files.