@ai-ecoverse/slicc-bios 1.36.7 → 1.37.0

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
@@ -201,17 +201,29 @@ The Files panel lists `/opt/grammars/node_modules` but doesn't scan it.
201
201
 
202
202
  **Release notes (slicc-spectrum#458):** each update check also gives the Kernel, UI, Agent and Tailscale rows a `releases` list from their GitHub repositories (`slicc-kernel`, `slicc-spectrum`, `slicc-agent`, `wasm-tailscale`), and each optional package one from the repository its npm version document names, when that is on GitHub ([`os/releases.js`](src/seed/releases.js)). A row gets the release it has installed and every newer one up to the version it offers, newest first, at most 30. Each release has its `version` (the tag without the `v`, or without the package's name in a shared repository such as homescoop), its `url` and its `notes`, the release body unchanged (the `<!-- cert-verify -->` block included, which spectrum turns into a Certified badge) up to 64 KB. Spectrum renders the notes; bios only fetches them. bios asks GitHub's unauthenticated API (`/repos/<repo>/releases?per_page=100`, page by page down to the installed version, at most 5 pages), without credentials, a referrer or any header but `Accept` and `If-None-Match`. It keeps each list in IndexedDB (`slicc-releases`) for a day and revalidates it with its ETag at every check, and GitHub doesn't count a 304 against its 60 requests an hour. A 403 or 429 backs off until `Retry-After`, the rate limit's reset or 15 minutes, and leaves `releases` out, so the row looks as it does without notes, with no error. The page sets no `connect-src`, so these requests need no change to its CSP.
203
203
 
204
- Below the system rows, Install / Update offers **Optional packages** (spectrum ≥ 1.42.0): tools that seven doesn't preinstall, each at the version the homescoop coordinator certified. The catalog is [`src/packages/optional/`](src/packages/optional/): `package.json` pins each package exactly, `package-lock.json` (made with `npm install --package-lock-only --ignore-scripts`, never installed) holds its integrity, and `catalog.json` gives its id, label, description, commands, tarball size and `requires`. A test keeps the three in step. Today it offers git, the GitHub CLI, OpenSSH, `slicc` (see [Sevens this kernel follows](#network)), Python, the Python data tools (numpy, pandas and matplotlib), Node.js (slicc-jsh's `node` and `jsh`), `sliccy:browser` for `.jsh` scripts, Ruby, Perl, Biome, the PDF tools (poppler), qpdf, rsync, screen, SQLite, dig, websocat, ntfy, GnuPG, fnox, mcpcat (an MCP client), zip (Info-ZIP's `zip`, `unzip` and `zipinfo`), xxd (vim's hex dump, with `xxd -r`) and ImageMagick. zip's `unzip` refuses an entry whose name isn't UTF-8 (an old Latin-1 or CP437 archive without a Unicode path): it says `cannot create <name>` / `Illegal byte sequence`, extracts the other entries and exits 50, and `unzip -l` still lists the entry. It never extracts it under a changed name, and `unzip -p` still streams its bytes ([homescoop#1174](https://github.com/ai-ecoverse/homescoop/issues/1174)). ImageMagick is homescoop's HEIF build (`wasm-imagemagick-heif`, a superset of the plain build, which isn't offered), with `magick`, `convert`, `mogrify`, `identify` and `magick-open`, and it reads HEIC and AVIF. A failed write leaves an existing target as it was. Its known issues: writing over another user's 0666 file in a sticky directory such as `/tmp` fails with `Operation not permitted`, though writing your own files works ([homescoop#1258](https://github.com/ai-ecoverse/homescoop/issues/1258)); `.mpc` writes fail with `cache resources exhausted` ([homescoop#1208](https://github.com/ai-ecoverse/homescoop/issues/1208)); and the cert's coverage gaps, among them the no-encoder fallback and MPC's two-file write ([homescoop#1209](https://github.com/ai-ecoverse/homescoop/issues/1209)). sudo for `magick`, `convert` or `mogrify` is offered once, never always, since they write files. No two catalog entries provide the same command, so an install never shadows another entry's.
204
+ Below the system rows, Install / Update offers **Optional packages** (spectrum ≥ 1.42.0): tools that seven doesn't preinstall. homescoop's packages (`wasm-*`, `wasi-*`, `wasix-*`) come at npm's `latest`, which under cert-review v2 is certified, since homescoop publishes only from a reviewed main through its ladder. The four that other repos publish, slicc-jsh, mcpcat, wasi-slicc (slicc-cli's) and sliccy-browser (slicc-cdp's), stay bios pins in [`src/packages/optional/package.json`](src/packages/optional/package.json) and its `package-lock.json`, so release-state, Renovate, cert review and the cert scenarios certify them as before; the page can't check those repos' cert-review runs itself (GitHub's API allows 60 unauthenticated requests an hour), so a main-built release alone doesn't reach seven. The catalog, [`src/packages/optional/catalog.json`](src/packages/optional/catalog.json), lists each package by its npm name, with only what npm can't tell: its `id` and `label`, and optionally `requires` (other ids), `notes` (bios's own caveats, one line each, shown next to npm's description), `helpers` (commands to leave out of the list until homescoop marks them `helper: true`), `range` and `abi` (Python's, below) and `kind: "project"`. A project keeps its `description`, `commands` and `size`, since npm doesn't know it.
205
205
 
206
- - **Install** runs `pnpm add -g <package>@<version>` in the page's kernel, as a user would, under the Web Lock `slicc-optional`, so the commands work at once in every open shell. pnpm 12 gives each global add its own project under `$PNPM_HOME/global/v11/`; bios reads `PNPM_HOME` from the kernel's environment. Afterwards `os/packages.js` reads that project's `pnpm-lock.yaml`: every package in it, the one added and each dependency, must be a version in the catalog's lockfile or the base set's, with that integrity. homescoop pins `@ai-ecoverse/*` dependencies exactly (uv → Python, git → bash), so the catalog's lockfile names them all. Anything else, a dependency pnpm resolved to another version included, removes the package again and fails the row with *This version doesn't match the tested build*. An entry's `requires` (uv needs Python) are installed first. A package's kernel command always wins over the same package's Node `bin`. After each install and update, for every name that a package declares both in `slicc.commands` and in `bin`, bios removes the link that pnpm made in `$PNPM_HOME/bin`, but only when that link points into this package, so `mcpcat` runs `/usr/bin/mcpcat`, not a `#!/usr/bin/env node` script with no Node to run it. Another package's bins are never touched, and a package with only a `bin` keeps it. `/opt/user` (Your packages) isn't affected: its bins are not on `PATH`. A certified catalog package's agent skills reach every cone the same way. After the install or update, for each folder its `package.json` lists in `pi.skills`, bios links each skill in it into `/usr/share/skills/<name>`, through the kernel and as root, so no cone can change what the agent loads. The folder has to resolve inside the package; the skill's folder name has to match `^[a-z0-9][a-z0-9-]*$` and equal its `SKILL.md` `name`; and it mustn't collide with a built-in or with an entry it didn't make. The skill files are made readable by everyone (`a+rX`). bios records its links in `var/lib/slicc/optional/<id>/skills`, removes the ones an update drops, and removes all of them on Remove. A skipped skill is logged and never fails the install. The agent's rule stands: it doesn't scan root's global pnpm, so a user's `pnpm add -g` can't add skills. A project entry also **updates** a required package that's older than the catalog's before it installs, since it runs on the catalog's version: the data tools override their own Python away, and their builds need the catalog's Python. A global add brings its own pinned dependencies, so it leaves an older required package as it is.
206
+ - **What npm tells (`os/packages.js`):** at boot, and at an update check at most every ten minutes, bios fetches each entry's version doc from the registry from the page (`https://registry.npmjs.org/<name>/latest`, which sends CORS `*`; the kernel's network path isn't needed), all in parallel and each with a 15-second timeout. A pinned entry's doc is its pin's (`/<name>/<pin>`), so only its description, commands and size come from npm. It takes `version` (the row's `offered`), `description` (npm's text, verbatim), the commands (the keys of `slicc.commands`, without one marked `helper: true` or listed in `helpers`, and only names a shell can run), `dist.unpackedSize` (the row's `size`, now what the package unpacks to on disk, its own files only, so git reads 56 MB where the old tarball-based size read 19 MB; the row says `unpacked: true`) and `dist.integrity`. An entry with a `range` (Python's is `3.15.0`) takes the highest version in range from the abbreviated packument instead, where the range is matched against the upstream X.Y.Z with homescoop's `-N` build ignored, so `3.15.0` offers 3.15.0-3 but never a 3.15.1 or 3.16 (pydata's builds are for one Python ABI: homescoop keeps the ABI within one X.Y.Z, and its py-* ranges stop at the next patch). With `abi`, a version whose `slicc.python.abi` differs isn't offered.
207
+ - **Cache:** the last good answer for each entry is kept in `var/lib/slicc/optional/npm.json`, so the panel works offline and shows at once at boot; a later fetch replaces it, an entry that fails keeps its cached answer, and holds only what the rows show. A passing provenance verdict is remembered only in the tab's memory, for the listing (never a refusal, never in OPFS, which kernel processes can write, and never for an install, which always asks npm again).
208
+ - **No answer and no cache:** boot never waits for npm. Such a row has `registry: 'checking'` while the fetch runs, then `registry: 'unreachable'`, with `offered: null`, an empty description, no commands, no size and no Install (spectrum shows *Couldn't reach npm.*); a row that isn't installed gets **Retry**, which, like the panel's `refreshPackages()`, fetches npm again. An installed row keeps **Remove**.
209
+ - **The gate** (one function, `gate()` in `os/packages.js`, for the panel's Install and Update, a user's Update and [Your packages](#your-packages)) checks every package in the lock pnpm made. Each must be one of:
210
+ - an exact `name@version` with that integrity in the base set's lockfile (`src/packages/package-lock.json`), the catalog's pins (`src/packages/optional/package-lock.json`) or `src/packages/certs.json`, which is the only way a pinned entry passes; or
211
+ - an `@ai-ecoverse/*` package whose locked integrity equals the registry's `dist.integrity` for that exact version, and that npm's stored SLSA v1 provenance (`dist.attestations`, which bios trusts as npm stores it) binds to that integrity (its subject's sha512) and to its publisher's repository and release workflow at `refs/heads/main`. The publisher is bios's own, never read from npm: homescoop's `ladder-build.yml` or `publish.yml` for the `wasm-*`, `wasi-*`, `wasix-*` and `py-*` packages, and [`sources.json`](src/packages/optional/sources.json) for slicc-cdp, whose rule is `certified: "tag"`, its npm dist-tag `certified` (from the abbreviated packument), since its main released versions its cert-review didn't pass. A package with no publisher there (slicc-jsh, mcpcat, sliccy-browser at another version than its pin, or wasi-slicc, whose provenance is slicc-cli's, not homescoop's) is refused.
212
+ - Whatever matched, homescoop's certification exceptions then apply, exact matches included: a `fail` verdict refuses that version, and a `requires` verdict refuses it unless every pin of what it requires, in the lock and the base set's lockfile (never `certs.json`'s history), is in range. bios bundles `certification-exceptions.json` at release-state's pinned ref ([`exceptions.json`](src/packages/optional/exceptions.json); `pins.test` keeps it byte for byte that file) and unions it with homescoop main's (`raw.githubusercontent.com`, CORS `*`), which can only deny or constrain, never grant: a tampered or missing live file is at worst a denial, and the bundled copy decides alone when it can't be fetched. Finally a package whose `engines['slicc-kernel']` or kernel peer range the base set's kernel doesn't meet is refused.
213
+ - Anything that isn't `@ai-ecoverse/*` and isn't in the base set is refused; homescoop packages have no third-party dependencies.
214
+ - **Listing:** each entry's latest goes through the same rules (with its exact `dependencies`) when it's fetched. If latest fails, bios walks back through older versions (in range, not deprecated, at most five; a version whose doc is broken is skipped) and offers the newest that passes, with `newer: { version, reason }` naming latest's blocker. A pinned entry is never walked back. If none passes, the row is `withheld` with that reason, offers no Install or Update, and an installed copy keeps Remove.
215
+
216
+ Today it offers git, the GitHub CLI, OpenSSH, `slicc` (see [Sevens this kernel follows](#network)), Python, the Python data tools (numpy, pandas and matplotlib), Node.js (slicc-jsh's `node` and `jsh`), `sliccy:browser` for `.jsh` scripts, Ruby, Perl, Biome, the PDF tools (poppler), qpdf, rsync, screen, SQLite, dig, websocat, ntfy, GnuPG, fnox, mcpcat (an MCP client), zip (Info-ZIP's `zip`, `unzip` and `zipinfo`), xxd (vim's hex dump, with `xxd -r`) and ImageMagick. zip's `unzip` refuses an entry whose name isn't UTF-8 (an old Latin-1 or CP437 archive without a Unicode path): it says `cannot create <name>` / `Illegal byte sequence`, extracts the other entries and exits 50, and `unzip -l` still lists the entry. It never extracts it under a changed name, and `unzip -p` still streams its bytes ([homescoop#1174](https://github.com/ai-ecoverse/homescoop/issues/1174)). ImageMagick is homescoop's HEIF build (`wasm-imagemagick-heif`, a superset of the plain build, which isn't offered), with `magick`, `convert`, `mogrify`, `identify` and `magick-open`, and it reads HEIC and AVIF. A failed write leaves an existing target as it was. Its known issues: writing over another user's 0666 file in a sticky directory such as `/tmp` fails with `Operation not permitted`, though writing your own files works ([homescoop#1258](https://github.com/ai-ecoverse/homescoop/issues/1258)); `.mpc` writes fail with `cache resources exhausted` ([homescoop#1208](https://github.com/ai-ecoverse/homescoop/issues/1208)); and the cert's coverage gaps, among them the no-encoder fallback and MPC's two-file write ([homescoop#1209](https://github.com/ai-ecoverse/homescoop/issues/1209)). sudo for `magick`, `convert` or `mogrify` is offered once, never always, since they write files. No two entries' npm `latest` provide the same command, so an install never shadows another entry's; `packages.test` checks that against npm's current `latest`.
217
+
218
+ - **Install** runs `pnpm add -g <package>@<version>` in the page's kernel, as a user would, under the Web Lock `slicc-optional`, so the commands work at once in every open shell. pnpm 12 gives each global add its own project under `$PNPM_HOME/global/v11/`; bios reads `PNPM_HOME` from the kernel's environment. Afterwards `os/packages.js` reads that project's `pnpm-lock.yaml`, and every package in it, the one added and each dependency, must pass [the gate](#optional-packages). A locked integrity that isn't the registry's for that version (drift) removes the package again and fails the row with *This version doesn't match the tested build*; any other refusal fails it with *Not offered: <reason>.* An Update that fails puts the version it had back (*… stays.*), and an install that fails removes the package, so nothing unchecked stays installed. A row with no version from npm installs nothing, and Install and Update ask npm for the offer again first, so they never act on the OPFS cache's version. An entry's `requires` (uv needs Python) are installed first. A package's kernel command always wins over the same package's Node `bin`. After each install and update, for every name that a package declares both in `slicc.commands` and in `bin`, bios removes the link that pnpm made in `$PNPM_HOME/bin`, but only when that link points into this package, so `mcpcat` runs `/usr/bin/mcpcat`, not a `#!/usr/bin/env node` script with no Node to run it. Another package's bins are never touched, and a package with only a `bin` keeps it. `/opt/user` (Your packages) isn't affected: its bins are not on `PATH`. A certified catalog package's agent skills reach every cone the same way. After the install or update, for each folder its `package.json` lists in `pi.skills`, bios links each skill in it into `/usr/share/skills/<name>`, through the kernel and as root, so no cone can change what the agent loads. The folder has to resolve inside the package; the skill's folder name has to match `^[a-z0-9][a-z0-9-]*$` and equal its `SKILL.md` `name`; and it mustn't collide with a built-in or with an entry it didn't make. The skill files are made readable by everyone (`a+rX`). bios records its links in `var/lib/slicc/optional/<id>/skills`, removes the ones an update drops, and removes all of them on Remove. A skipped skill is logged and never fails the install. The agent's rule stands: it doesn't scan root's global pnpm, so a user's `pnpm add -g` can't add skills. A project entry also **updates** a required package that's older than the catalog's before it installs, since it runs on the catalog's version: the data tools override their own Python away, and their builds need the catalog's Python. A global add brings its own pinned dependencies, so it leaves an older required package as it is.
207
219
  - **Progress:** a row shows pnpm's package counts once pnpm counts more than one package. Before that, a single package, such as Python, still shows its download in bytes, from pnpm's `Downloading` lines (see [Agent](#agent)). Without either the bar is indeterminate.
208
- - **State** comes from pnpm's global projects, not from a list of bios's own, so a package installed by hand shows as installed with its version. One older than the catalog's offers **Update**, which adds the catalog's version; one at or above it offers **Remove**. bios never downgrades.
209
- - **A user's own installs:** bios also reads each user's own pnpm global (`/home/<user>/.local/share/pnpm/global/v11`, a `pnpm add -g` as `cone`), as root and read-only, straight from the files: it runs no pnpm as the user for that, and with kernel users off it reads none. Each row lists its installs (`installs`, slicc-spectrum#475): the panel's copy as `{ version, where: '/usr/local/share/pnpm', manager: 'panel' }` and each user's as `{ version, where: '/home/<user>/.local/share/pnpm', user, manager: 'pnpm' }`. The version and state follow the panel's copy, or else the user's newest. A row with any install never offers **Install**, and only a panel copy offers **Remove**; a row with only user installs offers **Update** when it's older than the catalog's, and nothing otherwise. That **Update** runs `pnpm add -g` as each user whose copy is older, with their uid, gid, `HOME`, `PNPM_HOME` and `PATH` in their home, with `--ignore-scripts`, `--ignore-pnpmfile`, the store's integrity check and no release-age wait (the catalog's version is certified), never as root and never with the system's environment, so the files stay theirs and no system copy appears. Their lockfile then passes the same check as a panel install; if it doesn't, bios puts the user's version back and the row says so. bios never touches a user's own bins. A requirement counts only in its own scope: the panel's copy for a panel install or a project, so one only a user has is installed for the system first, and that user's own global, or the panel's, for that user's copy (*Needs …*). The Remove question counts every copy that needs it, a user's included, and the move from the old root global moves a system copy even when a user has the package. The panel's own Install, Update and Remove work on its copy as before, whatever a user has.
220
+ - **State** comes from pnpm's global projects, not from a list of bios's own, so a package installed by hand shows as installed with its version. One older than npm's offered version offers **Update**, which adds that version; one at or above it offers **Remove**. bios never downgrades.
221
+ - **A user's own installs:** bios also reads each user's own pnpm global (`/home/<user>/.local/share/pnpm/global/v11`, a `pnpm add -g` as `cone`), as root and read-only, straight from the files: it runs no pnpm as the user for that, and with kernel users off it reads none. Each row lists its installs (`installs`, slicc-spectrum#475): the panel's copy as `{ version, where: '/usr/local/share/pnpm', manager: 'panel' }` and each user's as `{ version, where: '/home/<user>/.local/share/pnpm', user, manager: 'pnpm' }`. The version and state follow the panel's copy, or else the user's newest. A row with any install never offers **Install**, and only a panel copy offers **Remove**; a row with only user installs offers **Update** when it's older than npm's offered version, and nothing otherwise. That **Update** runs `pnpm add -g` as each user whose copy is older, with their uid, gid, `HOME`, `PNPM_HOME` and `PATH` in their home, with `--ignore-scripts`, `--ignore-pnpmfile`, the store's integrity check and no release-age wait (the catalog's version is certified), never as root and never with the system's environment, so the files stay theirs and no system copy appears. Their lockfile then passes the same check as a panel install; if it doesn't, bios puts the user's version back and the row says so. bios never touches a user's own bins. A requirement counts only in its own scope: the panel's copy for a panel install or a project, so one only a user has is installed for the system first, and that user's own global, or the panel's, for that user's copy (*Needs …*). The Remove question counts every copy that needs it, a user's included, and the move from the old root global moves a system copy even when a user has the package. The panel's own Install, Update and Remove work on its copy as before, whatever a user has.
210
222
  - **Remove** runs `pnpm remove -g <package>`. It asks first only when another installed entry needs it (*Remove Node.js (jsh)? Browser for jsh scripts needs it and stops working until Node.js (jsh) is back.*, accent); otherwise it doesn't ask, since pnpm's global projects hold no user data and the package can be installed again. A cancelled confirm changes nothing.
211
223
  - **Readable by everyone:** after every pnpm install of `/opt/agent`, `/opt/grammars` and an optional project in `/opt/slicc`, bios makes that tree readable by everyone, as root: one `find` selects the files without `a+r`, the executables without `a+x` and the directories without `a+x`, and runs `chmod a+rX` on only those, so a tree of 15,000 entries with one `0600` file pays for one walk and one `chmod`, not 15,000. pnpm writes some files `0600`, such as `node_modules/.pnpm-workspace-state-v1.json`, and with kernel users every user must be able to read seven's installed packages. An install from before this runs the same pass once at its next check, marked by `var/lib/slicc/<project>/readable`.
212
224
  - **Failures** lead with one sentence and keep pnpm's output, starting with the package and version, under *Install log*, with **Retry**.
213
225
  - **Withdrawn and kept as exceptions** (homescoop#858/#859, #864): uv, esbuild, tsc and buf are withdrawn until attested rebuilds. They're retired rows (*No longer offered*, with Remove for an earlier install), and their certs lines are gone. Instead, use `pip` for uv's work for now (uv returns as `@ai-ecoverse/wasi-uv`, Astral's uv, once that's certified), and install esbuild and typescript straight from npm with `pnpm add -g`; buf has no stand-in. **git** and **gh** stay as recorded supply-chain exceptions until their attested rebuilds: their `certs.json` entries carry an `exception` field, which `pins.test.mjs` lists, and any other uncertified pin still fails it.
214
- - **Python data tools on Python 3.15:** the catalog's Python is wasix-python 3.15.0-3, and the data tools are homescoop's attested cp315 builds for it: py-numpy 2.5.4-2, py-pandas 3.0.6-3, py-matplotlib 3.11.2-13 and py-scipy 1.18.1-3, with contourpy, kiwisolver, pillow 13.0.0-2 and their pure dependencies, one copy each. The pure ones (dateutil, six, tzdata, cycler and the rest) are homescoop's version-neutral builds (homescoop#1283): their site-packages folder is `lib/python3/site-packages` and they ship no bytecode, so one build serves any Python 3. seven never mixes builds for two Pythons: Python and every py-* move in one PR, and Renovate groups them so (`renovate.json`). The project's version is 2026.10.21, so an install of the 3.14 data tools (2026.10.19 and earlier), or of the first 3.15 builds (2026.10.20), shows as outdated, with **Update**, which moves Python first and then the project; nothing built for 3.14 stays in `/opt/slicc/pydata`, and the `.pth` lists only 3.15 site-packages.
226
+ - **Python data tools on Python 3.15:** the catalog's Python is the highest wasix-python 3.15.0-N (its `range` is `3.15.0`, its `abi` cp315; 3.15.0-3 today), and the data tools are homescoop's attested cp315 builds for it: py-numpy 2.5.4-2, py-pandas 3.0.6-3, py-matplotlib 3.11.2-13 and py-scipy 1.18.1-3, with contourpy, kiwisolver, pillow 13.0.0-2 and their pure dependencies, one copy each. The pure ones (dateutil, six, tzdata, cycler and the rest) are homescoop's version-neutral builds (homescoop#1283): their site-packages folder is `lib/python3/site-packages` and they ship no bytecode, so one build serves any Python 3. seven never mixes builds for two Pythons: the py-* move in one PR, Renovate groups them so (`renovate.json`), and the PR that moves them to another ABI moves Python's `range` and `abi` too. The project's version is 2026.10.21, so an install of the 3.14 data tools (2026.10.19 and earlier), or of the first 3.15 builds (2026.10.20), shows as outdated, with **Update**, which moves Python first and then the project; nothing built for 3.14 stays in `/opt/slicc/pydata`, and the `.pth` lists only 3.15 site-packages.
215
227
  - **What changed for code:** pandas 3.0 has copy-on-write, a `str` dtype for strings by default, and no longer needs pytz, so the project drops it (`six` stays, for dateutil). pillow 13 removed some deprecated APIs. numpy 2.5 keeps homescoop#1082's fix: `numpy.linalg` raises `LinAlgError` on a singular matrix instead of returning NaN.
216
228
  - **scipy** has static OpenBLAS, and every module loads except the deprecated `scipy.odr`, which needs Fortran, so `import scipy.odr` fails.
217
229
  - **The withdrawn builds** (homescoop#826, #730) stay uncertified: no py-numpy 2.3.2-4 to -10 or py-pandas 2.3.2-5 to -11.
@@ -222,7 +234,7 @@ Below the system rows, Install / Update offers **Optional packages** (spectrum
222
234
  - **Without Python:** if Python is removed while the data tools stay installed, the row warns that it needs Python (`warnings`, spectrum ≥ 1.49.1).
223
235
  - **ntfy** (`@ai-ecoverse/wasi-ntfy`, homescoop#1003) is seven's webhook receiver. A webhook, a phone or another agent publishes to a topic, and `ntfy sub <topic> '<command>'` runs the command once per message, in order, with `$NTFY_MESSAGE`, `$NTFY_TITLE`, `$NTFY_ID` and `$NTFY_RAW` (the message's JSON line, `attachment.url` included). For example, `ntfy sub https://ntfy.sliccy.ai/github 'agent send cone --lick=webhook --source github "$NTFY_RAW"'` turns each message into one `webhook` lick, and a replay with `--since` delivers it once. The connection is outbound only, through the page's fetch, so a quiet stream relies on the 120 s body window ([Network](#network)) to outlast ntfy's 45 s keepalive. Keep the gateway's `tk_` token in the vault and pass it as `NTFY_TOKEN` or `--token`. The command runs as the user who started `ntfy sub`, with that user's privileges, and everything in a message (`$NTFY_*`) is untrusted input chosen by whoever can publish to the topic or post to its hook URL: quote it (`"$NTFY_MESSAGE"`) and never `eval` it. A command that runs `ntfy pub` again should `unset ${!NTFY_*}` first, or it publishes to the incoming message's topic. `ntfy.test.mjs` tests it against a local fake ntfy server, not ntfy.sh.
224
236
  - **Login shells:** bios writes `/etc/profile.d/slicc.sh` at every boot, which puts `~/.local/share/gem/ruby/3.4.0/bin` on `PATH`, so a command from `gem install` runs by name in a login shell. It also makes sure `/etc/profile` runs `/etc/profile.d/*.sh`: it writes one if there's none, and adds that loop once, after the lines already there, to an `/etc/profile` that doesn't mention `/etc/profile.d/`.
225
- - **The agent** reads the same catalog: bios writes it to `/etc/slicc/optional.json` at every boot (id, package, version, label, description, commands, requires).
237
+ - **The agent** reads the same catalog: bios writes it to `/etc/slicc/optional.json` at every boot and after every npm fetch (id, package, label, commands, requires, and npm's version and description once they're known).
226
238
 
227
239
  Optional packages never count in the header and never open the panel. The terminal's `pnpm add -g` still installs anything, at any version.
228
240
 
@@ -519,7 +531,7 @@ Limits:
519
531
 
520
532
  ## Certified packages
521
533
 
522
- Seven certifies a gated package (slicc-kernel, slicc-cdp, slicc-clipboard, slicc-jsh, mcpcat, and the `wasi-*`, `wasix-*`, `wasm-*` and `py-*` packages) by its integrity: a version is certified when [`src/packages/certs.json`](src/packages/certs.json) (the historic list, with its recorded `exception`s) or one of the lockfiles seven ships (the base set, `/opt/agent`, the optional catalog) carries it with that integrity. `src/seed/layer.js`'s `certifiedSet()` reads that union in the page, and a user's or a project's install that needs anything else is refused. A pin on main is certified because every pin a PR or merge group changes passes **release-state** in `ci / test` and bios's own cert-review in the queue. `test/integration/pins.test.mjs` checks the union covers every gated pin with its integrity (Tailscale's project included), and fails when a pinned package's `engines.slicc-kernel` or kernel peer range isn't met by the pinned kernel.
534
+ Seven certifies a gated package (slicc-kernel, slicc-cdp, slicc-clipboard, slicc-jsh, mcpcat, and the `wasi-*`, `wasix-*`, `wasm-*` and `py-*` packages) by its integrity: a version is certified when [`src/packages/certs.json`](src/packages/certs.json) (the historic list, with its recorded `exception`s) or one of the lockfiles seven ships (the base set, `/opt/agent`, the optional catalog's pins, Tailscale and the catalog's projects) carries it with that integrity. `src/seed/layer.js`'s `certifiedSet()` reads that union in the page, and a user's or a project's install that needs anything else is refused, except an optional catalog package that passes [the gate](#optional-packages), with the dependencies it pins exactly, so a user's own add of a catalog package passes or fails as the panel's Install does. homescoop's certification exceptions apply to every version there, a `certs.json` or lockfile match included, and when they can't be read the version is refused. A pin on main is certified because every pin a PR or merge group changes passes **release-state** in `ci / test` and bios's own cert-review in the queue. `test/integration/pins.test.mjs` checks the union covers every gated pin with its integrity (Tailscale's project included), and fails when a pinned package's `engines.slicc-kernel` or kernel peer range isn't met by the pinned kernel.
523
535
 
524
536
  **release-state** ([`scripts/cert/release-state.mjs`](scripts/cert/release-state.mjs), code only) judges each gated pin and each `certs.json` line that a change adds, against the registry and its own repository's certification:
525
537
  - **Always:** the registry's integrity equals the lockfile's (or the line's).
@@ -530,7 +542,7 @@ It runs twice: in `ci / test` for quick feedback, and as cert-review's code chec
530
542
 
531
543
  ### Renovate keeps the pins current
532
544
 
533
- [`renovate.json`](renovate.json) bumps every `@ai-ecoverse/*` pin in the base set (`src/packages/package.json`), the optional catalog (`src/packages/optional/package.json`) and `/opt/agent` (`src/packages/agent/package.json`), with their npm and pnpm lockfiles.
545
+ [`renovate.json`](renovate.json) bumps every `@ai-ecoverse/*` pin in the base set (`src/packages/package.json`), the optional catalog's four non-homescoop pins (`src/packages/optional/package.json`) and `/opt/agent` (`src/packages/agent/package.json`), with their npm and pnpm lockfiles. The catalog's homescoop entries aren't pinned, so they need no bumps; the Python data tools' project (`src/packages/optional/projects/pydata`) is pinned by hand, from the dependency dashboard.
534
546
 
535
547
  - **PRs:** homescoop's packages (`wasi-*`, `wasix-*`, `wasm-*`, `py-*`, `wasi-pnpm` included) come as one PR a day, between 00:00 and 06:00 UTC. The kernel (its base-set and `/opt/agent` pins together), slicc-cdp, slicc-agent, slicc-spectrum and slicc-jsh each get their own PR, and so does every other package. The grammars and Tailscale projects stay on the dependency dashboard.
536
548
  - **Automerge only when certified:** Renovate turns on auto-merge, so a PR goes through the merge queue once its required checks are green: `ci / test` (with release-state for every gated pin it changes) and `cert-review` (see [Certification review](#certification-review)). No bot writes to a Renovate branch: the shipped lockfiles are part of what seven certifies, so a certified pin needs no `certs.json` line.
@@ -557,7 +569,7 @@ It runs twice: in `ci / test` for quick feedback, and as cert-review's code chec
557
569
  - **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.
558
570
  - **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.
559
571
  - **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.
560
- - **Pins:** [`scripts/canary/override-pins.mjs`](scripts/canary/override-pins.mjs) `name@version …` fetches each tarball through the harness download cache (so the tests find it there), checks it against npm's sha512 and records its sha256. It sets the version in every `package.json` under `src/packages` that pins the package and lets npm (`--package-lock-only`) and pnpm 12 (`--lockfile-only`) rewrite that directory's lockfiles, so a dependency that moves with the package (an agent release taking a newer slicc-browsers) moves in the lock too. A package that is only a dependency in a pnpm lock is forced with an `overrides` entry in that directory's `pnpm-workspace.yaml`. One that is only a dependency in an npm lock (wasm-git's own wasm-bash in the optional catalog) is left alone and reported as held. It writes `node_modules/.cache/slicc-canary/pins.json`, whose `candidates` are the gated packages the locks now pin that `certs.json` doesn't certify.
572
+ - **Pins:** [`scripts/canary/override-pins.mjs`](scripts/canary/override-pins.mjs) `name@version …` fetches each tarball through the harness download cache (so the tests find it there), checks it against npm's sha512 and records its sha256. It sets the version in every `package.json` under `src/packages` that pins the package and lets npm (`--package-lock-only`) and pnpm 12 (`--lockfile-only`) rewrite that directory's lockfiles, so a dependency that moves with the package (an agent release taking a newer slicc-browsers) moves in the lock too. A package that is only a dependency in a pnpm lock is forced with an `overrides` entry in that directory's `pnpm-workspace.yaml`. One that is only a dependency in an npm lock (sliccy-browser's own slicc-cdp in the optional catalog) is left alone and reported as held. The catalog's homescoop entries aren't pinned, so they aren't candidates here; seven offers their npm `latest` as it is. It writes `node_modules/.cache/slicc-canary/pins.json`, whose `candidates` are the gated packages the locks now pin that `certs.json` doesn't certify.
561
573
  - **Certs check:** with `SLICC_CANARY` set to that file, `pins.test.mjs` reports those candidates as "candidate, not certified" instead of failing on them; anything else uncertified still fails. Without it (normal CI) the check is unchanged.
562
574
  - **Tests:** the named shards in `shards.json` (`ci.yml` assigns files to shards at random instead, see [CI](#ci)), run by [`scripts/canary/shard.mjs`](scripts/canary/shard.mjs) with the overrides. The test files with a failure run again on main's pins, and the ones that passed there run once more with the overrides, so each failure is a regression (passes on main's pins, fails with the overrides), a failure on both, or flaky. Tests that assert a pinned version by value (`jsh.test.mjs` for slicc-jsh, `update.test.mjs` and `reuse.test.mjs` for wasm-bash) regress whenever that package is overridden.
563
575
  - **Output:** a `canary` artifact with `canary.json` (`<proof>/canary.json` for the proofs), `{ biosRef, overrides: [{ name, version, sha256 }], candidates, held, shards: [{ shard, wallMs, phases }], results: [{ test, status, baseline, retry, verdict, log }] }`, and a job summary with the overrides, a note when a slicc-kernel override of 1.78.0 or later meets a ref whose `src/` calls `createKernel` without a `users` mode (that kernel then defaults to `enforce`, and `i`, `npm` and `npx` by path exit 126 until #405 and kernel #495; [`scripts/canary/users.mjs`](scripts/canary/users.mjs) finds the calls, and `canary.json` lists them as `kernels`), the wall time of each shard and the failures split into regressions, failures on both, and flaky ones. The report job fails on a failure without overrides, on a missing shard, on a shard that exited nonzero with no failing test (a crash or a throwing teardown), when an `expect` entry (a `{ test, log }` pair of substrings) matches no regression, or on a regression no `expect` entry matches, unless the run sets `strict: false`. `test/integration/canary.test.mjs` checks these rules.
@@ -566,7 +578,7 @@ It runs twice: in `ci / test` for quick feedback, and as cert-review's code chec
566
578
 
567
579
  ### The npm package
568
580
 
569
- `@ai-ecoverse/slicc-bios` on npm carries only the manifests a consumer needs to test against what seven ships: `src/packages/package.json`, `package-lock.json`, `pnpm-lock.yaml` and `certs.json`, `src/packages/agent/package.json` and `pnpm-lock.yaml`, and `src/packages/optional/package.json`, `package-lock.json` and `catalog.json`. It has no runtime code and no dependencies, and those paths stay where they are. [`.github/workflows/release.yml`](.github/workflows/release.yml) releases it from `main` only: semantic-release reads the conventional commits, tags `v<version>` and writes the GitHub release, then `npm publish --provenance` publishes the tag at HEAD through npm's trusted publishing on a GitHub-hosted runner, retrying, and skipping a version npm already has. So re-running the workflow on main publishes a tag whose publish failed. The step then waits until npm serves the version, up to about 8 minutes with a growing backoff, since npm's listing can lag a publish by a minute or more ([`scripts/ci/served.mjs`](scripts/ci/served.mjs)). It passes only once npm's `dist.integrity` equals the tarball's from `npm pack --dry-run`, or, when only the gzip differs because another runner packed it, once the served tarball's tar equals the packed one byte for byte. A version npm serves with other contents fails at once, and one npm never serves fails after the wait. Every `npm view` answer, and `npm publish`'s output, is in the log. The deploy to seven (`deploy.yml`) is separate and doesn't wait for it.
581
+ `@ai-ecoverse/slicc-bios` on npm carries only the manifests a consumer needs to test against what seven ships: `src/packages/package.json`, `package-lock.json`, `pnpm-lock.yaml` and `certs.json`, `src/packages/agent/package.json` and `pnpm-lock.yaml`, and `src/packages/optional/package.json`, `package-lock.json` (the four non-homescoop pins), `catalog.json`, `sources.json` and `exceptions.json`. It has no runtime code and no dependencies, and those paths stay where they are. [`.github/workflows/release.yml`](.github/workflows/release.yml) releases it from `main` only: semantic-release reads the conventional commits, tags `v<version>` and writes the GitHub release, then `npm publish --provenance` publishes the tag at HEAD through npm's trusted publishing on a GitHub-hosted runner, retrying, and skipping a version npm already has. So re-running the workflow on main publishes a tag whose publish failed. The step then waits until npm serves the version, up to about 8 minutes with a growing backoff, since npm's listing can lag a publish by a minute or more ([`scripts/ci/served.mjs`](scripts/ci/served.mjs)). It passes only once npm's `dist.integrity` equals the tarball's from `npm pack --dry-run`, or, when only the gzip differs because another runner packed it, once the served tarball's tar equals the packed one byte for byte. A version npm serves with other contents fails at once, and one npm never serves fails after the wait. Every `npm view` answer, and `npm publish`'s output, is in the log. The deploy to seven (`deploy.yml`) is separate and doesn't wait for it.
570
582
 
571
583
  ## Develop
572
584
 
@@ -597,8 +609,8 @@ On a pull request, the plan first reads the files the pull request changes (`git
597
609
 
598
610
  - **docs**: only Markdown or `docs/` changed. Lint runs, and neither the shards nor `ci / vendors` run.
599
611
  - **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.
600
- - **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.
601
- - **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.
612
+ - **catalog**: only `src/packages/optional/**` or `certs.json` changed. The pins, optional, npm, packages, unshadow and renovate rows run, plus the rows of each changed package (a changed `catalog.json`, `retired.json` or `sources.json` entry, by its key).
613
+ - **bump**: only pins and lockfiles changed (the base set, `/opt/agent`, grammars, Tailscale, the optional catalog's pins, 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.
602
614
  - **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.
603
615
 
604
616
  [`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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-ecoverse/slicc-bios",
3
- "version": "1.36.7",
3
+ "version": "1.37.0",
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",
@@ -27,7 +27,9 @@
27
27
  "src/packages/agent/pnpm-lock.yaml",
28
28
  "src/packages/optional/package.json",
29
29
  "src/packages/optional/package-lock.json",
30
- "src/packages/optional/catalog.json"
30
+ "src/packages/optional/catalog.json",
31
+ "src/packages/optional/sources.json",
32
+ "src/packages/optional/exceptions.json"
31
33
  ],
32
34
  "engines": {
33
35
  "node": ">=26"
@@ -42,11 +44,11 @@
42
44
  "format": "biome check --write ."
43
45
  },
44
46
  "devDependencies": {
45
- "@ai-ecoverse/slicc": "1.46.4",
47
+ "@ai-ecoverse/slicc": "1.47.0",
46
48
  "@ai-ecoverse/slicc-browsers": "1.10.3",
47
49
  "@ai-ecoverse/slicc-node": "2.5.1",
48
50
  "@ai-ecoverse/slicc-shared-web": "1.24.2",
49
- "@ai-ecoverse/slicc-spectrum": "1.104.0",
51
+ "@ai-ecoverse/slicc-spectrum": "1.104.1",
50
52
  "@ai-ecoverse/slicc-vault": "1.15.1",
51
53
  "@biomejs/biome": "2.5.15",
52
54
  "es-module-lexer": "3.0.3",
@@ -2,179 +2,146 @@
2
2
  "@ai-ecoverse/wasm-git": {
3
3
  "id": "git",
4
4
  "label": "git",
5
- "description": "Version control for your projects.",
6
- "commands": ["git"],
7
- "size": 18814699
5
+ "helpers": [
6
+ "git-shell",
7
+ "git-remote-http",
8
+ "git-remote-https",
9
+ "git-upload-pack",
10
+ "git-receive-pack"
11
+ ]
8
12
  },
9
13
  "@ai-ecoverse/wasi-gh": {
10
14
  "id": "gh",
11
15
  "label": "GitHub CLI",
12
- "description": "GitHub CLI. In seven, use GH_TOKEN from the vault; gh auth login stores a plain-text token. gh auth login -c (clipboard) needs slicc-clipboard. A git credential helper using gh auth git-credential gets no token.",
13
- "commands": ["gh"],
14
- "size": 16248809
16
+ "notes": [
17
+ "In seven, use GH_TOKEN from the vault: gh auth login stores a plain-text token.",
18
+ "gh auth login -c (clipboard) needs slicc-clipboard.",
19
+ "A git credential helper using gh auth git-credential gets no token."
20
+ ]
15
21
  },
16
22
  "@ai-ecoverse/wasix-openssh": {
17
23
  "id": "ssh",
18
- "label": "OpenSSH",
19
- "description": "Connects to servers and copies files with ssh, scp and sftp; git over ssh too.",
20
- "commands": ["ssh", "scp", "sftp", "ssh-keygen", "ssh-add"],
21
- "size": 3360417
24
+ "label": "OpenSSH"
22
25
  },
23
26
  "@ai-ecoverse/wasi-slicc": {
24
27
  "id": "slicc",
25
28
  "label": "slicc",
26
- "description": "Prompts, watches and aborts another seven's agent from this terminal: slicc <join-url> prompt, watch or abort. For root and cones; the other seven must allow remote control from this one in its Linked devices.",
27
- "commands": ["slicc"],
28
- "size": 1349790
29
+ "notes": [
30
+ "For root and cones. The other seven must allow remote control from this one in its Linked devices."
31
+ ]
29
32
  },
30
33
  "@ai-ecoverse/wasix-python": {
31
34
  "id": "python",
32
35
  "label": "Python",
33
- "description": "Python 3.15 with pip (pip, pip3 or python3 -m pip), for scripts and data work.",
34
- "commands": ["python3", "pip", "pip3"],
35
- "size": 61095391
36
+ "range": "3.15.0",
37
+ "abi": "cp315"
36
38
  },
37
39
  "slicc-py-datatools": {
38
40
  "id": "pydata",
39
- "kind": "project",
40
41
  "label": "Python data tools",
41
- "description": "numpy, pandas, matplotlib and scipy for Python, about 240 MB on disk. scipy lacks only the deprecated scipy.odr.",
42
+ "kind": "project",
43
+ "description": "numpy, pandas, matplotlib and scipy for Python, about 240 MB on disk.",
42
44
  "commands": [],
45
+ "size": 67059175,
43
46
  "requires": ["python"],
44
- "size": 67059175
47
+ "notes": ["scipy lacks only the deprecated scipy.odr."]
45
48
  },
46
49
  "@ai-ecoverse/slicc-jsh": {
47
50
  "id": "node",
48
51
  "label": "Node.js (jsh)",
49
- "description": "Node.js 22-compatible node and jsh commands: fs (chmod included), streams, http, fetch, WebSocket, zlib, crypto, v8.serialize and child_process, the sync calls (spawnSync, execSync, execFileSync) and detached spawns included, tls on the kernel's own handshake and Brotli and zstd decompression in zlib, without fork, worker or asymmetric crypto yet. fetch() reaches servers inside seven (localhost, <port>.kernel.localhost) and streams their responses. node with no arguments opens the REPL.",
50
- "commands": ["node", "jsh"],
51
- "size": 1478434
52
+ "notes": [
53
+ "No fork, worker or asymmetric crypto yet.",
54
+ "fetch() reaches servers inside seven (localhost, <port>.kernel.localhost)."
55
+ ]
52
56
  },
53
57
  "@ai-ecoverse/sliccy-browser": {
54
58
  "id": "jsh-browser",
55
59
  "label": "Browser for jsh scripts",
56
- "description": "sliccy:browser for .jsh scripts: find and open tabs, run code in them, read cookies and localStorage, and fetch as the page, through seven's browser automation. Seven's own tab and the vault stay out of reach.",
57
- "commands": [],
58
60
  "requires": ["node"],
59
- "size": 1525841
61
+ "notes": ["Seven's own tab and the vault stay out of reach."]
60
62
  },
61
63
  "@ai-ecoverse/wasix-ruby": {
62
64
  "id": "ruby",
63
65
  "label": "Ruby",
64
- "description": "Ruby 3.4 with gem, bundler, rake, irb and erb, for scripts and gems. Commands from gem install run by name in a login shell.",
65
- "commands": ["ruby", "gem", "bundle", "rake", "irb", "erb"],
66
- "size": 9762412
66
+ "notes": ["Commands from gem install run by name in a login shell."]
67
67
  },
68
68
  "@ai-ecoverse/wasix-perl": {
69
69
  "id": "perl",
70
- "label": "Perl",
71
- "description": "Perl 5.42 with cpan, perldoc and prove, for scripts and text processing.",
72
- "commands": ["perl", "cpan", "perldoc", "prove", "pod2html", "pod2man", "pod2text"],
73
- "size": 19663059
70
+ "label": "Perl"
74
71
  },
75
72
  "@ai-ecoverse/wasi-biome": {
76
73
  "id": "biome",
77
- "label": "Biome",
78
- "description": "Formats and lints JavaScript, TypeScript, JSON and CSS.",
79
- "commands": ["biome"],
80
- "size": 10593722
74
+ "label": "Biome"
81
75
  },
82
76
  "@ai-ecoverse/wasm-poppler": {
83
77
  "id": "pdf",
84
- "label": "PDF tools",
85
- "description": "Reads PDFs: text, page images, and splitting or joining files.",
86
- "commands": ["pdftotext", "pdfinfo", "pdftoppm", "pdfimages", "pdfunite", "pdfseparate"],
87
- "size": 2584619
78
+ "label": "PDF tools"
88
79
  },
89
80
  "@ai-ecoverse/wasm-qpdf": {
90
81
  "id": "qpdf",
91
82
  "label": "qpdf",
92
- "description": "Merges, splits, rotates and encrypts PDF files.",
93
- "commands": ["qpdf"],
94
- "size": 975365
83
+ "helpers": ["fix-qdf", "zlib-flate"]
95
84
  },
96
85
  "@ai-ecoverse/wasm-libheif": {
97
86
  "id": "heif",
98
- "label": "HEIF and AVIF images",
99
- "description": "HEIC/HEIF and AVIF image decoder (heif-convert, heif-info). Includes an HEVC decoder (libde265); HEVC is patent-encumbered. LGPL-3.0-or-later.",
100
- "commands": ["heif-convert", "heif-dec", "heif-info"],
101
- "size": 4190759
87
+ "label": "HEIF and AVIF images"
102
88
  },
103
89
  "@ai-ecoverse/wasm-rsync": {
104
90
  "id": "rsync",
105
- "label": "rsync",
106
- "description": "Copies and syncs folders, sending only what changed, also to rsync:// servers.",
107
- "commands": ["rsync"],
108
- "size": 376423
91
+ "label": "rsync"
109
92
  },
110
93
  "@ai-ecoverse/wasm-sqlite3": {
111
94
  "id": "sqlite3",
112
95
  "label": "SQLite",
113
- "description": "The sqlite3 shell 3.54, for SQLite databases. journal_mode=WAL falls back to delete, and a WAL database made elsewhere opens as \"file is not a database\".",
114
- "commands": ["sqlite3"],
115
- "size": 678323
96
+ "notes": [
97
+ "journal_mode=WAL falls back to delete, and a WAL database made elsewhere opens as \"file is not a database\"."
98
+ ]
116
99
  },
117
100
  "@ai-ecoverse/wasm-screen": {
118
101
  "id": "screen",
119
- "label": "screen",
120
- "description": "Keeps a terminal session running to detach and reattach, from any terminal.",
121
- "commands": ["screen"],
122
- "size": 715907
102
+ "label": "screen"
123
103
  },
124
104
  "@ai-ecoverse/wasi-dig": {
125
105
  "id": "dig",
126
- "label": "dig",
127
- "description": "Looks up DNS records, tailnet names included.",
128
- "commands": ["dig"],
129
- "size": 214326
106
+ "label": "dig"
130
107
  },
131
108
  "@ai-ecoverse/wasix-websocat": {
132
109
  "id": "websocat",
133
110
  "label": "websocat",
134
- "description": "Connects to WebSocket servers (ws:// and wss://) from the terminal. An upstream alpha (websocat 4). It speaks raw TCP, so hosts outside seven need an exit: a linked slicc CLI or a Tailscale exit node. A listener that can't bind still exits 0.",
135
- "commands": ["websocat"],
136
- "size": 1267173
111
+ "notes": [
112
+ "An upstream alpha. It speaks raw TCP, so hosts outside seven need an exit: a linked slicc CLI or a Tailscale exit node.",
113
+ "A listener that can't bind still exits 0."
114
+ ]
137
115
  },
138
116
  "@ai-ecoverse/wasi-ntfy": {
139
117
  "id": "ntfy",
140
118
  "label": "ntfy",
141
- "description": "Publishes and subscribes to notifications, and runs a command for every message: ntfy sub <topic> '<command>', with the message in $NTFY_MESSAGE and $NTFY_RAW. Works with ntfy.sh, any ntfy server and the tray's webhook gateway, ntfy.sliccy.ai.",
142
- "commands": ["ntfy"],
143
- "size": 4751117
119
+ "notes": ["Works with ntfy.sh, any ntfy server and the tray's webhook gateway, ntfy.sliccy.ai."]
144
120
  },
145
121
  "@ai-ecoverse/wasix-gnupg": {
146
122
  "id": "gpg",
147
- "label": "GnuPG",
148
- "description": "Signs, verifies and encrypts files and commits with OpenPGP keys.",
149
- "commands": ["gpg", "gpgv", "gpg-agent", "gpgconf", "gpg-connect-agent", "gpg2"],
150
- "size": 3328285
123
+ "label": "GnuPG"
151
124
  },
152
125
  "@ai-ecoverse/mcpcat": {
153
126
  "id": "mcpcat",
154
127
  "label": "mcpcat (MCP client)",
155
- "description": "Calls MCP servers from the terminal: lists and calls their tools, resources and prompts, over HTTP or a stdio command. In a header, -H 'Authorization: Bearer ${NAME}' (single quotes) sends the vault's placeholder, which the vault fills in where a secret rule allows that host; mcpcat never prints the value.",
156
- "commands": ["mcpcat"],
157
- "size": 595379
128
+ "notes": [
129
+ "-H 'Authorization: Bearer ${NAME}' (single quotes) sends the vault's placeholder, which the vault fills in where a secret rule allows that host; mcpcat never prints the value."
130
+ ]
158
131
  },
159
132
  "@ai-ecoverse/wasm-imagemagick-heif": {
160
133
  "id": "imagemagick",
161
- "label": "ImageMagick",
162
- "description": "Convert, resize and inspect images (magick, convert, mogrify, identify), including HEIC/AVIF.",
163
- "commands": ["magick", "convert", "mogrify", "identify", "magick-open"],
164
- "size": 11420934
134
+ "label": "ImageMagick"
165
135
  },
166
136
  "@ai-ecoverse/wasm-zip": {
167
137
  "id": "zip",
168
138
  "label": "zip",
169
- "description": "Create and extract .zip archives (zip, unzip, zipinfo).",
170
- "commands": ["zip", "unzip", "zipinfo"],
171
- "size": 869325
139
+ "notes": [
140
+ "unzip refuses an entry whose name isn't UTF-8 (an old Latin-1 or CP437 archive) and extracts the rest (homescoop#1174)."
141
+ ]
172
142
  },
173
143
  "@ai-ecoverse/wasm-xxd": {
174
144
  "id": "xxd",
175
- "label": "xxd",
176
- "description": "Hex dump and reverse (xxd, from vim).",
177
- "commands": ["xxd"],
178
- "size": 124869
145
+ "label": "xxd"
179
146
  }
180
147
  }
@@ -0,0 +1,337 @@
1
+ {
2
+ "schema": 1,
3
+ "entries": [
4
+ {
5
+ "package": "@ai-ecoverse/emscripten-cache",
6
+ "versions": ["6.0.9-3"],
7
+ "verdict": "fail",
8
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/859",
9
+ "ruling": "cert lane 2026-10-17 04:40 and 05:05: staged from a local slicc-emscripten embuilder cache with no provenance; unverifiable build, not certified"
10
+ },
11
+ {
12
+ "package": "@ai-ecoverse/py-cycler",
13
+ "versions": ["0.12.1-1", "0.12.1-2", "0.12.1-3", "0.12.1-4", "0.12.1-5", "0.12.1-6", "0.12.1-7"],
14
+ "verdict": "fail",
15
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/858",
16
+ "ruling": "cert lane 2026-10-17 04:40 (#858/#859 audit): unverifiable build; the root and every version that repacks down to it are not certified (root 0.12.1-1, manual batch at gitHead f22dcbc2)"
17
+ },
18
+ {
19
+ "package": "@ai-ecoverse/py-fonttools",
20
+ "versions": ["4.66.1-1", "4.66.1-2", "4.66.1-3", "4.66.1-4", "4.66.1-5", "4.66.1-6", "4.66.1-7"],
21
+ "verdict": "fail",
22
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/858",
23
+ "ruling": "cert lane 2026-10-17 04:40 (#858/#859 audit): unverifiable build; the root and every version that repacks down to it are not certified (root 4.66.1-1, manual batch at gitHead f22dcbc2)"
24
+ },
25
+ {
26
+ "package": "@ai-ecoverse/py-matplotlib",
27
+ "versions": ["3.11.2-2", "3.11.2-3", "3.11.2-4", "3.11.2-5", "3.11.2-6", "3.11.2-7", "3.11.2-8", "3.11.2-9"],
28
+ "verdict": "fail",
29
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/858",
30
+ "ruling": "cert lane 2026-10-17 04:40 (#858/#859 audit): unverifiable build; the root and every version that repacks down to it are not certified (root 3.11.2-2, manual batch at gitHead f22dcbc2)"
31
+ },
32
+ {
33
+ "package": "@ai-ecoverse/py-numpy",
34
+ "range": ">=2.3.2-4 <=2.3.2-10",
35
+ "verdict": "fail",
36
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/826",
37
+ "ruling": "cert lane 2026-10-17 04:10: unverifiable build (the recipe sha256 matches no upstream source; root 2.3.2-4 could stage a prebuilt), not certified; also the #858 chain"
38
+ },
39
+ {
40
+ "package": "@ai-ecoverse/py-packaging",
41
+ "versions": ["26.3.0-1", "26.3.0-2", "26.3.0-3", "26.3.0-4", "26.3.0-5", "26.3.0-6", "26.3.0-7"],
42
+ "verdict": "fail",
43
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/858",
44
+ "ruling": "cert lane 2026-10-17 04:40 (#858/#859 audit): unverifiable build; the root and every version that repacks down to it are not certified (root 26.3.0-1, manual batch at gitHead f22dcbc2)"
45
+ },
46
+ {
47
+ "package": "@ai-ecoverse/py-pandas",
48
+ "range": ">=2.3.2-5 <=2.3.2-11",
49
+ "verdict": "fail",
50
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/730",
51
+ "ruling": "cert lane 2026-10-17 03:45: unverifiable build (the recipe sha256 matches neither the PyPI sdist nor the GitHub archive), not certified; also the #858 chain"
52
+ },
53
+ {
54
+ "package": "@ai-ecoverse/py-pyparsing",
55
+ "versions": ["3.3.3-1", "3.3.3-2", "3.3.3-3", "3.3.3-4", "3.3.3-5", "3.3.3-6", "3.3.3-7"],
56
+ "verdict": "fail",
57
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/858",
58
+ "ruling": "cert lane 2026-10-17 04:40 (#858/#859 audit): unverifiable build; the root and every version that repacks down to it are not certified (root 3.3.3-1, manual batch at gitHead f22dcbc2)"
59
+ },
60
+ {
61
+ "package": "@ai-ecoverse/py-scipy",
62
+ "versions": ["1.18.0-5", "1.18.0-7", "1.18.0-8", "1.18.0-9", "1.18.0-10", "1.18.0-11", "1.18.0-12"],
63
+ "verdict": "fail",
64
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/858",
65
+ "ruling": "cert lane 2026-10-17 04:40 (#858/#859 audit): unverifiable build; the root and every version that repacks down to it are not certified (root 1.18.0-5, no provenance, could stage a prebuilt)"
66
+ },
67
+ {
68
+ "package": "@ai-ecoverse/wasi-buf",
69
+ "versions": ["1.73.0-2"],
70
+ "verdict": "fail",
71
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/864",
72
+ "ruling": "cert lane 2026-10-17 05:05 (#864 group 1): no provenance and no tree; unverifiable build, not certified"
73
+ },
74
+ {
75
+ "package": "@ai-ecoverse/wasi-cargo",
76
+ "versions": ["0.99.0-2"],
77
+ "verdict": "fail",
78
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/864",
79
+ "ruling": "cert lane 2026-10-17 05:05 (#864 group 1): no provenance and no tree; unverifiable build, not certified (added row: no recipe)"
80
+ },
81
+ {
82
+ "package": "@ai-ecoverse/wasi-esbuild",
83
+ "versions": ["0.28.2-2"],
84
+ "verdict": "fail",
85
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/864",
86
+ "ruling": "cert lane 2026-10-17 05:05 (#864 group 1): no provenance and no tree; unverifiable build, not certified"
87
+ },
88
+ {
89
+ "package": "@ai-ecoverse/wasi-gh",
90
+ "versions": ["2.102.0-1"],
91
+ "verdict": "fail",
92
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/864",
93
+ "ruling": "cert lane 2026-10-17 05:05 (#864 group 1): no provenance and no tree; unverifiable build, not certified"
94
+ },
95
+ {
96
+ "package": "@ai-ecoverse/wasi-hf",
97
+ "versions": ["0.1.0-2"],
98
+ "verdict": "fail",
99
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/864",
100
+ "ruling": "cert lane 2026-10-17 05:05 (#864 group 1): no provenance and no tree; unverifiable build, not certified"
101
+ },
102
+ {
103
+ "package": "@ai-ecoverse/wasi-protoc-gen-connect-go",
104
+ "versions": ["1.21.0-0"],
105
+ "verdict": "fail",
106
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/864",
107
+ "ruling": "cert lane 2026-10-17 05:05 (#864 group 1): no provenance and no tree; unverifiable build, not certified"
108
+ },
109
+ {
110
+ "package": "@ai-ecoverse/wasi-protoc-gen-go",
111
+ "versions": ["1.36.12-0"],
112
+ "verdict": "fail",
113
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/864",
114
+ "ruling": "cert lane 2026-10-17 05:05 (#864 group 1): no provenance and no tree; unverifiable build, not certified"
115
+ },
116
+ {
117
+ "package": "@ai-ecoverse/wasi-protoc-gen-go-grpc",
118
+ "versions": ["1.6.2-0"],
119
+ "verdict": "fail",
120
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/864",
121
+ "ruling": "cert lane 2026-10-17 05:05 (#864 group 1): no provenance and no tree; unverifiable build, not certified"
122
+ },
123
+ {
124
+ "package": "@ai-ecoverse/wasi-rustc",
125
+ "versions": ["1.98.1-4"],
126
+ "verdict": "fail",
127
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/864",
128
+ "ruling": "cert lane 2026-10-17 05:05 (#864 group 1): no provenance and no tree; unverifiable build, not certified"
129
+ },
130
+ {
131
+ "package": "@ai-ecoverse/wasi-rustc-names",
132
+ "versions": ["1.98.1-4"],
133
+ "verdict": "fail",
134
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/864",
135
+ "ruling": "cert lane 2026-10-17 05:05 (#864 group 1): no provenance and no tree; unverifiable build, not certified (added row: no recipe)"
136
+ },
137
+ {
138
+ "package": "@ai-ecoverse/wasi-typescript",
139
+ "versions": ["7.0.2-1"],
140
+ "verdict": "fail",
141
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/864",
142
+ "ruling": "cert lane 2026-10-17 05:05 (#864 group 1): no provenance and no tree; unverifiable build, not certified"
143
+ },
144
+ {
145
+ "package": "@ai-ecoverse/wasi-zig",
146
+ "versions": ["0.16.0-15"],
147
+ "verdict": "fail",
148
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/864",
149
+ "ruling": "cert lane 2026-10-17 05:05 (#864 group 1): no provenance and no tree; unverifiable build, not certified"
150
+ },
151
+ {
152
+ "package": "@ai-ecoverse/wasi-zig-libc-src",
153
+ "versions": ["0.16.0-15"],
154
+ "verdict": "fail",
155
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/864",
156
+ "ruling": "cert lane 2026-10-17 05:05 (#864 group 1): no provenance and no tree; unverifiable build, not certified (added row: no recipe)"
157
+ },
158
+ {
159
+ "package": "@ai-ecoverse/wasix-automake",
160
+ "versions": ["1.17.0-5", "1.17.0-6", "1.17.0-7", "1.17.0-8", "1.17.0-9", "1.17.0-10"],
161
+ "verdict": "fail",
162
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/858",
163
+ "ruling": "cert lane 2026-10-17 04:40 (#858/#859 audit): unverifiable build; the root and every version that repacks down to it are not certified (root 1.17.0-5, whose gitHead c20b25fb has no recipe; withdraws the lane's 1.17.0-8 line)"
164
+ },
165
+ {
166
+ "package": "@ai-ecoverse/wasix-openssl",
167
+ "versions": ["3.5.9-3"],
168
+ "verdict": "fail",
169
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/864",
170
+ "ruling": "cert lane 2026-10-17 05:05 and 05:55: no provenance; unverifiable build and build input, not certified"
171
+ },
172
+ {
173
+ "package": "@ai-ecoverse/wasix-python",
174
+ "versions": ["3.14.2-16"],
175
+ "verdict": "fail",
176
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/864",
177
+ "ruling": "cert lane 2026-10-17 06:10: no provenance and no gitHead; unattested build input of py-kiwisolver, not certified"
178
+ },
179
+ {
180
+ "package": "@ai-ecoverse/wasix-sysroot",
181
+ "versions": ["2025.9.30-14", "2025.9.30-28", "2025.9.30-29", "2025.9.30-30", "2025.9.30-31", "2025.9.30-32"],
182
+ "verdict": "fail",
183
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/864",
184
+ "ruling": "cert lane 2026-10-17 05:55: -14 was built locally with no provenance, and -29..-32 are the -14 tarball with patches on top; not certified; withdraws the lane's -28 line (ce48e444)"
185
+ },
186
+ {
187
+ "package": "@ai-ecoverse/wasix-uv-shim",
188
+ "versions": ["0.1.0-6"],
189
+ "verdict": "fail",
190
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/864",
191
+ "ruling": "cert lane 2026-10-17 05:05 (#864 group 1): no provenance and no tree; unverifiable build, not certified"
192
+ },
193
+ {
194
+ "package": "@ai-ecoverse/wasix-zlib",
195
+ "versions": ["1.3.1-2"],
196
+ "verdict": "fail",
197
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/864",
198
+ "ruling": "cert lane 2026-10-17 05:05 and 05:55: no provenance; unverifiable build and build input, not certified"
199
+ },
200
+ {
201
+ "package": "@ai-ecoverse/wasm-bash",
202
+ "versions": ["5.3.0-20"],
203
+ "verdict": "requires",
204
+ "requires": {
205
+ "@ai-ecoverse/slicc-kernel": ">=1.130.2"
206
+ },
207
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/1230",
208
+ "ruling": "cert lane 2026-10-19 12:40 and 16:45: FAIL below slicc-kernel 1.130.2 (an interactive bash exits 130 on a ^C during fork); certified with slicc-kernel >=1.130.2"
209
+ },
210
+ {
211
+ "package": "@ai-ecoverse/wasm-binaryen",
212
+ "versions": ["132.0.0-1", "132.0.0-2"],
213
+ "verdict": "fail",
214
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/859",
215
+ "ruling": "cert lane 2026-10-17 04:40 (#858/#859 audit): unverifiable build; the root and every version that repacks down to it are not certified (root 132.0.0-1, staged from a local slicc-emscripten tree)"
216
+ },
217
+ {
218
+ "package": "@ai-ecoverse/wasm-clang",
219
+ "versions": ["24.0.0-10", "24.0.0-11", "24.0.0-12", "24.0.0-13", "24.0.0-14", "24.0.0-15", "24.0.0-16", "24.0.0-17", "24.0.0-18", "24.0.0-19", "24.0.0-20", "24.0.0-21"],
220
+ "verdict": "fail",
221
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/859",
222
+ "ruling": "cert lane 2026-10-17 04:40 (#858/#859 audit): unverifiable build; the root and every version that repacks down to it are not certified (root 24.0.0-10, staged from a local slicc-emscripten tree)"
223
+ },
224
+ {
225
+ "package": "@ai-ecoverse/wasm-cmake",
226
+ "versions": ["4.4.3-9"],
227
+ "verdict": "fail",
228
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/864",
229
+ "ruling": "cert lane 2026-10-17 05:05 (#864 group 1): no provenance and no tree; unverifiable build, not certified"
230
+ },
231
+ {
232
+ "package": "@ai-ecoverse/wasm-emscripten",
233
+ "versions": ["6.0.9-11", "6.0.9-12", "6.0.9-13", "6.0.9-14", "6.0.9-15", "6.0.9-16", "6.0.9-17", "6.0.9-18", "6.0.9-19"],
234
+ "verdict": "fail",
235
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/859",
236
+ "ruling": "cert lane 2026-10-17 04:40 (#858/#859 audit): unverifiable build; the root and every version that repacks down to it are not certified (root 6.0.9-11, staged from a local slicc-emscripten tree)"
237
+ },
238
+ {
239
+ "package": "@ai-ecoverse/wasm-freetype",
240
+ "versions": ["2.13.3-1"],
241
+ "verdict": "fail",
242
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/864",
243
+ "ruling": "cert lane 2026-10-17 05:55 (#864 transitive): unattested build input, not certified (a laptop publish)"
244
+ },
245
+ {
246
+ "package": "@ai-ecoverse/wasm-git",
247
+ "versions": ["2.55.0-14", "2.55.0-15"],
248
+ "verdict": "fail",
249
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/858",
250
+ "ruling": "cert lane 2026-10-17 04:40 (#858/#859 audit): unverifiable build; the root and every version that repacks down to it are not certified (root 2.55.0-14, no provenance); also #864 group 1"
251
+ },
252
+ {
253
+ "package": "@ai-ecoverse/wasm-go-std-wasip1",
254
+ "versions": ["1.26.5-1"],
255
+ "verdict": "fail",
256
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/864",
257
+ "ruling": "cert lane 2026-10-17 05:05 (#864 group 1): no provenance and no tree; unverifiable build, not certified (gitHead f22dcbc2 has no recipe)"
258
+ },
259
+ {
260
+ "package": "@ai-ecoverse/wasm-lcms2",
261
+ "versions": ["2.19.1-1"],
262
+ "verdict": "fail",
263
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/864",
264
+ "ruling": "cert lane 2026-10-17 05:55 (#864 transitive): unattested build input, not certified (a laptop publish)"
265
+ },
266
+ {
267
+ "package": "@ai-ecoverse/wasm-libheif",
268
+ "versions": ["1.23.6-1"],
269
+ "verdict": "fail",
270
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/864",
271
+ "ruling": "cert lane 2026-10-17 05:55 (#864 transitive): unattested build input, not certified (a laptop publish)"
272
+ },
273
+ {
274
+ "package": "@ai-ecoverse/wasm-libiconv",
275
+ "versions": ["1.18.0-1"],
276
+ "verdict": "fail",
277
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/864",
278
+ "ruling": "cert lane 2026-10-17 05:55 (#864 transitive): unattested build input, not certified (a laptop publish)"
279
+ },
280
+ {
281
+ "package": "@ai-ecoverse/wasm-libjpeg-turbo",
282
+ "versions": ["3.1.2", "3.1.2-2"],
283
+ "verdict": "fail",
284
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/864",
285
+ "ruling": "cert lane 2026-10-17 05:55 (#864 transitive): unattested build input, not certified (laptop publishes)"
286
+ },
287
+ {
288
+ "package": "@ai-ecoverse/wasm-libpng",
289
+ "versions": ["1.6.59-1"],
290
+ "verdict": "fail",
291
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/864",
292
+ "ruling": "cert lane 2026-10-17 05:55 (#864 transitive): unattested build input, not certified (a laptop publish)"
293
+ },
294
+ {
295
+ "package": "@ai-ecoverse/wasm-libtiff",
296
+ "versions": ["4.7.2-1"],
297
+ "verdict": "fail",
298
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/864",
299
+ "ruling": "cert lane 2026-10-17 05:55 (#864 transitive): unattested build input, not certified (a laptop publish)"
300
+ },
301
+ {
302
+ "package": "@ai-ecoverse/wasm-libwebp",
303
+ "versions": ["1.5.0-1"],
304
+ "verdict": "fail",
305
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/864",
306
+ "ruling": "cert lane 2026-10-17 05:55 (#864 transitive): unattested build input, not certified (a laptop publish)"
307
+ },
308
+ {
309
+ "package": "@ai-ecoverse/wasm-libxml2",
310
+ "versions": ["2.15.4-1"],
311
+ "verdict": "fail",
312
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/864",
313
+ "ruling": "cert lane 2026-10-17 05:55 (#864 transitive): unattested build input, not certified (a laptop publish)"
314
+ },
315
+ {
316
+ "package": "@ai-ecoverse/wasm-openjpeg",
317
+ "versions": ["2.5.3"],
318
+ "verdict": "fail",
319
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/864",
320
+ "ruling": "cert lane 2026-10-17 05:55 (#864 transitive): unattested build input, not certified (a laptop publish)"
321
+ },
322
+ {
323
+ "package": "@ai-ecoverse/wasm-xz",
324
+ "versions": ["5.8.1-1"],
325
+ "verdict": "fail",
326
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/864",
327
+ "ruling": "cert lane 2026-10-17 05:55 (#864 transitive): unattested build input, not certified (a laptop publish)"
328
+ },
329
+ {
330
+ "package": "@ai-ecoverse/wasm-zlib",
331
+ "versions": ["1.3.1-2", "1.3.1-3"],
332
+ "verdict": "fail",
333
+ "issue": "https://github.com/ai-ecoverse/homescoop/issues/864",
334
+ "ruling": "cert lane 2026-10-17 05:05 and 05:55: no provenance; unverifiable build and build input, not certified"
335
+ }
336
+ ]
337
+ }
@@ -9,27 +9,7 @@
9
9
  "@ai-ecoverse/mcpcat": "0.17.4",
10
10
  "@ai-ecoverse/slicc-jsh": "0.45.4",
11
11
  "@ai-ecoverse/sliccy-browser": "0.1.29",
12
- "@ai-ecoverse/wasi-biome": "2.5.15-4",
13
- "@ai-ecoverse/wasi-dig": "0.1.0-4",
14
- "@ai-ecoverse/wasi-gh": "2.102.0-2",
15
- "@ai-ecoverse/wasi-ntfy": "2.32.0-2",
16
- "@ai-ecoverse/wasi-slicc": "1.47.0",
17
- "@ai-ecoverse/wasix-gnupg": "2.4.9-11",
18
- "@ai-ecoverse/wasix-openssh": "10.6.0-11",
19
- "@ai-ecoverse/wasix-perl": "5.42.0-20",
20
- "@ai-ecoverse/wasix-python": "3.15.0-3",
21
- "@ai-ecoverse/wasix-ruby": "3.4.11-20",
22
- "@ai-ecoverse/wasix-websocat": "4.0.0-alpha3-5",
23
- "@ai-ecoverse/wasm-git": "2.55.0-17",
24
- "@ai-ecoverse/wasm-imagemagick-heif": "7.1.2-34-9.1",
25
- "@ai-ecoverse/wasm-libheif": "1.23.6-6",
26
- "@ai-ecoverse/wasm-poppler": "26.10.0-5",
27
- "@ai-ecoverse/wasm-qpdf": "12.4.2-4",
28
- "@ai-ecoverse/wasm-rsync": "3.5.1-5",
29
- "@ai-ecoverse/wasm-screen": "5.0.1-13",
30
- "@ai-ecoverse/wasm-sqlite3": "3.54.0-6",
31
- "@ai-ecoverse/wasm-xxd": "9.2.1192-3",
32
- "@ai-ecoverse/wasm-zip": "3.0.0-7"
12
+ "@ai-ecoverse/wasi-slicc": "1.47.0"
33
13
  }
34
14
  },
35
15
  "node_modules/@ai-ecoverse/mcpcat": {
@@ -85,36 +65,6 @@
85
65
  "node": ">=24"
86
66
  }
87
67
  },
88
- "node_modules/@ai-ecoverse/wasi-biome": {
89
- "version": "2.5.15-4",
90
- "resolved": "https://registry.npmjs.org/@ai-ecoverse/wasi-biome/-/wasi-biome-2.5.15-4.tgz",
91
- "integrity": "sha512-hTKxTKNCvvfzXoVp30xFe8o/iB3cZ+FxjxYPv4kvyTuvG9i6InbGmZH/IgPsfRgMIL3g0TYIZQcFNlaOHjCTCg==",
92
- "license": "MIT OR Apache-2.0"
93
- },
94
- "node_modules/@ai-ecoverse/wasi-dig": {
95
- "version": "0.1.0-4",
96
- "resolved": "https://registry.npmjs.org/@ai-ecoverse/wasi-dig/-/wasi-dig-0.1.0-4.tgz",
97
- "integrity": "sha512-zWKTPKPoJ27Jndc1gpHSGmGovisg8mXD6hkPYm14ccVlqtVpNTDdGgdY+5QAqzqYdTzyiVAbkhqFMDo75vxVOg==",
98
- "license": "Apache-2.0"
99
- },
100
- "node_modules/@ai-ecoverse/wasi-gh": {
101
- "version": "2.102.0-2",
102
- "resolved": "https://registry.npmjs.org/@ai-ecoverse/wasi-gh/-/wasi-gh-2.102.0-2.tgz",
103
- "integrity": "sha512-2Jsk/p+QT6Dvf4pMYYSAMSD5WQ67037Bqy6HxvHLT+DslyKNrxm2ExnMu1mQ9l5HG3uaWazdC/Vx4x3EuLwNqA==",
104
- "license": "MIT",
105
- "engines": {
106
- "slicc-kernel": ">=1.30.0"
107
- }
108
- },
109
- "node_modules/@ai-ecoverse/wasi-ntfy": {
110
- "version": "2.32.0-2",
111
- "resolved": "https://registry.npmjs.org/@ai-ecoverse/wasi-ntfy/-/wasi-ntfy-2.32.0-2.tgz",
112
- "integrity": "sha512-gPaK5pptREyvSsfnog3PqxDYAiZ9Qeo3S0llnB5UVzOeQTLT222SecJ5Xm7d6ldB2//3iILp3wxqV24TItpwMg==",
113
- "license": "Apache-2.0 OR GPL-2.0-only",
114
- "engines": {
115
- "slicc-kernel": ">=1.125.4"
116
- }
117
- },
118
68
  "node_modules/@ai-ecoverse/wasi-slicc": {
119
69
  "version": "1.47.0",
120
70
  "resolved": "https://registry.npmjs.org/@ai-ecoverse/wasi-slicc/-/wasi-slicc-1.47.0.tgz",
@@ -123,141 +73,6 @@
123
73
  "engines": {
124
74
  "slicc-kernel": ">=1.92.0"
125
75
  }
126
- },
127
- "node_modules/@ai-ecoverse/wasix-gnupg": {
128
- "version": "2.4.9-11",
129
- "resolved": "https://registry.npmjs.org/@ai-ecoverse/wasix-gnupg/-/wasix-gnupg-2.4.9-11.tgz",
130
- "integrity": "sha512-urq5NdBeiHXZ22+cPjcwr49grwYxdW5dIx6BHvyWmkcDbUseCakG5b0tIw3gpb3hmGbf/Xb+IyqE7pZvyZsGzQ==",
131
- "license": "GPL-3.0-or-later",
132
- "engines": {
133
- "slicc-kernel": ">=1.117.2"
134
- }
135
- },
136
- "node_modules/@ai-ecoverse/wasix-openssh": {
137
- "version": "10.6.0-11",
138
- "resolved": "https://registry.npmjs.org/@ai-ecoverse/wasix-openssh/-/wasix-openssh-10.6.0-11.tgz",
139
- "integrity": "sha512-MPTOdE/bKShVw+j65vN5yfZuV/xPyUdPJ34R2s2pSHzxNHHtLJOlZaCdfDmcvR5u+N2BGR/c7COBmYFmo/t6tQ==",
140
- "license": "SSH-OpenSSH",
141
- "engines": {
142
- "slicc-kernel": ">=1.44.0"
143
- }
144
- },
145
- "node_modules/@ai-ecoverse/wasix-perl": {
146
- "version": "5.42.0-20",
147
- "resolved": "https://registry.npmjs.org/@ai-ecoverse/wasix-perl/-/wasix-perl-5.42.0-20.tgz",
148
- "integrity": "sha512-YjEfv0m/nfzUvMnilYXis8VRrTxAlyeuckwF1vjfR4tZ50/+7nOG10NwEV1Lv2V4HIztSFxnTuot5OhePYw2CA==",
149
- "license": "Artistic-1.0-Perl OR GPL-1.0-or-later",
150
- "engines": {
151
- "slicc-kernel": ">=1.120.0"
152
- }
153
- },
154
- "node_modules/@ai-ecoverse/wasix-python": {
155
- "version": "3.15.0-3",
156
- "resolved": "https://registry.npmjs.org/@ai-ecoverse/wasix-python/-/wasix-python-3.15.0-3.tgz",
157
- "integrity": "sha512-DiWOa70kqBzeQUPqM0124YKRoE0cHvMDH6Pa1msd/kijc981oVd5JEUhScSTN8j2EHHR5aZmueBnffffdLiSIw==",
158
- "license": "PSF-2.0 AND GPL-3.0-or-later",
159
- "engines": {
160
- "slicc-kernel": ">=1.122.3"
161
- }
162
- },
163
- "node_modules/@ai-ecoverse/wasix-ruby": {
164
- "version": "3.4.11-20",
165
- "resolved": "https://registry.npmjs.org/@ai-ecoverse/wasix-ruby/-/wasix-ruby-3.4.11-20.tgz",
166
- "integrity": "sha512-666zP5PgZ4PLk01W6E2F7cBQd7kjZXqyzaMgF1r5MK52v/aO53i7aHfuYHL1frLJgIzCPY8gXe7t3pkkacw/dw==",
167
- "license": "Ruby",
168
- "engines": {
169
- "slicc-kernel": ">=1.120.0"
170
- }
171
- },
172
- "node_modules/@ai-ecoverse/wasix-websocat": {
173
- "version": "4.0.0-alpha3-5",
174
- "resolved": "https://registry.npmjs.org/@ai-ecoverse/wasix-websocat/-/wasix-websocat-4.0.0-alpha3-5.tgz",
175
- "integrity": "sha512-ajSgu0rHPgwGrsXEJUSBX1J9s/gl//BRVKfGMkxe1WjwzYXoBFLD99BcJD4LvEMXTE+Wmvlfq102GgOevd3GRA==",
176
- "license": "MIT OR Apache-2.0",
177
- "engines": {
178
- "slicc-kernel": ">=1.95.0"
179
- }
180
- },
181
- "node_modules/@ai-ecoverse/wasm-bash": {
182
- "version": "5.3.0-19",
183
- "resolved": "https://registry.npmjs.org/@ai-ecoverse/wasm-bash/-/wasm-bash-5.3.0-19.tgz",
184
- "integrity": "sha512-svL9HAGz74mj8OaQaiA7uv7Wv0JnGQKryJk0zdkZBglDg2WIxX0ez+IKmR5lfLo9boFHopGQJ9rw6UeWBZypZw==",
185
- "license": "GPL-3.0-or-later",
186
- "engines": {
187
- "slicc-kernel": ">=1.48.3"
188
- }
189
- },
190
- "node_modules/@ai-ecoverse/wasm-git": {
191
- "version": "2.55.0-17",
192
- "resolved": "https://registry.npmjs.org/@ai-ecoverse/wasm-git/-/wasm-git-2.55.0-17.tgz",
193
- "integrity": "sha512-1anA5CYYvfVEcu9PQC1f5v6a9w2Q8GcSjrIQHW5Qjq5/zoYDxNmbElB6rX0zhvc5n5ZL5X6mY6RaSxi3jU+bkQ==",
194
- "license": "GPL-2.0-only",
195
- "dependencies": {
196
- "@ai-ecoverse/wasm-bash": "5.3.0-19"
197
- },
198
- "engines": {
199
- "slicc-kernel": ">=1.47.1"
200
- }
201
- },
202
- "node_modules/@ai-ecoverse/wasm-imagemagick-heif": {
203
- "version": "7.1.2-34-9.1",
204
- "resolved": "https://registry.npmjs.org/@ai-ecoverse/wasm-imagemagick-heif/-/wasm-imagemagick-heif-7.1.2-34-9.1.tgz",
205
- "integrity": "sha512-0z9FTPGFcO/8cFvCHkBI8kBQLvtjts3WFrhVzI5FQSVeRyZwMCKJZWHmAgiGUiS5q/UbsJF2AI9ocwGgIaJXjw==",
206
- "license": "ImageMagick AND LGPL-3.0-or-later AND BSD-2-Clause",
207
- "engines": {
208
- "slicc-kernel": ">=1.78.0"
209
- }
210
- },
211
- "node_modules/@ai-ecoverse/wasm-libheif": {
212
- "version": "1.23.6-6",
213
- "resolved": "https://registry.npmjs.org/@ai-ecoverse/wasm-libheif/-/wasm-libheif-1.23.6-6.tgz",
214
- "integrity": "sha512-RhPLxEfVz3CRiOqYt0WCSPLWqNBTNgrvZcRcQYCfk2DtH+MmdlcH6GjhFPB7IKlmkOKOwonpeXzA/cI5e2H7SA==",
215
- "license": "LGPL-3.0-or-later AND MIT AND BSD-2-Clause"
216
- },
217
- "node_modules/@ai-ecoverse/wasm-poppler": {
218
- "version": "26.10.0-5",
219
- "resolved": "https://registry.npmjs.org/@ai-ecoverse/wasm-poppler/-/wasm-poppler-26.10.0-5.tgz",
220
- "integrity": "sha512-cKHeDywd6qiuM2lb80P1p+Ucpy2VH4PkqbC4Rz1cB1fuBDkCxceO2cYxWrf2r2A11lYZ7sJBm9qMWBi2FdTkMA==",
221
- "license": "GPL-2.0-only OR GPL-3.0-only"
222
- },
223
- "node_modules/@ai-ecoverse/wasm-qpdf": {
224
- "version": "12.4.2-4",
225
- "resolved": "https://registry.npmjs.org/@ai-ecoverse/wasm-qpdf/-/wasm-qpdf-12.4.2-4.tgz",
226
- "integrity": "sha512-y1FD7A7zJUdnrdnT9sBD3X+50e2i9r3A7KW6zWQnjTJ6SShsVldihj7RbeyeyRqegrOvYfaMZ/5mJwnlY8M0Og==",
227
- "license": "Apache-2.0"
228
- },
229
- "node_modules/@ai-ecoverse/wasm-rsync": {
230
- "version": "3.5.1-5",
231
- "resolved": "https://registry.npmjs.org/@ai-ecoverse/wasm-rsync/-/wasm-rsync-3.5.1-5.tgz",
232
- "integrity": "sha512-PH3b0+QLwWURo5293My7WMeUChS+p2aOO/JkOIgUNtSqbNTbu2bVaC31fxr+xhkAmAnH+WcTnjwvPQn/mQQ+ig==",
233
- "license": "GPL-3.0-or-later",
234
- "engines": {
235
- "slicc-kernel": ">=1.29.2"
236
- }
237
- },
238
- "node_modules/@ai-ecoverse/wasm-screen": {
239
- "version": "5.0.1-13",
240
- "resolved": "https://registry.npmjs.org/@ai-ecoverse/wasm-screen/-/wasm-screen-5.0.1-13.tgz",
241
- "integrity": "sha512-g2K9J63mKkRORjPTQA7gGgvVBaW/0FZCjCkKxb+gvIstiwxpCos5mCW2z6+jGXXlxJ32cxTdyu3M0X4KWhkW3g==",
242
- "license": "GPL-3.0-or-later"
243
- },
244
- "node_modules/@ai-ecoverse/wasm-sqlite3": {
245
- "version": "3.54.0-6",
246
- "resolved": "https://registry.npmjs.org/@ai-ecoverse/wasm-sqlite3/-/wasm-sqlite3-3.54.0-6.tgz",
247
- "integrity": "sha512-R68+igrJTaNAheMY317wTWVlRTWQQIA6WnkFgwc2XKdwDnh23tALEoRSURKXki2VacPknGt3YplY/rl/cCwsaw==",
248
- "license": "blessing"
249
- },
250
- "node_modules/@ai-ecoverse/wasm-xxd": {
251
- "version": "9.2.1192-3",
252
- "resolved": "https://registry.npmjs.org/@ai-ecoverse/wasm-xxd/-/wasm-xxd-9.2.1192-3.tgz",
253
- "integrity": "sha512-CJKX6isuCrz3ZFoKLGQqeqj20aiWNSR8BsbgWtRTmCP4bvlZefmvz8vGIsD4rOdZybdfgIfhPnEEnBdsqiNn4g==",
254
- "license": "Vim"
255
- },
256
- "node_modules/@ai-ecoverse/wasm-zip": {
257
- "version": "3.0.0-7",
258
- "resolved": "https://registry.npmjs.org/@ai-ecoverse/wasm-zip/-/wasm-zip-3.0.0-7.tgz",
259
- "integrity": "sha512-q92s+O0EaT+uGHZZ2ZCffoYfb7ZzlRHd3K+wvXDh2l0V+uBJUZE7VeC+5AZQ5KZ2v80w5h7jZbOiw34EWKW4Dw==",
260
- "license": "Info-ZIP"
261
76
  }
262
77
  }
263
78
  }
@@ -1,31 +1,11 @@
1
1
  {
2
2
  "name": "slicc-bios-optional",
3
3
  "private": true,
4
- "description": "The certified versions of the optional packages that seven's Install / Update panel offers. Never installed as a project: the panel runs pnpm add -g for each one.",
4
+ "description": "The optional packages that seven pins because their publisher isn't homescoop's ladder: slicc-jsh, mcpcat, wasi-slicc (slicc-cli) and sliccy-browser (slicc-cdp). Release-state and cert review certify these pins; every other catalog entry is npm's latest behind the runtime gate. Never installed as a project: the panel runs pnpm add -g for each one.",
5
5
  "dependencies": {
6
6
  "@ai-ecoverse/mcpcat": "0.17.4",
7
7
  "@ai-ecoverse/slicc-jsh": "0.45.4",
8
8
  "@ai-ecoverse/sliccy-browser": "0.1.29",
9
- "@ai-ecoverse/wasi-biome": "2.5.15-4",
10
- "@ai-ecoverse/wasi-dig": "0.1.0-4",
11
- "@ai-ecoverse/wasi-gh": "2.102.0-2",
12
- "@ai-ecoverse/wasi-ntfy": "2.32.0-2",
13
- "@ai-ecoverse/wasi-slicc": "1.47.0",
14
- "@ai-ecoverse/wasix-gnupg": "2.4.9-11",
15
- "@ai-ecoverse/wasix-openssh": "10.6.0-11",
16
- "@ai-ecoverse/wasix-perl": "5.42.0-20",
17
- "@ai-ecoverse/wasix-python": "3.15.0-3",
18
- "@ai-ecoverse/wasix-ruby": "3.4.11-20",
19
- "@ai-ecoverse/wasix-websocat": "4.0.0-alpha3-5",
20
- "@ai-ecoverse/wasm-git": "2.55.0-17",
21
- "@ai-ecoverse/wasm-imagemagick-heif": "7.1.2-34-9.1",
22
- "@ai-ecoverse/wasm-libheif": "1.23.6-6",
23
- "@ai-ecoverse/wasm-poppler": "26.10.0-5",
24
- "@ai-ecoverse/wasm-qpdf": "12.4.2-4",
25
- "@ai-ecoverse/wasm-rsync": "3.5.1-5",
26
- "@ai-ecoverse/wasm-screen": "5.0.1-13",
27
- "@ai-ecoverse/wasm-sqlite3": "3.54.0-6",
28
- "@ai-ecoverse/wasm-xxd": "9.2.1192-3",
29
- "@ai-ecoverse/wasm-zip": "3.0.0-7"
9
+ "@ai-ecoverse/wasi-slicc": "1.47.0"
30
10
  }
31
11
  }
@@ -0,0 +1,5 @@
1
+ {
2
+ "@ai-ecoverse/slicc-cdp": {
3
+ "certified": "tag"
4
+ }
5
+ }
@@ -10,7 +10,7 @@
10
10
  "@ai-ecoverse/slicc-cdp": "1.30.18",
11
11
  "@ai-ecoverse/slicc-clipboard": "1.0.2",
12
12
  "@ai-ecoverse/slicc-kernel": "1.138.0",
13
- "@ai-ecoverse/slicc-spectrum": "1.104.0",
13
+ "@ai-ecoverse/slicc-spectrum": "1.104.1",
14
14
  "@ai-ecoverse/wasi-fnox": "1.39.0-5",
15
15
  "@ai-ecoverse/wasi-pnpm": "12.9.1-19",
16
16
  "@ai-ecoverse/wasi-ripgrep": "15.2.0-5",
@@ -81,9 +81,9 @@
81
81
  }
82
82
  },
83
83
  "node_modules/@ai-ecoverse/slicc-spectrum": {
84
- "version": "1.104.0",
85
- "resolved": "https://registry.npmjs.org/@ai-ecoverse/slicc-spectrum/-/slicc-spectrum-1.104.0.tgz",
86
- "integrity": "sha512-ZH6vp9jDlh3mDBb8PdU5l4jkeP0+GQNmP3+Q39uPDOx/Jx2H76hyjqY6zMX0ZJNQsnLr8W0/RFvT0CM4O+viWg==",
84
+ "version": "1.104.1",
85
+ "resolved": "https://registry.npmjs.org/@ai-ecoverse/slicc-spectrum/-/slicc-spectrum-1.104.1.tgz",
86
+ "integrity": "sha512-/NNo3NmWc8l4+fcVKlynOKzRFbi2N/1H1w8Hkn4N8B51UgjvAW+Y3oykgp0kePQPb11zjithkKmZjC22CdXMkw==",
87
87
  "license": "Apache-2.0",
88
88
  "engines": {
89
89
  "node": ">=24"
@@ -7,7 +7,7 @@
7
7
  "@ai-ecoverse/slicc-cdp": "1.30.18",
8
8
  "@ai-ecoverse/slicc-clipboard": "1.0.2",
9
9
  "@ai-ecoverse/slicc-kernel": "1.138.0",
10
- "@ai-ecoverse/slicc-spectrum": "1.104.0",
10
+ "@ai-ecoverse/slicc-spectrum": "1.104.1",
11
11
  "@ai-ecoverse/wasi-fnox": "1.39.0-5",
12
12
  "@ai-ecoverse/wasi-pnpm": "12.9.1-19",
13
13
  "@ai-ecoverse/wasi-ripgrep": "15.2.0-5",
@@ -21,8 +21,8 @@ importers:
21
21
  specifier: 1.138.0
22
22
  version: 1.138.0
23
23
  '@ai-ecoverse/slicc-spectrum':
24
- specifier: 1.104.0
25
- version: 1.104.0
24
+ specifier: 1.104.1
25
+ version: 1.104.1
26
26
  '@ai-ecoverse/wasi-fnox':
27
27
  specifier: 1.39.0-5
28
28
  version: 1.39.0-5
@@ -115,8 +115,8 @@ packages:
115
115
  resolution: {integrity: sha512-p5cdX1mB6xed1NcRGe0Uifm3NVx8d3YXzA2kLYH2d7HtcSwjvmOU566SUaUKBtbgwXHRAC5gAfW1QoD6/fAiOQ==}
116
116
  engines: {node: '>=24'}
117
117
 
118
- '@ai-ecoverse/slicc-spectrum@1.104.0':
119
- resolution: {integrity: sha512-ZH6vp9jDlh3mDBb8PdU5l4jkeP0+GQNmP3+Q39uPDOx/Jx2H76hyjqY6zMX0ZJNQsnLr8W0/RFvT0CM4O+viWg==}
118
+ '@ai-ecoverse/slicc-spectrum@1.104.1':
119
+ resolution: {integrity: sha512-/NNo3NmWc8l4+fcVKlynOKzRFbi2N/1H1w8Hkn4N8B51UgjvAW+Y3oykgp0kePQPb11zjithkKmZjC22CdXMkw==}
120
120
  engines: {node: '>=24'}
121
121
  peerDependencies:
122
122
  '@shikijs/langs': 4.5.0
@@ -215,7 +215,7 @@ snapshots:
215
215
 
216
216
  '@ai-ecoverse/slicc-kernel@1.138.0': {}
217
217
 
218
- '@ai-ecoverse/slicc-spectrum@1.104.0': {}
218
+ '@ai-ecoverse/slicc-spectrum@1.104.1': {}
219
219
 
220
220
  '@ai-ecoverse/wasi-fnox@1.39.0-5': {}
221
221