@wenathlan/saddle 2.1.6 → 2.1.8

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.
Files changed (300) hide show
  1. package/Dockerfile +170 -66
  2. package/LICENSE +0 -0
  3. package/README.md +73 -58
  4. package/alternatives.ts +0 -0
  5. package/biome.jsonc +134 -0
  6. package/boards.json +2 -2
  7. package/browser.ts +482 -0
  8. package/cli.ts +274 -0
  9. package/compute.ts +4 -4
  10. package/cores.json +2 -2
  11. package/distribution.ts +731 -0
  12. package/docker.config +37 -9
  13. package/docs/.gitkeep +0 -0
  14. package/docs/actionrecorder.md +0 -0
  15. package/docs/actionsincident.md +0 -0
  16. package/docs/alternatives.md +0 -0
  17. package/docs/architecture.md +0 -0
  18. package/docs/{architecture-1.8.19.md → architecture1819.md} +0 -0
  19. package/docs/{architecture-1.8.19.mmd → architecture1819.mmd} +0 -0
  20. package/docs/artifactavailability.md +2 -2
  21. package/docs/{artifactresearch-1.8.9.md → artifactresearch189.md} +0 -0
  22. package/docs/{batches-1816-1820.md → batches1816to1820.md} +0 -0
  23. package/docs/{brancharchive-2026-08-18.md → brancharchive20260818.md} +0 -0
  24. package/docs/branchaudit.md +0 -0
  25. package/docs/browser.md +18 -1
  26. package/docs/capabilityreport.md +0 -0
  27. package/docs/comparativeaudit.md +0 -0
  28. package/docs/consolidation.md +0 -0
  29. package/docs/{containerplatforms-1.8.17.md → containerplatforms1817.md} +0 -0
  30. package/docs/{containerplatforms-2.1.0.md → containerplatforms210.md} +1 -1
  31. package/docs/{documentmap-1.8.12.md → documentmap1812.md} +1 -1
  32. package/docs/{e2ugh-engine.md → e2ughengine.md} +0 -0
  33. package/docs/ecosystemplan.md +0 -0
  34. package/docs/enginearchitecture.md +0 -0
  35. package/docs/extension.md +13 -2
  36. package/docs/featureaudit.md +0 -0
  37. package/docs/{flatbuildresearch-1.8.11.md → flatbuildresearch1811.md} +0 -0
  38. package/docs/gapmatrix.md +0 -0
  39. package/docs/hardware.md +0 -0
  40. package/docs/libraryapi.md +1 -1
  41. package/docs/{licenseaudit-1.8.12.md → licenseaudit1812.md} +0 -0
  42. package/docs/logs/examplesession.json +54 -0
  43. package/docs/memoryengine.md +0 -0
  44. package/docs/{mobileconversionresearch-1.8.10.md → mobileconversionresearch1810.md} +0 -0
  45. package/docs/modes.md +0 -0
  46. package/docs/{nativeidentityresearch-1.8.11.md → nativeidentityresearch1811.md} +0 -0
  47. package/docs/{native-wrappers.md → nativewrappers.md} +0 -0
  48. package/docs/ninetymodalities.md +191 -0
  49. package/docs/optimization.md +0 -0
  50. package/docs/packageaudit185.md +0 -0
  51. package/docs/performance.md +0 -0
  52. package/docs/{planning.1.8.18.md → planning1818.md} +0 -0
  53. package/docs/{planning.1.8.19.md → planning1819.md} +0 -0
  54. package/docs/planningengine.md +186 -0
  55. package/docs/planningninety.md +391 -0
  56. package/docs/platformpipelineaudit.md +0 -0
  57. package/docs/platformpipelines.md +0 -0
  58. package/docs/productindex.md +0 -0
  59. package/docs/registryresearch.md +0 -0
  60. package/docs/release.md +0 -0
  61. package/docs/release17notes.md +0 -0
  62. package/docs/release181notes.md +0 -0
  63. package/docs/release182notes.md +0 -0
  64. package/docs/release184notes.md +0 -0
  65. package/docs/release185notes.md +0 -0
  66. package/docs/release18notes.md +0 -0
  67. package/docs/releaseassets.md +0 -0
  68. package/docs/{releasenotes-1.8.12.md → releasenotes1812.md} +0 -0
  69. package/docs/{releasenotes-1.8.13.md → releasenotes1813.md} +2 -2
  70. package/docs/{releasenotes-1.8.14.md → releasenotes1814.md} +1 -1
  71. package/docs/{releasenotes-1.8.15.md → releasenotes1815.md} +0 -0
  72. package/docs/{releasenotes-1.8.16.md → releasenotes1816.md} +0 -0
  73. package/docs/{releasenotes-1.8.17.md → releasenotes1817.md} +0 -0
  74. package/docs/{releasenotes-1.8.18.md → releasenotes1818.md} +0 -0
  75. package/docs/{releasenotes-1.8.19.md → releasenotes1819.md} +0 -0
  76. package/docs/{reorganization-1.8.8.md → reorganization188.md} +0 -0
  77. package/docs/{reorganization-1.8.9.md → reorganization189.md} +0 -0
  78. package/docs/{repo-analysis-1.8.21.json → repoanalysis1821.json} +0 -0
  79. package/docs/{repo-candidates-1.8.21.jsonl → repocandidates1821.jsonl} +0 -0
  80. package/docs/{repo-research-1.8.16.md → reporesearch1816.md} +0 -0
  81. package/docs/{repo-research-1.8.21.md → reporesearch1821.md} +0 -0
  82. package/docs/{repo-selected-1.8.21.json → reposelected1821.json} +0 -0
  83. package/docs/{repo-synthesis-1.8.16.md → reposynthesis1816.md} +1 -1
  84. package/docs/{repo-synthesis-1.8.21.md → reposynthesis1821.md} +0 -0
  85. package/docs/{research-1.8.18-isolation.md → research1818isolation.md} +0 -0
  86. package/docs/{research-1.8.19-virtual-browser.md → research1819virtualbrowser.md} +0 -0
  87. package/docs/roadmapp2p3.md +0 -0
  88. package/docs/s3compatible.md +0 -0
  89. package/docs/{scanningresearch-1.8.11.md → scanningresearch1811.md} +0 -0
  90. package/docs/security.md +0 -0
  91. package/docs/{securityaudit-1.8.7.md → securityaudit187.md} +0 -0
  92. package/docs/{securityreferences-1.8.11.md → securityreferences1811.md} +0 -0
  93. package/docs/{securityresearch-1.8.11.md → securityresearch1811.md} +0 -0
  94. package/docs/{signingresearch-1.8.12.md → signingresearch1812.md} +0 -0
  95. package/docs/signingwithoutcertificates.md +0 -0
  96. package/docs/signpathapplication.md +0 -0
  97. package/docs/sitemap.md +0 -0
  98. package/docs/{tauri-glib-risk-1.8.11.md → tauriglibrisk1811.md} +0 -0
  99. package/docs/todo.md +2 -2
  100. package/docs/{todo-1.8.15.md → todo1815.md} +1 -1
  101. package/docs/{todo-1.8.16.md → todo1816.md} +5 -5
  102. package/docs/{todo-1.8.18.md → todo1818.md} +0 -0
  103. package/docs/{todo-1.8.19.md → todo1819.md} +0 -0
  104. package/docs/{toolchainresearch-1.8.9.md → toolchainresearch189.md} +0 -0
  105. package/docs/toolchains.md +0 -0
  106. package/docs/usage.md +0 -0
  107. package/docs/viability.md +0 -0
  108. package/docs/virtualization.md +0 -0
  109. package/docs/{web-duplicatecleanup.md → webduplicatecleanup.md} +0 -0
  110. package/docs/{web-ideas.md → webideas.md} +0 -0
  111. package/docs/{workflowimprovements-2026-08-19.md → workflowimprovements20260819.md} +0 -0
  112. package/docs/workflowinputs.md +0 -0
  113. package/docs/workflowoperations.md +0 -0
  114. package/docs/workloadlaw.md +104 -0
  115. package/execution.ts +677 -0
  116. package/foundation.ts +314 -0
  117. package/gpumonitor.cpp +0 -0
  118. package/gpus.json +1 -1
  119. package/index.ts +38 -29
  120. package/isolation.ts +84 -0
  121. package/modalityregistry.ts +1493 -0
  122. package/{dist/modes.js → modes.ts} +79 -62
  123. package/mttg.config +1 -1
  124. package/orchestrator.ts +54 -17
  125. package/package.json +245 -146
  126. package/passage.config +0 -0
  127. package/performance.ts +0 -0
  128. package/processors.json +1 -1
  129. package/qemu.config +2 -2
  130. package/qemubridge.py +0 -0
  131. package/quantum.ts +0 -0
  132. package/render.ts +0 -0
  133. package/sandbox.ts +2035 -0
  134. package/scheduler.ts +1 -1
  135. package/security.ts +0 -0
  136. package/server.ts +52 -0
  137. package/tiers.ts +9 -3
  138. package/tsconfig.json +22 -13
  139. package/virtual.ts +1105 -0
  140. package/virtualcpu.ts +1 -0
  141. package/virtualgpu.ts +2 -1
  142. package/virtualhardware.c +0 -0
  143. package/virtualhardware.json +2 -2
  144. package/virtualization.ts +1 -1
  145. package/virtualizationcore.cpp +0 -0
  146. package/virtualmemory.ts +0 -0
  147. package/vm.config.json +2 -2
  148. package/workloadlaw.ts +293 -0
  149. package/biome.json +0 -151
  150. package/dist/acquisition.d.ts +0 -359
  151. package/dist/acquisition.d.ts.map +0 -1
  152. package/dist/acquisition.js +0 -629
  153. package/dist/acquisition.js.map +0 -1
  154. package/dist/alternatives.d.ts +0 -509
  155. package/dist/alternatives.d.ts.map +0 -1
  156. package/dist/alternatives.js +0 -951
  157. package/dist/alternatives.js.map +0 -1
  158. package/dist/automation.d.ts +0 -426
  159. package/dist/automation.d.ts.map +0 -1
  160. package/dist/automation.js +0 -561
  161. package/dist/automation.js.map +0 -1
  162. package/dist/browser.d.ts +0 -562
  163. package/dist/browser.d.ts.map +0 -1
  164. package/dist/browser.js +0 -1057
  165. package/dist/browser.js.map +0 -1
  166. package/dist/cli.d.ts +0 -17
  167. package/dist/cli.d.ts.map +0 -1
  168. package/dist/cli.js +0 -169
  169. package/dist/cli.js.map +0 -1
  170. package/dist/communication.d.ts +0 -192
  171. package/dist/communication.d.ts.map +0 -1
  172. package/dist/communication.js +0 -418
  173. package/dist/communication.js.map +0 -1
  174. package/dist/compute.d.ts +0 -1161
  175. package/dist/compute.d.ts.map +0 -1
  176. package/dist/compute.js +0 -2273
  177. package/dist/compute.js.map +0 -1
  178. package/dist/distribution.d.ts +0 -529
  179. package/dist/distribution.d.ts.map +0 -1
  180. package/dist/distribution.js +0 -811
  181. package/dist/distribution.js.map +0 -1
  182. package/dist/docs/example-localjob.d.ts +0 -2
  183. package/dist/docs/example-localjob.d.ts.map +0 -1
  184. package/dist/docs/example-localjob.js +0 -15
  185. package/dist/docs/example-localjob.js.map +0 -1
  186. package/dist/docs/example-publicapi.d.ts +0 -2
  187. package/dist/docs/example-publicapi.d.ts.map +0 -1
  188. package/dist/docs/example-publicapi.js +0 -7
  189. package/dist/docs/example-publicapi.js.map +0 -1
  190. package/dist/execution.d.ts +0 -530
  191. package/dist/execution.d.ts.map +0 -1
  192. package/dist/execution.js +0 -761
  193. package/dist/execution.js.map +0 -1
  194. package/dist/format.d.ts +0 -19
  195. package/dist/format.d.ts.map +0 -1
  196. package/dist/format.js +0 -60
  197. package/dist/format.js.map +0 -1
  198. package/dist/foundation.d.ts +0 -176
  199. package/dist/foundation.d.ts.map +0 -1
  200. package/dist/foundation.js +0 -309
  201. package/dist/foundation.js.map +0 -1
  202. package/dist/index.d.ts +0 -735
  203. package/dist/index.d.ts.map +0 -1
  204. package/dist/index.js +0 -1020
  205. package/dist/index.js.map +0 -1
  206. package/dist/integration.d.ts +0 -236
  207. package/dist/integration.d.ts.map +0 -1
  208. package/dist/integration.js +0 -236
  209. package/dist/integration.js.map +0 -1
  210. package/dist/intelligence.d.ts +0 -94
  211. package/dist/intelligence.d.ts.map +0 -1
  212. package/dist/intelligence.js +0 -145
  213. package/dist/intelligence.js.map +0 -1
  214. package/dist/isolation.d.ts +0 -129
  215. package/dist/isolation.d.ts.map +0 -1
  216. package/dist/isolation.js +0 -96
  217. package/dist/isolation.js.map +0 -1
  218. package/dist/media.d.ts +0 -344
  219. package/dist/media.d.ts.map +0 -1
  220. package/dist/media.js +0 -986
  221. package/dist/media.js.map +0 -1
  222. package/dist/modes.d.ts +0 -359
  223. package/dist/modes.d.ts.map +0 -1
  224. package/dist/modes.js.map +0 -1
  225. package/dist/operations.d.ts +0 -67
  226. package/dist/operations.d.ts.map +0 -1
  227. package/dist/operations.js +0 -94
  228. package/dist/operations.js.map +0 -1
  229. package/dist/orchestrator.d.ts +0 -1339
  230. package/dist/orchestrator.d.ts.map +0 -1
  231. package/dist/orchestrator.js +0 -4308
  232. package/dist/orchestrator.js.map +0 -1
  233. package/dist/packager/targetcli.js +0 -4
  234. package/dist/performance.d.ts +0 -416
  235. package/dist/performance.d.ts.map +0 -1
  236. package/dist/performance.js +0 -827
  237. package/dist/performance.js.map +0 -1
  238. package/dist/quantum.d.ts +0 -810
  239. package/dist/quantum.d.ts.map +0 -1
  240. package/dist/quantum.js +0 -2073
  241. package/dist/quantum.js.map +0 -1
  242. package/dist/render.d.ts +0 -381
  243. package/dist/render.d.ts.map +0 -1
  244. package/dist/render.js +0 -1073
  245. package/dist/render.js.map +0 -1
  246. package/dist/scheduler.d.ts +0 -596
  247. package/dist/scheduler.d.ts.map +0 -1
  248. package/dist/scheduler.js +0 -1259
  249. package/dist/scheduler.js.map +0 -1
  250. package/dist/security.d.ts +0 -501
  251. package/dist/security.d.ts.map +0 -1
  252. package/dist/security.js +0 -1170
  253. package/dist/security.js.map +0 -1
  254. package/dist/server.d.ts +0 -21
  255. package/dist/server.d.ts.map +0 -1
  256. package/dist/server.js +0 -52
  257. package/dist/server.js.map +0 -1
  258. package/dist/tiers.d.ts +0 -1002
  259. package/dist/tiers.d.ts.map +0 -1
  260. package/dist/tiers.js +0 -2165
  261. package/dist/tiers.js.map +0 -1
  262. package/dist/virtual.d.ts +0 -641
  263. package/dist/virtual.d.ts.map +0 -1
  264. package/dist/virtual.js +0 -1285
  265. package/dist/virtual.js.map +0 -1
  266. package/dist/virtualcpu.d.ts +0 -316
  267. package/dist/virtualcpu.d.ts.map +0 -1
  268. package/dist/virtualcpu.js +0 -1180
  269. package/dist/virtualcpu.js.map +0 -1
  270. package/dist/virtualgpu.d.ts +0 -345
  271. package/dist/virtualgpu.d.ts.map +0 -1
  272. package/dist/virtualgpu.js +0 -1000
  273. package/dist/virtualgpu.js.map +0 -1
  274. package/dist/virtualization.d.ts +0 -607
  275. package/dist/virtualization.d.ts.map +0 -1
  276. package/dist/virtualization.js +0 -1187
  277. package/dist/virtualization.js.map +0 -1
  278. package/dist/virtualmemory.d.ts +0 -818
  279. package/dist/virtualmemory.d.ts.map +0 -1
  280. package/dist/virtualmemory.js +0 -1796
  281. package/dist/virtualmemory.js.map +0 -1
  282. package/dist/vitest.config.d.ts +0 -3
  283. package/dist/vitest.config.d.ts.map +0 -1
  284. package/dist/vitest.config.js +0 -26
  285. package/dist/vitest.config.js.map +0 -1
  286. package/dist/webscrape.d.ts +0 -720
  287. package/dist/webscrape.d.ts.map +0 -1
  288. package/dist/webscrape.js +0 -2697
  289. package/dist/webscrape.js.map +0 -1
  290. package/docs/CONVERSA.txt +0 -1523
  291. package/docs/architecture-1.8.19.png +0 -0
  292. package/docs/assets/architecture.svg +0 -45
  293. package/docs/assets/saddlemark.svg +0 -13
  294. package/docs/example-localjob.ts +0 -15
  295. package/docs/example-publicapi.ts +0 -7
  296. package/docs/saddle.archive.1.8.17.tar.gz.gpg +0 -0
  297. package/media.ts +0 -1337
  298. package/web/manifest.json +0 -30
  299. package/web/readme.md +0 -383
  300. package/web/tsconfig.json +0 -25
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.1.6",
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/arm64"
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": false,
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/arm64"
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.1.6",
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.1.6",
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/arm64"
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
File without changes
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 [releasenotes-1.8.16.md](releasenotes-1.8.16.md).
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 [containerplatforms-1.8.17.md](containerplatforms-1.8.17.md).
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
package/docs/browser.md CHANGED
@@ -1,7 +1,24 @@
1
1
  # Saddle browser surface
