@wenathlan/saddle 2.1.5 → 2.1.7
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/Dockerfile +158 -60
- package/LICENSE +0 -0
- package/README.md +68 -53
- package/alternatives.ts +0 -0
- package/biome.jsonc +134 -0
- package/boards.json +2 -2
- package/compute.ts +4 -4
- package/cores.json +2 -2
- package/docker.config +37 -9
- package/docs/.gitkeep +0 -0
- package/docs/actionrecorder.md +0 -0
- package/docs/actionsincident.md +0 -0
- package/docs/alternatives.md +0 -0
- package/docs/architecture.md +0 -0
- package/docs/{architecture-1.8.19.md → architecture1819.md} +0 -0
- package/docs/{architecture-1.8.19.mmd → architecture1819.mmd} +0 -0
- package/docs/artifactavailability.md +2 -2
- package/docs/{artifactresearch-1.8.9.md → artifactresearch189.md} +0 -0
- package/docs/{batches-1816-1820.md → batches1816to1820.md} +0 -0
- package/docs/{brancharchive-2026-08-18.md → brancharchive20260818.md} +0 -0
- package/docs/branchaudit.md +0 -0
- package/docs/browser.md +0 -0
- package/docs/capabilityreport.md +0 -0
- package/docs/comparativeaudit.md +0 -0
- package/docs/consolidation.md +0 -0
- package/docs/{containerplatforms-1.8.17.md → containerplatforms1817.md} +0 -0
- package/docs/{containerplatforms-2.1.0.md → containerplatforms210.md} +1 -1
- package/docs/{documentmap-1.8.12.md → documentmap1812.md} +1 -1
- package/docs/{e2ugh-engine.md → e2ughengine.md} +0 -0
- package/docs/ecosystemplan.md +0 -0
- package/docs/enginearchitecture.md +0 -0
- package/docs/extension.md +0 -0
- package/docs/featureaudit.md +0 -0
- package/docs/{flatbuildresearch-1.8.11.md → flatbuildresearch1811.md} +0 -0
- package/docs/gapmatrix.md +0 -0
- package/docs/hardware.md +0 -0
- package/docs/libraryapi.md +0 -0
- package/docs/{licenseaudit-1.8.12.md → licenseaudit1812.md} +0 -0
- package/docs/logs/examplesession.json +54 -0
- package/docs/memoryengine.md +0 -0
- package/docs/{mobileconversionresearch-1.8.10.md → mobileconversionresearch1810.md} +0 -0
- package/docs/modes.md +0 -0
- package/docs/{nativeidentityresearch-1.8.11.md → nativeidentityresearch1811.md} +0 -0
- package/docs/{native-wrappers.md → nativewrappers.md} +0 -0
- package/docs/ninetymodalities.md +191 -0
- package/docs/optimization.md +0 -0
- package/docs/packageaudit185.md +0 -0
- package/docs/performance.md +0 -0
- package/docs/{planning.1.8.18.md → planning1818.md} +0 -0
- package/docs/{planning.1.8.19.md → planning1819.md} +0 -0
- package/docs/planningengine.md +186 -0
- package/docs/planningninety.md +391 -0
- package/docs/platformpipelineaudit.md +0 -0
- package/docs/platformpipelines.md +0 -0
- package/docs/productindex.md +0 -0
- package/docs/registryresearch.md +0 -0
- package/docs/release.md +0 -0
- package/docs/release17notes.md +0 -0
- package/docs/release181notes.md +0 -0
- package/docs/release182notes.md +0 -0
- package/docs/release184notes.md +0 -0
- package/docs/release185notes.md +0 -0
- package/docs/release18notes.md +0 -0
- package/docs/releaseassets.md +0 -0
- package/docs/{releasenotes-1.8.12.md → releasenotes1812.md} +0 -0
- package/docs/{releasenotes-1.8.13.md → releasenotes1813.md} +2 -2
- package/docs/{releasenotes-1.8.14.md → releasenotes1814.md} +1 -1
- package/docs/{releasenotes-1.8.15.md → releasenotes1815.md} +0 -0
- package/docs/{releasenotes-1.8.16.md → releasenotes1816.md} +0 -0
- package/docs/{releasenotes-1.8.17.md → releasenotes1817.md} +0 -0
- package/docs/{releasenotes-1.8.18.md → releasenotes1818.md} +0 -0
- package/docs/{releasenotes-1.8.19.md → releasenotes1819.md} +0 -0
- package/docs/{reorganization-1.8.8.md → reorganization188.md} +0 -0
- package/docs/{reorganization-1.8.9.md → reorganization189.md} +0 -0
- package/docs/{repo-analysis-1.8.21.json → repoanalysis1821.json} +0 -0
- package/docs/{repo-candidates-1.8.21.jsonl → repocandidates1821.jsonl} +0 -0
- package/docs/{repo-research-1.8.16.md → reporesearch1816.md} +0 -0
- package/docs/{repo-research-1.8.21.md → reporesearch1821.md} +0 -0
- package/docs/{repo-selected-1.8.21.json → reposelected1821.json} +0 -0
- package/docs/{repo-synthesis-1.8.16.md → reposynthesis1816.md} +1 -1
- package/docs/{repo-synthesis-1.8.21.md → reposynthesis1821.md} +0 -0
- package/docs/{research-1.8.18-isolation.md → research1818isolation.md} +0 -0
- package/docs/{research-1.8.19-virtual-browser.md → research1819virtualbrowser.md} +0 -0
- package/docs/roadmapp2p3.md +0 -0
- package/docs/s3compatible.md +0 -0
- package/docs/{scanningresearch-1.8.11.md → scanningresearch1811.md} +0 -0
- package/docs/security.md +0 -0
- package/docs/{securityaudit-1.8.7.md → securityaudit187.md} +0 -0
- package/docs/{securityreferences-1.8.11.md → securityreferences1811.md} +0 -0
- package/docs/{securityresearch-1.8.11.md → securityresearch1811.md} +0 -0
- package/docs/{signingresearch-1.8.12.md → signingresearch1812.md} +0 -0
- package/docs/signingwithoutcertificates.md +0 -0
- package/docs/signpathapplication.md +0 -0
- package/docs/sitemap.md +0 -0
- package/docs/{tauri-glib-risk-1.8.11.md → tauriglibrisk1811.md} +0 -0
- package/docs/todo.md +2 -2
- package/docs/{todo-1.8.15.md → todo1815.md} +1 -1
- package/docs/{todo-1.8.16.md → todo1816.md} +5 -5
- package/docs/{todo-1.8.18.md → todo1818.md} +0 -0
- package/docs/{todo-1.8.19.md → todo1819.md} +0 -0
- package/docs/{toolchainresearch-1.8.9.md → toolchainresearch189.md} +0 -0
- package/docs/toolchains.md +0 -0
- package/docs/usage.md +0 -0
- package/docs/viability.md +0 -0
- package/docs/virtualization.md +0 -0
- package/docs/{web-duplicatecleanup.md → webduplicatecleanup.md} +0 -0
- package/docs/{web-ideas.md → webideas.md} +0 -0
- package/docs/{workflowimprovements-2026-08-19.md → workflowimprovements20260819.md} +0 -0
- package/docs/workflowinputs.md +0 -0
- package/docs/workflowoperations.md +0 -0
- package/docs/workloadlaw.md +104 -0
- package/gpumonitor.cpp +0 -0
- package/gpus.json +1 -1
- package/index.ts +19 -10
- package/manifest.json +20 -0
- package/modalityregistry.ts +1493 -0
- package/mttg.config +1 -1
- package/orchestrator.ts +52 -15
- package/package.json +196 -103
- package/passage.config +2 -2
- package/performance.ts +0 -0
- package/processors.json +1 -1
- package/qemu.config +2 -2
- package/qemubridge.py +0 -0
- package/quantum.ts +0 -0
- package/render.ts +0 -0
- package/scheduler.ts +0 -0
- package/security.ts +0 -0
- package/tiers.ts +9 -3
- package/tsconfig.json +21 -11
- package/virtualcpu.ts +1 -0
- package/virtualgpu.ts +1 -0
- package/virtualhardware.c +0 -0
- package/virtualhardware.json +2 -2
- package/virtualization.ts +0 -0
- package/virtualizationcore.cpp +0 -0
- package/virtualmemory.ts +0 -0
- package/vm.config.json +3 -3
- package/biome.json +0 -151
- package/dist/acquisition.d.ts +0 -359
- package/dist/acquisition.d.ts.map +0 -1
- package/dist/acquisition.js +0 -629
- package/dist/acquisition.js.map +0 -1
- package/dist/alternatives.d.ts +0 -509
- package/dist/alternatives.d.ts.map +0 -1
- package/dist/alternatives.js +0 -951
- package/dist/alternatives.js.map +0 -1
- package/dist/automation.d.ts +0 -426
- package/dist/automation.d.ts.map +0 -1
- package/dist/automation.js +0 -561
- package/dist/automation.js.map +0 -1
- package/dist/browser.d.ts +0 -562
- package/dist/browser.d.ts.map +0 -1
- package/dist/browser.js +0 -1057
- package/dist/browser.js.map +0 -1
- package/dist/cli.d.ts +0 -17
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -169
- package/dist/cli.js.map +0 -1
- package/dist/communication.d.ts +0 -192
- package/dist/communication.d.ts.map +0 -1
- package/dist/communication.js +0 -418
- package/dist/communication.js.map +0 -1
- package/dist/compute.d.ts +0 -1161
- package/dist/compute.d.ts.map +0 -1
- package/dist/compute.js +0 -2273
- package/dist/compute.js.map +0 -1
- package/dist/distribution.d.ts +0 -529
- package/dist/distribution.d.ts.map +0 -1
- package/dist/distribution.js +0 -811
- package/dist/distribution.js.map +0 -1
- package/dist/docs/example-localjob.d.ts +0 -2
- package/dist/docs/example-localjob.d.ts.map +0 -1
- package/dist/docs/example-localjob.js +0 -15
- package/dist/docs/example-localjob.js.map +0 -1
- package/dist/docs/example-publicapi.d.ts +0 -2
- package/dist/docs/example-publicapi.d.ts.map +0 -1
- package/dist/docs/example-publicapi.js +0 -7
- package/dist/docs/example-publicapi.js.map +0 -1
- package/dist/execution.d.ts +0 -530
- package/dist/execution.d.ts.map +0 -1
- package/dist/execution.js +0 -761
- package/dist/execution.js.map +0 -1
- package/dist/format.d.ts +0 -19
- package/dist/format.d.ts.map +0 -1
- package/dist/format.js +0 -60
- package/dist/format.js.map +0 -1
- package/dist/foundation.d.ts +0 -176
- package/dist/foundation.d.ts.map +0 -1
- package/dist/foundation.js +0 -309
- package/dist/foundation.js.map +0 -1
- package/dist/index.d.ts +0 -735
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -1020
- package/dist/index.js.map +0 -1
- package/dist/integration.d.ts +0 -236
- package/dist/integration.d.ts.map +0 -1
- package/dist/integration.js +0 -236
- package/dist/integration.js.map +0 -1
- package/dist/intelligence.d.ts +0 -94
- package/dist/intelligence.d.ts.map +0 -1
- package/dist/intelligence.js +0 -145
- package/dist/intelligence.js.map +0 -1
- package/dist/isolation.d.ts +0 -129
- package/dist/isolation.d.ts.map +0 -1
- package/dist/isolation.js +0 -96
- package/dist/isolation.js.map +0 -1
- package/dist/media.d.ts +0 -344
- package/dist/media.d.ts.map +0 -1
- package/dist/media.js +0 -986
- package/dist/media.js.map +0 -1
- package/dist/modes.d.ts +0 -359
- package/dist/modes.d.ts.map +0 -1
- package/dist/modes.js +0 -134
- package/dist/modes.js.map +0 -1
- package/dist/operations.d.ts +0 -67
- package/dist/operations.d.ts.map +0 -1
- package/dist/operations.js +0 -94
- package/dist/operations.js.map +0 -1
- package/dist/orchestrator.d.ts +0 -1339
- package/dist/orchestrator.d.ts.map +0 -1
- package/dist/orchestrator.js +0 -4308
- package/dist/orchestrator.js.map +0 -1
- package/dist/packager/targetcli.js +0 -4
- package/dist/performance.d.ts +0 -416
- package/dist/performance.d.ts.map +0 -1
- package/dist/performance.js +0 -827
- package/dist/performance.js.map +0 -1
- package/dist/quantum.d.ts +0 -810
- package/dist/quantum.d.ts.map +0 -1
- package/dist/quantum.js +0 -2073
- package/dist/quantum.js.map +0 -1
- package/dist/render.d.ts +0 -381
- package/dist/render.d.ts.map +0 -1
- package/dist/render.js +0 -1073
- package/dist/render.js.map +0 -1
- package/dist/scheduler.d.ts +0 -596
- package/dist/scheduler.d.ts.map +0 -1
- package/dist/scheduler.js +0 -1259
- package/dist/scheduler.js.map +0 -1
- package/dist/security.d.ts +0 -501
- package/dist/security.d.ts.map +0 -1
- package/dist/security.js +0 -1170
- package/dist/security.js.map +0 -1
- package/dist/server.d.ts +0 -21
- package/dist/server.d.ts.map +0 -1
- package/dist/server.js +0 -52
- package/dist/server.js.map +0 -1
- package/dist/tiers.d.ts +0 -1002
- package/dist/tiers.d.ts.map +0 -1
- package/dist/tiers.js +0 -2165
- package/dist/tiers.js.map +0 -1
- package/dist/virtual.d.ts +0 -641
- package/dist/virtual.d.ts.map +0 -1
- package/dist/virtual.js +0 -1285
- package/dist/virtual.js.map +0 -1
- package/dist/virtualcpu.d.ts +0 -316
- package/dist/virtualcpu.d.ts.map +0 -1
- package/dist/virtualcpu.js +0 -1180
- package/dist/virtualcpu.js.map +0 -1
- package/dist/virtualgpu.d.ts +0 -345
- package/dist/virtualgpu.d.ts.map +0 -1
- package/dist/virtualgpu.js +0 -1000
- package/dist/virtualgpu.js.map +0 -1
- package/dist/virtualization.d.ts +0 -607
- package/dist/virtualization.d.ts.map +0 -1
- package/dist/virtualization.js +0 -1187
- package/dist/virtualization.js.map +0 -1
- package/dist/virtualmemory.d.ts +0 -818
- package/dist/virtualmemory.d.ts.map +0 -1
- package/dist/virtualmemory.js +0 -1796
- package/dist/virtualmemory.js.map +0 -1
- package/dist/vitest.config.d.ts +0 -3
- package/dist/vitest.config.d.ts.map +0 -1
- package/dist/vitest.config.js +0 -26
- package/dist/vitest.config.js.map +0 -1
- package/dist/webscrape.d.ts +0 -720
- package/dist/webscrape.d.ts.map +0 -1
- package/dist/webscrape.js +0 -2697
- package/dist/webscrape.js.map +0 -1
- package/docs/CONVERSA.txt +0 -1523
- package/docs/architecture-1.8.19.png +0 -0
- package/docs/assets/architecture.svg +0 -45
- package/docs/assets/saddlemark.svg +0 -13
- package/docs/example-localjob.ts +0 -15
- package/docs/example-publicapi.ts +0 -7
- package/docs/saddle.archive.1.8.17.tar.gz.gpg +0 -0
- package/media.ts +0 -1337
- package/web/manifest.json +0 -30
- package/web/readme.md +0 -383
- package/web/tsconfig.json +0 -25
package/README.md
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
</p>
|
|
4
4
|
|
|
5
5
|
<p align="center">
|
|
6
|
-
<strong>Storage-backed jobs,
|
|
7
|
-
<strong>Binary computing engine, agent browser,
|
|
6
|
+
<strong>Storage-backed jobs, ninety sandbox modalities and portable runners for Node.js.</strong><br/>
|
|
7
|
+
<strong>Binary computing engine, agent browser, sandbox plane and packager.</strong><br/>
|
|
8
8
|
<a href="https://github.com/wenathlan/saddle/actions/workflows/ci.yml"><img src="https://github.com/wenathlan/saddle/actions/workflows/ci.yml/badge.svg" alt="CI" /></a>
|
|
9
9
|
<a href="https://github.com/wenathlan/saddle/releases/tag/v2.0.0"><img src="https://img.shields.io/badge/release-v2.0.0-d35d3d" alt="Release 2.0.0" /></a>
|
|
10
10
|
<a href="https://github.com/wenathlan/saddle/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-GPL--3.0--only-202a2f" alt="GPL 3.0 only license" /></a>
|
|
@@ -30,11 +30,13 @@ domain modules land beside the saddle domains:
|
|
|
30
30
|
| `scheduler.ts`, `compute.ts`, `performance.ts` | job queues, batch compute and benchmark planning |
|
|
31
31
|
| `media.ts`, `render.ts`, `quantum.ts`, `tiers.ts` | media pipeline, GPU registry, quantum simulation, tier policy |
|
|
32
32
|
| `security.ts`, `alternatives.ts` | hardening gates and the alternative-stack catalog |
|
|
33
|
-
| `
|
|
33
|
+
| `index.html`, `App.tsx`, `Sol/` | the single SPA shell and the Sol theme (one tsx app with one stylesheet per theme) |
|
|
34
|
+
| `server.ts`, `sandbox.ts` | the zero-dependency self-hosted API of the 2.1.7 grand-merge envelope (`node server.ts`; the api answers its version at `/api/v1/health`) and the browser-pure engine port |
|
|
35
|
+
| `vercel.json`, `netlify.toml` | the platform deploy adapters beside the surface they publish (the caddy ghost stays out of the tree) |
|
|
34
36
|
| `specs/*` package exports | processors, gpus, cores, boards and the qemu/mttg/passage/docker envelopes |
|
|
35
37
|
|
|
36
38
|
The full pre-merge documentation of the engine lives in
|
|
37
|
-
[docs/
|
|
39
|
+
[docs/e2ughengine.md](docs/e2ughengine.md) and its release history in
|
|
38
40
|
[CHANGELOG.md (the e2ugh lineage sections)](CHANGELOG.md (the e2ugh lineage sections)).
|
|
39
41
|
|
|
40
42
|
## Start here
|
|
@@ -46,18 +48,18 @@ npm install @wenathlan/saddle
|
|
|
46
48
|
```
|
|
47
49
|
|
|
48
50
|
```js
|
|
49
|
-
import {
|
|
51
|
+
import { createVirtualEngine, planreport, resolvejoin } from "@wenathlan/saddle";
|
|
50
52
|
|
|
51
|
-
const
|
|
52
|
-
const
|
|
53
|
+
const engine = createVirtualEngine({ model: "saddle-90", vcpus: 4, ramgb: 8 });
|
|
54
|
+
const report = planreport(); // { plancount: 90, live: 81, host: 9, planned: 0, plananswered: true }
|
|
55
|
+
const modalities = resolvejoin({ base: "balanced", gpu: false, network: false });
|
|
53
56
|
|
|
54
|
-
console.log(
|
|
57
|
+
console.log(engine.id, report.plananswered, modalities[0].id);
|
|
55
58
|
```
|
|
56
59
|
|
|
57
|
-
The deterministic
|
|
60
|
+
The deterministic engine tests do not require network access or real credentials:
|
|
58
61
|
|
|
59
62
|
```bash
|
|
60
|
-
node --import tsx docs/example-publicapi.ts
|
|
61
63
|
npm test
|
|
62
64
|
```
|
|
63
65
|
|
|
@@ -88,9 +90,8 @@ The historical design treats the repository and its runner as a **virtual proces
|
|
|
88
90
|
|
|
89
91
|
| Mode | Boundary | Typical use |
|
|
90
92
|
| --- | --- | --- |
|
|
91
|
-
|
|
|
93
|
+
| Library | in-process function call | The npm package consumed directly by another program. |
|
|
92
94
|
| Browser | caller-owned transport | Interactive pages, snapshots, tabs and actions. |
|
|
93
|
-
| Auto | adaptive selection | Fetch first, then browser when the caller permits it. |
|
|
94
95
|
| Headless | no visible UI | CI runners, servers and scheduled jobs. |
|
|
95
96
|
| CLI or binary | packaged entry point | Operator tools or third-party compute jobs. |
|
|
96
97
|
| Computer | storage-to-compute bridge | Bounded binary and memory processing. |
|
|
@@ -108,8 +109,9 @@ The engine coordinates serializable contracts rather than hiding providers. The
|
|
|
108
109
|
| Jobs | `engine`, `scheduler`, `inprocess` | `prepare -> process -> sync -> cleanup` |
|
|
109
110
|
| Storage | local, chunked, content-addressed, S3-compatible, GitHub Contents and file-hosting adapters | durable objects, ranges, dedupe and sync |
|
|
110
111
|
| Working set | memory bridge, modes, objects and transforms | storage-to-compute and compute-to-storage flows |
|
|
111
|
-
|
|
|
112
|
-
|
|
|
112
|
+
| Sandbox modalities | the ninety-record modality registry with the join resolver and the honest live/host/planned census | the workload never names a modality — the platform resolves the join |
|
|
113
|
+
| Edge lanes | the edgelandes lane tables (sandbox jails, language toolchains, runner seats, ram recipes, delivery protocols, storage wire speakers, virtual compositions) | ninety lanes probing the host, every run in a private temp dir under a hard deadline |
|
|
114
|
+
| Script lanes | sh interpretation, the house yaml subset and detached background runs | deterministic local execution through the universal runner |
|
|
113
115
|
| Browser | snapshots, tabs, frames, actions, fingerprint, session and replay contracts | caller-owned browser automation without a mandatory provider |
|
|
114
116
|
| Operations | queues, idempotency, saga, retry, circuit breaker, health and heartbeat | controlled execution and recovery |
|
|
115
117
|
| Protocols | JSON, NDJSON, SSE, blocks, API envelopes and MCP | transport-neutral messages |
|
|
@@ -134,9 +136,9 @@ The root entry point is transport-neutral. Node filesystem, HTTP server, persist
|
|
|
134
136
|
|
|
135
137
|
The same contracts can be surfaced as an npm library, application archive, computer runtime, desktop installer, Android APK/AAB, iOS IPA, CLI, binary, browser package, Manifest V3 extension, web/PWA artifact, LibreOffice OXT, VSIX, webhook server, MCP transport, workflow action, container image, Maven package, NuGet package or RubyGem. These surfaces are declarative target plans and caller-owned adapters around the engine; they are not separate sources of truth.
|
|
136
138
|
|
|
137
|
-
###
|
|
139
|
+
### The ninety sandbox modalities
|
|
138
140
|
|
|
139
|
-
The
|
|
141
|
+
The sandbox plane answers the ninety modality plan. `modalityregistry.ts` holds one honest record per modality — isolation family, drivers, hardening gates, boot budget, gpu and network paths, and a live/host/planned state that never pretends — and `resolvejoin` reads a workload request (base profile, gpu, network, isolation depth, boot budget) and answers the modality set that satisfies it, so the person chooses none and the platform resolves the join of all. The edgelandes lane tables wire the plan: ninety lanes probing their host runtime (the sandbox jails, the language toolchains, the runner seats, the ram recipes, the delivery protocols, the virtual hardware compositions), every run in a private temp dir under a hard deadline, an absent runtime answering a coded absence that names it. `scriptlanes.ts` rides the same law for scripts — sh plans, the house yaml subset and detached background runs through the universal runner — and `workloadlaw.ts` catalogs the heavy workload lane of every family app as a demand the same join resolver answers. The self-hosted surface publishes the census at `/api/v1/modalities` and the lane table at `/api/v1/edge/lanes`.
|
|
140
142
|
|
|
141
143
|
### Third-party compute identity
|
|
142
144
|
|
|
@@ -146,23 +148,18 @@ Saddle can be connected to GitHub, GitLab, Forgejo, Gitea, Codeberg, Docker or a
|
|
|
146
148
|
|
|
147
149
|
| Export | Purpose |
|
|
148
150
|
| --- | --- |
|
|
149
|
-
| `
|
|
150
|
-
| `
|
|
151
|
-
| `
|
|
152
|
-
| `
|
|
153
|
-
| `
|
|
154
|
-
| `
|
|
155
|
-
| `
|
|
156
|
-
| `
|
|
157
|
-
| `
|
|
158
|
-
| `withRetry` | bounded retry and abort handling |
|
|
159
|
-
| `createServer` | caller-owned HTTP surface |
|
|
160
|
-
| `batchscrape` | bounded URL groups |
|
|
161
|
-
| `crawlurl` | crawl contract with domain and budget controls |
|
|
151
|
+
| `createVirtualEngine` / `VirtualEngine` / `probeengine` | virtual machine lifecycle, health probes and metrics |
|
|
152
|
+
| `validateSpec` / `specschema` | engine specification validation and normalization |
|
|
153
|
+
| `randomPort` / `resolveHost` / `buildEndpoint` | endpoint allocation without fixed addresses |
|
|
154
|
+
| `InternalMemory` / `MetricsStore` / `enginebus` | the memory bank, the metrics store and the engine event bus |
|
|
155
|
+
| `MODALITIES` / `planreport` | the ninety-record modality registry and its honest census |
|
|
156
|
+
| `resolvejoin` / `getmodality` | the join resolver — the workload never names a modality |
|
|
157
|
+
| `edgelanes` / `edgelandesreport` | the edge lane table and its probe report |
|
|
158
|
+
| `interpretsh` / `interpretyml` / `runscriptbackground` | script lanes: sh plans, yaml plans and detached runs |
|
|
159
|
+
| `engine` / `scheduler` / `inprocess` / `eventbus` | job lifecycle, runner dispatch and events |
|
|
162
160
|
| `browseragent` | caller-owned navigation, click, type and screenshot actions |
|
|
163
161
|
| `mcpserver` / `mcptransport` | MCP tools over JSONL or HTTP |
|
|
164
162
|
| `nodeserver` | Web Request/Response handler |
|
|
165
|
-
| `engine` / `scheduler` | job lifecycle and runner dispatch |
|
|
166
163
|
| `release-assets` | SHA256SUMS, SBOM and provenance metadata for caller-selected artifacts |
|
|
167
164
|
| `releaseevidence` / `evaluateevidence` | serializable release-evidence creation and evaluation |
|
|
168
165
|
| `releasereadiness` / `evidencefromverification` | readiness assessment from caller-supplied verification evidence |
|
|
@@ -191,14 +188,14 @@ The base permission set is `activeTab`, `scripting` and `storage`. It does not r
|
|
|
191
188
|
| --- | --- |
|
|
192
189
|
| Credentials | injected by the caller or repository secret; never committed or printed |
|
|
193
190
|
| Network | HTTP/HTTPS targets are validated; private-target access remains caller policy |
|
|
194
|
-
|
|
|
191
|
+
| Edge lanes | every lane runs in a private temp dir under a hard deadline; the visitor law guard holds on every run |
|
|
195
192
|
| Storage | adapters are replaceable; the core does not own a provider account |
|
|
196
193
|
| Runtime | Node-only filesystem, HTTP, Playwright and release metadata stay outside the transport-neutral root |
|
|
197
194
|
| Extension | page-world reads are bounded, token-correlated and read-only |
|
|
198
195
|
| Failure | retry, circuit breaker, idempotency and resume are configurable |
|
|
199
196
|
| Releases | version comes from the `vX.Y.Z` tag and must match `package.json` |
|
|
200
197
|
|
|
201
|
-
Version 2.0.0 (the grand merge) absorbs the e2ugh virtual-hardware engine into the saddle engine: fifteen engine modules land at the repository root (virtualcpu, virtualmemory, virtualgpu, virtualization, orchestrator, scheduler, compute, media, render, security, performance, alternatives, tiers, quantum and the engine index core), the e2ugh static console and self-hosted API live at web, the hardware catalogs (processors, gpus, cores, boards) and the four virtual-hardware config envelopes (qemu, mttg, passage, docker) ship as package exports under specs
|
|
198
|
+
Version 2.0.0 (the grand merge) absorbs the e2ugh virtual-hardware engine into the saddle engine: fifteen engine modules land at the repository root (virtualcpu, virtualmemory, virtualgpu, virtualization, orchestrator, scheduler, compute, media, render, security, performance, alternatives, tiers, quantum and the engine index core), the e2ugh static console and self-hosted API live at web, the hardware catalogs (processors, gpus, cores, boards) and the four virtual-hardware config envelopes (qemu, mttg, passage, docker) ship as package exports under specs/*. The engine surface stays dependency-free at the root (node built-ins only). Version 1.8.19 previously while reorganizing implementation ownership into twenty correlated domains behind a transport-neutral root router. The migration groups foundation nouns, execution state, API protocols, MCP adapters, automation contracts, package delivery and mode profiles without adding a privileged effect. Existing package subpaths remain available through their updated compiled targets. The denied-by-default execution, policy, handoff and internal-API contracts remain plans or receipts until a separately approved caller adapter is supplied. The current container targets the eleven-architecture family surface (`linux/amd64`, `linux/amd64/v2`, `linux/arm64`, `linux/arm/v7`, `linux/arm/v6`, `linux/ppc64le`, `linux/s390x`, `linux/riscv64`, `linux/386`, `linux/mips64le`, `linux/loong64`); release evidence, readiness and verification remain serializable and caller-owned.
|
|
202
199
|
|
|
203
200
|
## Package surfaces and release automation
|
|
204
201
|
|
|
@@ -221,7 +218,7 @@ Saddle is applying to the SignPath Foundation for open-source code signing. Unti
|
|
|
221
218
|
|
|
222
219
|
The requested policy is: **Free code signing provided by SignPath.io, certificate by SignPath Foundation**. Committers and reviewers are maintainers with write access to the public repository. Approvers are repository owners or release approvers recorded in `governance.md`. Every signed release must be built from repository source, pass the security and packaging gates, and receive manual signing approval.
|
|
223
220
|
|
|
224
|
-
The core program will not transfer information to other networked systems unless specifically requested by the user or the person installing or operating it. Browser sessions, storage adapters, runners and external services remain caller-configured and subject to their own policies. See [`
|
|
221
|
+
The core program will not transfer information to other networked systems unless specifically requested by the user or the person installing or operating it. Browser sessions, storage adapters, runners and external services remain caller-configured and subject to their own policies. See [`privacypolicy.md`](privacypolicy.md) and [`SECURITY.md`](SECURITY.md).
|
|
225
222
|
|
|
226
223
|
## GitHub Pages web surface
|
|
227
224
|
|
|
@@ -232,7 +229,7 @@ npm run web:check
|
|
|
232
229
|
VITE_BASE_PATH=/saddle npm run web:build:pages
|
|
233
230
|
```
|
|
234
231
|
|
|
235
|
-
Small public configuration and visual assets live under `web/public/`. The development collector
|
|
232
|
+
Small public configuration and visual assets live under `web/public/`. The obsolete `web/public/__manus__` directory is intentionally absent; the development debug collector (the visitor-browser telemetry hook at the former `web/debugcollector.ts`) left the saddle — the engine keeps no surface that watches the user's browser.
|
|
236
233
|
|
|
237
234
|
## Development
|
|
238
235
|
|
|
@@ -265,24 +262,28 @@ Remote execution, provider credentials, browser transport, persistence, proxy se
|
|
|
265
262
|
## Repository map
|
|
266
263
|
|
|
267
264
|
```text
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
265
|
+
index.ts the transport-neutral root barrel re-exporting every domain
|
|
266
|
+
foundation.ts errors, events, identifiers, hashing, jobs, artifacts and sessions
|
|
267
|
+
execution.ts the engine, the scheduler, the inprocess runner and the working-set contracts
|
|
268
|
+
virtual.ts memory bridge, modes, objects, transforms and the local adapters
|
|
269
|
+
isolation.ts execution request, decision, handoff and the internal api envelopes
|
|
270
|
+
modalityregistry.ts the ninety-record sandbox modality catalog, the join resolver and the census
|
|
271
|
+
edgelandes*.ts the edge lane tables: host jails and toolchains, inproc recipes, virtual compositions, the ninety merge seat
|
|
272
|
+
edgeplane.ts the merged lane dispatch plane and the visitor law guard
|
|
273
|
+
scriptlanes.ts sh plans, the house yaml subset and detached background runs
|
|
274
|
+
workloadlaw.ts the family workload seat: every app declares the lanes its workloads ride
|
|
275
|
+
sandbox*.ts the sandbox state, the declared sandbox profile and its environment adapter
|
|
276
|
+
virtualcpu.ts, virtualmemory.ts, virtualgpu.ts, virtualization.ts, orchestrator.ts,
|
|
277
|
+
scheduler.ts, compute.ts, media.ts, render.ts, quantum.ts, tiers.ts, security.ts,
|
|
278
|
+
performance.ts, alternatives.ts
|
|
279
|
+
the e2ugh virtual-hardware engine domains landed at the root by the grand merge
|
|
280
|
+
automation.ts, browser.ts, communication.ts, distribution.ts, integration.ts,
|
|
281
|
+
intelligence.ts, modes.ts
|
|
282
|
+
the saddle domain routing barrel files (bot, browser, delivery, integrations, profiles)
|
|
283
|
+
server.ts, webserver.ts, api.ts, cli.ts
|
|
284
|
+
the self-hosted api surfaces, the web console and the stable cli
|
|
285
|
+
Sol/ the Sol theme — the platform's web surface (one tsx app, one stylesheet per theme)
|
|
286
|
+
specs processors.json, gpus.json, cores.json, boards.json and the qemu/mttg/passage/docker/vm envelopes
|
|
286
287
|
tests/ deterministic engine and extension coverage
|
|
287
288
|
docs/ architecture, API, security, release and registry notes
|
|
288
289
|
```
|
|
@@ -291,7 +292,7 @@ The engine is TypeScript-first ESM with English JSDoc comments and a generated J
|
|
|
291
292
|
|
|
292
293
|
## Historical documentation
|
|
293
294
|
|
|
294
|
-
The repository history contains 41 root README revisions and several surface-specific records. Their durable ideas are consolidated here: storage-backed execution, bounded working sets, replaceable runners,
|
|
295
|
+
The repository history contains 41 root README revisions and several surface-specific records. Their durable ideas are consolidated here: storage-backed execution, bounded working sets, replaceable runners, browser actions, workflow delivery, multi-registry packaging, explicit recovery contracts and caller-owned integrations. Historical references that describe superseded identities, obsolete Node baselines, speculative provider quotas, unavailable hosted services or removed layouts remain historical evidence rather than current promises.
|
|
295
296
|
|
|
296
297
|
## Current scope
|
|
297
298
|
|
|
@@ -300,3 +301,17 @@ Version 1.8.19 organizes the existing engine into twenty documented, dependency-
|
|
|
300
301
|
## License
|
|
301
302
|
|
|
302
303
|
Saddle is distributed under the [GNU General Public License v3.0 only](LICENSE).
|
|
304
|
+
|
|
305
|
+
---
|
|
306
|
+
|
|
307
|
+
# The Sol theme
|
|
308
|
+
|
|
309
|
+
# Saddle Sol
|
|
310
|
+
|
|
311
|
+
Saddle is the 90-modality sandbox platform of the DevThink family: one engine spanning compute, virtualization, media, mesh, automation and the other modalities, exposed as a self-hosted site. This Sol theme is the platform's web surface — a Vite + React SPA (console, dashboard, playground, integrations) served from the same sqlite database that `schema.prisma`, `init.sql` and `drizzle.config.ts` describe.
|
|
312
|
+
|
|
313
|
+
```bash
|
|
314
|
+
pnpm install
|
|
315
|
+
pnpm dev
|
|
316
|
+
```
|
|
317
|
+
|
package/alternatives.ts
CHANGED
|
File without changes
|
package/biome.jsonc
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
// the family biome baseline: identical across the apps, the identity only names the app.
|
|
2
|
+
{
|
|
3
|
+
"$schema": "https://biomejs.dev/schemas/2.6.4/schema.json",
|
|
4
|
+
"vcs": {
|
|
5
|
+
"enabled": true,
|
|
6
|
+
"clientKind": "git",
|
|
7
|
+
"useIgnoreFile": false
|
|
8
|
+
},
|
|
9
|
+
"files": {
|
|
10
|
+
"includes": [
|
|
11
|
+
"**/*.ts",
|
|
12
|
+
"**/*.tsx",
|
|
13
|
+
"**/*.js",
|
|
14
|
+
"**/*.mjs",
|
|
15
|
+
"**/*.cjs",
|
|
16
|
+
"**/*.json",
|
|
17
|
+
"!**/dist",
|
|
18
|
+
"!**/distpackage",
|
|
19
|
+
"!**/target",
|
|
20
|
+
"!**/node_modules",
|
|
21
|
+
"!**/bun.lock",
|
|
22
|
+
"!**/*.min.js",
|
|
23
|
+
"!**/docs",
|
|
24
|
+
"!**/tests/tmp",
|
|
25
|
+
"!**/tests/code",
|
|
26
|
+
"!**/Sol/dist",
|
|
27
|
+
"!**/Sol/.vite",
|
|
28
|
+
"!**/Sol/node_modules",
|
|
29
|
+
"!**/coverage",
|
|
30
|
+
"!**/android",
|
|
31
|
+
"!**/releasecheck",
|
|
32
|
+
"!**/build",
|
|
33
|
+
"!**/release",
|
|
34
|
+
"!index-*.js"
|
|
35
|
+
]
|
|
36
|
+
},
|
|
37
|
+
"formatter": {
|
|
38
|
+
"enabled": true,
|
|
39
|
+
"indentStyle": "space",
|
|
40
|
+
"indentWidth": 2,
|
|
41
|
+
"lineWidth": 120,
|
|
42
|
+
"lineEnding": "lf"
|
|
43
|
+
},
|
|
44
|
+
"linter": {
|
|
45
|
+
"enabled": true,
|
|
46
|
+
"rules": {
|
|
47
|
+
"preset": "recommended",
|
|
48
|
+
"correctness": {
|
|
49
|
+
"noUnusedVariables": "warn",
|
|
50
|
+
"noUnsafeOptionalChaining": "warn",
|
|
51
|
+
"useExhaustiveDependencies": "warn",
|
|
52
|
+
"noUnusedImports": "warn",
|
|
53
|
+
"noUnusedPrivateClassMembers": "warn",
|
|
54
|
+
"noUnusedFunctionParameters": "warn",
|
|
55
|
+
"noConstantCondition": "warn",
|
|
56
|
+
"noVoidTypeReturn": "warn"
|
|
57
|
+
},
|
|
58
|
+
"a11y": {
|
|
59
|
+
"useButtonType": "warn",
|
|
60
|
+
"noStaticElementInteractions": "warn",
|
|
61
|
+
"useSemanticElements": "warn",
|
|
62
|
+
"useAriaPropsSupportedByRole": "warn"
|
|
63
|
+
},
|
|
64
|
+
"suspicious": {
|
|
65
|
+
"noExplicitAny": "warn",
|
|
66
|
+
"noArrayIndexKey": "warn",
|
|
67
|
+
"noControlCharactersInRegex": "warn",
|
|
68
|
+
"noRedeclare": "warn",
|
|
69
|
+
"noAssignInExpressions": "warn",
|
|
70
|
+
"noShadowRestrictedNames": "warn",
|
|
71
|
+
"noDuplicateElseIf": "warn",
|
|
72
|
+
"noImplicitAnyLet": "warn",
|
|
73
|
+
"noTsIgnore": "warn",
|
|
74
|
+
"noGlobalIsNan": "warn"
|
|
75
|
+
},
|
|
76
|
+
"style": {
|
|
77
|
+
"noNonNullAssertion": "warn",
|
|
78
|
+
"useTemplate": "warn",
|
|
79
|
+
"useExponentiationOperator": "warn",
|
|
80
|
+
"useConst": "warn"
|
|
81
|
+
},
|
|
82
|
+
"complexity": {
|
|
83
|
+
"useLiteralKeys": "warn",
|
|
84
|
+
"useOptionalChain": "warn",
|
|
85
|
+
"noUselessContinue": "warn",
|
|
86
|
+
"noUselessUndefinedInitialization": "warn",
|
|
87
|
+
"noUselessEscapeInRegex": "warn"
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
"javascript": {
|
|
92
|
+
"formatter": {
|
|
93
|
+
"quoteStyle": "double",
|
|
94
|
+
"semicolons": "always",
|
|
95
|
+
"trailingCommas": "all",
|
|
96
|
+
"arrowParentheses": "always"
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
"css": {
|
|
100
|
+
"parser": {
|
|
101
|
+
"tailwindDirectives": true
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
"overrides": [
|
|
105
|
+
{
|
|
106
|
+
"includes": ["**/*"],
|
|
107
|
+
"linter": {
|
|
108
|
+
"rules": {
|
|
109
|
+
"suspicious": {
|
|
110
|
+
"noDebugger": "off"
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
"includes": ["tests/workflowcheck.ts", "tests/publishlanes.test.ts"],
|
|
117
|
+
"linter": {
|
|
118
|
+
"rules": {
|
|
119
|
+
"suspicious": {
|
|
120
|
+
"noTemplateCurlyInString": "off"
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
],
|
|
126
|
+
"assist": {
|
|
127
|
+
"enabled": true,
|
|
128
|
+
"actions": {
|
|
129
|
+
"source": {
|
|
130
|
+
"useSortedKeys": "off"
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
package/boards.json
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"date": "2026-08-22",
|
|
8
8
|
"dateFirstDoctrine": "The observer validates all specifications against the latest stable releases available on 2026-08-22.",
|
|
9
9
|
"toolchain": {
|
|
10
|
-
"node": "26.
|
|
10
|
+
"node": "26.12.0 Current",
|
|
11
11
|
"nodeAlt": "24.19.0 LTS",
|
|
12
12
|
"typescript": "7.0.2",
|
|
13
13
|
"python": "3.14.7",
|
|
@@ -88,7 +88,7 @@
|
|
|
88
88
|
}
|
|
89
89
|
},
|
|
90
90
|
"name": "boards.json",
|
|
91
|
-
"version": "2.
|
|
91
|
+
"version": "2.0.127",
|
|
92
92
|
"title": "saddle - Virtual Motherboard Database (retail boards + platform reference sockets)",
|
|
93
93
|
"sources": [
|
|
94
94
|
"pool:boards.json [S6, 20 retail boards]",
|
package/compute.ts
CHANGED
|
@@ -2554,7 +2554,7 @@ export function buildvmcrdmanifest(opts?: {
|
|
|
2554
2554
|
'metadata:',
|
|
2555
2555
|
` name: ${plural}.${group}`,
|
|
2556
2556
|
'spec:',
|
|
2557
|
-
|
|
2557
|
+
` group: ${group}`,
|
|
2558
2558
|
' scope: Namespaced',
|
|
2559
2559
|
' names:',
|
|
2560
2560
|
` plural: ${plural}`,
|
|
@@ -2562,7 +2562,7 @@ export function buildvmcrdmanifest(opts?: {
|
|
|
2562
2562
|
` kind: ${kind}`,
|
|
2563
2563
|
' shortNames: [vm, evm]',
|
|
2564
2564
|
' versions:',
|
|
2565
|
-
|
|
2565
|
+
` - name: ${version}`,
|
|
2566
2566
|
' served: true',
|
|
2567
2567
|
' storage: true',
|
|
2568
2568
|
' subresources:',
|
|
@@ -2618,8 +2618,8 @@ export function buildvmcrdmanifest(opts?: {
|
|
|
2618
2618
|
'',
|
|
2619
2619
|
].join('\n');
|
|
2620
2620
|
const sample = [
|
|
2621
|
-
|
|
2622
|
-
|
|
2621
|
+
`apiVersion: ${group}/${version}`,
|
|
2622
|
+
`kind: ${kind}`,
|
|
2623
2623
|
'metadata:',
|
|
2624
2624
|
' name: demo-vm',
|
|
2625
2625
|
' namespace: saddle',
|
package/cores.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"metadata": {
|
|
3
3
|
"id": "cores.json",
|
|
4
|
-
"version": "2.
|
|
4
|
+
"version": "2.0.127",
|
|
5
5
|
"date": "2026-08-22",
|
|
6
6
|
"datestamp": "2026-08-22T00:00:00Z",
|
|
7
7
|
"observer": "third person observer notes the hybrid core inventory reflects production silicon as of 2026-08-22",
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
]
|
|
37
37
|
},
|
|
38
38
|
"stack": {
|
|
39
|
-
"node": "26.
|
|
39
|
+
"node": "26.12.0 Current",
|
|
40
40
|
"nodeAlt": "24.19.0 LTS",
|
|
41
41
|
"typescript": "7.0.2",
|
|
42
42
|
"python": "3.14.7",
|
package/docker.config
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"meta": {
|
|
3
3
|
"name": "docker.config",
|
|
4
4
|
"title": "saddle - Docker Engine and Containerization Configuration",
|
|
5
|
-
"version": "2.
|
|
5
|
+
"version": "2.0.154",
|
|
6
6
|
"date": "2026-08-22",
|
|
7
7
|
"language": "en",
|
|
8
8
|
"sources": [
|
|
@@ -106,11 +106,21 @@
|
|
|
106
106
|
"platforms": {
|
|
107
107
|
"architectures": [
|
|
108
108
|
"linux/amd64",
|
|
109
|
-
"linux/
|
|
109
|
+
"linux/amd64/v2",
|
|
110
|
+
"linux/arm64",
|
|
111
|
+
"linux/arm/v7",
|
|
112
|
+
"linux/arm/v6",
|
|
113
|
+
"linux/ppc64le",
|
|
114
|
+
"linux/s390x",
|
|
115
|
+
"linux/riscv64",
|
|
116
|
+
"linux/386",
|
|
117
|
+
"linux/mips64le",
|
|
118
|
+
"linux/loong64"
|
|
110
119
|
],
|
|
111
120
|
"primary": "linux/amd64",
|
|
112
|
-
"qemuEmulation":
|
|
113
|
-
"nativeBuild": true
|
|
121
|
+
"qemuEmulation": true,
|
|
122
|
+
"nativeBuild": true,
|
|
123
|
+
"note": "the eleven-arch family standard (PR15b: amd64, amd64/v2, arm64, arm/v7, arm/v6, ppc64le, s390x, riscv64, 386, mips64le, loong64 - the complete linux platform surface docker/buildx carries, the owner's law: eleven OS architectures for every container of every application) the one container file and the publish lanes carry; amd64 and amd64/v2 build native, the other nine legs ride QEMU emulation; unknown/* stays rejected as not runnable"
|
|
114
124
|
},
|
|
115
125
|
"runtimeBase": {
|
|
116
126
|
"nodeImage": "node:26.7.0-alpine",
|
|
@@ -468,9 +478,18 @@
|
|
|
468
478
|
"multiArch": {
|
|
469
479
|
"platforms": [
|
|
470
480
|
"linux/amd64",
|
|
471
|
-
"linux/
|
|
481
|
+
"linux/amd64/v2",
|
|
482
|
+
"linux/arm64",
|
|
483
|
+
"linux/arm/v7",
|
|
484
|
+
"linux/arm/v6",
|
|
485
|
+
"linux/ppc64le",
|
|
486
|
+
"linux/s390x",
|
|
487
|
+
"linux/riscv64",
|
|
488
|
+
"linux/386",
|
|
489
|
+
"linux/mips64le",
|
|
490
|
+
"linux/loong64"
|
|
472
491
|
],
|
|
473
|
-
"command": "docker buildx build --platform linux/amd64,linux/arm64 --cache-from type=gha --cache-to type=gha,mode=max --push -t ghcr.io/vhe/sandbox:29.7.2 ."
|
|
492
|
+
"command": "docker buildx build --platform linux/amd64,linux/amd64/v2,linux/arm64,linux/arm/v7,linux/arm/v6,linux/ppc64le,linux/s390x,linux/riscv64,linux/386,linux/mips64le,linux/loong64 --cache-from type=gha --cache-to type=gha,mode=max --push -t ghcr.io/vhe/sandbox:29.7.2 ."
|
|
474
493
|
},
|
|
475
494
|
"actionsWorkflowUses": [
|
|
476
495
|
"docker/setup-buildx-action@v4.3.0",
|
|
@@ -618,7 +637,7 @@
|
|
|
618
637
|
"labels": {
|
|
619
638
|
"org.opencontainers.image.title": "saddle-v6",
|
|
620
639
|
"org.opencontainers.image.description": "Saddle v6 virtualization orchestrator with QEMU 11.1.0, Node 22 LTS, Python 3.13.5, MTTG, Passage, OVMF",
|
|
621
|
-
"org.opencontainers.image.version": "2.
|
|
640
|
+
"org.opencontainers.image.version": "2.0.154",
|
|
622
641
|
"org.opencontainers.image.created": "2026-08-22T00:00:00Z",
|
|
623
642
|
"org.opencontainers.image.authors": "Saddle Core <core@saddle.dev>",
|
|
624
643
|
"org.opencontainers.image.url": "https://saddle.dev",
|
|
@@ -630,7 +649,7 @@
|
|
|
630
649
|
"org.opencontainers.image.base.name": "debian:bookworm-slim",
|
|
631
650
|
"org.opencontainers.image.base.digest": "sha256:bookworm-slim-pinned-2026-08-22",
|
|
632
651
|
"saddle": {
|
|
633
|
-
"com.saddle.version": "2.
|
|
652
|
+
"com.saddle.version": "2.0.154",
|
|
634
653
|
"com.saddle.engine": "qemu-11.1.0",
|
|
635
654
|
"com.saddle.modes": "32",
|
|
636
655
|
"com.saddle.forge.mirrors": "github,gitea,forgejo",
|
|
@@ -655,7 +674,16 @@
|
|
|
655
674
|
"target": "runtime-base",
|
|
656
675
|
"platforms": [
|
|
657
676
|
"linux/amd64",
|
|
658
|
-
"linux/
|
|
677
|
+
"linux/amd64/v2",
|
|
678
|
+
"linux/arm64",
|
|
679
|
+
"linux/arm/v7",
|
|
680
|
+
"linux/arm/v6",
|
|
681
|
+
"linux/ppc64le",
|
|
682
|
+
"linux/s390x",
|
|
683
|
+
"linux/riscv64",
|
|
684
|
+
"linux/386",
|
|
685
|
+
"linux/mips64le",
|
|
686
|
+
"linux/loong64"
|
|
659
687
|
],
|
|
660
688
|
"cacheFrom": [
|
|
661
689
|
"type=gha",
|
package/docs/.gitkeep
CHANGED
|
File without changes
|
package/docs/actionrecorder.md
CHANGED
|
File without changes
|
package/docs/actionsincident.md
CHANGED
|
File without changes
|
package/docs/alternatives.md
CHANGED
|
File without changes
|
package/docs/architecture.md
CHANGED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -141,7 +141,7 @@ The available metadata files are `manifest.android.1.8.15.json`, `manifest.conta
|
|
|
141
141
|
|
|
142
142
|
## 1.8.16 verified release matrix
|
|
143
143
|
|
|
144
|
-
The published [v1.8.16 release](https://github.com/wenathlan/saddle/releases/tag/v1.8.16) contains 38 attached assets: six Linux desktop artifacts, six Windows desktop artifacts, four macOS desktop artifacts, two Android artifacts, one container archive, one browser extension, nine manifests, and nine checksum files. The asset names match the matrix in [
|
|
144
|
+
The published [v1.8.16 release](https://github.com/wenathlan/saddle/releases/tag/v1.8.16) contains 38 attached assets: six Linux desktop artifacts, six Windows desktop artifacts, four macOS desktop artifacts, two Android artifacts, one container archive, one browser extension, nine manifests, and nine checksum files. The asset names match the matrix in [releasenotes1816.md](releasenotes1816.md).
|
|
145
145
|
|
|
146
146
|
The release-event Android workflow stopped because production signing secrets were not configured. The separately successful manual Android run `31839378707` used the workflow's explicit `ci-test-key` option and attached the APK, AAB, checksum, and manifest. No iOS artifact is claimed because Apple signing, provisioning, and export credentials were not configured. Desktop artifacts remain `unsigned`, the container manifest remains `caller-owned`, and no result is represented as production signing, notarization, registry trust, SBOM validation, or vulnerability status without its own evidence.
|
|
147
147
|
|
|
@@ -151,7 +151,7 @@ The release-evidence API can normalize and evaluate results supplied by complete
|
|
|
151
151
|
|
|
152
152
|
The 1.8.17 candidate keeps the established release asset contract while expanding the GHCR image index to `linux/amd64`, `linux/arm64`, and `linux/ppc64le`. The workflow must inspect the pushed index before this document treats those platform variants as available. The attached `saddle.container.1.8.17.tar.gz` remains one archive artifact and is not evidence of a Windows container variant.
|
|
153
153
|
|
|
154
|
-
`windows/amd64`, `linux/arm/v7`, and `linux/386` are not claimed by this candidate. A Windows image requires its own versioned Windows base, Dockerfile, runner, and compatibility validation; the existing Debian Linux Dockerfile cannot produce it by adding a platform string. `unknown` descriptors are not runnable targets. The platform decision and evidence limits are detailed in [
|
|
154
|
+
`windows/amd64`, `linux/arm/v7`, and `linux/386` are not claimed by this candidate. A Windows image requires its own versioned Windows base, Dockerfile, runner, and compatibility validation; the existing Debian Linux Dockerfile cannot produce it by adding a platform string. `unknown` descriptors are not runnable targets. The platform decision and evidence limits are detailed in [containerplatforms1817.md](containerplatforms1817.md).
|
|
155
155
|
|
|
156
156
|
## 1.8.17 verified container publication
|
|
157
157
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
package/docs/branchaudit.md
CHANGED
|
File without changes
|
package/docs/browser.md
CHANGED
|
File without changes
|
package/docs/capabilityreport.md
CHANGED
|
File without changes
|
package/docs/comparativeaudit.md
CHANGED
|
File without changes
|
package/docs/consolidation.md
CHANGED
|
File without changes
|
|
File without changes
|
|
@@ -8,7 +8,7 @@ from a three-platform Linux manifest index to the four-architecture family
|
|
|
8
8
|
surface: `linux/amd64`, `linux/arm64`, `linux/ppc64le`, and `linux/s390x`.
|
|
9
9
|
The selection unifies the container surfaces of the grand merge: the saddle
|
|
10
10
|
lineage shipped amd64/arm64/ppc64le (the 1.8.17 decision, see
|
|
11
|
-
[
|
|
11
|
+
[containerplatforms1817.md](containerplatforms1817.md)) and the e2ugh
|
|
12
12
|
lineage published all four architectures for the virtual-hardware engine
|
|
13
13
|
(`publish ghcr vhe`). One product, one registry, one architecture surface:
|
|
14
14
|
the s390x leg joins the node engine from the e2ugh side of the family.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
## Canonical root documents
|
|
4
4
|
|
|
5
|
-
Project policies, notices and contribution guidance remain at the repository root so package consumers and forge interfaces can discover them without entering `docs`. The canonical license is the extensionless `LICENSE` file containing the official unmodified GNU GPL v3.0 text. Human-readable project policies use one Markdown file per context: `
|
|
5
|
+
Project policies, notices and contribution guidance remain at the repository root so package consumers and forge interfaces can discover them without entering `docs`. The canonical license is the extensionless `LICENSE` file containing the official unmodified GNU GPL v3.0 text. Human-readable project policies use one Markdown file per context: `acceptableusepolicy.md`, `authors.md`, `bugreport.md`, `cla.md`, `codeofconduct.md`, `contributing.md`, `copyright.md`, `disclaimer.md`, `eula.md`, `exportcontrol.md`, `governance.md`, `notice.md`, `privacypolicy.md`, `pullrequesttemplate.md`, `security.md`, `support.md`, `termsandconditions.md`, `termsofuse.md`, `thirdpartynotices.md` and `trademarkpolicy.md`.
|
|
6
6
|
|
|
7
7
|
The public scope README remains `/home/ubuntu/upload/README.md` and was not modified. The repository's own `README.md` remains a public project document and can receive release or signing-policy updates separately from the immutable scope reference.
|
|
8
8
|
|
|
File without changes
|
package/docs/ecosystemplan.md
CHANGED
|
File without changes
|