{ "schemaVersion": 1, "changes": [ { "changeId": "FE-REG-ENV:API_CONTRACT_VERSION:*:removed", "versionBump": "Runtime Config V2 (CONFIG_SCHEMA_VERSION 2.0) removes the scalar API contract version.", "migration": "Release Manifest V2 contractSet replaces the scalar: the compiled external contract package set is canonicalized and digested, and boot compares it against the manifest.", "compatibilityWindow": "The V1 config and V1 manifest readers stay in place for one release. A V1 document may still carry the scalar; a V2 document is rejected if it does.", "rollback": "Restore the V1 writer in scripts/generate-build-manifest.ts and the scalar key in public/config.json; the V1 reader is still present.", "owner": "frontend-platform" }, { "changeId": "FE-REG-QUERY:*:*:removed", "versionBump": "Query invalidation composition moves from the legacy flat query registry to the bounded many-to-many invalidation graph.", "migration": "Installed feature contracts now contribute topics, namespace identities, edges, and separate wire versions; bootstrap validates and indexes those contributions before constructing coordinators.", "compatibilityWindow": "Cross-context envelopes remain opaque topic/version pairs and release cache epochs isolate mixed releases; no query keys or cached values cross contexts.", "rollback": "Restore the flat QUERY_REGISTRY composition and its coordinator adapter together with the prior governance entry.", "owner": "frontend-platform" }, { "changeId": "FE-REG-QUERY:$contract:allowedValues:contract-field-changed", "versionBump": "Cross-context invalidation wire protocol starts at version 1.", "migration": "Every installed query row declares invalidate-only; older tabs remain local-only.", "compatibilityWindow": "Mixed releases are isolated by release cacheEpoch and never exchange query keys or values.", "rollback": "Remove the coordinator composition and the two query registry fields.", "owner": "frontend-platform" }, { "changeId": "FE-REG-QUERY:$contract:breakingFields:contract-field-changed", "versionBump": "Cross-context invalidation wire protocol starts at version 1.", "migration": "Every installed query row declares its opaque topic and transport policy.", "compatibilityWindow": "A release cacheEpoch rejects messages from a different deployed contract.", "rollback": "Remove the coordinator composition and restore the prior query registry contract.", "owner": "frontend-platform" }, { "changeId": "FE-REG-QUERY:$contract:fieldTypes:contract-field-changed", "versionBump": "Cross-context invalidation wire protocol starts at version 1.", "migration": "The installed reference query row and all consumers were updated atomically.", "compatibilityWindow": "Old clients do not consume the new fields; new clients validate them before boot.", "rollback": "Restore the previous query registry field types and local-only invalidation.", "owner": "frontend-platform" }, { "changeId": "FE-REG-QUERY:$contract:requiredFields:contract-field-changed", "versionBump": "Cross-context invalidation wire protocol starts at version 1.", "migration": "Missing topics now fail registry validation instead of silently degrading at runtime.", "compatibilityWindow": "Only a fully built release consumes its own installed registry snapshot.", "rollback": "Remove the newly required fields and cross-context composition together.", "owner": "frontend-platform" }, { "changeId": "FE-REG-QUERY:$contract:uniqueFields:contract-field-changed", "versionBump": "Cross-context invalidation wire protocol starts at version 1.", "migration": "Existing query namespaces received unique registry-issued opaque topics.", "compatibilityWindow": "Topics are scoped by release cacheEpoch, so mixed releases cannot collide.", "rollback": "Drop invalidationTopic uniqueness after removing the transport consumer.", "owner": "frontend-platform" }, { "changeId": "FE-REG-RELEASE:apiContractVersion:compatibilityRole:field-changed", "versionBump": "The release token registry adds contractSetDigest and demotes apiContractVersion to a legacy V1 scalar.", "migration": "compareReleaseToRuntime no longer sources the scalar from Runtime Config; when neither side declares it there is nothing to compare and contractSet verification owns contract coherence.", "compatibilityWindow": "A V1 manifest still supplies apiContractVersion and is still compared against a V1 config that declares one.", "rollback": "Restore the previous compatibilityRole text and remove the contractSetDigest token together with the V2 manifest writer.", "owner": "frontend-platform" }, { "changeId": "FE-REG-STORAGE:$contract:allowedValues:contract-field-changed", "versionBump": "Web Storage value codec contracts start at version 1.", "migration": "Existing keys retain their physical schema version; values outside the selected codec are discarded.", "compatibilityWindow": "Valid existing color-scheme and opaque-string records remain readable.", "rollback": "Restore the previous registry contract; no physical key deletion is required.", "owner": "frontend-platform" }, { "changeId": "FE-REG-STORAGE:$contract:breakingFields:contract-field-changed", "versionBump": "Web Storage value codec contracts start at version 1.", "migration": "Each existing row received an explicit codec; executable migration was never consumed and is now forbidden.", "compatibilityWindow": "Schema-versioned physical keys and the envelope shape remain unchanged.", "rollback": "Remove valueCodec enforcement and restore the prior metadata declaration.", "owner": "frontend-platform" }, { "changeId": "FE-REG-STORAGE:$contract:fieldTypes:contract-field-changed", "versionBump": "Web Storage value codec contracts start at version 1.", "migration": "The dead function migration union was narrowed to the only implemented discard policy.", "compatibilityWindow": "All installed definitions already used discard before this contract change.", "rollback": "Restore the former type metadata without rewriting persisted records.", "owner": "frontend-platform" }, { "changeId": "FE-REG-STORAGE:$contract:requiredFields:contract-field-changed", "versionBump": "Web Storage value codec contracts start at version 1.", "migration": "All installed storage rows now declare their closed value codec.", "compatibilityWindow": "Existing valid envelopes continue to decode; invalid values fail closed.", "rollback": "Remove the required codec field and runtime codec dispatch together.", "owner": "frontend-platform" } ] }