2
2
 
3
- The root `browser/` directory contains the transport-neutral browser-agent contracts: session state, context, snapshots, fingerprints, Playwright integration, recording and agent orchestration. It is library logic and is shared by callers; it is not a second copy of the desktop UI.
3
+ The root `browser.ts` carries the transport-neutral browser-agent contracts of the engine: session state, context, snapshots, fingerprints, the virtual-browser request/decision/handoff/receipt family, the optional Playwright adapter, recording and agent orchestration (sections 1-9 of the grand merge). It is library logic and is shared by callers; it is not a second copy of the desktop UI.
4
4
 
5
5
  The user-facing browser application is the existing Tauri shell in `desktop/`, which wraps the compiled `web/dist/public` surface on Windows, Linux and macOS. Android and iOS convert the same web output through Capacitor. This boundary keeps browser behavior in the library and keeps presentation and native packaging in their target surfaces.
6
6
 
7
+ ## The Manifest V3 extension migrated to devthink (wave 2 regrouping)
8
+
9
+ The Chrome Manifest V3 extension surface — the former sections 10-17 of `browser.ts` (`extension/permissions`, `extension/protocol`, `extension/content`, `extension/popup`, `extension/pagebridge`, `extension/worker`, `extension/serviceworker`, `extension/build`) — now lives in **`devthink/browserextension.ts`** with every export under the same name and signature. The family rule that drove the move: the saddle is exclusively the virtualization engine (VM / sandbox / microVM / the ninety modalities / vGPU / vCPU) and never touches the browser, GPU, CPU or storage of the user — every feature that runs in the user's browser is not a VM modality and belongs to devthink, the owner of the family extension product (which already packages its own extension through `packageextension.ts` and `crossbrowser.ts`).
10
+
11
+ What moved with the surface:
12
+
13
+ | former saddle root file | devthink root file |
14
+ | --- | --- |
15
+ | `browser.ts` sections 10-17 | `devthink/browserextension.ts` |
16
+ | `manifest.json` (MV3 bridge manifest) | `devthink/extensionmanifest.json` |
17
+ | `popup.html` | `devthink/extensionpopup.html` |
18
+ | `popup.css` | `devthink/extensionpopup.css` |
19
+ | `icon32.png` / `icon64.png` / `icon128.png` | `devthink/extensionicon32.png` / `extensionicon64.png` / `extensionicon128.png` |
20
+ | `tests/extension.test.ts` | `devthink/tests/browserextension.test.ts` |
21
+
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
+
7
24
  Release filenames identify the user-facing desktop browser with the dotted lowercase pattern `saddle.browser.1.8.14.<format>`. Internal module filenames remain API-compatible unless a deliberate public compatibility migration is documented.
