@ai-ecoverse/slicc-bios 1.14.0 → 1.15.1
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 +6 -2
- package/package.json +2 -2
- package/src/packages/agent/package.json +1 -1
- package/src/packages/agent/pnpm-lock.yaml +8 -8
- package/src/packages/certs.json +8 -0
- package/src/packages/package-lock.json +4 -4
- package/src/packages/package.json +1 -1
- package/src/packages/pnpm-lock.yaml +5 -5
package/README.md
CHANGED
|
@@ -479,9 +479,13 @@ Limits:
|
|
|
479
479
|
[`.github/workflows/canary.yml`](.github/workflows/canary.yml) answers "is bios main green with these candidate versions?" before anyone asks for a pin. It never pushes, pins or opens a PR: it reports.
|
|
480
480
|
|
|
481
481
|
- **Triggers:** `workflow_dispatch` and `workflow_call` with `overrides`, a JSON list of `name@version` (`["@ai-ecoverse/slicc-kernel@1.81.0"]`), and optionally `runner`, `shards` (names from [`scripts/canary/shards.json`](scripts/canary/shards.json); `follow-chat`, `remote-pydata`, `users-agent-ui`, `packages-update-cdp`, `guard`, `guard-set-extension-prompt`, `guard-set-extension-lagging`, `guard-set-proxy-prompt`, `guard-set-proxy-lagging`, `k4-link`, `user-packages-keys-favicon` and `rest` by default; a shard's `env` in that file, such as `GUARD_VARIANTS`, is set for its tests, or `sweep` for just the base-set sweep and the certs check), `expect` and `bios-ref` (any branch or sha of slicc-bios: the shard jobs check it out and lay this ref's `scripts/canary`, and `sweep.test.mjs` if it has none, over it; a ref whose `pins.test.mjs` has no canary mode gets the candidates in its working copy of `certs.json` instead, and the report still lists them as candidates). A proof in `proofs.json` can name its own `ref` the same way. An hourly `schedule` checks npm's `latest` of every kernel, jsh, cdp, agent, `wasm-*`, `wasi-*`, `wasix-*` and `py-*` package that a `src/packages/**/package.json` pins, and runs once with every newer one as the overrides, only when that list differs from the last scheduled canary's (its inputs are kept in the Actions cache). A `pull_request` trigger, filtered to the canary's own files, runs the proof in [`scripts/canary/proofs.json`](scripts/canary/proofs.json) from one plan job, cancelling a superseded run: kernel 1.78.0 on the `sweep` shard must regress grep, sed, jq, xz, findutils, diffutils and patch with exit 70 (kernel #483). A second proof packs `@ai-ecoverse/slicc-cdp@1.26.2` with `npm pack`, uploads it from the plan job, and runs it as a candidate artifact on `packages-update-cdp` and `guard` with `repeat: 3`.
|
|
482
|
-
- **A candidate from another repo's run:** `candidate-package` (the package it replaces, `@ai-ecoverse/slicc-cdp`), `candidate-artifact` (an artifact holding one `npm pack` tarball of it), `candidate-run` (the run that uploaded it), `candidate-sha256` and optionally `candidate-repo` (the caller's repository by default). Each shard job downloads the artifact with `github.token`, which under `workflow_call` is the caller's, so the caller's job needs `actions: read`. [`override-pins.mjs`](scripts/canary/override-pins.mjs) checks the tarball's sha256 before it reads anything and refuses a mismatch, then checks the tarball is that package with an exact version. It seeds the harness download cache with the bytes at the npm URL of that version, and rewrites the pins and locks through a local registry that serves npm's packuments with that version added, so an unpublished `x.y.z-pr.N.M` locks like a published one (npm's lock gets the registry URL back). Everything else stays a registry version. The report lists it as `candidate (artifact <run>/<name>, sha256 …)`.
|
|
482
|
+
- **A candidate from another repo's run:** `candidate-package` (the package it replaces, `@ai-ecoverse/slicc-cdp`), `candidate-artifact` (an artifact holding one `npm pack` tarball of it), `candidate-run` (the run that uploaded it), `candidate-sha256` (the tarball's) and optionally `candidate-repo` (the caller's repository by default). Each shard job downloads the artifact with `github.token`, which under `workflow_call` is the caller's, so the caller's job needs `actions: read`. [`override-pins.mjs`](scripts/canary/override-pins.mjs) checks the tarball's sha256 before it reads anything and refuses a mismatch, then checks the tarball is that package with an exact version. It seeds the harness download cache with the bytes at the npm URL of that version, and rewrites the pins and locks through a local registry that serves npm's packuments with that version added, so an unpublished `x.y.z-pr.N.M` locks like a published one (npm's lock gets the registry URL back). Everything else stays a registry version. The report lists it as `candidate (artifact <run>/<name>, sha256 …)`.
|
|
483
|
+
- **Binding the candidate to its upload:** a call that names a candidate also passes `candidate-artifact-id` and `candidate-artifact-digest`, the `artifact-id` and `artifact-digest` outputs of the step that uploaded it (the digest is the zip's SHA-256, not the tarball's `candidate-sha256`; a `sha256:` prefix is allowed). `candidate-binding` is `strict` by default, and the plan refuses a candidate without both values. Only an explicit `candidate-binding: legacy` takes a candidate by name, as before; runs that name no candidate, such as the schedule and the PR proofs, don't set it. Before anything from the tested ref runs, [`scripts/canary/bind.mjs`](scripts/canary/bind.mjs) reads `GET /repos/{repo}/actions/artifacts/{id}` and `GET /repos/{repo}` and refuses the artifact unless its id, name, `workflow_run.id`, `workflow_run.repository_id` and digest are the bound ones and it hasn't expired. The shard then downloads it by `artifact-ids` with `digest-mismatch: error`, and the tarball's sha256 check stays. The PR proof's tarball is bound the same way, to the plan job's upload step.
|
|
484
|
+
- **Digests:** every digest the canary emits is the uploader's `artifact-digest` output, 64 lowercase hex digits with no prefix. The REST API's `digest` field is `sha256:` followed by the same digits, so strip that prefix before comparing.
|
|
485
|
+
- **`artifact-id`, `artifact-digest` and `artifacts`** are `workflow_call` outputs. The first two are the `canary` report artifact's, from the report job's upload step. `artifacts` is a JSON list of `{ role, name, id, digest, attempt }` covering every artifact the call uploaded, in this order: `plan` (the plan job's `canary-inputs` on a schedule, or the PR proof's tarball), then for each planned shard, in plan order, `shard` (`<label>-canary-shard-<run>-<shard>`) and `files` (`<label>-canary-files-<run>-<shard>`, present only when the shard left files), then `report` (`<label>-canary`). Names follow from the trusted plan. Each id and digest is the output of the step that uploaded that artifact, never an API lookup, and a `shard` or `files` row appears only once the report has checked it against the API. `attempt` is the `github.run_attempt` of the job that uploaded it: a job carried over from an earlier attempt keeps its number, and ids come only from the job outputs of the current attempt.
|
|
486
|
+
- **The shards reach the report by their upload steps:** a matrix job's outputs collapse to the last job's, so each shard job writes its rows to its own output, `binding_<strategy.job-index>` (the shard job declares `binding_0` to `binding_15`, and the plan refuses more than 16 jobs). The report job reads them all with `toJSON(needs.shard.outputs)`, checks each planned shard's `shard` and `files` artifacts against the API the same way as the candidate (with this run and this repository), and downloads only the verified `shard` ids. The shard jobs ran the candidate, so this API check, not the shard job, is what ties each id to the one artifact of that name in this run. It refuses a binding for a shard the plan didn't make, a row whose name isn't the planned one (a forged extra suffix), a directory in the download that no verified binding names, a `shard.json` holding another shard, and any download that failed its digest check. Each refusal turns the canary red with `FAIL refused <name>`, and the bindings step prints its own `canary bindings: PASS|FAIL` verdict, which the report requires.
|
|
483
487
|
- **`repeat`** (1 to 10, default 1): each selected test file runs that many times with the candidates, and the files with a failure run that many times on main's pins. A test failing in every candidate run and no baseline run is a regression, one failing in every run of both is a failure on both, and anything mixed is flaky. Each row carries its counts, `candidate 2/3, baseline 0/3`.
|
|
484
|
-
- **`result`**, a `workflow_call` output next to `ok`: the JSON summary (`ok`, `counts`, `regressions`, `both`, `flaky`, `failures`, `missingShards`, `unexplainedExits`, `candidates`, `overrides`, `repeat`) plus the `canary` artifact's name and
|
|
488
|
+
- **`result`**, a `workflow_call` output next to `ok`: the JSON summary (`ok`, `counts`, `regressions`, `both`, `flaky`, `failures`, `missingShards`, `unexplainedExits`, `refused`, `candidates`, `overrides`, `repeat`) plus the `canary` artifact's name, URL, id and digest. Those last two are a convenience: `artifact-id`, `artifact-digest` and `artifacts` are the authoritative values. A plan that refuses its inputs still gets a report, `canary: FAIL the plan refused: …`.
|
|
485
489
|
- **Permissions:** `contents: read` and `actions: read`, no secrets and no `id-token`. A caller outside bios runs the plan with its inputs: the PR proofs and the hourly npm check run only for bios's own triggers.
|
|
486
490
|
- **Jobs:** one plan job, one job per shard of each run, and one report job, because the queue for a runner costs more than the work.
|
|
487
491
|
- **Runner:** fork code never runs on the org's Cloud Run pools. A same-repo `pull_request` (the proofs from our own branches), or a `schedule`, `workflow_dispatch`, `workflow_run` or `release` run on `main` (any `bios-ref`), puts the shard jobs on the `runner` input, else the `CERT_RUNNER` repository variable (`cloud-run-bench`), and the light plan and report jobs on `CERT_LIGHT_RUNNER` (`cloud-run`). Everything else runs on `ubuntu-latest`, and the `runner` input is ignored: fork pull requests, and dispatches from any other branch. Under `workflow_call` the same check reads the caller's event. The pools run with "no new privileges", so `sudo` can't become root there: the shard job installs Chromium's system libraries only when `sudo -n true` works, and otherwise relies on the image's.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-ecoverse/slicc-bios",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.15.1",
|
|
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",
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
"format": "biome check --write ."
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
|
-
"@ai-ecoverse/slicc": "1.
|
|
45
|
+
"@ai-ecoverse/slicc": "1.44.0",
|
|
46
46
|
"@ai-ecoverse/slicc-browsers": "1.7.10",
|
|
47
47
|
"@ai-ecoverse/slicc-node": "2.5.1",
|
|
48
48
|
"@ai-ecoverse/slicc-shared-web": "1.23.1",
|
|
@@ -13,10 +13,10 @@ importers:
|
|
|
13
13
|
dependencies:
|
|
14
14
|
'@ai-ecoverse/slicc-agent':
|
|
15
15
|
specifier: 6.0.1
|
|
16
|
-
version: 6.0.1(@ai-ecoverse/slicc-kernel@1.
|
|
16
|
+
version: 6.0.1(@ai-ecoverse/slicc-kernel@1.124.2)(@aws-sdk/credential-provider-node@3.972.84)(@smithy/signature-v4@5.7.4)(ws@8.22.0)
|
|
17
17
|
'@ai-ecoverse/slicc-kernel':
|
|
18
|
-
specifier: 1.
|
|
19
|
-
version: 1.
|
|
18
|
+
specifier: 1.124.2
|
|
19
|
+
version: 1.124.2
|
|
20
20
|
|
|
21
21
|
packages:
|
|
22
22
|
|
|
@@ -34,8 +34,8 @@ packages:
|
|
|
34
34
|
resolution: {integrity: sha512-clzlvrVLjmWEiKXhuK/Lez7y3Dwmo+FJ8POUs5GYqLJy5u8cOAiXyliQlNUNOVkNx9EoPm0RVvdfFkSTgv/isg==}
|
|
35
35
|
engines: {node: '>=24'}
|
|
36
36
|
|
|
37
|
-
'@ai-ecoverse/slicc-kernel@1.
|
|
38
|
-
resolution: {integrity: sha512-
|
|
37
|
+
'@ai-ecoverse/slicc-kernel@1.124.2':
|
|
38
|
+
resolution: {integrity: sha512-YaFI+TJ2ARHvIW0sVfVplYz9SXyNzkl1CIuW+pHfy/DG6hBJhA8U+LLg+TSH6mZpIU2w01yV6guPQHjn/2TrnA==}
|
|
39
39
|
engines: {node: '>=24'}
|
|
40
40
|
|
|
41
41
|
'@ai-ecoverse/slicc-vault@1.9.1':
|
|
@@ -324,10 +324,10 @@ packages:
|
|
|
324
324
|
|
|
325
325
|
snapshots:
|
|
326
326
|
|
|
327
|
-
'@ai-ecoverse/slicc-agent@6.0.1(@ai-ecoverse/slicc-kernel@1.
|
|
327
|
+
'@ai-ecoverse/slicc-agent@6.0.1(@ai-ecoverse/slicc-kernel@1.124.2)(@aws-sdk/credential-provider-node@3.972.84)(@smithy/signature-v4@5.7.4)(ws@8.22.0)':
|
|
328
328
|
dependencies:
|
|
329
329
|
'@ai-ecoverse/slicc-browsers': 1.7.6
|
|
330
|
-
'@ai-ecoverse/slicc-kernel': 1.
|
|
330
|
+
'@ai-ecoverse/slicc-kernel': 1.124.2
|
|
331
331
|
'@ai-ecoverse/slicc-vault': 1.9.1
|
|
332
332
|
'@aws-sdk/middleware-websocket': 3.972.54
|
|
333
333
|
'@earendil-works/chord': 1.3.0
|
|
@@ -349,7 +349,7 @@ snapshots:
|
|
|
349
349
|
|
|
350
350
|
'@ai-ecoverse/slicc-browsers@1.7.6': {}
|
|
351
351
|
|
|
352
|
-
'@ai-ecoverse/slicc-kernel@1.
|
|
352
|
+
'@ai-ecoverse/slicc-kernel@1.124.2': {}
|
|
353
353
|
|
|
354
354
|
'@ai-ecoverse/slicc-vault@1.9.1': {}
|
|
355
355
|
|
package/src/packages/certs.json
CHANGED
|
@@ -227,6 +227,14 @@
|
|
|
227
227
|
"integrity": "sha512-PGJvZUm/oQYuS9pbUxDIpBSCeyaW91wDN2yWPCZIv664WDWKsiCTeQ1c4i8xU4Bq7C66viFK6EzZhvvofQ6b3Q==",
|
|
228
228
|
"sha256": "a2669581cdf276e288ae4681a10eefc865a4a435ff07591b1d69de58275e3782"
|
|
229
229
|
},
|
|
230
|
+
"@ai-ecoverse/slicc-kernel@1.117.5": {
|
|
231
|
+
"integrity": "sha512-uVQ/FO0VK2kh0VK/ZJp9P7UX0nHFQKtjBahxcSYoiYk2nBMzC13yrWKuR2A7Hr1nG/TsUP5FDJjRU46g+ZfVHg==",
|
|
232
|
+
"sha256": "02ba1f777d53ba1fe48caecaf97e1e75878638c570e1b5517e8e8863b27a2b4f"
|
|
233
|
+
},
|
|
234
|
+
"@ai-ecoverse/slicc-kernel@1.124.2": {
|
|
235
|
+
"integrity": "sha512-YaFI+TJ2ARHvIW0sVfVplYz9SXyNzkl1CIuW+pHfy/DG6hBJhA8U+LLg+TSH6mZpIU2w01yV6guPQHjn/2TrnA==",
|
|
236
|
+
"sha256": "3a4972b4fb9faae3ac1969df2fed37cf2e190f8821aca525be54ee5bade20436"
|
|
237
|
+
},
|
|
230
238
|
"@ai-ecoverse/wasi-biome@2.5.15-2": {
|
|
231
239
|
"integrity": "sha512-5oIfngw8Ln2/ddCJ0wtqMoSnW+UO2zuih0+x1CNDbwKkB18TxuWoI60QFQySjd69N6eP+blL/stz/AZyoYpeuw==",
|
|
232
240
|
"sha256": "25599e4317ec2e7ca9a447ff99ac01f271358cd06bd2d727e6b28b10c05bf44a"
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"@ai-ecoverse/slicc-browsers": "1.7.10",
|
|
10
10
|
"@ai-ecoverse/slicc-cdp": "1.26.2",
|
|
11
11
|
"@ai-ecoverse/slicc-clipboard": "1.0.2",
|
|
12
|
-
"@ai-ecoverse/slicc-kernel": "1.
|
|
12
|
+
"@ai-ecoverse/slicc-kernel": "1.124.2",
|
|
13
13
|
"@ai-ecoverse/slicc-spectrum": "1.86.3",
|
|
14
14
|
"@ai-ecoverse/wasi-pnpm": "12.9.1-9",
|
|
15
15
|
"@ai-ecoverse/wasi-ripgrep": "15.2.0-3",
|
|
@@ -71,9 +71,9 @@
|
|
|
71
71
|
}
|
|
72
72
|
},
|
|
73
73
|
"node_modules/@ai-ecoverse/slicc-kernel": {
|
|
74
|
-
"version": "1.
|
|
75
|
-
"resolved": "https://registry.npmjs.org/@ai-ecoverse/slicc-kernel/-/slicc-kernel-1.
|
|
76
|
-
"integrity": "sha512-
|
|
74
|
+
"version": "1.124.2",
|
|
75
|
+
"resolved": "https://registry.npmjs.org/@ai-ecoverse/slicc-kernel/-/slicc-kernel-1.124.2.tgz",
|
|
76
|
+
"integrity": "sha512-YaFI+TJ2ARHvIW0sVfVplYz9SXyNzkl1CIuW+pHfy/DG6hBJhA8U+LLg+TSH6mZpIU2w01yV6guPQHjn/2TrnA==",
|
|
77
77
|
"license": "Apache-2.0",
|
|
78
78
|
"engines": {
|
|
79
79
|
"node": ">=24"
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"@ai-ecoverse/slicc-browsers": "1.7.10",
|
|
7
7
|
"@ai-ecoverse/slicc-cdp": "1.26.2",
|
|
8
8
|
"@ai-ecoverse/slicc-clipboard": "1.0.2",
|
|
9
|
-
"@ai-ecoverse/slicc-kernel": "1.
|
|
9
|
+
"@ai-ecoverse/slicc-kernel": "1.124.2",
|
|
10
10
|
"@ai-ecoverse/slicc-spectrum": "1.86.3",
|
|
11
11
|
"@ai-ecoverse/wasi-pnpm": "12.9.1-9",
|
|
12
12
|
"@ai-ecoverse/wasi-ripgrep": "15.2.0-3",
|
|
@@ -18,8 +18,8 @@ importers:
|
|
|
18
18
|
specifier: 1.0.2
|
|
19
19
|
version: 1.0.2
|
|
20
20
|
'@ai-ecoverse/slicc-kernel':
|
|
21
|
-
specifier: 1.
|
|
22
|
-
version: 1.
|
|
21
|
+
specifier: 1.124.2
|
|
22
|
+
version: 1.124.2
|
|
23
23
|
'@ai-ecoverse/slicc-spectrum':
|
|
24
24
|
specifier: 1.86.3
|
|
25
25
|
version: 1.86.3
|
|
@@ -108,8 +108,8 @@ packages:
|
|
|
108
108
|
resolution: {integrity: sha512-p7b1h85qkiU0LKjNLCLiU7GVXjGigkyR2+VUCInM1cZo2yjLFxr7tGAOO09e6OG9nB7XKiQn3W88wb3s0gxy+g==}
|
|
109
109
|
engines: {node: '>=24', slicc-kernel: '>=1.75.0'}
|
|
110
110
|
|
|
111
|
-
'@ai-ecoverse/slicc-kernel@1.
|
|
112
|
-
resolution: {integrity: sha512-
|
|
111
|
+
'@ai-ecoverse/slicc-kernel@1.124.2':
|
|
112
|
+
resolution: {integrity: sha512-YaFI+TJ2ARHvIW0sVfVplYz9SXyNzkl1CIuW+pHfy/DG6hBJhA8U+LLg+TSH6mZpIU2w01yV6guPQHjn/2TrnA==}
|
|
113
113
|
engines: {node: '>=24'}
|
|
114
114
|
|
|
115
115
|
'@ai-ecoverse/slicc-spectrum@1.86.3':
|
|
@@ -206,7 +206,7 @@ snapshots:
|
|
|
206
206
|
|
|
207
207
|
'@ai-ecoverse/slicc-clipboard@1.0.2': {}
|
|
208
208
|
|
|
209
|
-
'@ai-ecoverse/slicc-kernel@1.
|
|
209
|
+
'@ai-ecoverse/slicc-kernel@1.124.2': {}
|
|
210
210
|
|
|
211
211
|
'@ai-ecoverse/slicc-spectrum@1.86.3': {}
|
|
212
212
|
|