sdk.js is released as immutable files:
packages/tracker/releases/<version>/sdk.js plus one entry in
packages/tracker/releases/manifest.json (size, SHA-384, the integrity value tenants paste).
A released file never changes; a fix is a new version. packages/tracker/releases/revoked.json
is the only mutable file. The gateway serves GET /v/<version>/sdk.js from the copy baked into
its image and answers 410 for a revoked version; the control plane, from its own baked copy,
refuses to show a snippet for one (tracker_version_revoked). How tenants check a file:
../security/verify-tracker.md.
Release a new version
Needs Node 26.13.1 and pnpm 12.18.0 (plan section 5).-
Set
versioninpackages/tracker/package.jsonto the new version. The release script refuses anything else. -
Build and record the release:
Expected:
gzip size <old> -> <new> (<n>%)and the new manifest entry as JSON. The script refuses a version that exists or is not newer than the newest, and never overwrites a file. -
Check the release directory, a byte-identical rebuild and the size budget:
Expected last line:
releases verified against HEAD. CI runs the same against the change’s base and fails if any committed release file or entry changed. -
Run the tracker’s tests and the browser suites that pin a version:
pnpm --filter tracker test, thenmake gateway-itandmake webpath(see the Makefile for their prerequisites). -
Commit, merge, and tag
tracker-v<x.y.z>.release-tracker.ymlchecks that the tag names the newest committed release and publishes it (attestation and npm publication wait for the GitHub Actions account issue and input I9; ../security/verify-tracker.md sections 3 and 6). -
Ship the files: the gateway and control plane images copy
packages/tracker/releases, so tag a platform release and roll it out (make <env>-deploy ROLLING=1 ...). Until then the new version answers 404 at the edge. - Tell tenants: the console offers the newest non-revoked version; existing snippets keep the version they pinned. Tenants upgrade on purpose.
Revoke a version
A version has a flaw serious enough that pages must stop running it, for example a tracker that sends more than the wire format allows, or a doubt about how a file was built.-
Add the version with a reason to
packages/tracker/releases/revoked.json:Leavereleases/<version>/and its manifest entry in place: removing them would break the immutability check and the record of what was served. -
pnpm --filter tracker verify-releases, then commit and tag a platform release, and roll it out to every edge and core node. Pages that load the version get 410 and record nothing; snippet requests for it get410 tracker_version_revoked. A page that still runs the file from its cache or a self-hosted copy keeps sending: from 1.2.0 those events name the release and the gateway refuses them with 410 (rejected_revoked_versionon the site’s counters); events of 1.0.0 and 1.1.0 carry no release name and still pass. -
On a node that already runs an image with the new list, a reload without restart is
possible:
SIGHUPmakes the gateway readrevoked.json(and the DB-IP file) again, and the control plane reads the file on every snippet request. Inside an image the file only changes with a new image, so in practice step 2 is the path. -
Tell the affected tenants which version to move to and why. Make sure a non-revoked version
exists first: if every version is revoked, the console answers
every tracker version is revoked.
Exercised
Not yet exercised: a release or revocation rolled out through images to staging or production,
and the tag workflow (GitHub Actions fails at start-up on the account, plan status phase 1).