File without changes
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
- [containerplatforms-1.8.17.md](containerplatforms-1.8.17.md)) and the e2ugh
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: `acceptable-use-policy.md`, `authors.md`, `bug-report.md`, `cla.md`, `code-of-conduct.md`, `contributing.md`, `copyright.md`, `disclaimer.md`, `eula.md`, `export-control.md`, `governance.md`, `notice.md`, `privacy-policy.md`, `pull-request-template.md`, `security.md`, `support.md`, `terms-and-conditions.md`, `terms-of-use.md`, `third-party-notices.md` and `trademark-policy.md`.
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
File without changes
File without changes
package/docs/extension.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # saddle browser bridge
2
2
 
3
+ > **Migration note (wave 2 regrouping):** the extension surface moved to
4
+ > `devthink/browserextension.ts` (sections 10-17 of the former
5
+ > `saddle/browser.ts`), with its tracked assets at the devthink root
6
+ > (`extensionmanifest.json`, `extensionpopup.html`, `extensionpopup.css`,
7
+ > `extensionicon32.png`, `extensionicon64.png`, `extensionicon128.png`)
8
+ > and its test battery at `devthink/tests/browserextension.test.ts`. The
9
+ > saddle is exclusively the virtualization engine; everything that runs
10
+ > in the user's browser belongs to devthink, the owner of the family
11
+ > extension product. The notes below describe the bridge design and stay
12
+ > accurate for the migrated surface.
13
+
3
14
  This directory contains the first Manifest V3 surface for Saddle. It is a user initiated bridge, not a hidden automation service.
