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
fix(#1468): fingerprint framework runtime bundle + no-cache serving safety net
The page-runtime bundle (/static/dist/dazzle.min.{js,css}) was emitted
non-fingerprinted with a multi-hour max-age, so returning users ran the cached
OLD bundle for ~4h after a deploy — the #1465 dzTable crash fix "didn't take"
until the cache expired.
Fix (two layers):
1. build_app_chrome content-hashes the bundle URLs (dazzle.min.<hash>.js) in
production/staging — immutable + instant propagation — for the dominant
app/workspace/page path and every site reading app.state.fragment_chrome_*.
Gated by asset_fingerprint.should_fingerprint() (mirrors should_bundle_assets:
on in prod/staging, off in dev/test and under [ui] active_development), so
dev/test keep plain URLs (stable assertions; the existing 18 literal-URL
tests are unaffected).
2. CombinedStaticFiles serves any /static/dist/* requested at its plain
(non-fingerprinted) URL no-cache — a safety net so emission sites that
hardcode the path (auth/profile/signing pages) still propagate fixes
immediately instead of staling. Fingerprinted requests stay immutable.
Adds [ui] active_development (no-cache iteration opt-out) and [ui]
static_max_age (cache duration for non-fingerprinted non-bundle assets) —
the "mature site vs active development" distinction.
Adversarial review caught that fingerprinting alone missed the hardcoded
emission sites; the serving-layer safety net covers them in one place.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: CHANGELOG.md
+11Lines changed: 11 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -9,6 +9,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
9
9
10
10
## [Unreleased]
11
11
12
+
## [0.86.16] - 2026-06-24
13
+
14
+
### Fixed
15
+
- **#1468 framework runtime bundle no longer serves stale to returning users after a deploy.** `/static/dist/dazzle.min.{js,css}` (+ `dazzle-icons.min.js`) was emitted non-fingerprinted with a multi-hour `max-age`, so after a deploy returning visitors kept running the cached old bundle for up to ~4h — a JS *crash* fix (e.g. #1465) "didn't take" until the cache expired. Two-layer fix: **(1)** `build_app_chrome` now content-hashes the framework bundle URLs (`dazzle.min.<hash>.js`) in production/staging — immutable long cache + instant propagation — for the dominant app/workspace/page path (and every site that reads `app.state.fragment_chrome_*`); **(2)** a serving-layer safety net in `CombinedStaticFiles` serves any `/static/dist/*` requested at its plain URL `no-cache`, so emission sites that hardcode the path (auth/profile/signing pages) still propagate fixes immediately rather than staling for hours.
16
+
17
+
### Added
18
+
- **`[ui] active_development` and `[ui] static_max_age` (dazzle.toml).** `active_development = true` opts a deployed site out of fingerprinting/immutable caching in favour of `no-cache` revalidation (fast iteration on a staging/dev deploy). `static_max_age = <seconds>` configures the cache duration for non-fingerprinted, non-bundle static assets (default 1h; fingerprinted assets are always immutable). Realises the "mature site vs site under active development" distinction.
19
+
20
+
### Agent Guidance
21
+
- **Fingerprinting is env-gated.** `dazzle.page.runtime.asset_fingerprint.should_fingerprint()` is on only in `DAZZLE_ENV=production`/`staging` and off under `[ui] active_development` — so dev/test see plain `/static/dist/...` URLs (stable assertions). New framework HTML that emits a `/static/dist/*` URL should route it through `fingerprint_static_url()` for the immutable optimization; if it can't, the `no-cache` serving safety net still guarantees correctness.
0 commit comments