| … | … | @@ -23,6 +23,12 @@ The packages are versioned in lockstep. |
| 23 | 23 | Efficiency Plan. The root README now links both candidate replacement |
| 24 | 24 | surfaces and keeps them distinct from the published legacy fleet. |
| 25 | 25 | |
| 26 | ### Fixed | |
| 27 | - Preserved the byte-for-byte executable v1 browser-control bundle while | |
| 28 | refreshing its manifest, Chromium evidence, cross-host evidence, and pinned | |
| 29 | compatibility hashes to bind the already-current bundle and source closure. | |
| 30 | The vNext policy export is not part of the executable v1 bundle. | |
| 31 | ||
| 26 | 32 | ## [0.24.3] — 2026-07-08 |
| 27 | 33 | |
| 28 | 34 | ### Added |
| … | … | @@ -62,6 +62,12 @@ and additional readback/operator evidence raises only the durability label. |
| 62 | 62 | It keeps workload placement separate from network privacy, durability, cost, |
| 63 | 63 | and semantic-service disclosure: |
| 64 | 64 | |
| 65 | This policy export is not added to the executable v1 browser-control bundle. | |
| 66 | That bundle remains byte-frozen; its manifest and browser evidence are refreshed | |
| 67 | only to bind the already-current bundle and exact source closure. The policy SDK | |
| 68 | is part of the unpublished private `1.0.0-rc.1` replacement workspace and is | |
| 69 | not an npm publication claim. | |
| 70 | ||
| 65 | 71 | ```js |
| 66 | 72 | import { |
| 67 | 73 | RUNTIME, |
| … | … | @@ -258,14 +258,15 @@ test('browser artifact manifest and verification inputs are exact and canonical' |
| 258 | 258 | }), 'BAD_BLIND_CLIENT_BROWSER_ARTIFACT') |
| 259 | 259 | }) |
| 260 | 260 | |
| 261 | test('browser artifact stays package-addressable while candidate authority blocks regeneration', t => { | |
| 261 | test('browser artifact stays package-addressable and regeneration check is current', t => { | |
| 262 | 262 | const generated = spawnSync(process.execPath, [fileURLToPath(generatorUrl), '--check'], { |
| 263 | 263 | cwd: os.tmpdir(), |
| 264 | 264 | encoding: 'utf8' |
| 265 | 265 | }) |
| 266 | t.is(generated.status, 1) | |
| 267 | t.ok(generated.stderr.includes('browser artifact tuple authority is stale')) | |
| 268 | t.ok(generated.stderr.includes('BlindForwardRouteScopeV1')) | |
| 266 | t.is(generated.status, 0) | |
| 267 | const generationReport = JSON.parse(generated.stdout) | |
| 268 | t.is(generationReport.schema, 'HiveRelayBlindClientBrowserArtifactGenerationV1') | |
| 269 | t.is(generationReport.releaseReady, true) | |
| 269 | 270 | const resolvedArtifact = fileURLToPath(import.meta.resolve( |
| 270 | 271 | '@hiverelay/blind-client/browser-artifacts/blind-client-control-v1.mjs')) |
| 271 | 272 | const resolvedManifest = fileURLToPath(import.meta.resolve( |