4
15
 
5
16
  ## load unpacked
@@ -7,7 +18,7 @@ This directory contains the first Manifest V3 surface for Saddle. It is a user i
7
18
  1. Open `chrome://extensions`.
8
19
  2. Enable developer mode.
9
20
  3. Choose **Load unpacked**.
10
- 4. Select this `extension/` directory.
21
+ 4. Select the built artifact directory (the unpacked output of the build adapter below).
11
22
  5. Open a page, invoke Saddle from the extension action and choose `Snapshot` or `Read page`.
12
23
 
13
24
  The manifest requests only `activeTab`, `scripting` and `storage`. It does not request broad host permissions, cookies, tabs, webRequest or debugger access. `activeTab` gives temporary access after the user invokes the action for the current tab.
@@ -20,7 +31,7 @@ The content bridge runs in Chrome's isolated world. It exposes bounded page meta
20
31
 
21
32
  ## deterministic release artifact
22
33
 
23
- The Node-only build adapter creates an isolated unpacked artifact with the release version in its manifest. A caller can run `npm run extension:build -- --version 1.8.14 --output build/extension` and package that directory with the archive tool available in the host environment. The release workflow derives the version from the published tag and attaches `saddle.extension.<version>.zip` without changing the source manifest.
34
+ The Node-only build adapter creates an isolated unpacked artifact with the release version in its manifest. A caller can run `node --import tsx ./browserextension.ts --version 1.8.14 --output build/browserextension` from the devthink app root (the retired saddle `extension:build` script went with the migration) and package that directory with the archive tool available in the host environment. The release workflow derives the version from the published tag and attaches `saddle.extension.<version>.zip` without changing the source manifest.
24
35
 
