@wenathlan/saddle 1.8.18 → 2.0.2

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 (802) hide show
  1. package/Dockerfile +1339 -0
  2. package/README.md +33 -12
  3. package/alternatives.ts +1218 -0
  4. package/biome.json +153 -0
  5. package/boards.json +1517 -0
  6. package/compute.ts +3144 -0
  7. package/cores.json +1801 -0
  8. package/dist/acquisition.d.ts +359 -0
  9. package/dist/acquisition.d.ts.map +1 -0
  10. package/dist/acquisition.js +629 -0
  11. package/dist/acquisition.js.map +1 -0
  12. package/dist/alternatives.d.ts +509 -0
  13. package/dist/alternatives.d.ts.map +1 -0
  14. package/dist/alternatives.js +951 -0
  15. package/dist/alternatives.js.map +1 -0
  16. package/dist/automation.d.ts +426 -0
  17. package/dist/automation.d.ts.map +1 -0
  18. package/dist/automation.js +561 -0
  19. package/dist/automation.js.map +1 -0
  20. package/dist/browser.d.ts +562 -0
  21. package/dist/browser.d.ts.map +1 -0
  22. package/dist/browser.js +1057 -0
  23. package/dist/browser.js.map +1 -0
  24. package/dist/capacitor.config.d.ts +13 -0
  25. package/dist/capacitor.config.d.ts.map +1 -0
  26. package/dist/capacitor.config.js +26 -0
  27. package/dist/capacitor.config.js.map +1 -0
  28. package/dist/cli.d.ts +17 -0
  29. package/dist/cli.d.ts.map +1 -0
  30. package/dist/cli.js +111 -0
  31. package/dist/cli.js.map +1 -0
  32. package/dist/communication.d.ts +192 -0
  33. package/dist/communication.d.ts.map +1 -0
  34. package/dist/communication.js +418 -0
  35. package/dist/communication.js.map +1 -0
  36. package/dist/compute.d.ts +1161 -0
  37. package/dist/compute.d.ts.map +1 -0
  38. package/dist/compute.js +2273 -0
  39. package/dist/compute.js.map +1 -0
  40. package/dist/distribution.d.ts +529 -0
  41. package/dist/distribution.d.ts.map +1 -0
  42. package/dist/distribution.js +811 -0
  43. package/dist/distribution.js.map +1 -0
  44. package/dist/execution.d.ts +530 -0
  45. package/dist/execution.d.ts.map +1 -0
  46. package/dist/execution.js +761 -0
  47. package/dist/execution.js.map +1 -0
  48. package/dist/format.d.ts +19 -0
  49. package/dist/format.d.ts.map +1 -0
  50. package/dist/format.js +60 -0
  51. package/dist/format.js.map +1 -0
  52. package/dist/foundation.d.ts +176 -0
  53. package/dist/foundation.d.ts.map +1 -0
  54. package/dist/foundation.js +309 -0
  55. package/dist/foundation.js.map +1 -0
  56. package/dist/index.d.ts +733 -123
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +1018 -123
  59. package/dist/index.js.map +1 -1
  60. package/dist/integration.d.ts +236 -0
  61. package/dist/integration.d.ts.map +1 -0
  62. package/dist/integration.js +236 -0
  63. package/dist/integration.js.map +1 -0
  64. package/dist/intelligence.d.ts +94 -0
  65. package/dist/intelligence.d.ts.map +1 -0
  66. package/dist/intelligence.js +145 -0
  67. package/dist/intelligence.js.map +1 -0
  68. package/dist/{isolation/contracts.d.ts → isolation.d.ts} +12 -1
  69. package/dist/isolation.d.ts.map +1 -0
  70. package/dist/{isolation/contracts.js → isolation.js} +13 -1
  71. package/dist/isolation.js.map +1 -0
  72. package/dist/media.d.ts +344 -0
  73. package/dist/media.d.ts.map +1 -0
  74. package/dist/media.js +986 -0
  75. package/dist/media.js.map +1 -0
  76. package/dist/modes.d.ts +359 -0
  77. package/dist/modes.d.ts.map +1 -0
  78. package/dist/modes.js +134 -0
  79. package/dist/modes.js.map +1 -0
  80. package/dist/{library/public.d.ts → operations.d.ts} +15 -1
  81. package/dist/operations.d.ts.map +1 -0
  82. package/dist/{library/public.js → operations.js} +18 -7
  83. package/dist/operations.js.map +1 -0
  84. package/dist/orchestrator.d.ts +1339 -0
  85. package/dist/orchestrator.d.ts.map +1 -0
  86. package/dist/orchestrator.js +4308 -0
  87. package/dist/orchestrator.js.map +1 -0
  88. package/dist/performance.d.ts +416 -0
  89. package/dist/performance.d.ts.map +1 -0
  90. package/dist/performance.js +827 -0
  91. package/dist/performance.js.map +1 -0
  92. package/dist/quantum.d.ts +810 -0
  93. package/dist/quantum.d.ts.map +1 -0
  94. package/dist/quantum.js +2073 -0
  95. package/dist/quantum.js.map +1 -0
  96. package/dist/render.d.ts +381 -0
  97. package/dist/render.d.ts.map +1 -0
  98. package/dist/render.js +1073 -0
  99. package/dist/render.js.map +1 -0
  100. package/dist/scheduler.d.ts +596 -0
  101. package/dist/scheduler.d.ts.map +1 -0
  102. package/dist/scheduler.js +1259 -0
  103. package/dist/scheduler.js.map +1 -0
  104. package/dist/security.d.ts +501 -0
  105. package/dist/security.d.ts.map +1 -0
  106. package/dist/security.js +1170 -0
  107. package/dist/security.js.map +1 -0
  108. package/dist/server.d.ts +21 -0
  109. package/dist/server.d.ts.map +1 -0
  110. package/dist/{server/node.js → server.js} +16 -2
  111. package/dist/server.js.map +1 -0
  112. package/dist/tiers.d.ts +1002 -0
  113. package/dist/tiers.d.ts.map +1 -0
  114. package/dist/tiers.js +2165 -0
  115. package/dist/tiers.js.map +1 -0
  116. package/dist/virtual.d.ts +641 -0
  117. package/dist/virtual.d.ts.map +1 -0
  118. package/dist/virtual.js +1285 -0
  119. package/dist/virtual.js.map +1 -0
  120. package/dist/virtualcpu.d.ts +316 -0
  121. package/dist/virtualcpu.d.ts.map +1 -0
  122. package/dist/virtualcpu.js +1180 -0
  123. package/dist/virtualcpu.js.map +1 -0
  124. package/dist/virtualgpu.d.ts +345 -0
  125. package/dist/virtualgpu.d.ts.map +1 -0
  126. package/dist/virtualgpu.js +1000 -0
  127. package/dist/virtualgpu.js.map +1 -0
  128. package/dist/virtualization.d.ts +607 -0
  129. package/dist/virtualization.d.ts.map +1 -0
  130. package/dist/virtualization.js +1187 -0
  131. package/dist/virtualization.js.map +1 -0
  132. package/dist/virtualmemory.d.ts +818 -0
  133. package/dist/virtualmemory.d.ts.map +1 -0
  134. package/dist/virtualmemory.js +1796 -0
  135. package/dist/virtualmemory.js.map +1 -0
  136. package/dist/webscrape.d.ts +720 -0
  137. package/dist/webscrape.d.ts.map +1 -0
  138. package/dist/webscrape.js +2697 -0
  139. package/dist/webscrape.js.map +1 -0
  140. package/docker.config +769 -0
  141. package/docs/CONVERSA.txt +1523 -0
  142. package/docs/alternatives.md +499 -0
  143. package/docs/architecture-1.8.19.md +76 -0
  144. package/docs/architecture-1.8.19.mmd +33 -0
  145. package/docs/architecture-1.8.19.png +0 -0
  146. package/docs/architecture.md +355 -0
  147. package/docs/brancharchive-2026-08-18.md +18 -0
  148. package/docs/browser.md +7 -0
  149. package/docs/consolidation.md +70 -0
  150. package/docs/e2ugh-engine.md +528 -0
  151. package/{dist/examples/localjob.js → docs/example-localjob.ts} +3 -3
  152. package/{dist/examples/publicapi.js → docs/example-publicapi.ts} +2 -2
  153. package/docs/hardware.md +342 -0
  154. package/docs/optimization.md +126 -0
  155. package/docs/performance.md +499 -0
  156. package/docs/planning.1.8.18.md +94 -0
  157. package/docs/planning.1.8.19.md +49 -0
  158. package/docs/releasenotes-1.8.19.md +35 -0
  159. package/docs/research-1.8.19-virtual-browser.md +27 -0
  160. package/docs/security.md +454 -0
  161. package/docs/todo-1.8.18.md +12 -0
  162. package/docs/todo-1.8.19.md +241 -0
  163. package/docs/viability.md +777 -0
  164. package/docs/virtualization.md +335 -0
  165. package/docs/web-duplicatecleanup.md +9 -0
  166. package/docs/web-ideas.md +106 -0
  167. package/docs/workflowimprovements-2026-08-19.md +70 -0
  168. package/gpumonitor.cpp +1543 -0
  169. package/gpus.json +2408 -0
  170. package/index.ts +1478 -0
  171. package/media.ts +1337 -0
  172. package/mttg.config +1549 -0
  173. package/orchestrator.ts +5462 -0
  174. package/package.json +304 -56
  175. package/passage.config +1331 -0
  176. package/performance.ts +1049 -0
  177. package/processors.json +2217 -0
  178. package/qemu.config +1062 -0
  179. package/qemubridge.py +1340 -0
  180. package/quantum.ts +2393 -0
  181. package/render.ts +1325 -0
  182. package/scheduler.ts +1600 -0
  183. package/security.ts +1449 -0
  184. package/tiers.ts +2871 -0
  185. package/tsconfig.json +29 -0
  186. package/virtualcpu.ts +1273 -0
  187. package/virtualgpu.ts +1181 -0
  188. package/virtualhardware.c +1011 -0
  189. package/virtualhardware.json +739 -0
  190. package/virtualization.ts +1628 -0
  191. package/virtualizationcore.cpp +4635 -0
  192. package/virtualmemory.ts +2303 -0
  193. package/vm.config.json +1910 -0
  194. package/{extension → web/extension}/manifest.json +1 -1
  195. package/web/readme.md +382 -0
  196. package/web/tsconfig.json +25 -0
  197. package/dist/adapters/forge.d.ts +0 -17
  198. package/dist/adapters/forge.d.ts.map +0 -1
  199. package/dist/adapters/forge.js +0 -19
  200. package/dist/adapters/forge.js.map +0 -1
  201. package/dist/adapters/forgejo.d.ts +0 -49
  202. package/dist/adapters/forgejo.d.ts.map +0 -1
  203. package/dist/adapters/forgejo.js +0 -8
  204. package/dist/adapters/forgejo.js.map +0 -1
  205. package/dist/adapters/github.d.ts +0 -12
  206. package/dist/adapters/github.d.ts.map +0 -1
  207. package/dist/adapters/github.js +0 -20
  208. package/dist/adapters/github.js.map +0 -1
  209. package/dist/adapters/gitlab.d.ts +0 -17
  210. package/dist/adapters/gitlab.d.ts.map +0 -1
  211. package/dist/adapters/gitlab.js +0 -10
  212. package/dist/adapters/gitlab.js.map +0 -1
  213. package/dist/adapters/huggingface.d.ts +0 -17
  214. package/dist/adapters/huggingface.d.ts.map +0 -1
  215. package/dist/adapters/huggingface.js +0 -6
  216. package/dist/adapters/huggingface.js.map +0 -1
  217. package/dist/adapters/socket.d.ts +0 -11
  218. package/dist/adapters/socket.d.ts.map +0 -1
  219. package/dist/adapters/socket.js +0 -17
  220. package/dist/adapters/socket.js.map +0 -1
  221. package/dist/adapters/transport.d.ts +0 -7
  222. package/dist/adapters/transport.d.ts.map +0 -1
  223. package/dist/adapters/transport.js +0 -36
  224. package/dist/adapters/transport.js.map +0 -1
  225. package/dist/ai/chunk.d.ts +0 -2
  226. package/dist/ai/chunk.d.ts.map +0 -1
  227. package/dist/ai/chunk.js +0 -36
  228. package/dist/ai/chunk.js.map +0 -1
  229. package/dist/ai/llmstxt.d.ts +0 -6
  230. package/dist/ai/llmstxt.d.ts.map +0 -1
  231. package/dist/ai/llmstxt.js +0 -12
  232. package/dist/ai/llmstxt.js.map +0 -1
  233. package/dist/ai/provenance.d.ts +0 -22
  234. package/dist/ai/provenance.d.ts.map +0 -1
  235. package/dist/ai/provenance.js +0 -25
  236. package/dist/ai/provenance.js.map +0 -1
  237. package/dist/ai/rag.d.ts +0 -26
  238. package/dist/ai/rag.d.ts.map +0 -1
  239. package/dist/ai/rag.js +0 -22
  240. package/dist/ai/rag.js.map +0 -1
  241. package/dist/ai/tokens.d.ts +0 -15
  242. package/dist/ai/tokens.d.ts.map +0 -1
  243. package/dist/ai/tokens.js +0 -9
  244. package/dist/ai/tokens.js.map +0 -1
  245. package/dist/api/auth.d.ts +0 -16
  246. package/dist/api/auth.d.ts.map +0 -1
  247. package/dist/api/auth.js +0 -19
  248. package/dist/api/auth.js.map +0 -1
  249. package/dist/api/contracts.d.ts +0 -28
  250. package/dist/api/contracts.d.ts.map +0 -1
  251. package/dist/api/contracts.js +0 -14
  252. package/dist/api/contracts.js.map +0 -1
  253. package/dist/api/control.d.ts +0 -10
  254. package/dist/api/control.d.ts.map +0 -1
  255. package/dist/api/control.js +0 -35
  256. package/dist/api/control.js.map +0 -1
  257. package/dist/api/http.d.ts +0 -7
  258. package/dist/api/http.d.ts.map +0 -1
  259. package/dist/api/http.js +0 -12
  260. package/dist/api/http.js.map +0 -1
  261. package/dist/api/rate.d.ts +0 -28
  262. package/dist/api/rate.d.ts.map +0 -1
  263. package/dist/api/rate.js +0 -36
  264. package/dist/api/rate.js.map +0 -1
  265. package/dist/api/security.d.ts +0 -12
  266. package/dist/api/security.d.ts.map +0 -1
  267. package/dist/api/security.js +0 -56
  268. package/dist/api/security.js.map +0 -1
  269. package/dist/api/service.d.ts +0 -5
  270. package/dist/api/service.d.ts.map +0 -1
  271. package/dist/api/service.js +0 -70
  272. package/dist/api/service.js.map +0 -1
  273. package/dist/apps/registry.d.ts +0 -33
  274. package/dist/apps/registry.d.ts.map +0 -1
  275. package/dist/apps/registry.js +0 -24
  276. package/dist/apps/registry.js.map +0 -1
  277. package/dist/binary/archive.d.ts +0 -27
  278. package/dist/binary/archive.d.ts.map +0 -1
  279. package/dist/binary/archive.js +0 -46
  280. package/dist/binary/archive.js.map +0 -1
  281. package/dist/binary/build.d.ts +0 -29
  282. package/dist/binary/build.d.ts.map +0 -1
  283. package/dist/binary/build.js +0 -17
  284. package/dist/binary/build.js.map +0 -1
  285. package/dist/binary/transform.d.ts +0 -70
  286. package/dist/binary/transform.d.ts.map +0 -1
  287. package/dist/binary/transform.js +0 -105
  288. package/dist/binary/transform.js.map +0 -1
  289. package/dist/bot/adapter.d.ts +0 -5
  290. package/dist/bot/adapter.d.ts.map +0 -1
  291. package/dist/bot/adapter.js +0 -11
  292. package/dist/bot/adapter.js.map +0 -1
  293. package/dist/bot/bot.d.ts +0 -28
  294. package/dist/bot/bot.d.ts.map +0 -1
  295. package/dist/bot/bot.js +0 -52
  296. package/dist/bot/bot.js.map +0 -1
  297. package/dist/bot/commands.d.ts +0 -8
  298. package/dist/bot/commands.d.ts.map +0 -1
  299. package/dist/bot/commands.js +0 -19
  300. package/dist/bot/commands.js.map +0 -1
  301. package/dist/bot/permissions.d.ts +0 -13
  302. package/dist/bot/permissions.d.ts.map +0 -1
  303. package/dist/bot/permissions.js +0 -16
  304. package/dist/bot/permissions.js.map +0 -1
  305. package/dist/browser/actions.d.ts +0 -33
  306. package/dist/browser/actions.d.ts.map +0 -1
  307. package/dist/browser/actions.js +0 -44
  308. package/dist/browser/actions.js.map +0 -1
  309. package/dist/browser/agent.d.ts +0 -21
  310. package/dist/browser/agent.d.ts.map +0 -1
  311. package/dist/browser/agent.js +0 -13
  312. package/dist/browser/agent.js.map +0 -1
  313. package/dist/browser/context.d.ts +0 -43
  314. package/dist/browser/context.d.ts.map +0 -1
  315. package/dist/browser/context.js +0 -54
  316. package/dist/browser/context.js.map +0 -1
  317. package/dist/browser/fingerprint.d.ts +0 -4
  318. package/dist/browser/fingerprint.d.ts.map +0 -1
  319. package/dist/browser/fingerprint.js +0 -12
  320. package/dist/browser/fingerprint.js.map +0 -1
  321. package/dist/browser/index.d.ts +0 -11
  322. package/dist/browser/index.d.ts.map +0 -1
  323. package/dist/browser/index.js +0 -11
  324. package/dist/browser/index.js.map +0 -1
  325. package/dist/browser/playwright.d.ts +0 -11
  326. package/dist/browser/playwright.d.ts.map +0 -1
  327. package/dist/browser/playwright.js +0 -24
  328. package/dist/browser/playwright.js.map +0 -1
  329. package/dist/browser/recorder.d.ts +0 -21
  330. package/dist/browser/recorder.d.ts.map +0 -1
  331. package/dist/browser/recorder.js +0 -58
  332. package/dist/browser/recorder.js.map +0 -1
  333. package/dist/browser/session.d.ts +0 -14
  334. package/dist/browser/session.d.ts.map +0 -1
  335. package/dist/browser/session.js +0 -21
  336. package/dist/browser/session.js.map +0 -1
  337. package/dist/browser/snapshot.d.ts +0 -69
  338. package/dist/browser/snapshot.d.ts.map +0 -1
  339. package/dist/browser/snapshot.js +0 -133
  340. package/dist/browser/snapshot.js.map +0 -1
  341. package/dist/captcha/contract.d.ts +0 -35
  342. package/dist/captcha/contract.d.ts.map +0 -1
  343. package/dist/captcha/contract.js +0 -17
  344. package/dist/captcha/contract.js.map +0 -1
  345. package/dist/captcha/evidence.d.ts +0 -10
  346. package/dist/captcha/evidence.d.ts.map +0 -1
  347. package/dist/captcha/evidence.js +0 -9
  348. package/dist/captcha/evidence.js.map +0 -1
  349. package/dist/captcha/guard.d.ts +0 -23
  350. package/dist/captcha/guard.d.ts.map +0 -1
  351. package/dist/captcha/guard.js +0 -12
  352. package/dist/captcha/guard.js.map +0 -1
  353. package/dist/cli/main.d.ts +0 -4
  354. package/dist/cli/main.d.ts.map +0 -1
  355. package/dist/cli/main.js +0 -46
  356. package/dist/cli/main.js.map +0 -1
  357. package/dist/core/errors.d.ts +0 -84
  358. package/dist/core/errors.d.ts.map +0 -1
  359. package/dist/core/errors.js +0 -54
  360. package/dist/core/errors.js.map +0 -1
  361. package/dist/core/events.d.ts +0 -9
  362. package/dist/core/events.d.ts.map +0 -1
  363. package/dist/core/events.js +0 -21
  364. package/dist/core/events.js.map +0 -1
  365. package/dist/core/hash.d.ts +0 -10
  366. package/dist/core/hash.d.ts.map +0 -1
  367. package/dist/core/hash.js +0 -82
  368. package/dist/core/hash.js.map +0 -1
  369. package/dist/core/ids.d.ts +0 -10
  370. package/dist/core/ids.d.ts.map +0 -1
  371. package/dist/core/ids.js +0 -15
  372. package/dist/core/ids.js.map +0 -1
  373. package/dist/delivery/manifest.d.ts +0 -35
  374. package/dist/delivery/manifest.d.ts.map +0 -1
  375. package/dist/delivery/manifest.js +0 -68
  376. package/dist/delivery/manifest.js.map +0 -1
  377. package/dist/deploy/index.d.ts +0 -6
  378. package/dist/deploy/index.d.ts.map +0 -1
  379. package/dist/deploy/index.js +0 -6
  380. package/dist/deploy/index.js.map +0 -1
  381. package/dist/dispatch/resumable.d.ts +0 -102
  382. package/dist/dispatch/resumable.d.ts.map +0 -1
  383. package/dist/dispatch/resumable.js +0 -64
  384. package/dist/dispatch/resumable.js.map +0 -1
  385. package/dist/dispatch/workflow.d.ts +0 -6
  386. package/dist/dispatch/workflow.d.ts.map +0 -1
  387. package/dist/dispatch/workflow.js +0 -37
  388. package/dist/dispatch/workflow.js.map +0 -1
  389. package/dist/domain/artifacts.d.ts +0 -12
  390. package/dist/domain/artifacts.d.ts.map +0 -1
  391. package/dist/domain/artifacts.js +0 -14
  392. package/dist/domain/artifacts.js.map +0 -1
  393. package/dist/domain/jobs.d.ts +0 -12
  394. package/dist/domain/jobs.d.ts.map +0 -1
  395. package/dist/domain/jobs.js +0 -20
  396. package/dist/domain/jobs.js.map +0 -1
  397. package/dist/domain/providers.d.ts +0 -10
  398. package/dist/domain/providers.d.ts.map +0 -1
  399. package/dist/domain/providers.js +0 -8
  400. package/dist/domain/providers.js.map +0 -1
  401. package/dist/domain/runtime.d.ts +0 -14
  402. package/dist/domain/runtime.d.ts.map +0 -1
  403. package/dist/domain/runtime.js +0 -10
  404. package/dist/domain/runtime.js.map +0 -1
  405. package/dist/domain/sessions.d.ts +0 -12
  406. package/dist/domain/sessions.d.ts.map +0 -1
  407. package/dist/domain/sessions.js +0 -57
  408. package/dist/domain/sessions.js.map +0 -1
  409. package/dist/examples/localjob.d.ts +0 -2
  410. package/dist/examples/localjob.d.ts.map +0 -1
  411. package/dist/examples/localjob.js.map +0 -1
  412. package/dist/examples/publicapi.d.ts +0 -2
  413. package/dist/examples/publicapi.d.ts.map +0 -1
  414. package/dist/examples/publicapi.js.map +0 -1
  415. package/dist/extension/build.d.ts +0 -9
  416. package/dist/extension/build.d.ts.map +0 -1
  417. package/dist/extension/build.js +0 -85
  418. package/dist/extension/build.js.map +0 -1
  419. package/dist/extension/content.d.ts +0 -6
  420. package/dist/extension/content.d.ts.map +0 -1
  421. package/dist/extension/content.js +0 -135
  422. package/dist/extension/content.js.map +0 -1
  423. package/dist/extension/index.d.ts +0 -7
  424. package/dist/extension/index.d.ts.map +0 -1
  425. package/dist/extension/index.js +0 -7
  426. package/dist/extension/index.js.map +0 -1
  427. package/dist/extension/pagebridge.d.ts +0 -6
  428. package/dist/extension/pagebridge.d.ts.map +0 -1
  429. package/dist/extension/pagebridge.js +0 -42
  430. package/dist/extension/pagebridge.js.map +0 -1
  431. package/dist/extension/permissions.d.ts +0 -26
  432. package/dist/extension/permissions.d.ts.map +0 -1
  433. package/dist/extension/permissions.js +0 -28
  434. package/dist/extension/permissions.js.map +0 -1
  435. package/dist/extension/popup.d.ts +0 -5
  436. package/dist/extension/popup.d.ts.map +0 -1
  437. package/dist/extension/popup.js +0 -26
  438. package/dist/extension/popup.js.map +0 -1
  439. package/dist/extension/protocol.d.ts +0 -58
  440. package/dist/extension/protocol.d.ts.map +0 -1
  441. package/dist/extension/protocol.js +0 -101
  442. package/dist/extension/protocol.js.map +0 -1
  443. package/dist/extension/serviceworker.d.ts +0 -25
  444. package/dist/extension/serviceworker.d.ts.map +0 -1
  445. package/dist/extension/serviceworker.js +0 -102
  446. package/dist/extension/serviceworker.js.map +0 -1
  447. package/dist/extension/worker.d.ts +0 -28
  448. package/dist/extension/worker.d.ts.map +0 -1
  449. package/dist/extension/worker.js +0 -22
  450. package/dist/extension/worker.js.map +0 -1
  451. package/dist/format/check.d.ts +0 -8
  452. package/dist/format/check.d.ts.map +0 -1
  453. package/dist/format/check.js +0 -38
  454. package/dist/format/check.js.map +0 -1
  455. package/dist/isolation/contracts.d.ts.map +0 -1
  456. package/dist/isolation/contracts.js.map +0 -1
  457. package/dist/library/public.d.ts.map +0 -1
  458. package/dist/library/public.js.map +0 -1
  459. package/dist/mcp/browser.d.ts +0 -9
  460. package/dist/mcp/browser.d.ts.map +0 -1
  461. package/dist/mcp/browser.js +0 -13
  462. package/dist/mcp/browser.js.map +0 -1
  463. package/dist/mcp/server.d.ts +0 -35
  464. package/dist/mcp/server.d.ts.map +0 -1
  465. package/dist/mcp/server.js +0 -40
  466. package/dist/mcp/server.js.map +0 -1
  467. package/dist/mcp/transport.d.ts +0 -7
  468. package/dist/mcp/transport.d.ts.map +0 -1
  469. package/dist/mcp/transport.js +0 -17
  470. package/dist/mcp/transport.js.map +0 -1
  471. package/dist/memory/bridge.d.ts +0 -14
  472. package/dist/memory/bridge.d.ts.map +0 -1
  473. package/dist/memory/bridge.js +0 -16
  474. package/dist/memory/bridge.js.map +0 -1
  475. package/dist/memory/engine.d.ts +0 -38
  476. package/dist/memory/engine.d.ts.map +0 -1
  477. package/dist/memory/engine.js +0 -109
  478. package/dist/memory/engine.js.map +0 -1
  479. package/dist/memory/modes.d.ts +0 -43
  480. package/dist/memory/modes.d.ts.map +0 -1
  481. package/dist/memory/modes.js +0 -66
  482. package/dist/memory/modes.js.map +0 -1
  483. package/dist/memory/objects.d.ts +0 -21
  484. package/dist/memory/objects.d.ts.map +0 -1
  485. package/dist/memory/objects.js +0 -20
  486. package/dist/memory/objects.js.map +0 -1
  487. package/dist/memory/planner.d.ts +0 -66
  488. package/dist/memory/planner.d.ts.map +0 -1
  489. package/dist/memory/planner.js +0 -108
  490. package/dist/memory/planner.js.map +0 -1
  491. package/dist/memory/targets.d.ts +0 -78
  492. package/dist/memory/targets.d.ts.map +0 -1
  493. package/dist/memory/targets.js +0 -29
  494. package/dist/memory/targets.js.map +0 -1
  495. package/dist/memory/transforms.d.ts +0 -19
  496. package/dist/memory/transforms.d.ts.map +0 -1
  497. package/dist/memory/transforms.js +0 -14
  498. package/dist/memory/transforms.js.map +0 -1
  499. package/dist/modes/matrix.d.ts +0 -23
  500. package/dist/modes/matrix.d.ts.map +0 -1
  501. package/dist/modes/matrix.js +0 -18
  502. package/dist/modes/matrix.js.map +0 -1
  503. package/dist/modes/modes.d.ts +0 -33
  504. package/dist/modes/modes.d.ts.map +0 -1
  505. package/dist/modes/modes.js +0 -15
  506. package/dist/modes/modes.js.map +0 -1
  507. package/dist/modes/resolve.d.ts +0 -96
  508. package/dist/modes/resolve.d.ts.map +0 -1
  509. package/dist/modes/resolve.js +0 -48
  510. package/dist/modes/resolve.js.map +0 -1
  511. package/dist/observability/metrics.d.ts +0 -14
  512. package/dist/observability/metrics.d.ts.map +0 -1
  513. package/dist/observability/metrics.js +0 -18
  514. package/dist/observability/metrics.js.map +0 -1
  515. package/dist/packager/manifest.d.ts +0 -66
  516. package/dist/packager/manifest.d.ts.map +0 -1
  517. package/dist/packager/manifest.js +0 -94
  518. package/dist/packager/manifest.js.map +0 -1
  519. package/dist/packager/publish.d.ts +0 -51
  520. package/dist/packager/publish.d.ts.map +0 -1
  521. package/dist/packager/publish.js +0 -18
  522. package/dist/packager/publish.js.map +0 -1
  523. package/dist/packager/targetcli.d.ts +0 -7
  524. package/dist/packager/targetcli.d.ts.map +0 -1
  525. package/dist/packager/targetcli.js +0 -22
  526. package/dist/packager/targetcli.js.map +0 -1
  527. package/dist/persistence/adapter.d.ts +0 -5
  528. package/dist/persistence/adapter.d.ts.map +0 -1
  529. package/dist/persistence/adapter.js +0 -11
  530. package/dist/persistence/adapter.js.map +0 -1
  531. package/dist/persistence/drizzle.d.ts +0 -2
  532. package/dist/persistence/drizzle.d.ts.map +0 -1
  533. package/dist/persistence/drizzle.js +0 -12
  534. package/dist/persistence/drizzle.js.map +0 -1
  535. package/dist/persistence/memory.d.ts +0 -2
  536. package/dist/persistence/memory.d.ts.map +0 -1
  537. package/dist/persistence/memory.js +0 -27
  538. package/dist/persistence/memory.js.map +0 -1
  539. package/dist/persistence/migrations.d.ts +0 -19
  540. package/dist/persistence/migrations.d.ts.map +0 -1
  541. package/dist/persistence/migrations.js +0 -13
  542. package/dist/persistence/migrations.js.map +0 -1
  543. package/dist/persistence/prisma.d.ts +0 -2
  544. package/dist/persistence/prisma.d.ts.map +0 -1
  545. package/dist/persistence/prisma.js +0 -25
  546. package/dist/persistence/prisma.js.map +0 -1
  547. package/dist/persistence/schema.d.ts +0 -63
  548. package/dist/persistence/schema.d.ts.map +0 -1
  549. package/dist/persistence/schema.js +0 -28
  550. package/dist/persistence/schema.js.map +0 -1
  551. package/dist/persistence/sql.d.ts +0 -3
  552. package/dist/persistence/sql.d.ts.map +0 -1
  553. package/dist/persistence/sql.js +0 -37
  554. package/dist/persistence/sql.js.map +0 -1
  555. package/dist/protocol/blocks.d.ts +0 -10
  556. package/dist/protocol/blocks.d.ts.map +0 -1
  557. package/dist/protocol/blocks.js +0 -26
  558. package/dist/protocol/blocks.js.map +0 -1
  559. package/dist/protocol/json.d.ts +0 -6
  560. package/dist/protocol/json.d.ts.map +0 -1
  561. package/dist/protocol/json.js +0 -6
  562. package/dist/protocol/json.js.map +0 -1
  563. package/dist/protocol/ndjson.d.ts +0 -3
  564. package/dist/protocol/ndjson.d.ts.map +0 -1
  565. package/dist/protocol/ndjson.js +0 -20
  566. package/dist/protocol/ndjson.js.map +0 -1
  567. package/dist/protocol/sse.d.ts +0 -7
  568. package/dist/protocol/sse.d.ts.map +0 -1
  569. package/dist/protocol/sse.js +0 -25
  570. package/dist/protocol/sse.js.map +0 -1
  571. package/dist/proxy/pool.d.ts +0 -9
  572. package/dist/proxy/pool.d.ts.map +0 -1
  573. package/dist/proxy/pool.js +0 -27
  574. package/dist/proxy/pool.js.map +0 -1
  575. package/dist/queue/idempotency.d.ts +0 -10
  576. package/dist/queue/idempotency.d.ts.map +0 -1
  577. package/dist/queue/idempotency.js +0 -13
  578. package/dist/queue/idempotency.js.map +0 -1
  579. package/dist/queue/persistent.d.ts +0 -14
  580. package/dist/queue/persistent.d.ts.map +0 -1
  581. package/dist/queue/persistent.js +0 -66
  582. package/dist/queue/persistent.js.map +0 -1
  583. package/dist/queue/queue.d.ts +0 -7
  584. package/dist/queue/queue.d.ts.map +0 -1
  585. package/dist/queue/queue.js +0 -55
  586. package/dist/queue/queue.js.map +0 -1
  587. package/dist/queue/saga.d.ts +0 -5
  588. package/dist/queue/saga.d.ts.map +0 -1
  589. package/dist/queue/saga.js +0 -20
  590. package/dist/queue/saga.js.map +0 -1
  591. package/dist/release/assets.d.ts +0 -144
  592. package/dist/release/assets.d.ts.map +0 -1
  593. package/dist/release/assets.js +0 -157
  594. package/dist/release/assets.js.map +0 -1
  595. package/dist/release/evidence.d.ts +0 -92
  596. package/dist/release/evidence.d.ts.map +0 -1
  597. package/dist/release/evidence.js +0 -148
  598. package/dist/release/evidence.js.map +0 -1
  599. package/dist/release/verify.d.ts +0 -12
  600. package/dist/release/verify.d.ts.map +0 -1
  601. package/dist/release/verify.js +0 -112
  602. package/dist/release/verify.js.map +0 -1
  603. package/dist/runners/chain.d.ts +0 -125
  604. package/dist/runners/chain.d.ts.map +0 -1
  605. package/dist/runners/chain.js +0 -95
  606. package/dist/runners/chain.js.map +0 -1
  607. package/dist/runners/health.d.ts +0 -36
  608. package/dist/runners/health.d.ts.map +0 -1
  609. package/dist/runners/health.js +0 -26
  610. package/dist/runners/health.js.map +0 -1
  611. package/dist/runners/heartbeat.d.ts +0 -23
  612. package/dist/runners/heartbeat.d.ts.map +0 -1
  613. package/dist/runners/heartbeat.js +0 -29
  614. package/dist/runners/heartbeat.js.map +0 -1
  615. package/dist/runners/inprocess.d.ts +0 -17
  616. package/dist/runners/inprocess.d.ts.map +0 -1
  617. package/dist/runners/inprocess.js +0 -20
  618. package/dist/runners/inprocess.js.map +0 -1
  619. package/dist/runners/scheduler.d.ts +0 -5
  620. package/dist/runners/scheduler.d.ts.map +0 -1
  621. package/dist/runners/scheduler.js +0 -19
  622. package/dist/runners/scheduler.js.map +0 -1
  623. package/dist/runtime/abort.d.ts +0 -8
  624. package/dist/runtime/abort.d.ts.map +0 -1
  625. package/dist/runtime/abort.js +0 -13
  626. package/dist/runtime/abort.js.map +0 -1
  627. package/dist/runtime/compatibility.d.ts +0 -37
  628. package/dist/runtime/compatibility.d.ts.map +0 -1
  629. package/dist/runtime/compatibility.js +0 -10
  630. package/dist/runtime/compatibility.js.map +0 -1
  631. package/dist/runtime/detect.d.ts +0 -13
  632. package/dist/runtime/detect.d.ts.map +0 -1
  633. package/dist/runtime/detect.js +0 -18
  634. package/dist/runtime/detect.js.map +0 -1
  635. package/dist/runtime/engine.d.ts +0 -20
  636. package/dist/runtime/engine.d.ts.map +0 -1
  637. package/dist/runtime/engine.js +0 -61
  638. package/dist/runtime/engine.js.map +0 -1
  639. package/dist/runtime/retry.d.ts +0 -19
  640. package/dist/runtime/retry.d.ts.map +0 -1
  641. package/dist/runtime/retry.js +0 -54
  642. package/dist/runtime/retry.js.map +0 -1
  643. package/dist/runtime/worker.d.ts +0 -10
  644. package/dist/runtime/worker.d.ts.map +0 -1
  645. package/dist/runtime/worker.js +0 -25
  646. package/dist/runtime/worker.js.map +0 -1
  647. package/dist/scrape/cache.d.ts +0 -45
  648. package/dist/scrape/cache.d.ts.map +0 -1
  649. package/dist/scrape/cache.js +0 -45
  650. package/dist/scrape/cache.js.map +0 -1
  651. package/dist/scrape/crawl.d.ts +0 -47
  652. package/dist/scrape/crawl.d.ts.map +0 -1
  653. package/dist/scrape/crawl.js +0 -114
  654. package/dist/scrape/crawl.js.map +0 -1
  655. package/dist/scrape/extract.d.ts +0 -63
  656. package/dist/scrape/extract.d.ts.map +0 -1
  657. package/dist/scrape/extract.js +0 -47
  658. package/dist/scrape/extract.js.map +0 -1
  659. package/dist/scrape/normalize.d.ts +0 -52
  660. package/dist/scrape/normalize.d.ts.map +0 -1
  661. package/dist/scrape/normalize.js +0 -102
  662. package/dist/scrape/normalize.js.map +0 -1
  663. package/dist/scrape/robots.d.ts +0 -37
  664. package/dist/scrape/robots.d.ts.map +0 -1
  665. package/dist/scrape/robots.js +0 -71
  666. package/dist/scrape/robots.js.map +0 -1
  667. package/dist/scrape/schema.d.ts +0 -23
  668. package/dist/scrape/schema.d.ts.map +0 -1
  669. package/dist/scrape/schema.js +0 -92
  670. package/dist/scrape/schema.js.map +0 -1
  671. package/dist/scrape/scraper.d.ts +0 -6
  672. package/dist/scrape/scraper.d.ts.map +0 -1
  673. package/dist/scrape/scraper.js +0 -46
  674. package/dist/scrape/scraper.js.map +0 -1
  675. package/dist/scrape/semantic.d.ts +0 -25
  676. package/dist/scrape/semantic.d.ts.map +0 -1
  677. package/dist/scrape/semantic.js +0 -27
  678. package/dist/scrape/semantic.js.map +0 -1
  679. package/dist/server/node.d.ts +0 -7
  680. package/dist/server/node.d.ts.map +0 -1
  681. package/dist/server/node.js.map +0 -1
  682. package/dist/sessions/file.d.ts +0 -25
  683. package/dist/sessions/file.d.ts.map +0 -1
  684. package/dist/sessions/file.js +0 -13
  685. package/dist/sessions/file.js.map +0 -1
  686. package/dist/sessions/replay.d.ts +0 -9
  687. package/dist/sessions/replay.d.ts.map +0 -1
  688. package/dist/sessions/replay.js +0 -70
  689. package/dist/sessions/replay.js.map +0 -1
  690. package/dist/sessions/store.d.ts +0 -25
  691. package/dist/sessions/store.d.ts.map +0 -1
  692. package/dist/sessions/store.js +0 -13
  693. package/dist/sessions/store.js.map +0 -1
  694. package/dist/storage/adapter.d.ts +0 -5
  695. package/dist/storage/adapter.d.ts.map +0 -1
  696. package/dist/storage/adapter.js +0 -11
  697. package/dist/storage/adapter.js.map +0 -1
  698. package/dist/storage/cache.d.ts +0 -23
  699. package/dist/storage/cache.d.ts.map +0 -1
  700. package/dist/storage/cache.js +0 -79
  701. package/dist/storage/cache.js.map +0 -1
  702. package/dist/storage/checksum.d.ts +0 -3
  703. package/dist/storage/checksum.d.ts.map +0 -1
  704. package/dist/storage/checksum.js +0 -19
  705. package/dist/storage/checksum.js.map +0 -1
  706. package/dist/storage/chunked.d.ts +0 -21
  707. package/dist/storage/chunked.d.ts.map +0 -1
  708. package/dist/storage/chunked.js +0 -67
  709. package/dist/storage/chunked.js.map +0 -1
  710. package/dist/storage/content.d.ts +0 -24
  711. package/dist/storage/content.d.ts.map +0 -1
  712. package/dist/storage/content.js +0 -44
  713. package/dist/storage/content.js.map +0 -1
  714. package/dist/storage/filehosting.d.ts +0 -2
  715. package/dist/storage/filehosting.d.ts.map +0 -1
  716. package/dist/storage/filehosting.js +0 -24
  717. package/dist/storage/filehosting.js.map +0 -1
  718. package/dist/storage/githubcontents.d.ts +0 -2
  719. package/dist/storage/githubcontents.d.ts.map +0 -1
  720. package/dist/storage/githubcontents.js +0 -29
  721. package/dist/storage/githubcontents.js.map +0 -1
  722. package/dist/storage/index.d.ts +0 -12
  723. package/dist/storage/index.d.ts.map +0 -1
  724. package/dist/storage/index.js +0 -12
  725. package/dist/storage/index.js.map +0 -1
  726. package/dist/storage/local.d.ts +0 -2
  727. package/dist/storage/local.d.ts.map +0 -1
  728. package/dist/storage/local.js +0 -72
  729. package/dist/storage/local.js.map +0 -1
  730. package/dist/storage/memory.d.ts +0 -6
  731. package/dist/storage/memory.d.ts.map +0 -1
  732. package/dist/storage/memory.js +0 -36
  733. package/dist/storage/memory.js.map +0 -1
  734. package/dist/storage/pool.d.ts +0 -95
  735. package/dist/storage/pool.d.ts.map +0 -1
  736. package/dist/storage/pool.js +0 -202
  737. package/dist/storage/pool.js.map +0 -1
  738. package/dist/storage/s3compatible.d.ts +0 -3
  739. package/dist/storage/s3compatible.d.ts.map +0 -1
  740. package/dist/storage/s3compatible.js +0 -70
  741. package/dist/storage/s3compatible.js.map +0 -1
  742. package/dist/storage/sync.d.ts +0 -47
  743. package/dist/storage/sync.d.ts.map +0 -1
  744. package/dist/storage/sync.js +0 -75
  745. package/dist/storage/sync.js.map +0 -1
  746. package/dist/surfaces/adapters.d.ts +0 -97
  747. package/dist/surfaces/adapters.d.ts.map +0 -1
  748. package/dist/surfaces/adapters.js +0 -50
  749. package/dist/surfaces/adapters.js.map +0 -1
  750. package/dist/surfaces/controls.d.ts +0 -18
  751. package/dist/surfaces/controls.d.ts.map +0 -1
  752. package/dist/surfaces/controls.js +0 -45
  753. package/dist/surfaces/controls.js.map +0 -1
  754. package/dist/surfaces/manifest.d.ts +0 -68
  755. package/dist/surfaces/manifest.d.ts.map +0 -1
  756. package/dist/surfaces/manifest.js +0 -42
  757. package/dist/surfaces/manifest.js.map +0 -1
  758. package/dist/surfaces/n8n.d.ts +0 -25
  759. package/dist/surfaces/n8n.d.ts.map +0 -1
  760. package/dist/surfaces/n8n.js +0 -31
  761. package/dist/surfaces/n8n.js.map +0 -1
  762. package/dist/surfaces/operations.d.ts +0 -32
  763. package/dist/surfaces/operations.d.ts.map +0 -1
  764. package/dist/surfaces/operations.js +0 -53
  765. package/dist/surfaces/operations.js.map +0 -1
  766. package/dist/surfaces/requirements.d.ts +0 -29
  767. package/dist/surfaces/requirements.d.ts.map +0 -1
  768. package/dist/surfaces/requirements.js +0 -50
  769. package/dist/surfaces/requirements.js.map +0 -1
  770. package/dist/surfaces/targets.d.ts +0 -196
  771. package/dist/surfaces/targets.d.ts.map +0 -1
  772. package/dist/surfaces/targets.js +0 -27
  773. package/dist/surfaces/targets.js.map +0 -1
  774. package/dist/webhook/delivery.d.ts +0 -18
  775. package/dist/webhook/delivery.d.ts.map +0 -1
  776. package/dist/webhook/delivery.js +0 -36
  777. package/dist/webhook/delivery.js.map +0 -1
  778. package/dist/webhook/receiver.d.ts +0 -26
  779. package/dist/webhook/receiver.d.ts.map +0 -1
  780. package/dist/webhook/receiver.js +0 -24
  781. package/dist/webhook/receiver.js.map +0 -1
  782. package/dist/webhook/signature.d.ts +0 -3
  783. package/dist/webhook/signature.d.ts.map +0 -1
  784. package/dist/webhook/signature.js +0 -7
  785. package/dist/webhook/signature.js.map +0 -1
  786. package/dist/workflow/manifest.d.ts +0 -22
  787. package/dist/workflow/manifest.d.ts.map +0 -1
  788. package/dist/workflow/manifest.js +0 -21
  789. package/dist/workflow/manifest.js.map +0 -1
  790. package/dist/workflow/registry.d.ts +0 -7
  791. package/dist/workflow/registry.d.ts.map +0 -1
  792. package/dist/workflow/registry.js +0 -18
  793. package/dist/workflow/registry.js.map +0 -1
  794. package/dist/workflow/templates.d.ts +0 -6
  795. package/dist/workflow/templates.d.ts.map +0 -1
  796. package/dist/workflow/templates.js +0 -18
  797. package/dist/workflow/templates.js.map +0 -1
  798. package/dist/workflow/triggers.d.ts +0 -64
  799. package/dist/workflow/triggers.d.ts.map +0 -1
  800. package/dist/workflow/triggers.js +0 -99
  801. package/dist/workflow/triggers.js.map +0 -1
  802. /package/{extension/README.md → docs/extension.md} +0 -0
