diff --git a/CHANGELOG.md b/CHANGELOG.md index ccdd635..4054c58 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ All notable changes are documented here. +## [0.3.0-alpha.2] - 2026-07-19 + +### Changed + +- Browser admission-control conformance now uses an active-session barrier and deterministic cleanup, removing timing-dependent WebKit retries. + ## [0.3.0-alpha.1] - 2026-07-19 ### Added diff --git a/README.md b/README.md index ffd783e..db86add 100644 --- a/README.md +++ b/README.md @@ -46,8 +46,8 @@ flowchart LR The alpha is distributed as a GitHub release archive rather than an npm registry publication. ```bash -curl -LO https://github.com/aantenore/tabloom/releases/download/v0.3.0-alpha.1/tabloom-0.3.0-alpha.1.tgz -pnpm add ./tabloom-0.3.0-alpha.1.tgz +curl -LO https://github.com/aantenore/tabloom/releases/download/v0.3.0-alpha.2/tabloom-0.3.0-alpha.2.tgz +pnpm add ./tabloom-0.3.0-alpha.2.tgz ``` Verify the adjacent `.sha256` asset before installing in a controlled delivery pipeline. diff --git a/package.json b/package.json index a6384b8..b5f29bc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@aantenore/tabloom", - "version": "0.3.0-alpha.1", + "version": "0.3.0-alpha.2", "description": "A provider-neutral control plane for one fenced browser inference runtime across pages and SharedWorkers.", "type": "module", "license": "Apache-2.0", diff --git a/tests/e2e/shared-worker.spec.ts b/tests/e2e/shared-worker.spec.ts index a03afcb..d35022e 100644 --- a/tests/e2e/shared-worker.spec.ts +++ b/tests/e2e/shared-worker.spec.ts @@ -106,17 +106,41 @@ test.describe('TabLoom adaptive SharedWorker topology', () => { context, }) => { const pages = await openCluster(context, 5, '?mode=shared-worker'); + const holder = pages[0]!; + const contenders = pages.slice(1); + const work = 'bounded-work-'.repeat(512); await Promise.all( pages.map((page) => expect(page.locator('#readiness')).toHaveText('ready'), ), ); + await holder.locator('#prompt').fill(`holder-${work}`); await Promise.all( - pages.map((page, index) => - page.locator('#prompt').fill(`${index}-${'bounded-work-'.repeat(24)}`), + contenders.map((page, index) => + page.locator('#prompt').fill(`contender-${index}-${work}`), ), ); - await Promise.all(pages.map((page) => page.locator('#send').click())); + await holder.locator('#send').click(); + await expect(holder.locator('#output')).not.toHaveText(''); + await Promise.all( + contenders.map((page) => page.locator('#send').dispatchEvent('click')), + ); + await expect + .poll(async () => { + const errors = await Promise.all( + pages.map((page) => page.locator('#error').textContent()), + ); + return errors.filter((error) => error === 'BACKPRESSURE').length; + }) + .toBe(1); + await Promise.all( + pages.map(async (page) => { + const cancel = page.locator('#cancel'); + if (await cancel.isEnabled()) { + await cancel.dispatchEvent('click'); + } + }), + ); await Promise.all( pages.map((page) => expect(page.locator('#request-status')).toHaveText(/completed|failed/u), @@ -126,6 +150,7 @@ test.describe('TabLoom adaptive SharedWorker topology', () => { pages.map((page) => page.locator('#error').textContent()), ); expect(errors.filter((error) => error === 'BACKPRESSURE')).toHaveLength(1); + expect(errors.filter((error) => error === 'CANCELLED')).toHaveLength(4); }); });