25
36
  ## next slices
26
37
 
File without changes
package/docs/gapmatrix.md CHANGED
File without changes
package/docs/hardware.md CHANGED
File without changes
@@ -60,7 +60,7 @@ The `fetcher`, browser adapter, persistence adapter, proxy pool, captcha solver,
60
60
 
61
61
  The package exposes explicit subpaths for `./browser`, `./bot`, `./captcha`, `./memory-engine`, `./deploy`, and `./release-evidence`. Desktop, mobile, target-plan and n8n contracts are exported from the root entry; the root entry remains the complete compiled JavaScript API with generated TypeScript declarations for consumers that prefer one import.
62
62
 
63
- The `./extension` subpath exposes browser-neutral message, snapshot and service-worker routing contracts. The concrete Manifest V3 files live in `extension/`; they are not imported by the core at runtime and do not require Chrome when the library is used as a Node package. The browser surface also exposes snapshots, tab/frame context, action results, bounded action batches and recording through `./browser`.
63
+ The former `./extension` subpath retired with the wave 2 regrouping: the Chrome Manifest V3 surface (message, snapshot and service-worker routing contracts, the content and page bridges, the popup and the build adapter) runs in the user's browser, so it is not a VM modality of the engine and migrated to `devthink/browserextension.ts` with every export under the same name. The browser surface keeps exposing snapshots, tab/frame context, action results, bounded action batches and recording through `./browser`.
64
64
 
