@ai-ecoverse/slicc-bios 1.30.0 → 1.30.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -564,19 +564,29 @@ No test calls a real model. Every test serves an empty `packages/agent/` project
564
564
 
565
565
  `ci.yml` runs on pull requests, the merge queue and pushes to `main`. A `ci / plan` job ([`scripts/ci/plan.mjs`](scripts/ci/plan.mjs)) splits the integration tests into 14 shards: each `guard-set-*.test.mjs` becomes one item per detach variant of the pinned guard vectors (run with `GUARD_VARIANTS`), every other test file is one item, and the items go in a random order, seeded with the run id, to the least-loaded shard by the times in [`scripts/ci/durations.json`](scripts/ci/durations.json), the longest items first. Each shard (`ci / integration (s01)` …) runs its items with [`scripts/ci/shard.mjs`](scripts/ci/shard.mjs), one `node --test` per guard-set file with its variants (the other files join the first), counting a test the guard-set helper reports for that run's guard-set file, keeps the harness's artifacts and coverage from every run, and writes its verdict line. `ci / test`, the required check, fails without a passing verdict from every shard the plan named.
566
566
 
567
+ On a pull request, the plan first reads the files the pull request changes (`git diff HEAD^1 HEAD` on its merge commit) and picks a mode ([`scripts/ci/scope.mjs`](scripts/ci/scope.mjs)):
568
+
569
+ - **docs**: only Markdown or `docs/` changed. Lint runs, and neither the shards nor `ci / vendors` run.
570
+ - **tests**: only `test/integration/*.test.mjs` files changed, and perhaps `durations.json`. Only those files run, in shards; `ci / vendors` runs when a vendors test changed.
571
+ - **catalog**: only `src/packages/optional/**` or `certs.json` changed. The pins, optional, packages, unshadow and renovate rows run, plus the rows of each changed package.
572
+ - **bump**: only pins and lockfiles changed (the base set, `/opt/agent`, grammars, Tailscale, the optional packages, root devDependencies) and `certs.json`. Pins, the boot smoke and renovate run, plus the rows of each changed package, and the catalog rows when an optional package changed.
573
+ - **full**: everything else, and every merge queue run, push to `main` and dispatch. A `package.json` that changed beyond its dependencies, a lockfile without a pin change, a changed helper or fixture, and a package without rows all run the full suite.
574
+
575
+ [`scripts/ci/scopes.json`](scripts/ci/scopes.json) maps each package name or pattern to its rows (`full` for the harness, Playwright and the installer's tar, `vendors` for the slicc CLI). The plan prints its mode and why in the job summary, and `ci / test` passes only when the jobs that mode skips were skipped and every other job passed: `ci: PASS docs plan, 0 shards, skipped integration and vendors`. The merge queue always runs everything, so `main` is never less tested.
576
+
567
577
  Every shard runs the files with a failing test once more and passes when they pass (`retry`, skipped when it wouldn't fit the shard's 62 minutes). From 2026-10-17 to 2026-10-18 a two-by-two experiment compared that with control: 0 of 28 merge queue runs with retry failed, against 15 of 42 without it, so the arms without retry were retired. The pull request's number mod 2 still picks whether a failing shard also cancels the others (`fail-fast+retry` for odd numbers, `retry` for even ones and pushes to `main`), for its runs and its merge queue runs alike, to measure what fail-fast does to the time a pull request waits on CI and its time to merge. The plan, with the arm, the seed and each shard's items, is in the job summary and the `experiment-plan` artifact; each shard's record (`artifacts/experiment/<shard>.json`: its groups, the first run and any retry with their exit codes, counts and failed files) is in its `integration-<shard>` artifact, with each item's time and every test that failed and then passed on the retry. `ci / test` joins them into `summary.json` (the `experiment-summary` artifact), and for each test that flipped it files an issue labeled `flaky-test`, or comments on the open one for that test, with the run, the arm, the shard and the first run's error ([`scripts/ci/summary.mjs`](scripts/ci/summary.mjs)); this step never fails the check, and a fork's read-only token files nothing. `node scripts/ci/durations.mjs` refreshes `durations.json` with the median times of the last 40 runs' summaries.
568
578
 
569
579
  ## Hosting
570
580
 
571
- `main` is live at <https://seven.sliccy.ai/>, and every other branch at `https://<branch>.sliccy.ai/`, where the branch name is lowercased and runs of anything but letters and digits become `-` (`feat/edge-hosting` → <https://feat-edge-hosting.sliccy.ai/>). Each host is its own origin, so a branch gets its own OPFS and service worker and can't disturb `seven`. `https://www.sliccy.ai/7/` serves the same `seven/` next to SLICC 6 (sliccy-ai#51, see [Next to SLICC 6](#next-to-slicc-6-wwwsliccyai7)).
581
+ `main` is live at <https://seven.sliccy.ai/>, and every `bb/**` branch at `https://<branch>.sliccy.ai/`, where the branch name is lowercased and runs of anything but letters and digits become `-` (`bb/edge-hosting` → <https://bb-edge-hosting.sliccy.ai/>). Other branches, Renovate's included, get no preview. Each host is its own origin, so a branch gets its own OPFS and service worker and can't disturb `seven`. `https://www.sliccy.ai/7/` serves the same `seven/` next to SLICC 6 (sliccy-ai#51, see [Next to SLICC 6](#next-to-slicc-6-wwwsliccyai7)).
572
582
 
573
583
  The hosts are served by the [sliccy-ai](https://github.com/ai-ecoverse/sliccy-ai) worker from the R2 bucket `slicc-bios`. This repo only publishes into that bucket:
574
584
 
575
585
  - [`edge/publish.mjs`](edge/publish.mjs) `<branch>` uploads `src/` to `seven/` for `main` and to `branches/<label>/` for every other branch, and deletes what the previous upload had and this one doesn't. A manifest next to it (`seven.json`, `branches/<label>.json`) records which branch owns the label, so two branches that map to the same label can't overwrite each other.
576
586
  - The bucket expires everything under `branches/` 30 days after upload. Every push uploads all files again, so a branch stays up while it's active and disappears a month after its last push. Nothing needs to be cleaned up when a branch is deleted.
577
- - [`.github/workflows/deploy.yml`](.github/workflows/deploy.yml) publishes on every push.
587
+ - [`.github/workflows/deploy.yml`](.github/workflows/deploy.yml) publishes on every push to `main` or a `bb/**` branch, on the `CERT_LIGHT_RUNNER` pool. A newer push to a `bb/**` branch cancels its running publish; a publish of `main` is never cancelled.
578
588
  - **`main`** publishes `seven/` with `CLOUDFLARE_API_TOKEN`, an account token with Workers R2 Storage Write. That token could overwrite `seven/`, so it lives only in the `production` environment, whose deployment branch policy allows `main` alone. A branch that changes the workflow can't read it.
579
- - **Every other branch** holds no secret. It runs in the `preview` environment, with no approval step and `id-token: write`. `edge/publish.mjs` asks GitHub for the job's OIDC token (audience `https://sliccy.ai`) and publishes through the sliccy-ai worker's `/api/publish/*` route. The route checks the token's signature, issuer, audience, expiry, repository and branch, then derives `branches/<label>/` from the branch itself. A branch can only ever write its own prefix, and never `seven/`. Files go up eight at a time, then deletions, then the manifest.
589
+ - **A `bb/**` branch** holds no secret. It runs in the `preview` environment, with no approval step and `id-token: write`. `edge/publish.mjs` asks GitHub for the job's OIDC token (audience `https://sliccy.ai`) and publishes through the sliccy-ai worker's `/api/publish/*` route. The route checks the token's signature, issuer, audience, expiry, repository and branch, then derives `branches/<label>/` from the branch itself. A branch can only ever write its own prefix, and never `seven/`. It first writes a manifest listing both the previous upload's files and this one's, so a publish cancelled midway leaves every file it uploaded on the list for the next publish to delete. Then files go up eight at a time, then deletions, then the final manifest.
580
590
 
581
591
  ## Rules
582
592
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-ecoverse/slicc-bios",
3
- "version": "1.30.0",
3
+ "version": "1.30.2",
4
4
  "description": "Slim loader that boots SLICC into OPFS and serves the UI from there",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -43,7 +43,7 @@
43
43
  },
44
44
  "devDependencies": {
45
45
  "@ai-ecoverse/slicc": "1.44.8",
46
- "@ai-ecoverse/slicc-browsers": "1.8.5",
46
+ "@ai-ecoverse/slicc-browsers": "1.9.0",
47
47
  "@ai-ecoverse/slicc-node": "2.5.1",
48
48
  "@ai-ecoverse/slicc-shared-web": "1.24.2",
49
49
  "@ai-ecoverse/slicc-spectrum": "1.96.1",
@@ -6,7 +6,7 @@
6
6
  "": {
7
7
  "name": "slicc-bios-packages",
8
8
  "dependencies": {
9
- "@ai-ecoverse/slicc-browsers": "1.8.5",
9
+ "@ai-ecoverse/slicc-browsers": "1.9.0",
10
10
  "@ai-ecoverse/slicc-cdp": "1.30.11",
11
11
  "@ai-ecoverse/slicc-clipboard": "1.0.2",
12
12
  "@ai-ecoverse/slicc-kernel": "1.129.0",
@@ -37,9 +37,9 @@
37
37
  }
38
38
  },
39
39
  "node_modules/@ai-ecoverse/slicc-browsers": {
40
- "version": "1.8.5",
41
- "resolved": "https://registry.npmjs.org/@ai-ecoverse/slicc-browsers/-/slicc-browsers-1.8.5.tgz",
42
- "integrity": "sha512-Ec91bcUjUORvGzC1YQ9BJ+0N17T8pJMITcAkVSVFayO0cq5OP8T1kXrMC/LoXVqLcOjo8kmxEVsu/qkzylyNFw==",
40
+ "version": "1.9.0",
41
+ "resolved": "https://registry.npmjs.org/@ai-ecoverse/slicc-browsers/-/slicc-browsers-1.9.0.tgz",
42
+ "integrity": "sha512-e20UO/bon0lXGDMq/UEaNwHedvX8Qyun7wneRVhlJUiFPrnOpjRx6xBopglLQIv1Iw/14ap5Xcc/GoNQwSeX8w==",
43
43
  "license": "Apache-2.0",
44
44
  "engines": {
45
45
  "node": ">=24"
@@ -3,7 +3,7 @@
3
3
  "private": true,
4
4
  "description": "Packages the BIOS installs from npm into OPFS, pinned by package-lock.json and pnpm-lock.yaml",
5
5
  "dependencies": {
6
- "@ai-ecoverse/slicc-browsers": "1.8.5",
6
+ "@ai-ecoverse/slicc-browsers": "1.9.0",
7
7
  "@ai-ecoverse/slicc-cdp": "1.30.11",
8
8
  "@ai-ecoverse/slicc-clipboard": "1.0.2",
9
9
  "@ai-ecoverse/slicc-kernel": "1.129.0",
@@ -9,8 +9,8 @@ importers:
9
9
  .:
10
10
  dependencies:
11
11
  '@ai-ecoverse/slicc-browsers':
12
- specifier: 1.8.5
13
- version: 1.8.5
12
+ specifier: 1.9.0
13
+ version: 1.9.0
14
14
  '@ai-ecoverse/slicc-cdp':
15
15
  specifier: 1.30.11
16
16
  version: 1.30.11
@@ -95,8 +95,8 @@ importers:
95
95
 
96
96
  packages:
97
97
 
98
- '@ai-ecoverse/slicc-browsers@1.8.5':
99
- resolution: {integrity: sha512-Ec91bcUjUORvGzC1YQ9BJ+0N17T8pJMITcAkVSVFayO0cq5OP8T1kXrMC/LoXVqLcOjo8kmxEVsu/qkzylyNFw==}
98
+ '@ai-ecoverse/slicc-browsers@1.9.0':
99
+ resolution: {integrity: sha512-e20UO/bon0lXGDMq/UEaNwHedvX8Qyun7wneRVhlJUiFPrnOpjRx6xBopglLQIv1Iw/14ap5Xcc/GoNQwSeX8w==}
100
100
  engines: {node: '>=24'}
101
101
 
102
102
  '@ai-ecoverse/slicc-cdp@1.30.11':
@@ -200,7 +200,7 @@ packages:
200
200
 
201
201
  snapshots:
202
202
 
203
- '@ai-ecoverse/slicc-browsers@1.8.5': {}
203
+ '@ai-ecoverse/slicc-browsers@1.9.0': {}
204
204
 
205
205
  '@ai-ecoverse/slicc-cdp@1.30.11': {}
206
206