frontend-patterns/research/experiments/feature-release/README.md
tegwick e34ec3fafe Exercise feature activation rollback and old-session artifact retention
Assistant: codex
Assistant-Model: gpt-6-astra
Assistant-Session: 01a0cffe-206f-7323-89d3-b20ca4cf4bf9
2026-09-26 23:14:34 +02:00

3 KiB

Feature publication, activation and rollback experiment

Executed 2026-09-26. Seven scenarios in Chromium 151.0.7922.34 and Firefox 155.0; 14/14 assertions met. Review, results, provenance.

This is an authored synthetic host using real browser-native modules/import maps, not execution of the earlier FSD/single-spa examples or a production release system. The host API is fixed at 1. Reports R1/R2 support 1, R3 declares 2; Account A1 stays unchanged. Each new HTML document receives the current map. Published assets and activation bindings are separate in-memory controls in the test server.

Reproduce

From this directory:

npm ci --ignore-scripts --cache /tmp/fep-npm-cache
PLAYWRIGHT_BROWSERS_PATH=/tmp/fep-playwright-browsers node node_modules/playwright/cli.js install firefox
PLAYWRIGHT_BROWSERS_PATH=/tmp/fep-playwright-browsers FEP_CHROMIUM_PATH=/path/to/chrome npm test

Playwright 1.63.0 is locked. Recorded runs used the same browser binaries identified by hashes in provenance.json, with an explicit Chromium executable override. Firefox required execution outside the workspace sandbox to access its temporary profile. No external network is used during cases. Loopback server/browser cleanup is automatic. Outputs default to /tmp/fep-release-result.json and an incomplete checkpoint at /tmp/fep-release-checkpoint.json; FEP_RESULT_PATH overrides the final destination. Any failed assertion produces nonzero exit. Receipts are not overwritten automatically.

Cases and limits

Case Observed result in both browsers
X01 Publish R2 without changing binding Fresh page still uses R1; no R2 request
X02 Activate compatible R2 Fresh page R2; old loaded and old lazy pages R1; Account A1 unchanged
X03 Activate incompatible R3 Host rejects mount, Account works; R3 module has already evaluated
X04 Point binding to missing artifact Reports error, Account navigation still usable
X05 Roll binding back R2 → R1 Fresh page R1; running page R2; explicit reload gets R1
X06 Retire R1 after activating R2 Old loaded page retains R1; old lazy page fails; new page uses R2
X07 Fail shared startup module Both navigation buttons remain disabled; feature loading never starts

Negative controls intentionally pass when the specified failure is observed. All responses disable HTTP caching, so this is not a CDN/cache invalidation test. Existing pages retain their document maps; dynamic map mutation/hot replacement is not tested. Only the host's deliberately tiny API-version contract is checked; module evaluation can already have side effects before that check. No backend writes, authentication, API migrations, atomic/concurrent map updates, accessibility audit or safe reload of unsaved work is modeled. The startup outage reflects this fixture's chosen dependency, not an assertion that every independently released frontend must fail that way.