65
65
  The current release exposes `desktopmanifest`, `mobilemanifest`, `desktopadapter`, `mobileadapter`, `n8nnode`, `n8nmatch`, `n8nexecute`, `controlsurface`, `controlservice`, and `workerbridge`. These factories describe surface boundaries and invoke caller-owned handlers; they do not install a native toolkit, start an n8n server, create a dashboard, or store credentials.
66
66
 
@@ -0,0 +1,54 @@
1
+ {
2
+ "version": 1,
3
+ "session": {
4
+ "id": "examplesession-0001",
5
+ "browser": "brave",
6
+ "seed": "examplesession-seed-0001"
7
+ },
8
+ "events": [
9
+ {
10
+ "t": 140,
11
+ "type": "move",
12
+ "x": 120,
13
+ "y": 90
14
+ },
15
+ {
16
+ "t": 300,
17
+ "type": "move",
18
+ "x": 180,
19
+ "y": 140
20
+ },
21
+ {
22
+ "t": 480,
23
+ "type": "click",
24
+ "x": 180,
25
+ "y": 140
26
+ },
27
+ {
28
+ "t": 680,
29
+ "type": "type",
30
+ "key": "k"
31
+ },
32
+ {
33
+ "t": 900,
34
+ "type": "move",
35
+ "x": 240,
36
+ "y": 200
37
+ },
38
+ {
39
+ "t": 1140,
40
+ "type": "click",
41
+ "x": 240,
42
+ "y": 200
43
+ },
44
+ {
45
+ "t": 1400,
46
+ "type": "scroll",
47
+ "dy": 320
48
+ }
49
+ ],
50
+ "captcha": {
51
+ "kind": "hcaptcha",
52
+ "passed": true
53
+ }
54
+ }
File without changes
package/docs/modes.md CHANGED
File without changes
File without changes
@@ -0,0 +1,191 @@
1
+ # ninety.modalities — the wave record
2
+
3
+ the ninety modalities wave (branch waved/ninety.modalities): the saddle
4
+ plane answers the ninety modality plan the owner charged — every planned
5
+ lane of the registry wires an honest executor, every app of the family
6
+ declares the modality its workloads ride, and the report never lies.
7
+
8
+ ## the state the wave found
9
+
10
+ the registry carried the ninety records with 30 live, 3 host and 57
11
+ planned — the catalog promised more than the lanes wired. the edge plane
12
+ drove 16 lanes (10 live, 6 host) and every app of the family named its
13
+ sandbox seat only through the debonair precedent (4 ids).
14
+
15
+ ## the wiring the wave answered
16
+
17
+ - **edgelandeshost.ts** (group a, 25 lanes): the sandbox jails
18
+ (bubblewrap, nsjail, chroot with the fakechroot fallback and the
19
+ privilege gate), the container extensions (podman, containerd, runc,
20
+ crun, the docker max/lite/ghcr profiles), the runtimes (clr, workerd),
21
+ the screens (xvfb-run, the wayland compositor seat), the mobile
22
+ termux host, the builds (bazel, buck2, turborepo), the ci runners
23
+ (actions-runner, gitlab-runner with the exec-removed refusal), the
24
+ network tunnels (tor with the socks circuit, i2p, wireguard with the
25
+ keygen law) and the storage daemons (minio mc, garage). every lane
26
+ probes its binary, runs under the hard deadline in a private temp dir
27
+ and answers the coded absence when the host carries no runtime.
28
+ - **edgelandesinproc.ts** (group b, 19 lanes): the ram recipes (tmpfs,
29
+ mmap, overlayfs, loopram, gitram, zram with the real stored-block
30
+ zlib stream, zswap with the lru pool, swapfile) behind the oom-guard
31
+ quota, the delivery protocols (the cdn mirror manifest, the rfc6455
32
+ wss frame, the quic datagram, the grpc length prefix, the capnp
33
+ segment), the storage wire speakers (libsql envelope, the mysql
34
+ handshake packet, the postgres startup message, the s3 canonical
35
+ signer), the webcontainer seat (the frozen module vm) and the
36
+ local-optin consent gate — pure ts, deterministic, in-process.
37
+ - **edgelandesvirtual.ts** (group c, 7 lanes): the virtual hardware
38
+ compositions riding the engine's own catalogs — the full machine, the
39
+ vgpu mig slice, the screen with the session otp, the driver surface,
40
+ the kvm plan (the qemu argv through the lazy virtualization domain —
41
+ the .js specifier graph loads inside the executor, never the boot),
42
+ the gpuless mesa render and the virgl context. every report says
43
+ composed, never booted.
44
+ - **edgelandesninety.ts** (the merge seat): the six heavyweight probes
45
+ (browser-server, mobile-capacitor, mobile-postmarketos, pod-session,
46
+ confidential-sevsnp, confidential-tdx) and the merged lane tables the
47
+ dispatch plane reads — 73 lanes in the plane, every one carrying its
48
+ executor, the wiring self-check refusing a gap at boot.
49
+ - **edgeplane.ts**: the lane table rides the merged specs, the dispatch
50
+ reads the merged executors, the visitor law guard holds on every run.
51
+ - **modalityregistry.ts**: the honest flips — 51 planned lanes walk to
52
+ live (the lanes the wave wired), 6 walk to host (the heavyweight
53
+ probes), zero stay planned. the census: **81 live, 9 host, 0 planned,
54
+ 90 records.**
55
+ - **the app declarations** (group e): every app of the family names the
56
+ modality its workloads ride — argan (17), cadria (16), cobaia (8),
57
+ devthink (78, the full vocabulary), forge (40), foundry (20), getry
58
+ (13), stealthhead (12), vault (25) and the debonair seat widened 4 →
59
+ 23 — every one through the env opt-in (APP_WORKER_MODALITY), the ids
60
+ mirrored as the string contract, zero imports, the visitor law stated
61
+ in every header.
62
+ - **the vendor mirror**: devthink/modalities.ts re-synced byte-identical
63
+ to the engine registry (the single-source law), the census pins of the
64
+ sandboxlane and e2e suites updated to the new truth.
65
+
66
+ ## the verification the wave recorded
67
+
68
+ - saddle: 28 files / **414 tests green** (379 base + 35 lane tests)
69
+ - argan 69 · cadria 548 · cobaia 30 · debonair 730 · devthink 194 files /
70
+ 3512 · forge 90 · foundry 78 · getry 86 · stealthhead 152 · vault 98
71
+ - family total: **5807 tests green** (5680 base + 127 of the wave)
72
+ - biome zero findings on every file the wave authored
73
+ - the live proof: the webserver answers /api/v1/modalities with
74
+ {plancount: 90, live: 81, host: 9, planned: 0} and /api/v1/edge/lanes
75
+ with the 73 probed lanes (61 live, 12 host)
76
+
77
+ ## the reconciliation with the parallel waves
78
+
79
+ the rebase onto main met two waves that landed while this one worked:
80
+ #239 (the tests home — the tests folders pure inside every app) and
81
+ #240 (the workload law — every app declares its lanes through
82
+ sandboxmodality.ts, the family seat with the join resolver and the
83
+ api routes). the reconciliation honored the no-duplication law: this
84
+ wave dropped its own app declaration seats (the modality.ts files of
85
+ group e) in favor of the #240 family seat the main branch pinned, and
86
+ kept everything the parallel waves did not touch — the fifty-seven
87
+ lane wirings, the registry flips, the vendor mirror sync and the
88
+ census pins. the two census rows #240 charged against the planned-only
89
+ gpu wait (the workload battery and the web workloads lane) now answer
90
+ the post-wave truth: the gpu records this wave wired live make the
91
+ stealthhead world-bake dispatchable, the family census carries zero
92
+ planned-only lanes, and the batteries say so.
93
+
94
+ ## the honest notes
95
+
96
+ - the host binary lanes of group a name runtimes this host does not
97
+ carry — the lanes answer HOST_RUNTIME_ABSENT naming the runtime (the
98
+ language-ruby precedent: live means the engine drives it when the
99
+ host provides the seat).
100
+ - the kvm lane loads the virtualization domain lazily inside the
101
+ executor: the webserver's plain node host resolves only .ts
102
+ specifiers and the domain re-exports virtualgpu through a .js
103
+ specifier — the family law (a domain the host cannot resolve degrades
104
+ that one lane, never the engine boot) now pins the pattern for every
105
+ future lane that reaches the .js graph.
106
+ - the six heavyweight lanes stay host (probe only): the execution
107
+ wiring of a confidential compute seat or a pod session is the next
108
+ rung, and the registry says so.
109
+
110
+ ## the wiring wave (wave four, pr15 — branch wave/ninety.wiring)
111
+
112
+ the wiring wave closed the last gap of the ninety plan: the registry
113
+ carried the ninety records with 81 live and 9 host while the plane
114
+ drove only 73 lanes — seventeen registry-live modalities waited without
115
+ a lane. the wave wired all seventeen, honestly, and the plane table
116
+ now answers the full plan: **90 lanes, 66 live, 24 host.**
117
+
118
+ ### the state the wave found
119
+
120
+ - the plane: 73 lanes (61 live, 12 host); the registry live set ahead
121
+ of the lane table by seventeen ids — runner-deno, runner-serverless,
122
+ language-rust, language-cargo, language-v, language-dotnet,
123
+ language-php, language-lua, language-zig, language-nim, runner-wasi,
124
+ fs-gitobjects, storage-sqlite, network-dns, network-doh, build-make
125
+ and build-ninja, every one already live in the registry.
126
+
127
+ ### the wiring the wave answered
128
+
129
+ - **edgelandeshost.ts** (group a, +12 lanes): the language toolchains
130
+ (rustc with the compile-then-run seat, cargo with CARGO_HOME and the
131
+ target tree inside the private dir, v with HOME at the temp dir,
132
+ dotnet with the csproj seat and DOTNET_CLI_HOME inside, php, lua, zig
133
+ with the global cache inside, nim with the nimcache inside), the
134
+ runner seats (deno with the scoped read permission and DENO_DIR
135
+ inside, wasi through wasmtime with the base64 module bytes) and the
136
+ build tail (make with the Makefile as the code field, ninja with the
137
+ build.ninja as the code field). every lane probes its binary, runs
138
+ under the hard deadline in the private temp dir and answers the coded
139
+ absence when the host carries no runtime — the twelve ride kind host
140
+ (the runtime probe rung), the twenty-five of the first wave stay kind
141
+ live.
142
+ - **edgelandesinproc.ts** (group b, +5 lanes): the serverless runner
143
+ (the v8 isolate manifest — one fresh node:vm context per run, the
144
+ module fingerprint fnv-1a, the frozen inputs surface), the git
145
+ objects vfs (the loose-object header law and the two-hex-char
146
+ fan-out), the sqlite vault (the hundred-byte page-one header with the
147
+ fnv-1a statement id as the change counter) and the network resolvers
148
+ (the rfc1035 question bytes of dns, the rfc8484 base64url ride of
149
+ doh under the https-only resolver law) — pure ts, deterministic,
150
+ seeded, in-process.
151
+ - **edgelandesninety.ts / edgeplane.ts**: the stale sixty-three
152
+ comments now state the post-wiring truth — ninety lanes, sixty-six
153
+ live, twenty-four host.
154
+ - **the pinned tests**: the host battery 25 → 37 (the twelve wave ids
155
+ in alphabetical order, kind host), the inproc battery 19 → 24 with
156
+ the five samples and the wave four seat laws (the isolate, the
157
+ fan-out, the page and the resolvers), the plane table 61/12 → 66/24,
158
+ and the runner-deno refusal test rewired to the wired truth (a real
159
+ run or the coded absence — the gap it proved is closed).
160
+
161
+ ### the verification the wave recorded
162
+
163
+ - saddle: 30 files / **437 tests green** (436 base + 1 seat law test)
164
+ - the build green, dist carrying both lane files
165
+ - biome zero findings on every file the wave touched
166
+ - the live proof: the plane table answers 66 live and 24 host of 90 —
167
+ /api/v1/edge/lanes now reports the ninety probed lanes
168
+
169
+ ### the honest notes
170
+
171
+ - the twelve host seats ride kind host with real executors: the plane
172
+ probes the runtime and the executor drives it when the host carries
173
+ it — an absent runtime answers HOST_RUNTIME_ABSENT naming the runtime,
174
+ exactly like the live seats of the first wave (the kind answers the
175
+ rung the table reports, the executor answers the run).
176
+ - the inproc seats stay deterministic: fixed fnv-1a addresses, rfc1035
177
+ big-endian fields and stored hex — no clock, no randomness, the same
178
+ payload answers the same bytes every run.
179
+ - this engine host carries make only: the eleven other runtimes answer
180
+ the coded absence here while the make lane proves a real run — the
181
+ batteries stay green on both kinds of host.
182
+
183
+ ## the os nicknames of the owner (reference)
184
+
185
+ sandboxprofile.ts answers five guest os ids — android, grapheneos, linux,
186
+ omarchy, windows — and the owner's spoken names are nicknames of those
187
+ builds, not new ids: marsh (marshmallow) → android, grapenios and grafene
188
+ os → grapheneos, omashi → omarchy, linux normal → linux. the owner's "v"
189
+ names no guest os: it answers the language-v lane of the modality
190
+ registry (the v compiler seat). nothing to add — the vocabulary already
191
+ covers every name the owner used.
File without changes
File without changes
File without changes
File without changes
File without changes