@wenathlan/saddle 2.0.166 → 2.0.168
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 +150 -25
- package/README.md +3 -3
- package/biome.jsonc +3 -3
- package/cli.ts +2 -2
- package/docker.config +2 -2
- package/docs/architecture.md +7 -7
- package/docs/browser.md +1 -1
- package/docs/e2ughengine.md +8 -8
- package/docs/extension.md +1 -1
- package/docs/osdistributions.md +1 -1
- package/docs/todo1816.md +1 -1
- package/docs/viability.md +1 -1
- package/index.ts +4 -2
- package/modalities.ts +284 -60
- package/package.json +84 -86
- package/{scriptlanes.ts → scripts.ts} +283 -5
- package/tiers.ts +10 -2
- package/tsconfig.json +1 -1
- package/workloadlaw.ts +337 -38
package/Dockerfile
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# saddle 2.0.
|
|
1
|
+
# saddle 2.0.168 — THE ENGINE CONTAINER FILE
|
|
2
2
|
#
|
|
3
3
|
# THE FAMILY CONTAINER DOCTRINE, THE SADDLE SHAPE: one versioned container
|
|
4
4
|
# per engine, built like the site homes (argan, cadria) build theirs — a
|
|
@@ -128,13 +128,17 @@
|
|
|
128
128
|
# building from inside saddle/ breaks the vault COPY - the sibling rides
|
|
129
129
|
# the context beside this directory, never inside it.
|
|
130
130
|
#
|
|
131
|
-
# THE DIGEST LAW: the FROM lines ride
|
|
132
|
-
# (the scorecard-file form the
|
|
133
|
-
#
|
|
134
|
-
#
|
|
135
|
-
#
|
|
136
|
-
#
|
|
137
|
-
#
|
|
131
|
+
# THE DIGEST LAW (the local-build heal): the FROM lines ride
|
|
132
|
+
# name@sha256:${NODE_BASE_DIGEST} (the scorecard-file form the
|
|
133
|
+
# supply-chain gate reads as pinned) and the ARG carries the resolved
|
|
134
|
+
# manifest-list digest of the pinned tag as its default — the same floor
|
|
135
|
+
# the debonair/forge seats stamp as their hardcoded digest, so a plain
|
|
136
|
+
# local `docker build -f saddle/Dockerfile .` never dies on an empty
|
|
137
|
+
# `@sha256:` reference the way the digest-never-hardcoded era did (the
|
|
138
|
+
# owner's law: the container must build functional like the other ten).
|
|
139
|
+
# The publish lanes still resolve the manifest digest on the runner at
|
|
140
|
+
# build time and override the default with the fresh value — the pin
|
|
141
|
+
# form the gate reads stays identical either way.
|
|
138
142
|
#
|
|
139
143
|
# THE VERSION LAW: the ARG default below mirrors saddle/package.json
|
|
140
144
|
# (the metadata lockstep the registry lanes stamp); the publish lanes pass
|
|
@@ -142,19 +146,19 @@
|
|
|
142
146
|
# the stamp.
|
|
143
147
|
|
|
144
148
|
ARG NODE_BASE_TAG="node:26.13.0-slim"
|
|
145
|
-
# the
|
|
146
|
-
#
|
|
147
|
-
#
|
|
148
|
-
#
|
|
149
|
-
#
|
|
150
|
-
#
|
|
151
|
-
#
|
|
152
|
-
ARG NODE_BASE_DIGEST
|
|
149
|
+
# the resolved manifest-list digest of node:26.13.0-slim (the local-build
|
|
150
|
+
# floor the ARG default stamps — the publish lanes override it with the
|
|
151
|
+
# freshly resolved digest at build time, and the FROM lines keep the
|
|
152
|
+
# name@sha256:${ARG} pin form the supply-chain gate reads either way):
|
|
153
|
+
# the default ends the empty-@sha256: era where a local build without the
|
|
154
|
+
# build-arg answered an invalid base reference and the container the
|
|
155
|
+
# owner charged functional never built at all.
|
|
156
|
+
ARG NODE_BASE_DIGEST=5adad64f9a1fca2d51972caa65983634c8a774eb300d72b20f7f2a0f60368072
|
|
153
157
|
|
|
154
158
|
# ===== stage: solbuild — the locked npm tree and the console spa =====
|
|
155
159
|
FROM --platform=$BUILDPLATFORM ${NODE_BASE_TAG}@sha256:${NODE_BASE_DIGEST} AS solbuild
|
|
156
160
|
|
|
157
|
-
ARG SADDLE_VERSION=2.0.
|
|
161
|
+
ARG SADDLE_VERSION=2.0.168
|
|
158
162
|
|
|
159
163
|
WORKDIR /app
|
|
160
164
|
|
|
@@ -168,6 +172,12 @@ COPY saddle/ .
|
|
|
168
172
|
# so the vault sources ride the context beside the saddle and land at
|
|
169
173
|
# /vault where the import resolves (the family context fix).
|
|
170
174
|
COPY vault/ /vault
|
|
175
|
+
# the routerbase sibling of the family law: saddle/routerbase.ts
|
|
176
|
+
# re-exports the family routerBase from ../devthink/routerbase.ts, so
|
|
177
|
+
# the devthink sources land at /devthink where the sol build resolves
|
|
178
|
+
# the re-export (sources only - the same never-installed law the vault
|
|
179
|
+
# sibling above rides, the family context fix the lanes carry).
|
|
180
|
+
COPY devthink/ /devthink
|
|
171
181
|
RUN npm run web:build:pages \
|
|
172
182
|
# the theme build emits the hashed SPA bundles straight at the app
|
|
173
183
|
# root (the family static-first vite contract): stage them into a
|
|
@@ -182,7 +192,7 @@ RUN npm run web:build:pages \
|
|
|
182
192
|
# ===== stage: base — the hardened runtime floor every profile shares =====
|
|
183
193
|
FROM ${NODE_BASE_TAG}@sha256:${NODE_BASE_DIGEST} AS base
|
|
184
194
|
|
|
185
|
-
ARG SADDLE_VERSION=2.0.
|
|
195
|
+
ARG SADDLE_VERSION=2.0.168
|
|
186
196
|
# the revision stamp the devthink container carries (DEVTHINK_REVISION
|
|
187
197
|
# there): the publish legs pass the release sha at build time and the
|
|
188
198
|
# revision label below declares the default-unknown local shape.
|
|
@@ -294,8 +304,9 @@ RUN apt-get update \
|
|
|
294
304
|
# edgeplane.ts
|
|
295
305
|
# pulls foundation.ts and the one edgelandes keyword file (the edgelandes
|
|
296
306
|
# fold retired the host/inproc/virtual/ninety arms into it); the lazy
|
|
297
|
-
# script-lane surface (webserver.ts imports
|
|
298
|
-
#
|
|
307
|
+
# script-lane surface (webserver.ts imports the one scripts keyword
|
|
308
|
+
# file on first use — the scripts fold retired the scriptlanes seat into
|
|
309
|
+
# it) pulls execution.ts through scripts.ts, so both ride the copy and
|
|
299
310
|
# the lane answers real runs instead of the honest 503; db.ts pulls
|
|
300
311
|
# labels.ts whose ../vault/labelstore.ts import resolves at /vault (the
|
|
301
312
|
# family context fix - the vault source lands beside /app the same way
|
|
@@ -315,7 +326,7 @@ RUN apt-get update \
|
|
|
315
326
|
# (virtual.ts pulls foundation.ts only; tiers.ts pulls node builtins
|
|
316
327
|
# only).
|
|
317
328
|
# run the console with: docker run saddle:<version>
|
|
318
|
-
COPY --from=solbuild /app/webserver.ts /app/db.ts /app/labels.ts /app/auth.ts /app/mesh.ts /app/sandbox.ts /app/modalityregistry.ts /app/edgeplane.ts /app/workloadlaw.ts /app/foundation.ts /app/edgelandes.ts /app/
|
|
329
|
+
COPY --from=solbuild /app/webserver.ts /app/db.ts /app/labels.ts /app/auth.ts /app/mesh.ts /app/sandbox.ts /app/modalityregistry.ts /app/edgeplane.ts /app/workloadlaw.ts /app/foundation.ts /app/edgelandes.ts /app/scripts.ts /app/execution.ts /app/virtual.ts /app/tiers.ts /app/mime.types /app/init.sql /app/schema.prisma ./
|
|
319
330
|
# the label store of the console stack: labels.ts (pulled by db.ts)
|
|
320
331
|
# resolves ../vault/labelstore.ts at /vault - the same family context
|
|
321
332
|
# fix the solbuild stage applies.
|
|
@@ -484,7 +495,7 @@ LABEL org.opencontainers.image.title="saddle (the android os-distribution lane)"
|
|
|
484
495
|
# docker build --target osv -t saddle:2.0.165-v .
|
|
485
496
|
# docker build --target oswindows -t saddle:2.0.165-windows .
|
|
486
497
|
FROM scratch AS osgrapheneos
|
|
487
|
-
ARG SADDLE_VERSION=2.0.
|
|
498
|
+
ARG SADDLE_VERSION=2.0.168
|
|
488
499
|
ARG SADDLE_OS_PROFILE="grapheneos"
|
|
489
500
|
ENV SADDLE_OS_PROFILE=grapheneos
|
|
490
501
|
LABEL org.opencontainers.image.title="saddle (the grapheneos os-distribution catalog lane)" \
|
|
@@ -495,7 +506,7 @@ LABEL org.opencontainers.image.title="saddle (the grapheneos os-distribution cat
|
|
|
495
506
|
COPY osprofiles/grapheneos.json /saddle/osprofile.json
|
|
496
507
|
|
|
497
508
|
FROM scratch AS osmaruos
|
|
498
|
-
ARG SADDLE_VERSION=2.0.
|
|
509
|
+
ARG SADDLE_VERSION=2.0.168
|
|
499
510
|
ARG SADDLE_OS_PROFILE="maruos"
|
|
500
511
|
ENV SADDLE_OS_PROFILE=maruos
|
|
501
512
|
LABEL org.opencontainers.image.title="saddle (the maru os os-distribution catalog lane)" \
|
|
@@ -506,7 +517,7 @@ LABEL org.opencontainers.image.title="saddle (the maru os os-distribution catalo
|
|
|
506
517
|
COPY osprofiles/maruos.json /saddle/osprofile.json
|
|
507
518
|
|
|
508
519
|
FROM scratch AS osv
|
|
509
|
-
ARG SADDLE_VERSION=2.0.
|
|
520
|
+
ARG SADDLE_VERSION=2.0.168
|
|
510
521
|
ARG SADDLE_OS_PROFILE="v"
|
|
511
522
|
ENV SADDLE_OS_PROFILE=v
|
|
512
523
|
LABEL org.opencontainers.image.title="saddle (the v os-distribution catalog lane)" \
|
|
@@ -517,7 +528,7 @@ LABEL org.opencontainers.image.title="saddle (the v os-distribution catalog lane
|
|
|
517
528
|
COPY osprofiles/v.json /saddle/osprofile.json
|
|
518
529
|
|
|
519
530
|
FROM scratch AS oswindows
|
|
520
|
-
ARG SADDLE_VERSION=2.0.
|
|
531
|
+
ARG SADDLE_VERSION=2.0.168
|
|
521
532
|
ARG SADDLE_OS_PROFILE="windows"
|
|
522
533
|
ENV SADDLE_OS_PROFILE=windows
|
|
523
534
|
LABEL org.opencontainers.image.title="saddle (the windows os-distribution catalog lane)" \
|
|
@@ -526,3 +537,117 @@ LABEL org.opencontainers.image.title="saddle (the windows os-distribution catalo
|
|
|
526
537
|
org.opencontainers.image.licenses="GPL-3.0-only" \
|
|
527
538
|
org.opencontainers.image.source="https://github.com/wenathlan/devthink"
|
|
528
539
|
COPY osprofiles/windows.json /saddle/osprofile.json
|
|
540
|
+
|
|
541
|
+
FROM scratch AS ospostmarketos
|
|
542
|
+
ARG SADDLE_VERSION=2.0.168
|
|
543
|
+
ARG SADDLE_OS_PROFILE="postmarketos"
|
|
544
|
+
ENV SADDLE_OS_PROFILE=postmarketos
|
|
545
|
+
LABEL org.opencontainers.image.title="saddle (the postmarketos os-distribution catalog lane)" \
|
|
546
|
+
org.opencontainers.image.description="the postmarketos os-distribution seat as a catalog lane: postmarketos is the alpine-based mobile distribution real devices boot — no runnable container base exists for this seat, the lane publishes the profile config the engine reads." \
|
|
547
|
+
org.opencontainers.image.version="${SADDLE_VERSION}" \
|
|
548
|
+
org.opencontainers.image.licenses="GPL-3.0-only" \
|
|
549
|
+
org.opencontainers.image.source="https://github.com/wenathlan/devthink"
|
|
550
|
+
COPY osprofiles/postmarketos.json /saddle/osprofile.json
|
|
551
|
+
|
|
552
|
+
FROM scratch AS oslineageos
|
|
553
|
+
ARG SADDLE_VERSION=2.0.168
|
|
554
|
+
ARG SADDLE_OS_PROFILE="lineageos"
|
|
555
|
+
ENV SADDLE_OS_PROFILE=lineageos
|
|
556
|
+
LABEL org.opencontainers.image.title="saddle (the lineageos os-distribution catalog lane)" \
|
|
557
|
+
org.opencontainers.image.description="the lineageos os-distribution seat as a catalog lane: lineageos is the community android continuation — the aftermarket mobile seat on the arm64 legs, the lane publishes the profile config the engine reads." \
|
|
558
|
+
org.opencontainers.image.version="${SADDLE_VERSION}" \
|
|
559
|
+
org.opencontainers.image.licenses="GPL-3.0-only" \
|
|
560
|
+
org.opencontainers.image.source="https://github.com/wenathlan/devthink"
|
|
561
|
+
COPY osprofiles/lineageos.json /saddle/osprofile.json
|
|
562
|
+
|
|
563
|
+
FROM scratch AS oscalyxos
|
|
564
|
+
ARG SADDLE_VERSION=2.0.168
|
|
565
|
+
ARG SADDLE_OS_PROFILE="calyxos"
|
|
566
|
+
ENV SADDLE_OS_PROFILE=calyxos
|
|
567
|
+
LABEL org.opencontainers.image.title="saddle (the calyxos os-distribution catalog lane)" \
|
|
568
|
+
org.opencontainers.image.description="the calyxos os-distribution seat as a catalog lane: calyxos is the privacy-focused android distribution, the hardened mobile seat beside grapheneos — the lane publishes the profile config the engine reads." \
|
|
569
|
+
org.opencontainers.image.version="${SADDLE_VERSION}" \
|
|
570
|
+
org.opencontainers.image.licenses="GPL-3.0-only" \
|
|
571
|
+
org.opencontainers.image.source="https://github.com/wenathlan/devthink"
|
|
572
|
+
COPY osprofiles/calyxos.json /saddle/osprofile.json
|
|
573
|
+
|
|
574
|
+
FROM scratch AS osarchlinux
|
|
575
|
+
ARG SADDLE_VERSION=2.0.168
|
|
576
|
+
ARG SADDLE_OS_PROFILE="archlinux"
|
|
577
|
+
ENV SADDLE_OS_PROFILE=archlinux
|
|
578
|
+
LABEL org.opencontainers.image.title="saddle (the archlinux os-distribution catalog lane)" \
|
|
579
|
+
org.opencontainers.image.description="the archlinux os-distribution seat as a catalog lane: archlinux is the rolling-release distribution omarchy builds on, the pacman desktop seat — the lane publishes the profile config the engine reads." \
|
|
580
|
+
org.opencontainers.image.version="${SADDLE_VERSION}" \
|
|
581
|
+
org.opencontainers.image.licenses="GPL-3.0-only" \
|
|
582
|
+
org.opencontainers.image.source="https://github.com/wenathlan/devthink"
|
|
583
|
+
COPY osprofiles/archlinux.json /saddle/osprofile.json
|
|
584
|
+
|
|
585
|
+
FROM scratch AS osalpine
|
|
586
|
+
ARG SADDLE_VERSION=2.0.168
|
|
587
|
+
ARG SADDLE_OS_PROFILE="alpine"
|
|
588
|
+
ENV SADDLE_OS_PROFILE=alpine
|
|
589
|
+
LABEL org.opencontainers.image.title="saddle (the alpine os-distribution catalog lane)" \
|
|
590
|
+
org.opencontainers.image.description="the alpine os-distribution seat as a catalog lane: alpine is the musl-based lightweight distribution, the small-footprint seat the musl legs answer — the lane publishes the profile config the engine reads." \
|
|
591
|
+
org.opencontainers.image.version="${SADDLE_VERSION}" \
|
|
592
|
+
org.opencontainers.image.licenses="GPL-3.0-only" \
|
|
593
|
+
org.opencontainers.image.source="https://github.com/wenathlan/devthink"
|
|
594
|
+
COPY osprofiles/alpine.json /saddle/osprofile.json
|
|
595
|
+
|
|
596
|
+
FROM scratch AS osdebian
|
|
597
|
+
ARG SADDLE_VERSION=2.0.168
|
|
598
|
+
ARG SADDLE_OS_PROFILE="debian"
|
|
599
|
+
ENV SADDLE_OS_PROFILE=debian
|
|
600
|
+
LABEL org.opencontainers.image.title="saddle (the debian os-distribution catalog lane)" \
|
|
601
|
+
org.opencontainers.image.description="the debian os-distribution seat as a catalog lane: debian is the universal operating system, the apt desktop seat the widest hardware matrix answers — the lane publishes the profile config the engine reads." \
|
|
602
|
+
org.opencontainers.image.version="${SADDLE_VERSION}" \
|
|
603
|
+
org.opencontainers.image.licenses="GPL-3.0-only" \
|
|
604
|
+
org.opencontainers.image.source="https://github.com/wenathlan/devthink"
|
|
605
|
+
COPY osprofiles/debian.json /saddle/osprofile.json
|
|
606
|
+
|
|
607
|
+
FROM scratch AS osfedora
|
|
608
|
+
ARG SADDLE_VERSION=2.0.168
|
|
609
|
+
ARG SADDLE_OS_PROFILE="fedora"
|
|
610
|
+
ENV SADDLE_OS_PROFILE=fedora
|
|
611
|
+
LABEL org.opencontainers.image.title="saddle (the fedora os-distribution catalog lane)" \
|
|
612
|
+
org.opencontainers.image.description="the fedora os-distribution seat as a catalog lane: fedora is the red-hat-upstream community distribution, the rpm desktop seat beside the apt rows — the lane publishes the profile config the engine reads." \
|
|
613
|
+
org.opencontainers.image.version="${SADDLE_VERSION}" \
|
|
614
|
+
org.opencontainers.image.licenses="GPL-3.0-only" \
|
|
615
|
+
org.opencontainers.image.source="https://github.com/wenathlan/devthink"
|
|
616
|
+
COPY osprofiles/fedora.json /saddle/osprofile.json
|
|
617
|
+
|
|
618
|
+
FROM scratch AS osnixos
|
|
619
|
+
ARG SADDLE_VERSION=2.0.168
|
|
620
|
+
ARG SADDLE_OS_PROFILE="nixos"
|
|
621
|
+
ENV SADDLE_OS_PROFILE=nixos
|
|
622
|
+
LABEL org.opencontainers.image.title="saddle (the nixos os-distribution catalog lane)" \
|
|
623
|
+
org.opencontainers.image.description="the nixos os-distribution seat as a catalog lane: nixos is the declarative distribution the nix package manager builds, the reproducible-system seat — the lane publishes the profile config the engine reads." \
|
|
624
|
+
org.opencontainers.image.version="${SADDLE_VERSION}" \
|
|
625
|
+
org.opencontainers.image.licenses="GPL-3.0-only" \
|
|
626
|
+
org.opencontainers.image.source="https://github.com/wenathlan/devthink"
|
|
627
|
+
COPY osprofiles/nixos.json /saddle/osprofile.json
|
|
628
|
+
|
|
629
|
+
FROM scratch AS osvoid
|
|
630
|
+
ARG SADDLE_VERSION=2.0.168
|
|
631
|
+
ARG SADDLE_OS_PROFILE="void"
|
|
632
|
+
ENV SADDLE_OS_PROFILE=void
|
|
633
|
+
LABEL org.opencontainers.image.title="saddle (the void os-distribution catalog lane)" \
|
|
634
|
+
org.opencontainers.image.description="the void os-distribution seat as a catalog lane: void is the independent source-rolling distribution, the xbps seat the musl legs answer beside alpine — the lane publishes the profile config the engine reads." \
|
|
635
|
+
org.opencontainers.image.version="${SADDLE_VERSION}" \
|
|
636
|
+
org.opencontainers.image.licenses="GPL-3.0-only" \
|
|
637
|
+
org.opencontainers.image.source="https://github.com/wenathlan/devthink"
|
|
638
|
+
COPY osprofiles/void.json /saddle/osprofile.json
|
|
639
|
+
|
|
640
|
+
# ===== stage: default — the trailing balanced seat the header documents =====
|
|
641
|
+
# THE DEFAULT TARGET LAW (the local-build heal): the header declares the
|
|
642
|
+
# plain `docker build -f saddle/Dockerfile .` with no --target answers the
|
|
643
|
+
# balanced profile, but the os-distribution scratch lanes below the
|
|
644
|
+
# balanced stage used to end the file — the no-target build answered
|
|
645
|
+
# osvoid, a scratch seat that COPYs the osprofiles/ folder only the
|
|
646
|
+
# publish lanes render, so the local container the owner charged
|
|
647
|
+
# functional died on the missing folder instead of building the engine.
|
|
648
|
+
# This trailing alias re-seats the balanced profile as the last stage:
|
|
649
|
+
# the no-target build answers the runnable engine (the same graph the
|
|
650
|
+
# compose lane rides), every os lane keeps its own explicit --target,
|
|
651
|
+
# and the profile axis (max / balanced / lite) stays addressable behind
|
|
652
|
+
# its names exactly as before.
|
|
653
|
+
FROM balanced
|
package/README.md
CHANGED
|
@@ -31,7 +31,7 @@ domain modules land beside the saddle domains:
|
|
|
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.0.
|
|
34
|
+
| `server.ts`, `sandbox.ts` | the zero-dependency self-hosted API of the 2.0.168 grand-merge envelope (`node server.ts`; the api answers its version at `/api/v1/health`) and the browser-pure engine port |
|
|
35
35
|
| `vercel.json`, `netlify.toml` | the platform deploy adapters beside the surface they publish (the caddy ghost stays out of the tree) |
|
|
36
36
|
| `specs/*` package exports | processors, gpus, cores, boards and the qemu/mttg/passage/docker envelopes |
|
|
37
37
|
|
|
@@ -170,7 +170,7 @@ The package export map is defined by the root manifest. Runnable public examples
|
|
|
170
170
|
|
|
171
171
|
## Browser extension
|
|
172
172
|
|
|
173
|
-
The extension surface migrated to the devthink app with the wave 2 regrouping: it is a TypeScript-first Manifest V3 reference surface (popup, service worker, isolated content bridge, read-only page-world `pagefacts` boundary, snapshot diffs and persisted window/tab/frame context for explicit resume) that runs in the user's browser, so it is not a VM modality of the engine — its module, tracked assets and tests now live at `devthink/browserextension.ts`, the devthink root `extension*` asset family and `devthink/
|
|
173
|
+
The extension surface migrated to the devthink app with the wave 2 regrouping: it is a TypeScript-first Manifest V3 reference surface (popup, service worker, isolated content bridge, read-only page-world `pagefacts` boundary, snapshot diffs and persisted window/tab/frame context for explicit resume) that runs in the user's browser, so it is not a VM modality of the engine — its module, tracked assets and tests now live at `devthink/browserextension.ts`, the devthink root `extension*` asset family and `devthink/test/browserextension.test.ts` (see `docs/browser.md` for the migration map).
|
|
174
174
|
|
|
175
175
|
```bash
|
|
176
176
|
# build an isolated JavaScript artifact from the devthink app root using the version supplied by the caller or release tag
|
|
@@ -284,7 +284,7 @@ server.ts, webserver.ts, api.ts, cli.ts
|
|
|
284
284
|
the self-hosted api surfaces, the web console and the stable cli
|
|
285
285
|
sol/ the Sol theme — the platform's web surface (one tsx app, one stylesheet per theme)
|
|
286
286
|
specs processors.json, gpus.json, cores.json, boards.json and the qemu/mttg/passage/docker/vm envelopes
|
|
287
|
-
|
|
287
|
+
test/ deterministic engine and extension coverage
|
|
288
288
|
docs/ architecture, API, security, release and registry notes
|
|
289
289
|
```
|
|
290
290
|
|
package/biome.jsonc
CHANGED
|
@@ -21,8 +21,8 @@
|
|
|
21
21
|
"!**/bun.lock",
|
|
22
22
|
"!**/*.min.js",
|
|
23
23
|
"!**/docs",
|
|
24
|
-
"!**/
|
|
25
|
-
"!**/
|
|
24
|
+
"!**/test/tmp",
|
|
25
|
+
"!**/test/code",
|
|
26
26
|
"!**/sol/dist",
|
|
27
27
|
"!**/sol/.vite",
|
|
28
28
|
"!**/sol/node_modules",
|
|
@@ -113,7 +113,7 @@
|
|
|
113
113
|
}
|
|
114
114
|
},
|
|
115
115
|
{
|
|
116
|
-
"includes": ["
|
|
116
|
+
"includes": ["test/workflowcheck.ts", "test/publishlanes.test.ts"],
|
|
117
117
|
"linter": {
|
|
118
118
|
"rules": {
|
|
119
119
|
"suspicious": {
|
package/cli.ts
CHANGED
|
@@ -32,7 +32,7 @@ import {
|
|
|
32
32
|
runscriptbackground,
|
|
33
33
|
scriptRunStatus,
|
|
34
34
|
type ScriptPlan,
|
|
35
|
-
} from "./
|
|
35
|
+
} from "./scripts.ts";
|
|
36
36
|
|
|
37
37
|
/* ════════════════════════════════════════════════════════════════════ */
|
|
38
38
|
/* Section 1: cli/main.ts — the saddle command-line entry point (the bin "saddle" resolves to this source through the source-is-library law (node 26 strips the types, the shebang hands the file to the runtime)). */
|
|
@@ -164,7 +164,7 @@ async function rendergpus() {
|
|
|
164
164
|
/* ══════════════════════════════════════════════════════════════════ */
|
|
165
165
|
/* Section 3: the script lanes renderer — the sh/yml/yaml execution */
|
|
166
166
|
/* surface of the engine lane (PR15): run, background, status, docker */
|
|
167
|
-
/* and compile ride the very
|
|
167
|
+
/* and compile ride the very scripts.ts functions the webserver */
|
|
168
168
|
/* routes serve, so the bin and the api speak one lane. */
|
|
169
169
|
/* ══════════════════════════════════════════════════════════════════ */
|
|
170
170
|
/**
|
package/docker.config
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
"meta": {
|
|
3
3
|
"name": "docker.config",
|
|
4
4
|
"title": "saddle - Docker Engine and Containerization Configuration",
|
|
5
|
-
"version": "2.0.
|
|
6
|
-
"date": "2026-
|
|
5
|
+
"version": "2.0.167",
|
|
6
|
+
"date": "2026-11-06",
|
|
7
7
|
"language": "en",
|
|
8
8
|
"sources": [
|
|
9
9
|
"pool:docker.config [S6 TOML 24 sections; repaired broken section headers 'eta]'->'[meta]', 'ealthcheck]'->'[healthcheck]']",
|
package/docs/architecture.md
CHANGED
|
@@ -17,7 +17,7 @@ syntax, variants, open infrastructure, version pinning, CI graph.
|
|
|
17
17
|
| # | Principle | Concrete rule in this repository |
|
|
18
18
|
| --- | --- | --- |
|
|
19
19
|
| 1 | Library-first | TypeScript is the primary API; zero runtime dependencies; ESM; `package.json` subpaths per module; Python (`qemubridge.py`) and C++ (`libs/`) act as bridges and mirrors, not as the main surface |
|
|
20
|
-
| 2 | Flat monolith | Tracked files stay flat: root-first plus exactly five directories (`libs/`, `docs/`, `
|
|
20
|
+
| 2 | Flat monolith | Tracked files stay flat: root-first plus exactly five directories (`libs/`, `docs/`, `test/`, `web/`, `.github/workflows/`), at most two levels, lowercase names without underscores or hyphens except the six dotted mandatory configs (`vm.config` family) |
|
|
21
21
|
| 3 | 20-25 related contexts per file | Every module header lists its contexts; the count is a hard band enforced in review (god-file and scatter-file anti-patterns both rejected) |
|
|
22
22
|
| 4 | Internal memory first | Mutable state lives in `Map`/`WeakMap` containers (`cpuRegistry`, `gpuregistry`, `engineRegistry`, `InternalMemory`, `regionledger`); no module-level mutable globals, no runtime-specific global state |
|
|
23
23
|
| 5 | Three-layer engine | Layer 1 interposition (`libs/virtualhardware.c`), layer 2 identity and rendering (procfs generators + Mesa stack in `render.ts`), layer 3 execution engines (Docker/QEMU/Firecracker/gVisor/Kata/CLH orchestrated by `orchestrator.ts`) |
|
|
@@ -104,7 +104,7 @@ Line counts are the shipped files (v2 carryover plus the v3/v5/v6 additions); ev
|
|
|
104
104
|
| `libs/gpumonitor.cpp` | 1543 | C++26 four-mode build: CLI smi-adapter, NVML/libcuda shim, N-API addon, forge mode (Plan/validate/qemu_argv, Mttg work-stealing mirror) | 12 hooks |
|
|
105
105
|
| `libs/virtualhardware.c` | 1011 | C11 LD_PRELOAD core: open-family interception, vhe_translate, inotify regeneration thread, xorshift32 drift, constructor 101 | 12 hooks |
|
|
106
106
|
|
|
107
|
-
Data files: `gpus.json` 2408, `processors.json` 2217, `vm.config.json` 1910, `cores.json` 1801, `mttg.config` 1548, `boards.json` 1517, `passage.config` 1330, `qemu.config` 1061, `virtualhardware.json` 739, `docker.config` 768. Web node (`web/`, the v6 edition plus the v7 wave): `sandbox.ts` 1433 is the browser-pure engine port (bank, procfs payloads, the 89-char smi table, mesa summaries, boot dmesg and the command dispatcher), `server.ts` 640 serves the console plus the `/api/v1` contract (health, spec catalogs, sandbox lifecycle, exec) over `node:http`, `index.html` 646 renders the spec panel, terminal and bus timeline, adapters `vercel.json`/`netlify.toml`/`caddyfile` (static edge, api reverse proxied) and `readme.md` 120; the v7 wave completes the node with `db.ts` (sqlite persistence for users, sessions and sandboxes), `auth.ts` (scrypt password hashing, timing-safe verification, cookie sessions), `mesh.ts` (HMAC-SHA256 signed clone-to-main calls with replay windows), the `login.html`/`register.html`/`dashboard.html` pages, `package.json`/`Dockerfile` (image `ghcr.io/wenathlan/e2ugh (main image, web/ included)`; node pinned by the root `.nvmrc`), the database definition kept flat as `schema.prisma` plus `init.sql`, and `mime.types`. Total repository: about 62,200 lines across 83 tracked files (the v2 carryover plus the v3 domains, the v5 media/test waves and the v6 web edition; the `
|
|
107
|
+
Data files: `gpus.json` 2408, `processors.json` 2217, `vm.config.json` 1910, `cores.json` 1801, `mttg.config` 1548, `boards.json` 1517, `passage.config` 1330, `qemu.config` 1061, `virtualhardware.json` 739, `docker.config` 768. Web node (`web/`, the v6 edition plus the v7 wave): `sandbox.ts` 1433 is the browser-pure engine port (bank, procfs payloads, the 89-char smi table, mesa summaries, boot dmesg and the command dispatcher), `server.ts` 640 serves the console plus the `/api/v1` contract (health, spec catalogs, sandbox lifecycle, exec) over `node:http`, `index.html` 646 renders the spec panel, terminal and bus timeline, adapters `vercel.json`/`netlify.toml`/`caddyfile` (static edge, api reverse proxied) and `readme.md` 120; the v7 wave completes the node with `db.ts` (sqlite persistence for users, sessions and sandboxes), `auth.ts` (scrypt password hashing, timing-safe verification, cookie sessions), `mesh.ts` (HMAC-SHA256 signed clone-to-main calls with replay windows), the `login.html`/`register.html`/`dashboard.html` pages, `package.json`/`Dockerfile` (image `ghcr.io/wenathlan/e2ugh (main image, web/ included)`; node pinned by the root `.nvmrc`), the database definition kept flat as `schema.prisma` plus `init.sql`, and `mime.types`. Total repository: about 62,200 lines across 83 tracked files (the v2 carryover plus the v3 domains, the v5 media/test waves and the v6 web edition; the `test/` suite alone is 3,674 lines across eleven files).
|
|
108
108
|
|
|
109
109
|
## 3a. v3 redistribution: features live in domains
|
|
110
110
|
|
|
@@ -121,9 +121,9 @@ The remaining categories of the old file were already domain-owned: kernel featu
|
|
|
121
121
|
|
|
122
122
|
## 3b. Test patterns
|
|
123
123
|
|
|
124
|
-
Tests live in the `
|
|
124
|
+
Tests live in the `test/` directory (one of the five allowed directories) and run on vitest: `vitest run` reads `test/*.test.ts` (153 tests across eleven files - engine, features, media, render, simulation, specs, virtualcpu, virtualgpu, virtualmemory, web, workflow), the same runner the ci.yml family suite executes through the app's `npm test`. Patterns:
|
|
125
125
|
|
|
126
|
-
-
|
|
126
|
+
- vitest (`describe`/`it`) plus `node:assert/strict`; no Jest, no node:test (vitest is the only CI runner), no install step beyond the dev tooling (the engine has zero runtime dependencies).
|
|
127
127
|
- One test file per area under test (planner and lint rules, cpuinfo/meminfo generators, MIG density validator, QEMU argv builder); assertions target public exports, never module internals.
|
|
128
128
|
- Doc-tests remain `@example` blocks in JSDoc (the planner asserts in `index.ts`), and every test stays deterministic: ports use the 30000-59999 random band or explicit ephemeral allocation, no network, no timing-dependent assertions.
|
|
129
129
|
|
|
@@ -266,7 +266,7 @@ Supporting subsystems: warm pool (prewarm/acquire/release/refill/drain, MAP_PRIV
|
|
|
266
266
|
| TypeScript | 7.0.2 (Go-native port); `strict`, `verbatimModuleSyntax`, `isolatedModules`, `erasableSyntaxOnly`, `exactOptionalPropertyTypes`, `noUncheckedIndexedAccess`; ES2025 target with `lib ES2025+ESNext.Disposable` |
|
|
267
267
|
| Erasable modern syntax | `using`/`await using` (modellease, MetricsStore, sandboxhandle), `satisfies` (`engineversions as const satisfies Record<string,string>`), const type parameters (`validateSpec<const T>`), `#private` fields and accessors, `import.meta.filename` for CLI detection |
|
|
268
268
|
| ESM | `"type": "module"`; relative imports carry the `.ts` extension; no CommonJS `require` |
|
|
269
|
-
| Tests |
|
|
269
|
+
| Tests | vitest + `node:assert/strict` executed with `vitest run` over `test/*.test.ts`; the dedicated `test/` directory holds eleven test files (148 cases: 86 planner/generator originals, 24 workflow/simulation gates, 18 feature-audit builders, 4 media pipeline, 1 snapshot regression, 9 web edition), ci.yml runs them through the app's `npm test`; no Jest; no node:test; doc-tests as `@example` blocks (the planner asserts live in `index.ts` planner docs) |
|
|
270
270
|
| C++26 | `import std;` permitted, `std::expected` as the error channel, `std::mdspan` with the p2662r3 fallback guard, `std::print`/`std::format`, `enum class`, `[[nodiscard]]` on validate/argv/topology, RAII for every fd/socket (no exceptions in happy paths) |
|
|
271
271
|
| C | C11 with `_GNU_SOURCE`, `dlsym(RTLD_NEXT)` resolution, xorshift32 deterministic drift, constructor priority 101 |
|
|
272
272
|
| Python | 3.14 floor; stdlib only (socket, json, logging); try/except logging on every operation |
|
|
@@ -318,11 +318,11 @@ The old pins survive only inside `legacyCatalog` provenance blocks in `virtualha
|
|
|
318
318
|
|
|
319
319
|
## 15. CI graph (summary)
|
|
320
320
|
|
|
321
|
-
Five workflows gate the tree: ci.yml (lint, typecheck matrix Node 24/26, the
|
|
321
|
+
Five workflows gate the tree: ci.yml (lint, typecheck matrix Node 24/26, the vitest suite in `test/`, build, flat-structure md5 guard, JSON schema validation of the ten data files), publishghcr.yml (the combined container pipeline: per-arch validation legs on push - clinfo/vulkaninfo/glxinfo probes inside the image - and the four-arch GHCR publication with provenance+SBOM on release), release.yml (GHCR + npm provenance + level-9 zip with SHA-256), pages.yml (the merged web pipeline: module syntax gate, boot smoke on port 37810, html lint, the webapi auth/mesh suite with a throwaway `E2UGH_DB`, the zip -9 static bundle and the GitHub Pages deployment of the web tree) and security.yml (CodeQL C/C++/TS, dependency review, Dockle/Trivy SARIF, gitleaks, Scorecard, Biome security group, license allowlist). Full descriptions and pins are in `readme.md`; the workflows themselves are the executable contract.
|
|
322
322
|
|
|
323
323
|
## 16. Compliance checklist
|
|
324
324
|
|
|
325
|
-
Flat tree (root plus `libs/`, `docs/`, `
|
|
325
|
+
Flat tree (root plus `libs/`, `docs/`, `test/`, `web/`, `.github/workflows/` only); no `src/`; lowercase names; six dotted configs present; every module header carries contexts, provenance and sources; no emoji; no hardcoded localhost; `node:*` first; one bus, one machine, one metrics; data files parse as strict JSON with `$schema`/`meta` headers; docs exceed 40 sections across the set; every version claim dated and primary-sourced. CI enforces the machine-checkable items; review enforces the rest.
|
|
326
326
|
|
|
327
327
|
## 17. Future extensions within the flat budget
|
|
328
328
|
|
package/docs/browser.md
CHANGED
|
@@ -17,7 +17,7 @@ What moved with the surface:
|
|
|
17
17
|
| `popup.html` | `devthink/extensionpopup.html` |
|
|
18
18
|
| `popup.css` | `devthink/extensionpopup.css` |
|
|
19
19
|
| `icon32.png` / `icon64.png` / `icon128.png` | `devthink/extensionicon32.png` / `extensionicon64.png` / `extensionicon128.png` |
|
|
20
|
-
| `
|
|
20
|
+
| `test/extension.test.ts` | `devthink/test/browserextension.test.ts` |
|
|
21
21
|
|
|
22
22
|
The tracked assets carry the `extension` prefix at the devthink root because devthink already owns its own extension surface (`manifest.json` of record, `popup.ts`, `design.html`) — no root name collides. The build adapter (section 17 of the migrated module) is self-referential: it extracts the seven script sections from `devthink/browserextension.ts` itself, reads `extensionmanifest.json` for the versioned manifest and copies the extension-prefixed assets into an isolated unpacked artifact (default output `build/browserextension`, so it never touches the `build/extension` directory owned by the devthink extension build). The `@wenathlan/saddle/extension` package export and the `extension:build` script retired with the migration — consumers import the surface from the devthink app.
|
|
23
23
|
|
package/docs/e2ughengine.md
CHANGED
|
@@ -172,7 +172,7 @@ Modularity ceilings, documented with all three historical answers and the chosen
|
|
|
172
172
|
|
|
173
173
|
## Repository structure (flat tree)
|
|
174
174
|
|
|
175
|
-
The CI pipeline enforces the flat contract: one concern per file with 20-25 related contexts inside, at most two directory levels (`libs/`, `docs/`, `
|
|
175
|
+
The CI pipeline enforces the flat contract: one concern per file with 20-25 related contexts inside, at most two directory levels (`libs/`, `docs/`, `test/`, `web/`, `.github/workflows/`), lowercase file names, and no duplicated content between files (the md5 guard that caught the README-cloning failure of earlier generations). The table reflects the tree as `find . -type f` lists it; `scheduler.ts`, `compute.ts` and the `test/` suite are the v3 additions (the former `future.ts` was decomposed into them).
|
|
176
176
|
|
|
177
177
|
| # | File | One-line role |
|
|
178
178
|
| --- | --- | --- |
|
|
@@ -220,7 +220,7 @@ The CI pipeline enforces the flat contract: one concern per file with 20-25 rela
|
|
|
220
220
|
| 42 | `docs/viability.md` | the proof, research methodology, 145-entry bibliography and roadmap appendices A-C |
|
|
221
221
|
| 43 | `docs/alternatives.md` | ten alternative sandbox families compared against the engine |
|
|
222
222
|
| 43b | `docs/optimization.md` | the build-pipeline optimization roadmap (cross-compilation, prebuilt QEMU/Mesa layers, runner strategy) for the slow multi-arch grid |
|
|
223
|
-
| 44 | `
|
|
223
|
+
| 44 | `test/` | vitest suite executed by ci.yml (`npm test`, `vitest run` over `test/*.test.ts`; 153 cases, including CI-gate replay and end-to-end simulation suites) |
|
|
224
224
|
| 45 | `web/` | the web node (v7): `index.html` terminal sandbox, `login.html`/`register.html`/`dashboard.html` auth pages, `sandbox.js` browser-pure engine port (20 commands), `localauth.js` static-edge browser accounts (login/register/dashboard keep working on github pages with no api; accounts are mirrored to IndexedDB so partial clears never lose them, the dashboard carries backup/restore keyfile buttons, and the CODEOWNERS admins iakadion + akadion are seeded automatically with the shared bootstrap password - surviving any storage reset), `server.js` self-hosted node:http API (`/api/v1` sandboxes and exec), `db.js` sqlite persistence layer, `auth.js` scrypt password hashing with cookie sessions, `mesh.js` HMAC-signed node-to-node calls, `package.json`/`Dockerfile` (image `ghcr.io/wenathlan/e2ugh`; node pinned by the root `.nvmrc`), `schema.prisma`/`init.sql` database definition kept flat per the two-level contract, `mime.types`, `vercel.json`/`netlify.toml` static deploy without functions, `caddyfile` self-host proxy for devthink.pro, `readme.md` web docs |
|
|
225
225
|
| 46 | `LICENSE` | full MIT text (Copyright (c) 2026 wenathlan) |
|
|
226
226
|
|
|
@@ -327,11 +327,11 @@ docker run --rm -p 37810:37810 -e E2UGH_DB=/data/e2ugh.db -v e2ughdata:/data \
|
|
|
327
327
|
|
|
328
328
|
Five workflows gate the repository, all pinned to action releases verified on 2026-08-22:
|
|
329
329
|
|
|
330
|
-
- **ci.yml** (every push and pull request) - six gates: Biome 2.5.11 lint and format; `tsc --noEmit` with TypeScript 7.0.2 on a Node 24/26 matrix; the
|
|
330
|
+
- **ci.yml** (every push and pull request) - six gates: Biome 2.5.11 lint and format; `tsc --noEmit` with TypeScript 7.0.2 on a Node 24/26 matrix; the vitest runner over the dedicated `test/` suite (153 test cases); a build gate; the flat-structure contract (flat tree, no deep nesting, no duplicated content via md5); strict JSON schema validation of every tracked data file.
|
|
331
331
|
- **hardware variants** (publishghcr.yml matrix) - one dockerfile, three curated profiles baked at build time so operators pull exactly the flavor they need: `ghcr.io/wenathlan/e2ugh:latest` (max: EPYC 9965 192c/384t, 1 TiB plan, 8x B200), `:balanced` (Threadripper PRO 9995WX 96c/192t, 512 GiB, 2x B200) and `:lite` (Ryzen 9 9950X3D 16c/32t, 128 GiB, 1x RTX 5090); every profile tag also carries semver and sha suffixes, and the runtime overlay (`VHE_TOTALRAM_GB`, `VHE_CPUS`, `VHE_GPU_PROFILE` environment variables) still lets any variant report any catalog identity up to 18 TiB at run time - the baked profile is the default identity, never a ceiling.
|
|
332
332
|
- **publishghcr.yml** (the combined container pipeline; main, tags and releases) - per-architecture validation legs (`linux/amd64` native; `linux/arm64`, `linux/ppc64le` and `linux/s390x` under QEMU user emulation) that validate the live stack inside the built image: `clinfo` must report Rusticl OpenCL 3.1 on llvmpipe, `vulkaninfo --summary` must find lavapipe Vulkan 1.4, and Xvfb + `glxinfo` must report llvmpipe OpenGL 4.6, executed with `--memory-swap=-1 --shm-size=2g`. On releases, production builds push per-arch images by digest (the max profile ships the four-arch registry surface: amd64, arm64, ppc64le, s390x) with provenance `mode=max` and SBOM attestations before `docker buildx imagetools` assembles the per-profile manifest indexes.
|
|
333
333
|
- **release.yml** (version tags and releases) - three publications: the multi-arch GHCR image, the npm package with `--provenance --access public` (zero runtime dependencies), and a maximum-compression (level 9) source zip with SHA-256 checksums.
|
|
334
|
-
- **pages.yml** (web/ or
|
|
334
|
+
- **pages.yml** (web/ or test/ changes on main, manual) - the web pipeline in one workflow: `node --check` on the five web modules (`server.js`, `db.js`, `auth.js`, `mesh.js`, `sandbox.js`), a boot smoke test on the pinned port 37810 (health endpoint and login page must answer 200), a python `html.parser` well-formedness lint of the four pages, the node:test webapi suite (auth and mesh coverage) with a throwaway `E2UGH_DB`, a zip -9 static bundle with SHA-256 checksums as an artifact (attached to tag releases by `release.yml`), and the GitHub Pages deployment of the whole `web/` tree (static-first, SPA fallback, `.nojekyll`) through configure-pages/upload-pages-artifact/deploy-pages. The pages are page-relative (`login.html`, `dashboard.html`) so every route resolves both on the self-hosted node and inside the `/e2ugh/` sub-path of github pages.
|
|
335
335
|
- **security.yml** (pushes, pull requests, weekly) - CodeQL semantic analysis for C/C++ and TypeScript, dependency review, Dockle and Trivy container scans with SARIF upload, gitleaks history scan, OSSF Scorecard, the Biome security rule group at blocking severity and an npm license allow list.
|
|
336
336
|
|
|
337
337
|
A deliberate CI fact: GitHub-hosted runners expose no `/dev/kvm` ([actions/runner-images#12933](https://github.com/actions/runner-images/issues/12933)), so QEMU-based validation runs under TCG with `thread=multi`, and Firecracker/Kata/Cloud Hypervisor paths are exercised only on self-hosted or bare-metal runners - the orchestrator detects the absence and falls back automatically.
|
|
@@ -372,7 +372,7 @@ const lint = planlint(defaultplan); // mttg floor, overcommit ceiling check
|
|
|
372
372
|
const toml = plantoml(defaultplan); // human-editable vm.config output
|
|
373
373
|
```
|
|
374
374
|
|
|
375
|
-
The planner doubles as a CLI: `node --experimental-strip-types index.ts` reads a `vm.config.toml`, plans the topology, and emits QEMU argv, a `docker run` line and a lint report. Development commands: `npm run typecheck` (TypeScript 7.0.2 gate), `npm run lint` (Biome 2.5.11) and `node --test
|
|
375
|
+
The planner doubles as a CLI: `node --experimental-strip-types index.ts` reads a `vm.config.toml`, plans the topology, and emits QEMU argv, a `docker run` line and a lint report. Development commands: `npm run typecheck` (TypeScript 7.0.2 gate), `npm run lint` (Biome 2.5.11) and `node --test test/` (see How to test below). Operational runbooks (host hardening, VFIO troubleshooting, capacity planning, incident: unbind of the only GPU) are condensed in `docs/virtualization.md` and expanded per-layer in the sibling docs.
|
|
376
376
|
|
|
377
377
|
---
|
|
378
378
|
|
|
@@ -384,7 +384,7 @@ The test contract is the Node built-in runner: no Jest, no third-party harness,
|
|
|
384
384
|
# from a checkout (Node 24+)
|
|
385
385
|
npm run typecheck # tsc --noEmit, the TypeScript 7.0.2 gate
|
|
386
386
|
npm run lint # Biome 2.5.11
|
|
387
|
-
|
|
387
|
+
npm test # the vitest suite (153 tests) - vitest run over test/*.test.ts, the form ci.yml uses
|
|
388
388
|
|
|
389
389
|
# from the published image (GHCR, linux/amd64 and linux/arm64)
|
|
390
390
|
docker run --rm --memory-swap=-1 --shm-size=2g \
|
|
@@ -392,7 +392,7 @@ docker run --rm --memory-swap=-1 --shm-size=2g \
|
|
|
392
392
|
bash -lc 'lscpu | head -3; free -h; nvidia-smi | head -12; clinfo -B | head -4'
|
|
393
393
|
```
|
|
394
394
|
|
|
395
|
-
The `
|
|
395
|
+
The `test/` suite (Node 26.7.0 in CI, Node 24+ locally, `node:assert/strict`, 153 tests across eleven files: engine, render, specs, virtualcpu, virtualgpu, virtualmemory, media, features, plus workflow and simulation suites that replay the CI gates and the engine end to end) covers the planner and its lint rules, the `/proc/cpuinfo` and `/proc/meminfo` generators, the MIG density validator and the QEMU argv builder; the patterns are documented in `docs/architecture.md`. The docker probe above is the same surface `publishghcr.yml` validates inside the image: `clinfo` must report Rusticl OpenCL 3.1 on llvmpipe, `vulkaninfo --summary` must find lavapipe Vulkan 1.4 and `glxinfo` on Xvfb must report llvmpipe OpenGL 4.6.
|
|
396
396
|
|
|
397
397
|
---
|
|
398
398
|
|
|
@@ -424,7 +424,7 @@ The `tests/` suite (Node 26.7.0 in CI, Node 24+ locally, `node:assert/strict`, 1
|
|
|
424
424
|
| SADDLE v5 / v6 (Meta TS) | 2026-08-22 wave | `src_core_orchestrator.ts` (2080 lines) and `coreorchestrator.ts` (1283 lines): RBAC, NUMA scheduler, balloon, SR-IOV, passage protocols, quotas, preemption, leader election, OTel exporter; plus `pipelinememorypassage.ts` host-aware memory planning | Unique subsystems absorbed into `orchestrator.ts` (5238 lines) and `virtualmemory.ts`; duplicated buses/state machines/metrics collapsed into one of each |
|
|
425
425
|
| Virtual Hardware Engine v5 (e2ugh) | 2026-08-22, English | The 44-file public repo generation: 9 TS modules, 11 JSONs, 4 workflows, 10 English docs with ~120 cited sources | Baseline of the v2 code tree; modules renamed and extended (hardware -> virtualcpu, memory -> virtualmemory) |
|
|
426
426
|
| e2ugh v2 | 2026-08-22+ | The merge: 57 CPUs, 19 GPUs + APUs, one event bus (51 typed topics), one 15-state lifecycle, one metrics store | Baseline of the v3 redistribution |
|
|
427
|
-
| e2ugh v3-v9 (this repo) | 2026-08-23+ | The rebrand and redistribution: github.com/wenathlan/e2ugh, package 1.2.1, `future.ts` decomposed into `scheduler.ts` and `compute.ts` (checkpoint plans into `virtualization.ts`, post-quantum into `security.ts`), a `
|
|
427
|
+
| e2ugh v3-v9 (this repo) | 2026-08-23+ | The rebrand and redistribution: github.com/wenathlan/e2ugh, package 1.2.1, `future.ts` decomposed into `scheduler.ts` and `compute.ts` (checkpoint plans into `virtualization.ts`, post-quantum into `security.ts`), a `test/` vitest suite, and the corrected version ledger (kernel 7.1.9/6.18.45, edk2-stable202605, wgpu 30.x, Spin 3.6.0, containerd 2.3.4, WireGuard via kernel mainline) | Current |
|
|
428
428
|
|
|
429
429
|
Full per-generation detail, including the verification reports for each wave, is preserved in `docs/viability.md`.
|
|
430
430
|
|
package/docs/extension.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
> `saddle/browser.ts`), with its tracked assets at the devthink root
|
|
6
6
|
> (`extensionmanifest.json`, `extensionpopup.html`, `extensionpopup.css`,
|
|
7
7
|
> `extensionicon32.png`, `extensionicon64.png`, `extensionicon128.png`)
|
|
8
|
-
> and its test battery at `devthink/
|
|
8
|
+
> and its test battery at `devthink/test/browserextension.test.ts`. The
|
|
9
9
|
> saddle is exclusively the virtualization engine; everything that runs
|
|
10
10
|
> in the user's browser belongs to devthink, the owner of the family
|
|
11
11
|
> extension product. The notes below describe the bridge design and stay
|
package/docs/osdistributions.md
CHANGED
|
@@ -178,7 +178,7 @@ owns every cycle it spends through saddle and vault edge processing.
|
|
|
178
178
|
|
|
179
179
|
## the pinning battery
|
|
180
180
|
|
|
181
|
-
`saddle/
|
|
181
|
+
`saddle/test/osdistrib.test.ts` (nine tests, green): the sixteen seats
|
|
182
182
|
in law order (the seven named seats plus the nine honest additions,
|
|
183
183
|
more than fifteen), the true facts verbatim per named seat and per
|
|
184
184
|
addition seat, the arch pairing honesty (every
|
package/docs/todo1816.md
CHANGED
|
@@ -538,7 +538,7 @@
|
|
|
538
538
|
- [ ] Derive the 1.8.16 documentation for PWA and Mini App bridge only after comparative evidence identifies a concrete gap that does not duplicate an existing Saddle capability.
|
|
539
539
|
- [x] Derive the 1.8.16 contract for release evidence only after comparative evidence identifies a concrete gap that does not duplicate an existing Saddle capability. Completed by `release/evidence.ts`: data-only normalization, policy evaluation, and readiness receipt; no external effects.
|
|
540
540
|
- [x] Derive the 1.8.16 artifact inventory for release evidence only after comparative evidence identifies a concrete gap that does not duplicate an existing Saddle capability. Completed by `evidencefromverification`, which maps only an already-valid `verifyassets` checksum inventory into `checked` evidence and preserves declared signing state as metadata.
|
|
541
|
-
- [x] Derive the 1.8.16 verification check for release evidence only after comparative evidence identifies a concrete gap that does not duplicate an existing Saddle capability. Completed by deterministic acceptance, insufficiency, mismatch, and readiness tests in `
|
|
541
|
+
- [x] Derive the 1.8.16 verification check for release evidence only after comparative evidence identifies a concrete gap that does not duplicate an existing Saddle capability. Completed by deterministic acceptance, insufficiency, mismatch, and readiness tests in `test/engine.test.ts`.
|
|
542
542
|
- [ ] Derive the 1.8.16 workflow test for release evidence only after comparative evidence identifies a concrete gap that does not duplicate an existing Saddle capability.
|
|
543
543
|
- [x] Derive the 1.8.16 failure policy for release evidence only after comparative evidence identifies a concrete gap that does not duplicate an existing Saddle capability. Completed by ordered `rejected` and `insufficient` reason codes without positive assurance claims.
|
|
544
544
|
- [x] Derive the 1.8.16 documentation for release evidence only after comparative evidence identifies a concrete gap that does not duplicate an existing Saddle capability. Completed in `docs/enginearchitecture.md` and `docs/reposynthesis1816.md`.
|
package/docs/viability.md
CHANGED
|
@@ -310,7 +310,7 @@ applied to e2ugh v2: the 8-document consolidation (readme, architecture,
|
|
|
310
310
|
hardware, virtualization, security, performance, alternatives, viability)
|
|
311
311
|
absorbs the redundant document families identified in the analysis phase,
|
|
312
312
|
workflows ship in `.github/workflows` from the start, and the tree stays
|
|
313
|
-
flat (root plus `libs/`, `docs/`, `
|
|
313
|
+
flat (root plus `libs/`, `docs/`, `test/`, `.github/workflows/`) with the
|
|
314
314
|
same checks the reports codified (counts, flat
|
|
315
315
|
naming, JSON validity, deduplication, version pins) now enforced by CI
|
|
316
316
|
rather than by a post-hoc report.
|
package/index.ts
CHANGED
|
@@ -1475,6 +1475,8 @@ export * from './modes.ts';
|
|
|
1475
1475
|
* runner, the yml/yaml interpretation through the house yaml subset with
|
|
1476
1476
|
* the babel compile roundtrip, the detached background runs on the house
|
|
1477
1477
|
* job queue and the docker-ready descriptors (the PR15 lane surface the
|
|
1478
|
-
* webserver routes and the script cli command consume)
|
|
1479
|
-
|
|
1478
|
+
* webserver routes and the script cli command consume) — riding the one
|
|
1479
|
+
* scripts keyword file beside its build-engine, security-gate and
|
|
1480
|
+
* flat-native validation lanes (the consolidation law of the root). */
|
|
1481
|
+
export * from './scripts.ts';
|
|
1480
1482
|
export * from './virtual.ts';
|