@@ -0,0 +1,49 @@
1
+ # Saddle 1.8.19 planning base
2
+
3
+ ## Product direction
4
+
5
+ Saddle 1.8.19 prioritizes a **virtual control plane**. The library can represent, validate, compare, deny and hand off requests for virtual storage, binary processing, containers, micro-VMs and browser sessions. It does not silently access a user's device, installed browser, browser profile, local files, local storage, credentials, process table or network configuration.
6
+
7
+ “Virtual” is an operational property of a caller-owned remote adapter and its host. A browser-only demonstration, an in-memory object or an in-process cache cannot be represented as a virtual machine, remote browser or remote storage service. Every operational effect requires an explicit policy, approval, named adapter and receipt.
8
+
9
+ ## Browser direction
10
+
11
+ | Surface | 1.8.19 interpretation | Operational boundary |
12
+ | --- | --- | --- |
13
+ | Saddle Browser | A custom visual shell, session manifest and adapter-selection surface. | It becomes a remote isolated browser only when a caller supplies a verified browser-runtime adapter. |
14
+ | Chromium family | Capability adapters for Chromium, Chrome, Edge, Brave, Vivaldi, Opera and compatible distributions. | One selected remote image or executable has one declared engine and distribution; the root does not install or control it. |
15
+ | Gecko family | Capability adapters for Firefox, Tor Browser and compatible Gecko distributions. | A Gecko adapter is distinct from a Chromium adapter and must have its own capability receipt. |
16
+ | WebKit family | A future capability adapter family, included in planning for broad engine coverage. | No WebKit runtime is claimed or activated by 1.8.19 planning. |
17
+ | Remote browser service | An adapter contract compatible with an operator-hosted browser container or remote-display service. | It requires a host, runtime/image, network and authentication policy owned by the operator. |
18
+
19
+ The product must not claim that a single “master browser” merges the Chromium and Gecko engines. The realistic path is one custom Saddle Browser experience that selects among independently built and independently evidenced engine adapters.
20
+
21
+ ## Virtual execution direction
22
+
23
+ | Request | Root-library result | Required operational adapter |
24
+ | --- | --- | --- |
25
+ | Remote artifact transfer | A bounded storage plan, policy decision and handoff reference. | A caller-owned remote storage adapter. |
26
+ | Binary processing | An inspection, transform or execution plan with no local effect. | A caller-owned WASM, container, process, micro-VM or remote-runner adapter. |
27
+ | Container job | An image, platform, limits and receipt requirement. | An operator-owned OCI runtime and host. |
28
+ | Micro-VM job | Kernel/image/limit/network requirements and a lifecycle receipt schema. | An operator-owned micro-VM host with real virtualization support. |
29
+ | Browser session | Engine preference, profile policy, network policy and capability request. | An operator-owned remote-browser adapter. |
30
+
31
+ ## Neko-derived architecture evidence
32
+
33
+ Neko describes itself as a self-hosted virtual browser that runs in Docker and streams a desktop using WebRTC. Its public GitHub workflow builds a base image and separate application images through a matrix of browser and desktop choices, with platform declarations rather than a merged browser engine.[1] Its documentation makes file uploads/downloads and persistent browser profiles explicit policy changes, and its remote transport requires WebRTC networking or a TURN configuration.[2]
34
+
35
+ Saddle can adopt these **architectural lessons** without copying Neko or assuming its infrastructure exists: use a base runtime plus distinct engine images, record platform/image capability receipts, treat remote display as a transport adapter, keep browser profile persistence opt-in, and separate build workflows from service operation. A Neko-compatible adapter remains a future integration point; it is not an embedded service in the package.
36
+
37
+ ## 1.8.19 first implementation selection
38
+
39
+ The first implementable block is an additive **remote-browser capability contract** that extends the 1.8.18 denied-by-default isolation API. It must represent engine family, distribution, session policy, display transport, image reference, storage policy, capability receipt and adapter handoff. Deterministic tests will verify selection and denial states without starting a browser, container, micro-VM or network service.
40
+
41
+ ## Artifact recovery boundary
42
+
43
+ The public `v1.8.18` tag and the packages already released from it remain immutable. Failed desktop and mobile release jobs used the tagged source that predated the web alias correction. Rerunning such a job would repeat the old source failure; a complete corrected desktop/mobile asset matrix therefore requires a later version after the 1.8.19 source is approved. The 1.8.18 package registries, Pages deployment and successful workflow evidence remain separate from missing release attachments.
44
+
45
+ ## References
46
+
47
+ [1] [Neko repository and GHCR image build workflow](https://github.com/m1k1o/neko)
48
+
49
+ [2] [Neko documentation: browser images, WebRTC, storage and profile policies](https://neko.m1k1o.net/docs/v2)
@@ -0,0 +1,35 @@
1
+ # Saddle 1.8.19 release notes
2
+
3
+ ## Release intent
4
+
5
+ Version **1.8.19** reorganizes the existing Saddle implementation into **twenty correlated logic domains**. It is an architecture and maintainability release: it does not remove public features, introduce an implicit infrastructure provider, or relax the existing default-denial boundaries for browser, filesystem, storage, network, runner and remote-provider effects.
6
+
7
+ ## Architecture changes
8
+
9
+ | Domain change | Result | Compatibility boundary |
10
+ | --- | --- | --- |
11
+ | Public root router | The package root re-exports coherent domain façades rather than a long undifferentiated module list. | The root remains transport-neutral. |
12
+ | Foundation and execution | Domain nouns moved into `core/`; queues, workflow dispatch and session behavior moved into `runtime/`. | Published session and queue subpaths resolve to their new compiled files. |
13
+ | Communication and adapters | JSON-family protocol, webhook and MCP logic moved into API and adapter contexts. | API names and MCP command behavior remain unchanged. |
14
+ | Automation and modes | Workflow, bot and automation surfaces share an automation context; target profiles belong to modes. | Bot and surface-requirement subpaths remain available. |
15
+ | Distribution and acquisition | Delivery and proxy-pool logic now live beside their related package and scrape contracts. | Delivery and deploy subpaths remain available. |
16
+
17
+ The complete ownership map and dependency-flow diagram are included with the package documentation. The only allowed effects remain caller-owned adapters that are explicitly supplied and approved at invocation time.
18
+
19
+ ## Package and native metadata
20
+
21
+ | Surface | Active version |
22
+ | --- | --- |
23
+ | npm, Maven, NuGet and RubyGems | `1.8.19` |
24
+ | Desktop and extension | `1.8.19` |
25
+ | Capacitor mobile metadata | `1.8.19` |
26
+ | iOS marketing version / build number | `1.8.19` / `1008019` |
27
+ | Robots user agent | `Saddle/1.8.19` |
28
+
29
+ ## Validation evidence
30
+
31
+ The source tree passed the engine build, **140 active Node tests**, **69 legacy Vitest tests**, web type checking and production build, flat-native ownership validation, format checking, npm pack dry-run, diff integrity checking, and a production dependency audit with no reported vulnerabilities. A web build produced a bundle-size advisory for a JavaScript chunk over 500 kB; this is a non-blocking bundler warning, not a failing gate.
32
+
33
+ ## Release boundary
34
+
35
+ This document records publication readiness only. It does **not** claim that registries, remote runners, signing services, hosted browsers or native packages have been activated. A tag and release remain separate operator actions and must be created only after the validated commit is available on the main branch.
@@ -0,0 +1,27 @@
1
+ # 1.8.19 virtual browser research record
2
+
3
+ ## Scope
4
+
5
+ This record evaluates Neko as a public reference for remote browser architecture. It is not an instruction to deploy Neko, a Docker runtime, a TURN server, a browser image or a micro-VM.
6
+
7
+ ## Findings
8
+
9
+ | Finding | Planning consequence |
10
+ | --- | --- |
11
+ | Neko is self-hosted, uses Docker and streams a desktop through WebRTC. | A browser service requires an operator-managed runtime, network and remote-display transport; it cannot live inside a static package or GitHub Pages site. |
12
+ | Neko's GHCR workflow builds a base image then runs a matrix for separate Firefox, Chromium, Chrome, Edge, Brave, Vivaldi, Opera, Tor Browser and desktop images. | Saddle should model engine and distribution selection as separate capabilities rather than claim source-level fusion of browser engines. |
13
+ | Neko treats file access and browser profile persistence as explicit configuration changes. | Saddle must keep transfers, downloads, uploads and persistence denied by default and adapter-owned. |
14
+ | Neko's remote interaction relies on WebRTC networking, with additional TURN or port configuration in some deployments. | A Saddle remote-browser adapter needs display transport, signaling, authentication and network-policy declarations before a real session can be claimed. |
15
+ | Neko supports other Linux desktop applications in addition to browsers. | Saddle can generalize its remote-runner contract beyond browsers while keeping every effect outside the root library. |
16
+
17
+ ## Disposition
18
+
19
+ 1.8.19 will introduce a data-only remote-browser capability model and test fixtures first. It will not bundle Neko, browser binaries, Docker, container images, TURN credentials, browser profiles or a persistent remote browser service. Those are future caller-selected adapters and operator deployments.
20
+
21
+ ## Sources
22
+
23
+ - https://github.com/m1k1o/neko
24
+ - https://raw.githubusercontent.com/m1k1o/neko/master/.github/workflows/ghcr.yml
25
+ - https://raw.githubusercontent.com/m1k1o/neko/master/.github/workflows/image_base.yml
26
+ - https://raw.githubusercontent.com/m1k1o/neko/master/.github/workflows/image_app.yml
27
+ - https://neko.m1k1o.net/docs/v2
@@ -0,0 +1,454 @@
1
+ # Security - The 2026 Defense Stack
2
+
3
+ e2ugh protects untrusted code execution with a layered 2026 defense stack:
4
+ Landlock, seccomp, eBPF LSM, cgroups v2, post-quantum TLS, CRIU with SELinux
5
+ relabeling, and confidential-computing tiers (Intel TDX, AMD SEV-SNP). None of
6
+ these layers requires root at sandbox runtime, and each one fails closed. This
7
+ document specifies what each layer does, the exact kernel or library versions
8
+ that provide it, the threat model of the engine's own spoofing surface, and
9
+ the hardening pipeline that guards the repository itself. All facts were
10
+ verified against primary sources on 2026-08-22 (date-first discipline; version pins re-verified 2026-08-23) and are
11
+ implemented in `security.ts` (1,302 lines). The sandbox engines themselves
12
+ (QEMU 11.1.0, Firecracker 1.16.1, gVisor release-20260817.0, Kata 4.1.0,
13
+ Cloud Hypervisor v53.0) are described in `virtualization.md`; their selection
14
+ policy lives in `alternatives.md`.
15
+
16
+ Contexts covered (25): Landlock ABI v1-v10 timeline, unprivileged sandboxing,
17
+ LANDLOCK_ACCESS_FS_IOCTL_DEV, scopes, abstract UNIX sockets, SIGSYS,
18
+ SECCOMP_RET_TRAP, gVisor systrap, deny-by-default profiles, io_uring blocked,
19
+ CVE-2026-46315, moby 47532, task-level io_uring restrictions, eBPF LSM,
20
+ TOCTOU immunity, Hornet LSM v6, cgroups v2 rootless delegation, ML-KEM
21
+ FIPS 203, ML-DSA FIPS 204, X25519MLKEM768, RFC 10024, ChaCha20-Poly1305,
22
+ CRIU SELinux relabel, TDX, SEV-SNP.
23
+
24
+ ## Contents
25
+
26
+ 1. [Threat model of the spoofing surface](#threat-model)
27
+ 2. [Landlock: unprivileged sandboxing at ABI v10](#landlock)
28
+ 3. [seccomp: the syscall filter baseline](#seccomp)
29
+ 4. [io_uring: the 2026 security pariah](#io-uring)
30
+ 5. [eBPF and the eBPF LSM](#ebpf-lsm)
31
+ 6. [cgroups v2: unified hierarchy and rootless delegation](#cgroups)
32
+ 7. [Post-quantum TLS](#pqc)
33
+ 8. [CRIU and SELinux relabeling on restore](#criu-relabel)
34
+ 9. [Confidential computing: TDX and SEV-SNP](#confidential)
35
+ 10. [The GPU virtual identity surface](#gpu-virtual identity)
36
+ 11. [Network and checkpoint security](#network)
37
+ 12. [Container hardening](#hardening)
38
+ 13. [Layer composition in security.ts](#composition)
39
+ 14. [Repository hardening pipeline](#pipeline)
40
+ 15. [Sources](#sources)
41
+
42
+ ## Threat model of the spoofing surface
43
+
44
+ e2ugh spoofs hardware identity (CPU model, memory size, GPU inventory) so
45
+ that software probing the sandbox believes it runs on high-end hardware. This
46
+ is an identity claim, not an isolation claim, and the threat model states both
47
+ directions explicitly: spoofing changes what the workload sees, never what the
48
+ operator gets.
49
+
50
+ | Asset | What spoofing protects | What spoofing does not protect |
51
+ |---|---|---|
52
+ | /proc/cpuinfo, /proc/meminfo | Workloads that gate on hardware identity (installer checks, license probes, benchmark harnesses) see the virtual board | An attacker using CPUID directly sees the real host CPU; only a VM (QEMU `-cpu EPYC-v5`) shapes CPUID |
53
+ | nvidia-smi / NVML | Tooling that reads NVML or parses nvidia-smi output reports the virtual GPU inventory | Any attempt to execute real CUDA kernels fails without actual GPUs; PCI device IDs on the bus are real |
54
+ | OpenCL/Vulkan device reports | clinfo and vulkaninfo report GPU-class devices backed by Rusticl and lavapipe | Rendering and compute still consume host CPU; there is no confidentiality effect at all |
55
+ | Resource limits | Generous shm and swap semantics prevent workload failures | A determined attacker can measure real throughput and infer the absence of hardware acceleration |
56
+
57
+ Accepted risks, stated plainly: timing side channels reveal software
58
+ rendering; CPUID on the bare host (outside QEMU) reveals the true processor;
59
+ and a static binary that issues raw syscalls bypasses LD_PRELOAD
60
+ interposition entirely (Go static builds, musl static builds). That last gap
61
+ is the reason identity spoofing is layered under QEMU or gVisor for hostile
62
+ workloads rather than standing alone; the full interposition analysis lives
63
+ in `viability.md` (honest limitations).
64
+
65
+ What the defense stack actually protects: untrusted code cannot escape
66
+ through the syscall surface (seccomp deny-by-default plus Landlock at the ABI
67
+ level the host kernel provides), cannot exhaust the host (cgroups v2 cpu,
68
+ memory, io, pids), cannot reach adjacent services (Landlock scopes and the
69
+ network policy in `passage.config`), cannot use io_uring (blocked everywhere
70
+ by default), and control traffic resists future cryptanalysis (hybrid
71
+ post-quantum TLS). VM-backed sandboxes add the full hypervisor boundary, with
72
+ the engine choosing Firecracker, QEMU, Cloud Hypervisor or Kata per the
73
+ selection policy documented in `alternatives.md`.
74
+
75
+ ## Landlock: unprivileged sandboxing at ABI v10
76
+
77
+ Landlock is an unprivileged, stackable LSM: any process can restrict itself
78
+ without root, CAP_SYS_ADMIN, or help from a supervisor. The mainline kernel
79
+ has reached ABI v10, which turns Landlock into a complete sandboxing
80
+ primitive (filesystem, TCP, UDP, IPC, signals) that layers on top of seccomp
81
+ rather than replacing it.
82
+
83
+ | ABI | Kernel | Capability added |
84
+ |---|---|---|
85
+ | v1 | 5.13 | Filesystem access rights (execute, write_file, read_file, read_dir, remove_dir, remove_file, make_*) |
86
+ | v2 | 5.19 | Refer and directory changes (linking/renaming across hierarchies) |
87
+ | v3 | 6.2 | File truncate |
88
+ | v4 | 6.7 | Network: TCP bind and connect |
89
+ | v5 | 6.10 | LANDLOCK_ACCESS_FS_IOCTL_DEV (device ioctls) |
90
+ | v6 | 6.12 | Scopes: abstract UNIX socket restriction and signal restriction (SIGSYS on violation) |
91
+ | v7 | 6.15 | Audit logging of denials |
92
+ | v8 | 6.16 | RESTRICT_SELF TSYNC: no_new_privs propagation to multi-threaded processes |
93
+ | v9 | 6.17 | RESOLVE_UNIX scope for path resolution |
94
+ | v10 | 6.20 | Network: UDP bind, connect and send |
95
+
96
+ Engine usage facts, as implemented in `security.ts`: the ABI level is probed
97
+ at runtime through `landlock_create_ruleset(NULL, 0,
98
+ LANDLOCK_CREATE_RULESET_VERSION)`, the applied ruleset is restricted to the
99
+ features the running kernel actually supports, and every probe failure
100
+ degrades to the remaining layers instead of aborting the sandbox. Hosts older
101
+ than 6.7 get filesystem-only Landlock; hosts on 6.20 or later get the full
102
+ unprivileged sandbox with TCP and UDP control. The v6 scopes matter most for
103
+ this engine: they cut the abstract UNIX socket channel that would otherwise
104
+ let a sandboxed process talk to an unconfined local service, which is the
105
+ classic container-escape relay.
106
+
107
+ ## seccomp: the syscall filter baseline
108
+
109
+ seccomp filters syscalls with BPF programs installed by the process itself
110
+ (or its supervisor) before untrusted code runs. The engine builds
111
+ deny-by-default filters: every syscall not explicitly allowed returns an
112
+ error, matching the Docker default-profile behavior of returning ENOSYS so
113
+ denied calls look absent rather than merely forbidden.
114
+
115
+ | Action | Result for the calling thread |
116
+ |---|---|
117
+ | SECCOMP_RET_KILL_PROCESS | Process killed immediately |
118
+ | SECCOMP_RET_KILL_THREAD | Offending thread killed |
119
+ | SECCOMP_RET_TRAP | SIGSYS delivered to the thread; the call appears to return with an error |
120
+ | SECCOMP_RET_ERRNO | Configured errno returned (the engine uses 38, ENOSYS) |
121
+ | SECCOMP_RET_USER_NOTIF | Supervisor notified and decides; the fd-injection ioctl enables file-descriptor substitution |
122
+ | SECCOMP_RET_TRACE / LOG / ALLOW | Ptrace observation, logging, or pass-through |
123
+
124
+ Three placements of the same mechanism appear across the stack:
125
+
126
+ 1. gVisor systrap. The gVisor Sentry itself is entered through
127
+ SECCOMP_RET_TRAP: every guest syscall raises SIGSYS, and the signal
128
+ handler in the Sentry emulates the call in userspace. RET_TRAP is thus the
129
+ foundation of the default gVisor platform (release-20260817.0), not merely
130
+ a debugging tool.
131
+ 2. Second-layer seccomp inside gVisor. The Sentry additionally installs its
132
+ own seccomp-bpf filter to constrain which syscalls can even reach the
133
+ Sentry - defense in depth inside the sandbox runtime itself.
134
+ 3. The engine profile. `security.ts` ships a Docker-default-compatible
135
+ profile allowing roughly 140 syscalls with the privileged set denied, and
136
+ a policy proxy that hard-fails any profile build that does not deny the
137
+ io_uring family (next section).
138
+
139
+ ## io_uring: the 2026 security pariah
140
+
141
+ io_uring is the kernel's high-performance asynchronous I/O subsystem, and as
142
+ of 2026 it is treated as a sandbox liability across the industry. The engine
143
+ position is simple: the io_uring family stays blocked in every sandbox
144
+ profile, and the performance cost is accepted (asynchronous file I/O inside
145
+ sandboxes uses thread pools instead). The kernel-side velocity work that uses
146
+ io_uring on the host (ZCRX receive, NVMe passthrough) is documented in
147
+ `performance.md` and operates outside the sandbox boundary.
148
+
149
+ | Actor | Position on io_uring in sandboxes |
150
+ |---|---|
151
+ | Docker default seccomp profile | Blocks io_uring syscalls since moby issue 47532 |
152
+ | gVisor | io_uring disabled by default in runsc |
153
+ | Kubernetes v1.33 audit and CIS benchmarks | Recommend blocking io_uring in container profiles |
154
+ | CVE record | CVE-2026-46315 (June 2026): information disclosure through io_uring |
155
+ | LWN, January 2026 | Task-level io_uring restrictions patchset: per-task limits designed to compose with seccomp, addressing the fact that SQPOLL and kernel-side offload can bypass a naive seccomp filter |
156
+
157
+ On x86_64 the blocked syscall numbers are io_uring_setup (425),
158
+ io_uring_enter (426) and io_uring_register (427). The engine denies the
159
+ family with ENOSYS, logs each denial as a policy audit event, and tracks the
160
+ LWN task-level restriction work as the only credible future path toward
161
+ re-enabling io_uring for trusted workloads.
162
+
163
+ ## eBPF and the eBPF LSM
164
+
165
+ The eBPF LSM (Linux Security Module) interface, available since kernel 5.7,
166
+ attaches verified BPF programs to LSM hooks. The property that distinguishes
167
+ it from tracepoints and syscall tracing is TOCTOU immunity: LSM hooks execute
168
+ at the exact kernel decision point (file open, credential change, socket
169
+ operation), so there is no gap between the observation and the enforcement in
170
+ which an attacker could change the target object. Tracepoint-based policy
171
+ suffers precisely that gap - check-then-bind races - which is why the engine
172
+ treats eBPF LSM as the audit plane and ptrace/strace as debug-only tools
173
+ (measured in `performance.md`: eBPF tracing at 2 percent overhead versus
174
+ strace at 12x slowdown).
175
+
176
+ | Fact | Detail |
177
+ |---|---|
178
+ | Availability | Kernel 5.7 and later; enabled through the BPF LSM in the kernel security list (`/sys/kernel/security/lsm`) |
179
+ | Verification | Programs are verified by the kernel verifier at load time; hooks cannot corrupt kernel state |
180
+ | Hornet LSM v6 (April 2026) | Verifies eBPF program signatures in-kernel, closing the gap where an attacker with root loads a hostile BPF policy |
181
+ | Cloudflare practice | Uses eBPF LSM to live-patch vulnerability classes (CVE-2024-1086-style exploitation paths) on running fleets without rebooting |
182
+
183
+ The engine attaches counters to security_file_open, security_socket_create
184
+ and related hooks for intrusion telemetry, and uses a tracepoint on
185
+ sys_enter_io_uring_setup purely to count denied async I/O attempts. BPF
186
+ programs are never loaded inside sandboxes; they observe the host side only,
187
+ keeping the sandbox footprint free of privileged eBPF usage. The broader eBPF
188
+ networking and observability surfaces (XDP at 14 Mpps, ring buffers, Tetragon
189
+ per-VM syscall filtering, BPF arenas on kernel 6.17) are specified in
190
+ `performance.md` (observability) and `virtualization.md` (passage).
191
+
192
+ ## cgroups v2: unified hierarchy and rootless delegation
193
+
194
+ cgroups v2 provide the resource envelope every other layer sits inside. The
195
+ unified hierarchy is the default on every modern distribution (RHEL 9 and
196
+ later, Ubuntu, Arch; managed by systemd), and the controllers the engine
197
+ uses are cpu, memory, io and pids. The multi-tenant scheduler (MTTG) that
198
+ consumes this layer is documented in `virtualization.md`; this section
199
+ covers only the security-relevant envelope.
200
+
201
+ | Controller | Engine setting | Purpose |
202
+ |---|---|---|
203
+ | cpu.max | Quota and period | CPU bandwidth per sandbox, maps Docker --cpus |
204
+ | cpu.weight | 1-10000 | Relative share under contention, per tenant QoS class |
205
+ | memory.max | Hard limit | Resident memory ceiling |
206
+ | memory.high | Soft throttle | Backpressure before the hard ceiling |
207
+ | memory.swap.max | Swap limit | Composes with --memory-swap -1 (unlimited) on the Docker path |
208
+ | pids.max | Process ceiling | Fork-bomb containment inside the sandbox |
209
+ | io.max / io.weight | Device I/O limits | Writeback-aware I/O control on the unified hierarchy |
210
+
211
+ Delegation is the reason rootless operation works: systemd subtree delegation
212
+ hands a cgroup subtree to an unprivileged user, and Podman and Docker rootless
213
+ use exactly that mechanism to run the whole container stack without root. The
214
+ engine writes its cgroup layout only into delegated subtrees and refuses to
215
+ touch the host root cgroup. This layer is what makes the Docker memory flags
216
+ from `performance.md` enforceable rather than advisory.
217
+
218
+ ## Post-quantum TLS
219
+
220
+ Transport security in 2026 is post-quantum by default on this stack,
221
+ protecting sandbox control traffic against harvest-now-decrypt-later
222
+ collection.
223
+
224
+ | Primitive | Standard | Status in the engine stack |
225
+ |---|---|---|
226
+ | ML-KEM | FIPS 203 | Module-lattice key encapsulation; native in OpenSSL 3.5 |
227
+ | ML-DSA | FIPS 204 | Module-lattice signatures; native in OpenSSL 3.5 |
228
+ | SLH-DSA | FIPS 205 | Hash-based signatures; available for long-lived keys |
229
+ | X25519MLKEM768 | RFC 10024 mechanism | Hybrid classical-plus-PQ group; default TLS 1.3 key exchange in OpenSSL 3.5 |
230
+ | RFC 10024 | Published 2026-08-10 | Standardizes the PQ/T hybrid mechanisms for TLS 1.3 |
231
+ | ChaCha20-Poly1305 | RFC 8439 | Symmetric AEAD fallback for hosts without AES-NI |
232
+
233
+ The deployment consequence the engine relies on: OpenSSL 3.5 LTS ships
234
+ X25519MLKEM768 as the default TLS 1.3 group, and Node 24 bundles OpenSSL
235
+ 3.5.5, so any TLS connection the orchestrator or the sandbox SDK makes
236
+ negotiates a hybrid post-quantum key exchange with zero additional code. The
237
+ secure-context builder in `security.ts` still pins the group list
238
+ (`X25519MLKEM768:X25519`) and TLS 1.3 as the minimum version so the guarantee
239
+ survives configuration drift. Client-side deployment is broad: Chrome,
240
+ Firefox and Brave prefer PQ groups, Cloudflare terminates them globally, and
241
+ AWS exposes PQ TLS in KMS, ACM and Secrets Manager. For symmetric encryption
242
+ on hosts without AES-NI, ChaCha20-Poly1305 remains the correct AEAD:
243
+ AES-256-GCM is up to three times faster with AES-NI, but ChaCha20 wins on
244
+ hardware without that acceleration (typical ARM and older x86_64 hosts), and
245
+ the cipher list keeps it available as the fallback. The same ChaCha20 stream
246
+ also encrypts CRIU checkpoint images (section on restore below).
247
+
248
+ In code, `security.ts` owns this surface end to end - the v3 redistribution
249
+ moved the post-quantum feature set out of the retired `future.ts` and back
250
+ into the security domain. Two symbols carry it: the `Rfc10024` negotiator
251
+ selects and pins the hybrid group list (X25519MLKEM768 first, X25519
252
+ classical fallback), and `PqcAuditTrail` is the tamper-evident chain for
253
+ every post-quantum key operation: append-only, hash-linked entries with an
254
+ ML-DSA signature over each link, so negotiation drift and key-usage anomalies
255
+ are detectable after the fact, not merely preventable. RFC 10024 was
256
+ published 2026-08-10 and standardizes exactly these PQ/T hybrid mechanisms
257
+ for TLS 1.3.
258
+
259
+ ## CRIU and SELinux relabeling on restore
260
+
261
+ CRIU v4.2.1 checkpoints and restores process trees, and the restore path is
262
+ where label hygiene matters: an image dumped from an SELinux-confined process
263
+ must not come back with a different or missing label. CRIU supports LSM
264
+ profile restoration (`--lsm-profile selinux:<label>`), so restored processes
265
+ re-enter their original SELinux context. The `criurelabel` planner in
266
+ `security.ts` emits the relabel arguments plus a `chcon` fallback for image
267
+ trees when the CRIU build lacks the LSM option, and a policy audit event
268
+ records every relabel. Checkpoint images themselves are encrypted with
269
+ ChaCha20-Poly1305 (RFC 8439), so a stolen snapshot file does not leak guest
270
+ memory. This closes the loop with the checkpoint/restore usage described in
271
+ `virtualization.md`: warm starts must not become a downgrade attack on
272
+ label-based isolation.
273
+
274
+ ## Confidential computing: TDX and SEV-SNP
275
+
276
+ For deployments where even the host operator is untrusted, the engine plans
277
+ two hardware confidential-computing tiers. QEMU 11.1.0 exposes both machine
278
+ types directly: `tdx-guest` with `sept-ve-disabled`, and `sev-snp-guest`
279
+ with `cbitpos=51 reduced-phys-bits=1` (both wired through the QEMU wrapper in
280
+ `virtualization.ts`). This section carries 27 documented contexts from the
281
+ 2026-08-22 research pass.
282
+
283
+ | Context | Verified fact |
284
+ |---|---|
285
+ | Intel TDX baseline | TDX support improved through QEMU 10.1 and solidified in 11.1 |
286
+ | TDX module live update | Linux 7.2 updates the TDX module without reboot |
287
+ | TDX guest flag | `-machine q35 -object tdx-guest,sept-ve-disabled=on` in the QEMU wrapper |
288
+ | CVE-2026-20885 | TDX module vulnerability, INTEL-SA-01436, disclosed March 2026 |
289
+ | Google + Intel joint audit | 9 months, 10 security issues found and fixed |
290
+ | AMD SEV-SNP host floor | QEMU 9.2 host stack, kernel 6.14, Ubuntu 25.04 |
291
+ | SEV-SNP launch measurement | Attested launch measurement over guest memory |
292
+ | Attestation standards | RATS RFC 9334, AMD KDS, NVIDIA NRAS remote attestation |
293
+ | SVSM | VMPL2 vTPM, stateful, with virtio-blk backing |
294
+ | Key Broker Service | Trustee 0.12.0 KBS proxy for secret release |
295
+ | Secret injection | SEV secret area via config table; OVMF encrypted boot; Grub FV |
296
+ | Kata confidential pod | kata-qemu-nvidia-gpu-snp runtime class through CRI-O |
297
+ | Confidential GKE Nodes | H100 GA on Google Cloud (Blackwell generation announced) |
298
+ | Post-quantum attestation | Phase 4: Dilithium/ML-DSA signatures in the attestation chain |
299
+ | Other TEEs | Intel SGX, ARM CCA (Realm Management Extension) |
300
+ | Device migration | VFIO migration protocol v2 (QEMU 8.0+) for passthrough devices |
301
+
302
+ Positioning inside e2ugh: confidential tiers are optional depth rungs on the
303
+ detection-isolation ladder. The spoofing thesis (see `viability.md`) does not
304
+ require them; they exist for operators who must also defend the host-side
305
+ boundary against physical inspection. The GPU angle matters here too:
306
+ confidential computing with GPUs (MIGv2 plus CC mode on Blackwell, driver
307
+ 570.124+) is tracked in `hardware.md`.
308
+
309
+ ## The GPU virtual identity surface
310
+
311
+ The GPU identity layer rests on four public interception libraries, each
312
+ covering a different read channel. From a security standpoint these are
313
+ presence spoofing only - they answer inventory questions, never execute
314
+ kernels on silicon - and their honest limits are analyzed in `viability.md`.
315
+
316
+ | Library | Mechanism | Security-relevant scope |
317
+ |---|---|---|
318
+ | pogusthewhisper/fake-nvidia-smi | Pure-Python (stdlib only) fake CLI with flex profiles h100 81,559 MiB and a100 40,536 MiB | Replaces one binary; byte-format matches the NVIDIA manual (driver 575.57.08, CUDA 12.9) |
319
+ | x0x0x00/gpuadapter | CUDA API interception: libcuda, libcudart, libcublas, libnccl via LD_PRELOAD (DYLD on macOS); `--devices "a100:2,h100:2"` profiles | Interposes the CUDA surface itself; includes virtual nvidia-smi adapter --query-gpu, topo, MIG views |
320
+ | rick-hsu/nvml-unified-shim | libnvidia-ml shim; nvmlDeviceGetCount falls back to cudaGetDeviceCount; GB10/Blackwell era | Serves NVML readers (pynvml, gpustat) without a driver |
321
+ | ssst0n3/fake-nvidia | Stub kernel module plus libnvidia-ml.so.1 returning false inventories | Kernel-adjacent tier for hosts that probe module state |
322
+
323
+ The fourth entry is the only one that touches kernel territory, and the
324
+ engine treats it as out of scope for sandbox deployments: loading modules
325
+ defeats the rootless property that the rest of the stack preserves. The
326
+ engine's own SMI table renderer (in `render.ts` and the Python bridge
327
+ `qemubridge.py`) generates the same vocabulary (`memory.total`,
328
+ `utilization.gpu`) as the public libraries, keeping the surface auditable in
329
+ one place.
330
+
331
+ ## Network and checkpoint security
332
+
333
+ The passage data-plane (six modes, from direct to zero-trust) is specified in
334
+ `virtualization.md`; this section fixes the security constants that survive
335
+ across all modes.
336
+
337
+ | Control | Setting |
338
+ |---|---|
339
+ | Gateway TLS | TLS 1.3 only (min and max), ciphers TLS_AES_128_GCM_SHA256, TLS_AES_256_GCM_SHA384, CHACHA20_POLY1305_SHA256; curves X25519, P-256, P-384; ALPN h2, h3 |
340
+ | Snapshot rollback | Five phases: detect (circuit breaker opens after 5 failures) - quiesce (guest-agent fs-freeze, pipeline drain) - loadvm - verify - reattach (network reattach plus GPU rebind through a fresh iommufd object) |
341
+ | Write-ahead log | Append-only JSONL per VM; idempotency token via node:crypto randomUUID; duplicates deduplicated on replay |
342
+ | Audit | RBAC roles admin/tenant/developer; immutable per-tenant JSONL audit log; OTEL audit_logged counter |
343
+ | Admission | seccomp plus AppArmor profiles on every gateway process |
344
+
345
+ Endpoint discipline: every listener binds to a user-resolved host on a
346
+ cryptographically random port (crypto.randomInt in the 30000-59999 band); no
347
+ component of the engine ever hardcodes an address, and the guards in
348
+ `orchestrator.ts` reject loopback defaults at construction time.
349
+
350
+ ## Container hardening
351
+
352
+ Per-runtime hardening beyond the shared profile:
353
+
354
+ | Runtime | Hardening stack |
355
+ |---|---|
356
+ | Firecracker 1.16.1 | jailer (cgroup v2, netns, chroot, seccomp), api-sock on a locked-down Unix socket |
357
+ | gVisor release-20260817.0 | systrap platform (RET_TRAP), second-layer seccomp, DirectFS only where needed |
358
+ | Kata 4.1.0 | runtime-rs rootless baseline plus seccomp on the QEMU hypervisor process |
359
+ | Cloud Hypervisor v53.0 | seccomp profile on the VMM thread; vfio-user devices through validated sockets |
360
+ | Docker 29.7.2 path | no-new-privileges, Tini as PID 1, `--read-only` rootfs with tmpfs carve-outs, AutoRemove |
361
+
362
+ The engine-level composition adds Landlock scopes on top of whichever
363
+ runtime tier is active, so a sandbox that somehow reaches an unconfined
364
+ process still cannot open abstract UNIX sockets or send signals outside its
365
+ group on kernels 6.12+.
366
+
367
+ ## Layer composition in security.ts
368
+
369
+ The shipped profile composes four layers, each deny-by-default, each failing
370
+ closed:
371
+
372
+ 1. Landlock ruleset (ABI-probed): read-only trees, write trees, device
373
+ ioctl gate, TCP and UDP scopes where the kernel supports them, abstract
374
+ UNIX socket and signal scopes.
375
+ 2. seccomp filter: roughly 140 allowed syscalls, privileged set denied with
376
+ ENOSYS, io_uring family denied unconditionally; profile builds that omit
377
+ the io_uring denial refuse to compile.
378
+ 3. cgroups v2: cpu, memory, swap, pids and io limits inside a delegated
379
+ subtree only.
380
+ 4. CRIU restore policy: SELinux relabel mandatory unless explicitly
381
+ disabled, every override audited.
382
+
383
+ A security self-check runs at engine startup: it verifies the Landlock ABI
384
+ level of the host, confirms the seccomp profile denies io_uring_setup,
385
+ checks that cgroup writes land in the delegated subtree, confirms the TLS
386
+ group list starts with X25519MLKEM768, and reports each result as a
387
+ pass/fail fact rather than a silent default. Runtime smoke checks recorded
388
+ during the v2 build: `detectlandlockabi('6.20.0')` returns 10, and the
389
+ seccomp builder's io_uring_setup denial evaluates true on every profile.
390
+
391
+ ## Repository hardening pipeline
392
+
393
+ The repository guards itself with the `security.yml` workflow (eight gates,
394
+ all pinned to versions verified 2026-08-22). The workflow file carries the
395
+ authoritative configuration; this section summarizes the gates and their
396
+ blocking semantics.
397
+
398
+ | Gate | Tool (pinned version) | Blocks on |
399
+ |---|---|---|
400
+ | CodeQL | github/codeql-action@v4.37.8, languages cpp + javascript-typescript | Any query result at the configured severities; C/C++ uses manual build-mode extraction over libs/ |
401
+ | Dependency review | actions/dependency-review-action@v5.0.0 | High or critical advisories and incompatible licenses on PRs and main pushes |
402
+ | Container scan | Dockle v0.4.15 and Trivy v0.36.0 | Dockle FATAL findings; Trivy CRITICAL CVEs (ignore-unfixed), SARIF uploaded to code scanning |
403
+ | Secret scan | gitleaks-action@v3.0.0, full git history (fetch-depth 0) | Any detected credential in any commit |
404
+ | Scorecard | ossf/scorecard-action@v2.4.4 | Results published to the public Scorecard API (weekly plus main pushes) |
405
+ | Biome security | @biomejs/biome@2.5.11, security group at error severity | noSecrets (error level on json/yml/toml/env overrides), noGlobalEval, noDangerouslySetInnerHtml |
406
+ | License check | license-checker, permissive allow list (MIT, Apache-2.0, ISC, BSD, 0BSD, Unlicense, CC0, Zlib, MPL-2.0, others) | Any copyleft or unlicensed runtime dependency; missing root LICENSE |
407
+ | Snyk (optional) | snyk/actions/node, guarded by SNYK_TOKEN | Never gates (continue-on-error); findings surface in logs |
408
+
409
+ The CI graph (six gates in `ci.yml`), the provenance and SBOM publishing in
410
+ `publishghcr.yml` (the combined container pipeline), and the complete workflow inventory are documented
411
+ in `architecture.md`; the security-relevant property repeated here is that
412
+ the default workflow permission is `contents: read` and each job elevates
413
+ only what it needs (security-events: write for SARIF uploaders, id-token:
414
+ write for the Scorecard publication).
415
+
416
+ ## Sources
417
+
418
+ - Landlock kernel documentation: https://docs.kernel.org/userspace-api/landlock.html
419
+ - Landlock project news and ABI timeline: https://landlock.io/news
420
+ - LWN Landlock coverage: https://lwn.net/Articles/1021648 and https://lwn.net/Articles/1050309
421
+ - seccomp manual page: https://man7.org/linux/man-pages/man2/seccomp.2.html
422
+ - gVisor platforms (systrap, RET_TRAP): https://gvisor.dev/docs/architecture_guide/platforms
423
+ - gVisor seccomp layers: https://gvisor.dev/blog/2024/02/01/seccomp
424
+ - Docker default profile blocking io_uring: https://github.com/moby/moby/issues/47532
425
+ - CVE-2026-46315 record: https://sentinelone.com/vulnerability-database/cve-2026-46315
426
+ - io_uring hardening analysis: https://systemshardening.com/articles/linux/io-uring-hardening
427
+ - LWN task-level io_uring restrictions: https://lwn.net/Articles/1054225
428
+ - eBPF LSM documentation: https://docs.kernel.org/bpf/prog_lsm.html
429
+ - Cloudflare eBPF LSM live patching: https://blog.cloudflare.com/live-patch-security-vulnerabilities-with-ebpf-lsm
430
+ - Hornet LSM v6 (LKML): https://lkml.iu.edu/2604.3/10670.html
431
+ - cgroup v2 kernel documentation: https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html
432
+ - systemd cgroup delegation: https://systemd.io/CGROUP_DELEGATION
433
+ - systemd resource control: https://www.freedesktop.org/software/systemd/man/systemd.resource-control.html
434
+ - OpenSSL post-quantum: https://openssl-corporation.org/post-quantum.html
435
+ - OpenSSL 3.5 PQ defaults analysis: https://postquantum.com/security-pqc/openssl-3-5-pqc-default
436
+ - RFC 10024 (PQ/T hybrids for TLS 1.3): https://datatracker.ietf.org/doc/rfc10024/
437
+ - RFC 8439 (ChaCha20-Poly1305): https://datatracker.ietf.org/doc/rfc8439/
438
+ - AWS PQ TLS details: https://docs.aws.amazon.com/sdkref/latest/guide/pqtls-details.html
439
+ - Cloudflare PQC support: https://developers.cloudflare.com/ssl/post-quantum-cryptography/pqc-support/
440
+ - CRIU releases: https://github.com/checkpoint-restore/criu/releases
441
+ - CRIU project: https://criu.org
442
+ - QEMU 11.1.0 announcement: https://www.qemu.org/2026/08/11/qemu-11-1-0/
443
+ - Intel TDX and INTEL-SA-01436: https://www.intel.com/content/www/us/en/security-center/advisory/intel-sa-01436.html
444
+ - AMD SEV-SNP: https://www.amd.com/en/products/processors/server/epyc/security/sev-snp.html
445
+ - RATS RFC 9334: https://datatracker.ietf.org/doc/rfc9334/
446
+ - CoCo Trustee (KBS): https://github.com/confidential-containers/trustee
447
+ - fake-nvidia-smi: https://github.com/pogusthewhisper/fake-nvidia-smi
448
+ - GpuAdapter (CUDA API interception): https://github.com/FanBB2333/GpuAdapter
449
+ - nvml-unified-shim: https://github.com/rick-hsu/nvml-unified-shim
450
+ - fake-nvidia stub: https://github.com/ssst0n3/fake-nvidia
451
+ - OSSF Scorecard: https://github.com/ossf/scorecard
452
+ - gitleaks: https://github.com/gitleaks/gitleaks
453
+ - Dockle: https://github.com/goodwithtech/dockle
454
+ - Trivy: https://github.com/aquasecurity/trivy
@@ -147,6 +147,18 @@
147
147
 
148
148
  - [x] **971–980.** Align active npm, lockfile, Maven, NuGet, RubyGems, extension, desktop, Capacitor, crawler and iOS metadata to `1.8.18`; create the candidate release note, run the release gates, inspect the npm package, configure `iakadion` authorship, commit, and push the verified source revision.
149
149
 
150
+ ## 13. Post-push CI correction — actions 981–990
151
+
152
+ - [x] **981–990.** Inspect the failed CodeQL Rust and Pages workflow runs; identify the exact failing steps; correct only the responsible workflow or build configuration; rerun local equivalents; commit and push the correction; verify the new runs; then retry the public GitHub release.
153
+
154
+ ## 14. Current deployment and scanner remediation — actions 991–1000
155
+
156
+ - [x] **991–1000.** Inspect the current failing Pages deploy, filesystem vulnerability scan, and OSV scan jobs; classify each as configuration, dependency, policy, or upstream availability; apply the minimal correction; validate locally when possible; push the verified remediation; and record the resulting workflow state without suppressing security findings.
157
+
158
+ ## 15. Push revalidation commit — actions 1001–1010
159
+
160
+ - [x] **1001–1010.** Confirm the fixed source alias and Pages workflow trigger; add a concise evidence record for the recovered deployment; create and push a non-versioned revalidation commit; verify the new push Pages deployment and security checks; preserve the immutable `v1.8.18` tag and published registry packages.
161
+
150
162
  ## Evidence ledger
151
163
 
152
164
  Every completed ten-action work package must link its evidence to the final release record: source revision or research URL, design note, code path, deterministic test name, boundary test, documentation update, validation command, result, reviewer state, and disposition. The 970 actions deliberately start with factual classification; implementation may proceed only for capabilities that are both technically feasible and expressible without false infrastructure claims.