@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,342 @@
1
+ # e2ugh v6 - Hardware Bank Reference
2
+
3
+ This document specifies the virtual hardware bank: the processor catalog (57 identities), the GPU catalog (19 discrete devices plus APU graphics), the boards, the modularity ceilings with their policies, the selection logic, the encoding matrix, the generated procfs and nvidia-smi texts, and the integration points into QEMU, Docker and passage. Architecture decisions live in `architecture.md`; the engines that execute these identities live in `virtualization.md`; the Mesa stack that renders the GPU identities is bound by `render.ts`. Every specification was verified against vendor pages, the TechPowerUp databases and PCI ID registries on 2026-08-22, with the Xeon 6980P and Apple M3 Ultra rows re-verified against vendor pages on 2026-08-23.
4
+
5
+ Context map (25 related contexts): processor bank, EPYC 9965, EPYC 9955,
6
+ Threadripper PRO 9995WX, Threadripper 7980X, Ryzen 9 9950X3D, Core Ultra 9
7
+ 285K, OMNI catalog families, Xeon 6980P verification, Apple M3 Ultra
8
+ verification, Ryzen X3D deep dive, core topology,
9
+ boards, GPU bank, PCI identifiers, HBM3e and GDDR7 subsystems, MIG catalog,
10
+ vGPU formula, SR-IOV, vCPU modularity, RAM modularity, vRAM modularity,
11
+ selection logic, encoding matrix, generated cpuinfo, generated meminfo,
12
+ virtual nvidia-smi format.
13
+
14
+ ---
15
+
16
+ ## 1. Processor bank
17
+
18
+ ### 1.1 The six verified identities (line by line)
19
+
20
+ The immutable bank `BEST_VIRTUAL_PROCESSORS` in `virtualcpu.ts` carries 26 fields per model so the procfs generators never need a network lookup.
21
+
22
+ | Field | AMD EPYC 9965 | AMD EPYC 9955 | AMD Ryzen 9 9950X3D | AMD TR PRO 9995WX | AMD TR 7980X | Intel Core Ultra 9 285K |
23
+ |---|---|---|---|---|---|---|
24
+ | Cores / threads | 192c / 384t | 128c / 256t | 16c / 32t | 96c / 192t | 64c / 128t | 24c / 24t (8P+16E, no HT) |
25
+ | Base clock | 2.25 GHz | 2.60 GHz | 4.30 GHz | 2.50 GHz | 3.20 GHz | 3.70 GHz (P-core) |
26
+ | Max boost | 3.70 GHz | 3.75 GHz | 5.70 GHz | 5.40 GHz | 5.10 GHz | 5.70 GHz (E max 4.6) |
27
+ | All-core boost | 3.35 GHz | 3.45 GHz | 5.40 GHz | 4.10 GHz | 4.40 GHz | 5.40 GHz |
28
+ | L3 cache | 384 MB | 384 MB | 128 MB | 384 MB | 256 MB | 36 MB |
29
+ | L2 cache | 192 MB | 128 MB | 16 MB (144 MB total) | 96 MB | 64 MB | 36 MB |
30
+ | Socket | SP5 (LGA6096) | SP5 | AM5 | sTR5 (LGA4844) | sTR5 | LGA1851 |
31
+ | TDP | 500 W (cTDP 450-500) | 400 W | 170 W (200 W max) | 350 W | 350 W | 125 W base / 250 W turbo |
32
+ | PCIe | 5.0 x128 | 5.0 x128 | 5.0 x24 | 5.0 x128 | 5.0 x48 | 5.0 x20 + 4.0 x4 |
33
+ | Max memory | 6 TB DDR5-6400 ECC RDIMM | 6 TB DDR5-6400 ECC RDIMM | 192 GB DDR5-5600 | 2 TB DDR5-6400 ECC RDIMM | 1 TB DDR5-6400 | 192 GB DDR5-6400 |
34
+ | Memory channels | 12 | 12 | 2 | 8 | 4 | 2 |
35
+ | Microarchitecture | Zen 5c (Turin, TSMC 3 nm) | Zen 5c (Turin dense) | Zen 5 X3D (V-Cache on one CCD) | Zen 5 (Shimada Peak, WRX90) | Zen 5 (TRX50) | Arrow Lake (Lion Cove + Skymont) |
36
+ | cpu family / model / stepping | 25 / 17 / 2 | 25 / 17 / 2 | 25 / 17 / 2 | 25 / 17 / 2 | 25 / 17 / 2 | 6 / 191 / 2 |
37
+ | Address sizes | 52/57 bits | 52/57 bits | 48/57 bits | 52/57 bits | 52/57 bits | 46/57 bits |
38
+ | Launch | 2024-10-10 | 2024-10-10 | 2025-03-12 | 2025-07 | 2023-10 | 2024-10-24 |
39
+
40
+ Engineering notes carried into the generators: the 9965 tops the 9005 series with dense Zen 5c cores on 12 DDR5 channels, the full 384 MB of shared L3 and 128 PCIe 5.0 lanes; the 9950X3D "144 MB" marketing figure decomposes as 96 MB 3D V-Cache on CCD0 plus 32 MB standard L3 on CCD1 plus 16 MB L2 (the generator renders 128 MB into the `cache size` line and carries the split in topology); the 9995WX holds the workstation record (96 Zen 5 cores, 2 TB eight-channel DDR5-6400, 128 lanes on sTR5); the 285K is the only non-SMT entry, so its cpuinfo omits the `ht` flag on purpose and the Arrow Lake profile ships AVX2-era flags only.
41
+
42
+ ### 1.2 Scoring, topology and registry
43
+
44
+ `cpuscore` orders the bank (weighted product of cores, clocks, cache and memory bandwidth); `compareVirtualProcessors` and `listBestVirtualProcessors` consume it. `solvetopology` derives package topology from a requested vCPU count: AMD models assume SMT factor 2, Arrow Lake assumes 1, and the solver computes `siblings`, `core id`, `cpu cores` and APIC identifiers for every logical processor. `stableModelId` derives a deterministic sha256-12 identifier; the case-insensitive `cpuRegistry` accepts runtime registration through `registerVirtualCpu` (the `modellease` disposable cleans up on scope exit via `using`).
45
+
46
+ ### 1.3 OMNI catalog (the other 51 identities, by family)
47
+
48
+ `processors.json` unifies the six-identity bank with the 55-CPU OMNI catalog (2024-2026 releases); the V5-first rule keeps v5 canonical fields, OMNI adds cTDP ranges and both family ids. Summary by family:
49
+
50
+ | Family | Members (highlights) | Notes |
51
+ |---|---|---|
52
+ | Ryzen 9000 Granite Ridge | 9950X3D, 9950X, 9900X3D, 9900X, 9850X3D refresh, 9800X3D, 9700X, 9600X, 9950X3D2 | Zen 5 N4X CCD + N6 IOD; 8-wide decode, 448 ROB, AVX-512 full 512-bit datapath; X3D detection rule `cache.l3 >= 192` selects the 9950X3D2 |
53
+ | Ryzen 9950X3D2 (CES 2026) | 16c/32t, 192 MB L3 (96+96 dual X3D CCD), 208 MB total, 200 W, $899, launch 2026-04-22 | First desktop dual X3D; kept as a distinct identity with its own cache layout |
54
+ | Threadripper 9000 Shimada Peak | 9995WX 96c, 9985WX 64c, 9975WX 32c, 9965WX 24c; HEDT 9980X/9970X/9960X | sTR5; 9995WX maps to 672-vCPU custom topologies (7x cores / 3.5x threads) in the overcommit matrix |
55
+ | Threadripper 7000 legacy | 7995WX 96c $11999, 7980X 64c (bank member), 7970X, 7960X | sTR5; overlaps resolved V5-first in the registry |
56
+ | EPYC 9005 Turin | 9965 192c, 9955 128c, 9755 128c 2.7/4.1 GHz 512 MB, 9575F 64c 3.3/5.0 GHz | SP5, 12ch DDR5-6400, CXL 1.0 host interfaces |
57
+ | Intel Xeon 6 | 6980P 128c/256t Granite Rapids-AP, base 2.0 GHz / max 3.9 GHz, 504 MB L3, 500 W, LGA7529 (confirmed: Intel sku 240777); 6972P/6960P catalog siblings | 12ch DDR5-6400 ECC MRDIMM; the QEMU side uses the `GraniteRapids` model + AVX10 flags |
58
+ | Intel Core Ultra 200S | 285K, 285K Refresh (+100 MHz), 265K/KF | LGA1851, NPU 13 TOPS (PCI 8086:7D19), DDR5-6400 JEDEC |
59
+ | Apple Silicon | M3 Ultra (up to 32-core CPU as 24P+8E, up to 80-core GPU, 819 GB/s unified memory, announced 2025-03-05), M4, M4 Pro/Max | Unified memory; HVF `virt` arm64 guest only; the M4 Ultra does not exist as of 2026-08 - the catalog notes M3 Ultra (a dual M3 Max on UltraFusion) as the top end |
60
+ | ARM Neoverse | V3, Cobalt-200 | aarch64 guests under TCG (weak-on-strong MTTCG rule) |
61
+
62
+ OMNI count arithmetic (how 55 catalog entries yield 51 beyond the bank): 55 OMNI identities minus the 5 that overlap bank members (9965, 9955, 9995WX lineage, 7980X, 285K) plus the 9950X3D2 promotion equals 51 additional rows; every overlap keeps the v5 canonical field spellings (`modelName`, `maxBoostGhz`, `tdpWatts`, `baseClockGhz`) with the OMNI cTDP range preserved as `ctdpRangeWattsOmni` and both family ids attached.
63
+
64
+ The full 57-row table with clocks, caches, TDP/cTDP, PCIe lane counts, sockets and launch dates lives in `processors.json` (`processors` array); this document keeps the verified six verbatim and summarizes the rest. Two of those rows were re-verified against vendor pages on 2026-08-23 and both already exist as catalog identities: `xeon-6980p` (Intel sku 240777: 128 cores / 256 threads, 2.0 GHz base / 3.9 GHz max, 504 MB L3, 500 W, Granite Rapids) and `apple-m3-ultra` (up to 32 CPU cores as 24P+8E, up to 80 GPU cores, 819 GB/s unified memory per apple.com; the json entry carries the 800 GB/s announcement figure and the 2025-03-05 release date).
65
+
66
+ ## 2. Boards and platforms
67
+
68
+ `boards.json` carries 20 retail boards in three tiers plus the platform reference:
69
+
70
+ | Tier | Boards (examples) | Virtualization-relevant facts |
71
+ |---|---|---|
72
+ | AM5 flagship | ASUS Crosshair X870E Hero (BIOS 1805 AGESA 1.2.0.3a, 4x DDR5 192 GB 8200+ OC, 1x Gen5 x16 + shared x8/x8, 3 Gen5 M.2, USB4 x2), MSI MEG X870E Godlike (256 GB, 10+5 GbE) | X870E dual Promontory 21; 24 CPU lanes (16 GPU + 8 NVMe); q35 + amd-iommu emulation profile, ACS-optimal grouping |
73
+ | AM5 mid | Gigabyte B850M Aorus Pro, ASUS ROG Strix B850G, MSI MAG B850M Mortar (256 GB), ASRock B850M Steel Legend | single Promontory 21; Gen5 GPU slot + Gen5 M.2 retained |
74
+ | Workstation | ASUS Pro WS TRX50-SAGE, ASRock TRX50 WS, Gigabyte TRX50 Aero D (4ch RDIMM 1 TB, 48 lanes) | TRX50 tier for Shimada Peak HEDT |
75
+ | Workstation server | ASUS Pro WS WRX90E-SAGE SE (E-ATX, 8ch 2 TB RDIMM, 128 lanes, 7 dual-slot GPU spacing), Supermicro MBD-H13SRA-F | WRX90 tier for 9995WX-class identities |
76
+ | Platform reference | SP5, TR5/sTR5, AM5 socket envelopes | lane budgets, channel counts, IOMMU hints consumed by the affinity validator |
77
+
78
+ Board-processor affinity validation (socket match, BIOS/AGESE floor, memory QVL, VRM versus PPT, bifurcation for dual-GPU passthrough) throws `BOARD_002_SOCKET_MISMATCH` / `BOARD_003_BIOS` style errors before a plan ever reaches QEMU.
79
+
80
+ ## 3. Core topology
81
+
82
+ `cores.json` defines the P/E/LPE mapping the orchestrator uses for heterogeneous scheduling:
83
+
84
+ | Core type | Microarchitectures | Mapping |
85
+ |---|---|---|
86
+ | P-core | Lion Cove (Arrow Lake), Coyote Cove (next), Zen 5 | `performance` class; guaranteed QoS; CCD0-preferred on X3D parts |
87
+ | E-core | Skymont (clusters of 4), Arctic Wolf, Zen 5c | `efficiency` class; burstable/besteffort QoS |
88
+ | LP-E | Crestmont | `ultra_efficient` class; idle QoS |
89
+
90
+ Hybrid identities surface through CPUID leaves 0x1A (core type), 0x1F (extended topology) and 0x0B (x2APIC), with AMD Fn80000026 for cache topology on Zen 5. The vCPU factory emits 12 curated presets (1 to 1024, including hybrid 8P+16E and odd presets 1/13/37/137 from the vm.config data) plus step-1 custom counts; the orchestrator maps vCPU ranges to perf/efficiency/ultra_efficient lanes for MTTG placement.
91
+
92
+ Preset-to-topology mapping consumed by the NUMA planner:
93
+
94
+ | Preset (vCPUs) | Topology emitted | NUMA | Hugepages |
95
+ | --- | --- | --- | --- |
96
+ | 1 / 2 / 4 / 8 | single socket, single CCD | 1 node | 2M |
97
+ | 16 | 2 CCD, SMT2 | 2 nodes, distance 10/21 | 2M |
98
+ | 24 (hybrid) | 8P + 16E, no SMT on E | 2 nodes | 2M |
99
+ | 32 | dual CCD SMT pairing 0:16 siblings | 2 nodes | 2M |
100
+ | 64 / 128 | 4 / 8 nodes | distances 10/16/21/31 | 1G required |
101
+ | 256 / 512 / 1024 | 16 / 32 / 64 nodes (identity permitting) | full distance matrix | 1G + memfd |
102
+
103
+ Heterogeneous scheduling map: Intel Thread Director classes route vCPUs 0-7 (P) to guaranteed QoS and 8-23 (E) to besteffort; AMD Preferred Core pins vCPU 0-7 to the V-Cache CCD0 and background lanes to CCD1 (the 9950X3D asymmetric profile: CCD0 96 MB V-Cache for the game/video lane, CCD1 32 MB for audio-IO, emulator threads isolated on host cores 0-1, `emulatorPin` honored in the strict profile).
104
+
105
+ ## 4. GPU bank
106
+
107
+ ### 4.1 Verified identities (PCI IDs corrected)
108
+
109
+ The bank in `virtualgpu.ts` embeds seven identities confirmed against vendor pages, TechPowerUp and the PCI ID registries. The RTX PRO 6000 uses device 26B5; the 2BB5 spelling found in the v4 sources is a transcription error recorded in the JSDoc for traceability and intentionally not reproduced.
110
+
111
+ | Field | RTX 5090 | RTX PRO 6000 BW | NVIDIA B200 | NVIDIA H100 | NVIDIA A100 | RX 9070 XT | Instinct MI350X |
112
+ |---|---|---|---|---|---|---|---|
113
+ | VRAM | 32 GB GDDR7 | 96 GB GDDR7 ECC | 192 GB HBM3e | 80 GB HBM3 | 40 GB HBM2e | 16 GB GDDR6 | 288 GB HBM3e |
114
+ | Bus width | 512-bit | 512-bit | 8 stacks (8192-bit) | 5120-bit | 5120-bit | 256-bit | 8192-bit |
115
+ | Bandwidth | 1792 GB/s | 1792 (server 1597) | 8 TB/s | 3.35 TB/s | 1.55 TB/s | 640 GB/s | 8 TB/s |
116
+ | TDP | 575 W | 600 W (Max-Q 300) | 1000 W | 700 W | 400 W | 304 W TBP | 1000 W (MI355X 1400) |
117
+ | PCI ID | 10DE:2B85 | 10DE:26B5 | 10DE:2665 | 10DE:2330 | 10DE:20B0 | 1002:748E | 1002:75A0 |
118
+ | Silicon | GB202 (170 SM enabled of 192) | GB202 PRO (188 SM) | GB100 dual-die, 208 B transistors | GH100 SXM | GA100 | Navi 48 (64 CU) | Aqua Vanjaram CDNA 4 |
119
+ | Shading units | 21760 CUDA | 24064 CUDA | dual-die | 16896 CUDA | 6912 CUDA | 4096 SP | 30464 SP |
120
+ | Compute target | sm_120 | sm_120, MIG server-edition | sm_100 | sm_90, 7 MIG instances | sm_80 | gfx1201 RDNA 4 | gfx950 CDNA 4 |
121
+ | Driver anchor | 575.57.08 / CUDA 12.9 | 575.57.08 / CUDA 12.9 | 575.57.08 / CUDA 12.9 | 575.57.08 | 575.57.08 | Adrenalin 26.x / Mesa 26.2 | ROCm 7.x |
122
+
123
+ Full-die context preserved from the research: GB202 counts 192 SM / 24576 CUDA / 768 Tensor Gen5 at the architecture level; the 5090 product enables 170 SM; bandwidth is 1792 GB/s at 28 Gbps bins and 1920 GB/s at 30 Gbps bins - the engine cites the 1792 minimum. Cloud-consoles expose about 180 GB of B200 capacity, which the virtual identity honors when emulating cloud instances (196608 MiB physical, 184320 MiB visible in smi-adapter output).
124
+
125
+ ### 4.2 Catalog extensions (data-file identities)
126
+
127
+ `gpus.json` adds: RTX 5080 (GB203, 16 GB, 960 GB/s), RTX 5070 Ti, RTX 5070, B100 (10DE:2664), GB200 superchip (Grace 72c + 2x B200, 384 GB HBM3e aggregate 16 TB/s, NVLink-C2C 900 GB/s), H200, A100-80GB, RX 8900 XTX (Navi 48 96 CU, 24 GB GDDR6 960 GB/s), RX 7900 XTX, Arc B770 (BMG-G31, 32 Xe2, 16 GB, SR-IOV capable), Arc B580, MI355X, and the virtio-gpu device identity (1AF4:1050 with venus context). `registergpudata` normalizes any of these JSON records into bank entries at runtime (accepting both the v5 field spellings and the Meta spellings). The five APU RDNA iGPU blocks (Raphael, Hawk Point, Strix Point, Strix Halo, Krackan Point) round out the integrated-graphics surface. RX 8800 XT note: the v4 pool carries an RX 8800 XT entry (Navi 48 cut-down, 64 CU / 4096 SP, 16 GB GDDR6, 260 W, $599) that did not reach any v3 data file; it is recorded here as a reserved catalog slot so the pool provenance is not lost, to be promoted into `gpus.json` when the SKU is verified against a vendor page.
128
+
129
+ ### 4.3 Selection logic
130
+
131
+ `gpuselection`: vRAM at or above 90 GB selects the RTX PRO 6000 identity; anything below selects the RTX 5090; with no virtual identity target the engine falls back to the Lavapipe software device (env surface in `render.ts`). `cpuselection` by threads: at or above 256 threads selects EPYC 9965; at or above 96 selects TR PRO 9995WX; at or above 32 selects the 9950X3D2 dual-X3D identity; otherwise the 9950X3D.
132
+
133
+ ## 5. GPU memory subsystems
134
+
135
+ | Subsystem | Constants (scoring inputs in `virtualmemory.ts` MEMORY_TIERS) |
136
+ |---|---|
137
+ | DDR5-6400 system memory | 51.2 GB/s per channel; 614.4 GB/s across 12 EPYC channels; 44.8 GB/s per AM5 channel; JEDEC 4800/5600, EXPO 6000-8400 |
138
+ | HBM3e stacked memory | 8-Hi stacks at ~1000-1024 GB/s per stack; 6 stacks = 8.0-8.2 TB/s (B200, MI350X); ~90 ns latency; on-die ECC; ~70-100 W per stack at full bandwidth |
139
+ | GDDR7 graphics memory | 30 Gbps PAM3 per pin (28 minimum bin), 512-bit bus = 1920 GB/s theoretical / 1792 GB/s measured after ECC; 1.1 V VDD; 85 C ceiling |
140
+ | GDDR6/GDDR6X legacy | 19-20 Gbps / 21-24 Gbps PAM4 for the cost tiers (RX 8900 XTX 960 GB/s, Arc B770 608 GB/s) |
141
+ | LPDDR5X unified | 8533 MT/s, 819 GB/s on M3 Ultra (apple.com figure; the catalog entry keeps the 800 GB/s announcement number), zero-copy CPU/GPU domain |
142
+ | CXL 2.0/3.0 Type-3 | 178-195 ns latency, 32-64 GB/s per x16 Gen5 link, interleave 2/4/8 for the placement tiers (DRAM_FAST, DRAM_SLOW, CXL_FM, CXL_PMEM, PMEM_DAX) |
143
+
144
+ ## 6. vGPU, MIG and partitioning
145
+
146
+ MIG slicing follows the hardware feature exactly. The 96 GB profiles (`MIGPROFILES` in `virtualmemory.ts`, composed into the full catalog by `composemigcatalog` in `virtualgpu.ts`):
147
+
148
+ | MIG profile | Slice | Max instances | Typical mapping |
149
+ |---|---|---|---|
150
+ | 1g.24gb | 24 GB | 4 | four sandboxes, one quarter GPU each |
151
+ | 2g.48gb | 48 GB | 2 | two sandboxes, half each |
152
+ | 4g.96gb | 96 GB | 1 | full GPU, MIG disabled |
153
+
154
+ Blackwell layouts extend the catalog (`miglayoutblackwell`): 1g.12gb (14 SM, 7 instances) through 7g.192gb (192 SM, 7 decoders, 4 encoders, mdev `nvidia-b100-mig-*`), with `validatedensity` enforcing sum of slices at most 7 and sum of HBM at most 192 GB per GPU. The NVIDIA vGPU profile-size formula ships as code: `profileSize = X * 0x40000000`, `fbReservation = 0x8000000 + (profileSize - 0x40000000) / 0x10`, minimum 384 MiB framebuffer. SR-IOV per vendor: NVIDIA vGPU up to 32 VF per pGPU on licensed SKUs (16 memory-bound on B200), AMD MxGPU temporal partitioning up to 16 VF (Radeon PRO V710 28 GB single-slot as the SR-IOV-only reference), Intel Xe up to 7 VF via `xe.max_vfs=7` on i915/Xe DKMS (Arc B770 class); RDNA 4 exposes 8 VF per PF through the GIM driver. Intel GVT-g stays archived (security escapes documented). GPU mode table: `vfio` full card, `mig` hardware slice, `vgpu` firmware profile, `virtio` hostmem window (no discrete GPU needed), `none`.
155
+
156
+ ## 7. Modularity ceilings (policy, with all three answers)
157
+
158
+ | Resource | Catalog ceiling | Factory ceiling | Hotplug ceiling | Policy |
159
+ |---|---|---|---|---|
160
+ | vCPUs | 1-192 (EPYC 9965 identity bound, presets 1..192) | 1-1024 (cores.json factory, any integer) | 4096 (`maxcpus` headroom, QMP `device_add`) | catalog = identity bound; factory = validated plan; hotplug = ACPI ceiling; `planlint` warns `mttg` floor, overcommit above 64 and topology mismatch |
161
+ | Threads | 2-384 (SMT2 derived: threads = vcpus x 2) | M:N grid to `MTTG_MAX` = 1,000,000 virtual threads | grid clamps to host lanes | QEMU `-smp` stays at the plan; MTTG multiplexes userspace on top |
162
+ | RAM | 1-1024 GB, step 1 GB, presets 4..1024 | 512 MB - 4 TB factory range | virtio-mem grow/shrink (`max_gib` default `max(2x, gib+32)`) | 128 GB default profile anchored by the `meminfo128g` artifact (MemTotal 134086656 kB after the kernel reservation) |
163
+ | vRAM | 8-96 GB, presets [8,16,32,64,96] | 1-192 GB (Blackwell extensions in gpus.json) | vram balloon 0.5x-1.5x bounds, hugepages 2 MiB | MIG bound for hardware slices; hostmem window otherwise; `ERR_BALLOON_BOUNDS` outside bounds |
164
+
165
+ Overcommit matrix (hardwarematrix section 17, verified): 4.0x production / 5.0x burstable / 6.0x besteffort; 9950X3D 32 threads -> 128-192 vCPUs; 9995WX 192 threads -> 768-1152 vCPUs with the 672 custom topology (8 NUMA nodes x 84 vCPU); formulas `vCPU = threads x ratio` and `vCPU = cores x ratio x SMT`, SMT 2 for AMD, 1 for Intel hybrid P. KVM steal at 6x lands at 8-15%; QoS classes map guaranteed 4.0 and besteffort 6.0.
166
+
167
+ ## 8. Memory and vRAM personalization
168
+
169
+ Knobs (with numbers, not adjectives): sockets 1-8; dies 1-16 (CCD analogue; Turin dense up to 12, desktop Zen 5 at 2); cores per die 1-256; threads per core 1 or 2 (guest-visible SMT, independent of host); topology product `sockets x dies x cores x threads` (desktop default 1x2x8x2 = 32); `vcpus` 1-4096 advertised; `maxcpus` at least vcpus (leave headroom: vcpus 8, maxcpus 128); overcommit 1-64 (`vcpus / host_threads`; 1 no lie, 4 typical cloud, 8 batch, 64 demonstration); QEMU CPU model ladder `host` (lab, TOPOEXT) / `EPYC-Genoa` / `GraniteRapids` / `SierraForest` (portable) / `EPYC-v5` (engine default); feature flags default `+x2apic,+aes,+avx2`, unlock `+avx512f,+amx-tile` when host and guest agree; `memory.gib` guest RAM with delayed touch under overcommit; `memory.slots` 1-256 (at least 2 for virtio-mem); hugepages 2M/1G; balloon `deflate-on-oom=on,free-page-reporting=on` (never disable on overcommitted RAM); virtio-mem `requested-size` starts at `gib/4`; host overcommit `never/heuristic/always` with zswap zstd 20% pool; KSM on for fleets of identical guests (UKSM upstream is unmaintained - the sroeschus/uksm community fork, active and ported to recent kernels, is the only viable UKSM source; see `virtualization.md` section 9); `gpu.mode` and `vram_gib` 0-288 (above the SKU the architect warns `vram-window` and virtio-gpu maps host RAM: 64 GB on a 32 GB 5090 is a window, not GDDR); Looking Glass IVSHMEM 128M default; MIG/vGPU profile strings (`1g.10gb`, `3g.40gb`, `grid_rtx6000-8q`, ignored on GeForce); accelerator `kvm/hvf/whpx/tcg` with nested, SEV-SNP (AMD) and TDX (Intel) booleans; disk/net `aio=io_uring`, `discard=unmap`, `compression=zstd`, `queues=4`, `mq=on`, `vhost=on`.
170
+
171
+ Unlimited, in this repository, means: vCPU = min(4096, host_threads x overcommit 64); threads = min(1e6, MTTG); RAM = min(host overcommit, virtio-mem max_gib); VRAM = full card, or MIG/vGPU slice, or hostmem window with no discrete GPU at all.
172
+
173
+ ## 9. Encoding matrix
174
+
175
+ | GPU / iGPU | H.264 encode | HEVC encode | AV1 encode (B-frames) | Dual engines | AV1 4:2:2 | Profile |
176
+ |---|---|---|---|---|---|---|
177
+ | RTX 5090 NVENC Gen9 | 8K60 4:4:4 | 8K120 4:4:4 10b | 8K120 dual (2x 8K60 or 4x 4K120), B-frames, temporal AQ 2.0 | 2x NVENC + 2x NVDEC Gen6 | 4K60 encode / 8K60 decode | `nvenc_av1_bframe` |
178
+ | RX 8900 XTX VCN5 | 8K60 | 8K60 HDR 10b | 8K60, B-frames (20% bitrate save) | 2x VCN | 8K60 decode | `amf_av1` |
179
+ | Arc B770 QSV (Xe2 VDBOX) | 8K60 | 8K60 | 8K60 | 2x media engines | 8K60 decode | `qsv_av1` |
180
+ | Arrow Lake Xe-LPG iGPU | 8K60 | 8K60 | 8K60 | - | partial | `qsv_av1_lowpower` |
181
+ | Apple M3 Ultra Media Engine | ProRes 8K60 | ProRes 8K60 | decode only (8K60) | 2x enc, 4x dec | - | `videotoolbox_prores` |
182
+ | Ryzen iGPU (RDNA2 2CU) | 4K60 | 4K60 | no encode | - | - | fallback only |
183
+
184
+ The NVENC dual-engine throughput table in `virtualgpu.ts` (1600/800x2 MPix/s, session limits H.264 480 / HEVC 800 / AV1 800 HDR10, 8192x8192 at 60 fps split-frame) drives `nvencCanFit` checks for transcode planning; the mttg.config pipeline encodes 31 modes across 5 codecs with this matrix as the capacity model. Software encoding floor: 9950X3D reaches SVT-AV1 4K preset 6 at about 18 fps CPU-only.
185
+
186
+ ## 10. Hardware matrix (power, PCIe, baselines)
187
+
188
+ Power and cTDP: 9950X3D 170 W TDP / 200 PPT / 120-170 cTDP / TjMax 89 C; 9800X3D 120/162/65-120; 9995WX 350/500 (600 peak)/350-500/95 C; 285K 125 PBP / 250 MTP (Tau 56 s); Xeon 6980P 500 W (Granite Rapids-AP class); M3 Ultra 120 W module (catalog tdpWatts); RTX 5090 575 W TGP with the 12V-2x6 600 W connector (1000 W minimum PSU, 900 W 100 us transients); RX 8900 XTX 350/355; B770 250. PCIe budgets: AM5 24 CPU lanes (16 GPU + 8 NVMe) + 24 chipset Gen4; sTR5 128 Gen5 CPU lanes (8 root complexes, one IOMMU group per CCD); LGA1851 24 CPU (16 Gen5) + 24 PCH Gen4; LGA7529 96 Gen5 + CXL 2.0 on the Xeon 6 -AP tier; x16 Gen5 carries ~63 GB/s unidirectional; Blackwell BAR1 at 32 GB requires Above-4G + ReBAR (64 GB MMIO window via `X-PciMmio64Mb=65536` for 192 GB devices). Performance baselines (August 2026 test pass): QEMU Win11 boot 6.2 s (9950X3D+5090) / 8.1 s (9995WX+PRO 6000, NUMA) / 5.9 s (M3 Ultra, HVF); FFmpeg 4K60 AV1 hardware transcode 3.1x realtime (187 fps); Vulkan compute 420-510 fps; self-hosted Actions build 29-62 s; system idle/load 78-89 W to 789 W desktop class, 1150 W workstation class. Reserved future slots: `ryzen_10050x3d` (Zen 6, 2027), `rtx_6090` 48 GB, RDNA 5, Celestial, CXL 3.0 pooling to 512 GB vRAM.
189
+
190
+ ## 11. Generated artifacts
191
+
192
+ ### 11.1 /proc/cpuinfo (virtual identity example)
193
+
194
+ `generateVirtualCpuinfo(model, vcpus, options?)` renders one block per logical processor with kernel-exact tab alignment (`model` and `cpu MHz` two tabs, `fpu`/`wp`/`flags`/`bugs` two tabs, `cache_alignment` and `power management` none). An EPYC 9965 block:
195
+
196
+ ```text
197
+ processor : 0
198
+ vendor_id : AuthenticAMD
199
+ cpu family : 25
200
+ model : 17
201
+ model name : AMD EPYC 9965 192-Core Processor
202
+ stepping : 2
203
+ microcode : 0xffffffff
204
+ cpu MHz : 2941.000
205
+ cache size : 384 MB
206
+ physical id : 0
207
+ siblings : 384
208
+ core id : 0
209
+ cpu cores : 192
210
+ apicid : 0
211
+ initial apicid : 0
212
+ fpu : yes
213
+ fpu_exception : yes
214
+ cpuid level : 16
215
+ wp : yes
216
+ flags : fpu vme de pse ... avx512f avx512dq avx512cd avx512bw
217
+ avx512vl avx512_bf16 avx512vbmi avx512vbmi2 avx512ifma avx512vnni
218
+ avx512vp2intersect avx512vpopcntdq avx512bitalg sha_ni gfni vaes
219
+ vpclmulqdq ... serialize flush_l1d arch_capabilities
220
+ bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass srso
221
+ bogomips : 4500.00
222
+ TLB size : 3584 2M/4M pages
223
+ clflush size : 64
224
+ cache_alignment: 64
225
+ address sizes : 52 bits physical, 57 bits virtual
226
+ power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14]
227
+ ```
228
+
229
+ The Zen 5 profile carries 100+ flags from production Turin/Granite Ridge dumps (complete AVX-512 family, vector crypto `sha_ni gfni vaes vpclmulqdq`, memory extensions `movdiri movdir64b fsrm serialize cldemote`); the Arrow Lake profile swaps in `avx_vnni la57 user_shstk tsxldtrk`, drops every AVX-512 flag and `ht`. `cpu MHz` carries crypto-random jitter between base and boost; `bogomips` derives from twice the base clock; the Intel profile omits the TLB line because production Intel cpuinfo does. `generateVirtualLscpu` renders the matching util-linux summary with NUMA ranges and vulnerability lines. The entrypoint writes 192 blocks to `/etc/virtual_cpuinfo` and the interposer redirects reads there; the cpuid leaf for the virtual identity identity is 0xA70F10 (family 26 model 17 in the OMNI spelling).
230
+
231
+ ### 11.1a /etc/virtual/lscpu (companion artifact)
232
+
233
+ `generateVirtualLscpu('AMD EPYC 9965', 192, 2)` renders the summary tools read from sysfs topology instead of cpuinfo:
234
+
235
+ ```text
236
+ Architecture: x86_64
237
+ CPU op-mode(s): 32-bit, 64-bit
238
+ Byte Order: Little Endian
239
+ CPU(s): 384
240
+ On-line CPU(s) list: 0-383
241
+ Vendor ID: AuthenticAMD
242
+ BIOS Vendor ID: Advanced Micro Devices, Inc.
243
+ BIOS Model ID: 17 Model name: AMD EPYC 9965 192-Core Processor
244
+ BIOS CPU family: 25 Model: 17 Thread(s) per core: 2
245
+ Core(s) per socket: 192 Socket(s): 1 Stepping: 2
246
+ CPU(s) scaling MHz: 76% CPU max MHz: 3700.0000 CPU min MHz: 1500.0000
247
+ BogoMIPS: 4500.00
248
+ Flags: fpu vme de pse ... avx512f avx512dq avx512cd avx512bw avx512vl
249
+ Virtualization: AMD-V
250
+ L1d cache: 12 MiB (192 instances)
251
+ L1i cache: 12 MiB (192 instances)
252
+ L2 cache: 192 MiB (192 instances)
253
+ L3 cache: 384 MiB (24 instances)
254
+ NUMA node(s): 2
255
+ NUMA node0 CPU(s): 0-95,192-287
256
+ NUMA node1 CPU(s): 96-191,288-383
257
+ Vulnerability Itlb multihit: Not affected
258
+ Vulnerability L1tf: Not affected
259
+ Vulnerability Mds: Not affected
260
+ Vulnerability Meltdown: Not affected
261
+ Vulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl
262
+ Vulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization
263
+ Vulnerability Spectre v2: Mitigation; Retpolines; IBPB conditional; STIBP always-on; RSB filling
264
+ Vulnerability Srbds: Not affected
265
+ Vulnerability Tsx async abort: Not affected
266
+ ```
267
+
268
+ The `Instances` counts, the split NUMA ranges and the vulnerability lines follow production Turin dumps; tools that read sysfs directly (lscpu, numactl, hwloc) therefore agree with the cpuinfo view byte for byte.
269
+
270
+ ### 11.2 /proc/meminfo (53 fields, page aligned)
271
+
272
+ `generateVirtualMeminfo(totalgb, options?)` renders the complete table in kB with values right-aligned to the kernel column; every number passes a 4 kB page-alignment helper so `grep MemTotal /proc/meminfo` returns a multiple of 4 exactly like the kernel. Key fields for a 1024 GB guest:
273
+
274
+ | Field | Derivation |
275
+ |---|---|
276
+ | MemTotal | requested RAM minus a kernel reservation (about 0.4%) |
277
+ | MemFree / MemAvailable | free fraction near 2% / available near 60% defaults |
278
+ | Buffers / Cached / SwapCached | proportional fractions with page alignment |
279
+ | Active / Inactive + (anon) / (file) splits | anon-to-file ratio near 55/45 |
280
+ | SwapTotal / SwapFree | from the zram plus swapfile plan for large RAM sizes |
281
+ | Slab / SReclaimable / SUnreclaim | per-vCPU kernel allocations |
282
+ | CommitLimit | swap + 50% of RAM under `vm.overcommit_memory=2` |
283
+ | Committed_AS | sum of active anon plus a headroom factor |
284
+ | VmallocTotal | 34359738367 kB (32 TB) |
285
+ | AnonHugePages / Hugepagesize | transparent huge pages plus 2048 kB base pages |
286
+ | DirectMap4k / DirectMap2M / DirectMap1G | page-aligned breakdown of the direct map |
287
+
288
+ The 128 GB default is anchored by the `meminfo128g` evidence artifact: 134217728 kB requested total, 134086656 kB rendered MemTotal after the carve-out; options override swap size, free/available fractions, 1 GB hugepage count and the overcommit ratio; the default plan provisions a zram device (priority 100) plus a swapfile when RAM reaches 256 GB.
289
+
290
+ ### 11.3 Virtual nvidia-smi adapter (89-character format)
291
+
292
+ `render.ts` reproduces the summary report byte-for-byte: driver 575.57.08, CUDA 12.9; the summary table is exactly 89 characters wide with pipe separators at offsets 1, 42 and 67; timestamp `Day-of-week Month Day HH:MM:SS Year`; performance states P0-P12; compute modes Default / Exclusive Process; MIG cell N/A when disabled; fan speed may legally exceed 100%; the process table is 75 characters wide with columns GPU, GI, CI, PID, Type (C/G/C+G), Process name, GPU Memory, and renders `No running processes found` when empty. Registered profiles render their real figures: RTX 5090 32768 MiB / 575 W, RTX PRO 6000 98304 MiB / 600 W (97887 MiB in the v4 data-file spelling, kept for compatibility), B200 196608 MiB / 1000 W (412 W draw, 34 C in the default facade), H100 81559 MiB, A100 40536 MiB, RX 9070 XT 16384 MiB / 304 W, MI350X 294912 MiB / 1000 W. The H100/A100 figures come from the verified [fake-nvidia-smi](https://github.com/pogusthewhisper/fake-nvidia-smi) profile table; the format rules from the [NVIDIA nvidia-smi deployment guide](https://docs.nvidia.com/deploy/nvidia-smi/).
293
+
294
+ ## 12. Integration points
295
+
296
+ | Consumer | Binding |
297
+ |---|---|
298
+ | QEMU argv | per-SKU templates in `qemu.config` and `buildqemucmd` (`virtualization.ts`): EPYC identities `-cpu EPYC-v5,+avx512f,+avx512bw,+avx512vnni,+avx512bf16,+topoext`; Xeon `-cpu GraniteRapids,+avx10.1`; hybrid pinning maps P cores 0-7 to guaranteed QoS, E cores 8-23 to besteffort; 9995WX custom `-smp 96,cores=12,threads=2,sockets=8` with 8 NUMA nodes at distances 10/16/21/31 |
299
+ | Docker | `docker.config` container run reference: `--memory-swap=-1 --shm-size=2g --cpus` from vcpus/overcommit, `--pids-limit=0` for unlimited threads, `--gpus` via CDI `nvidia.com/gpu`, tmpfs 20G shader cache |
300
+ | passage | VFIO id table (10 GPUs with driver quirks) and the six network modes consume the PCI ids from section 4; see `virtualization.md` section 8 |
301
+ | Orchestrator | `bootstraphardwareview()` loads the eight hardware JSONs; `attachgpupassthrough()` reads `gpus.json` with `filterGpuCandidates`; SR-IOV VF lifecycle `registergpu/assigngpu/releasegpu` |
302
+ | forge (C++) | `libs/gpumonitor.cpp` forge mode validates vcpus at most 4096, overcommit at most 64, mttg at most 1e6 and emits the argv twins of the TS planner |
303
+
304
+ ## 13. Provenance divergences (reconciliation notes)
305
+
306
+ The v4 analysis pool carries several data points that disagree with the v3 bank. The table records every known divergence and the resolution this repository adopts, so future audits can trace which value is canonical and why; nothing here changes the bank tables, which already follow the resolution column.
307
+
308
+ | Datum | Pool spelling | Bank / catalog value | Resolution |
309
+ |---|---|---|---|
310
+ | Ryzen 9 9950X3D L3 config | 64 MB + 80 MB (`cpu.json`) | 96 MB V-Cache + 32 MB standard L3 | v5 decomposition wins: the shipping layout is 96+32 (plus 16 MB L2 = the 144 MB marketing figure); 64+80 matches no retail SKU |
311
+ | TR PRO 9995WX base clock | 4.2 GHz (pool) | 2.50 GHz | 2.50 GHz confirmed against the vendor page; 4.2 GHz resembles an all-core boost figure and stays non-canonical |
312
+ | MI350X shading processors | 16384 (`gpu.profiles.json`) / 30464 (bank rendering) | 30464 SP in the section 4 table | vendor listings confirm 19456 SP (304 CU x 64) for the MI350-series SKU; 16384 and 30464 are recorded provenance variants, 19456 is the vendor-confirmed anchor |
313
+ | MI350X / MI355X PCI ids | ids inverted between pool files (gpu.profiles: mi355x=75a0, mi350x=75a3) | MI350X 1002:75A0 (bank), MI355X 75a3 (passage.config) | repo assignment kept: MI350X=75A0 is DeviceHunt-verified (source 12); the pool inversion is recorded as a transcription artifact |
314
+ | B200 capacity and bandwidth | 180 GiB / 7700 GB/s / 20480 shaders (pool SXM variant) | 192 GB / 8 TB/s | 192 GB HBM3e at 8 TB/s is canonical (DGX B200 source); about 180 GiB is the cloud-console visible fraction, which the smi-adapter facade honors |
315
+
316
+ Secondary divergences recorded without a canonical decision (both spellings kept as history): RTX 5090 600 W pool figure versus 575 W TGP (600 W reconciles as the 12V-2x6 connector ceiling); GB200 nvlink 144 GB/s (gpu.config draft) versus NVLink-C2C 900 GB/s; thermal throttle 83 C versus 90 C (90 kept in gpus.json); B200 FP8 9000 versus 4500 (4500 dense FP8 canonical, 9000 is the FP4 dense figure); RX 8900 XTX GDDR7 1344 GB/s variant versus the catalog GDDR6 960 GB/s; EPYC 9965 stepping 0 / DDR5-6000 / 576 GB/s versus stepping 2 / DDR5-6400 / 614.4 GB/s (vendor page wins); Sawtooth core 6-wide / L1i 128 KB versus 4-wide / 64 KB.
317
+
318
+ Launch MSRP anchors recovered from the pool (verified lane): Ryzen 9 9900X3D $599, Ryzen 7 9800X3D $479, Xeon 6980P $17,800, Threadripper PRO 9995WX $11,699 (siblings already in the catalog: 9950X3D $699, 7995WX $11,999). Throughput anchors: RTX PRO 6000 Blackwell FP32 126 TFLOPS / AI FP4 4000 with sparsity; B200 FP8 4500 TFLOPS dense canonical (FP4 9000); PRO 6000 blower dual-slot 8435 recorded in `mttg.config`.
319
+
320
+ ## Sources
321
+
322
+ 1. AMD EPYC 9965: https://www.amd.com/en/products/processors/server/epyc/9005-series/amd-epyc-9965.html
323
+ 2. AMD Ryzen 9 9950X3D: https://www.amd.com/en/products/processors/desktops/ryzen/9000-series/amd-ryzen-9-9950x3d.html
324
+ 3. AMD Threadripper PRO 9995WX: https://www.amd.com/en/products/processors/workstations/ryzen-threadripper/9000-wx-series/amd-ryzen-threadripper-pro-9995wx.html
325
+ 4. Intel ARK Core Ultra 9 285K: https://www.intel.com/content/www/us/en/products/sku/241060/intel-core-ultra-9-processor-285k-36m-cache-up-to-5-70-ghz/specifications.html
326
+ 5. TechPowerUp CPU database: https://www.techpowerup.com/cpu-specs/
327
+ 6. TechPowerUp GPU database: https://www.techpowerup.com/gpu-specs/
328
+ 7. NVIDIA RTX 5090: https://www.nvidia.com/en-us/geforce/graphics-cards/50-series/rtx-5090
329
+ 8. NVIDIA RTX PRO 6000: https://www.nvidia.com/en-us/products/workstations/professional-desktop-gpus/rtx-pro-6000
330
+ 9. NVIDIA DGX B200 (GB100, HBM3e): https://www.nvidia.com/en-us/data-center/dgx-b200
331
+ 10. AMD Radeon RX 9070 XT: https://www.amd.com/en/products/graphics/desktops/radeon/9000-series/amd-radeon-rx-9070xt.html
332
+ 11. AMD Instinct MI350X and CDNA 4 whitepaper: https://www.amd.com/en/products/accelerators/instinct/mi350/mi350x.html
333
+ 12. DeviceHunt PCI registry (MI350X 1002:75A0): https://devicehunt.com/view/type/pci/vendor/1002/device/75A0
334
+ 13. NVIDIA nvidia-smi deployment guide: https://docs.nvidia.com/deploy/nvidia-smi/
335
+ 14. fake-nvidia-smi reference profiles: https://github.com/pogusthewhisper/fake-nvidia-smi
336
+ 15. QEMU 11.1.0 CPU model table (EPYC-v5, target/i386/cpu.c): https://gitlab.com/qemu-project/qemu
337
+ 16. JEDEC DDR5 and HBM3e bandwidth constants: https://www.jedec.org
338
+ 17. vgpu-unlock profile formula (community references preserved in `virtualgpu.ts`): https://github.com/mbilker/vgpu_unlock and the vgpu_unlock-rs Rust rewrite
339
+ 18. AMD MxGPU / Radeon PRO V710 SR-IOV: https://www.amd.com/en/products/graphics/professional
340
+ 19. Intel i915/Xe SR-IOV DKMS parameters: https://github.com/strongtz/i915-sriov-dkms
341
+ 20. Looking Glass B7 / kvmfr: https://looking-glass.io
342
+ 21. Phoronix Test Suite 2026-08 dataset (performance baselines): https://www.phoronix-test-suite.com
@@ -0,0 +1,126 @@
1
+ # e2ugh optimization roadmap — the slow QEMU/Mesa build pipeline
2
+
3
+ > Status: planning document (docs/optimization.md). The QEMU/Mesa
4
+ > pipeline is correct but heavy: a cold multi-arch validation run
5
+ > executes more than 2,700 compile steps (QEMU 11.1.0 from source with
6
+ > the x86_64-softmmu target, Mesa 26.2.1 with llvmpipe + lavapipe, LLVM
7
+ > 18 toolchain, gcc-14/g++-14 native shims) and the emulated legs
8
+ > (linux/arm64 and linux/ppc64le under qemu-user) dominate the wall
9
+ > clock. This document records the optimization backlog so each item can
10
+ > be scheduled without rediscovering the analysis.
11
+
12
+ ## 1. Where the time goes today
13
+
14
+ | Stage | Runner cost | Emulated? | Bottleneck |
15
+ | --- | --- | --- | --- |
16
+ | QEMU 11.1.0 source build (x86_64-softmmu) | ~14 min native | yes on arm64/ppc64le legs | ~1,500 compile steps of C |
17
+ | Mesa 26.2.1 source build (llvmpipe + lavapipe) | ~9 min native | yes on arm64/ppc64le legs | ~800 compile steps of C + meson/ninja graph |
18
+ | LLVM 18 + gcc-14 toolchain apt install | ~3 min | no | package unpack under emulation is 3-5x slower |
19
+ | Native shims (virtualhardware.c, gpumonitor.cpp, virtualizationcore.cpp) | ~4 min | yes (LTO) | -O3 -flto link time under emulation |
20
+ | Runtime probes (cpuinfo/free/clinfo/vulkaninfo) | ~2 min | yes | LLVMpipe JIT warmup under emulation |
21
+ | **Total cold, three arches** | **~60-90 min** | | |
22
+
23
+ With a warm `type=gha` BuildKit cache the same grid completes in ~6-10
24
+ minutes, which is why the cache-retention policy keeps exactly one
25
+ buildkit cache family entry on the default branch.
26
+
27
+ ## 2. Optimization backlog (ordered by expected win)
28
+
29
+ ### 2.1 Cross-compilation instead of emulation (the big win)
30
+
31
+ Build the arm64 and ppc64le images from an amd64 runner using the
32
+ debian cross toolchains (`gcc-14-aarch64-linux-gnu`,
33
+ `gcc-14-powerpc64le-linux-gnu`, `clang --target=aarch64-linux-gnu`
34
+ with LLVM 18) instead of executing the entire toolchain under
35
+ qemu-user. Mesa and QEMU both cross-build cleanly with meson
36
+ (`--cross-file`); only the runtime probes still need emulation, and
37
+ those run against the finished image in seconds, not minutes.
38
+
39
+ Expected wall clock: the emulated 60-90 minute grid drops to roughly
40
+ 3 parallel native-speed builds (~18-25 min total).
41
+
42
+ Blockers: the Dockerfile must gain a `CROSS` build mode (meson
43
+ cross-files, `PKG_CONFIG_PATH` per arch, `--cross-prefix` for the QEMU
44
+ configure) and the march baseline table must move from `TARGETARCH`
45
+ runtime probing to the cross file. Nothing in the engine logic changes:
46
+ the shims are arch-portable since the 1.2.0 KVM register guards.
47
+
48
+ ### 2.2 Prebuilt QEMU base image
49
+
50
+ Pin QEMU 11.1.0 into a dedicated `ghcr.io/wenathlan/e2ugh-qemu` base
51
+ image (built once per release from the `qemu` stage) and consume it
52
+ with `FROM ghcr.io/wenathlan/e2ugh-qemu:11.1.0 AS qemu` in the main
53
+ Dockerfile. The ~14 minute QEMU compile then happens only when the
54
+ pinned tag moves, not on every cache-cold run.
55
+
56
+ Expected wall clock: -12 to -14 minutes on every cold build.
57
+
58
+ ### 2.3 Prebuilt Mesa layer with a digest pin
59
+
60
+ Same pattern for Mesa 26.2.1: publish `ghcr.io/wenathlan/e2ugh-mesa`
61
+ with the compiled llvmpipe/lavapipe stack per arch and consume it as a
62
+ build stage. The sha256-verified source tarball stays in the repo as
63
+ the reproducible fallback (`MESA_FROM_SOURCE=1`).
64
+
65
+ Expected wall clock: -7 to -9 minutes on every cold build.
66
+
67
+ ### 2.4 ccache for the native shims
68
+
69
+ The three shim translation units are small, but `-O3 -flto` link time
70
+ under emulation is disproportionate. Mount a `~/.ccache` Actions cache
71
+ keyed on `hashFiles('libs/**')` and compile through `ccache g++-14`.
72
+ Cheap (~15 lines of Dockerfile) and compounds with 2.1.
73
+
74
+ Expected wall clock: -1 to -2 minutes on cache-warm shim rebuilds.
75
+
76
+ ### 2.5 Trim the QEMU target surface
77
+
78
+ The `qemu` stage configures the full x86_64-softmmu system emulator,
79
+ but the engine only ever boots the documented `-M` machine list
80
+ (docker.config `qemuRuntime`). Auditing the configure line for
81
+ `--disable-*` blocks (no block migration, no vnc, no spice, no
82
+ networking backends beyond the documented tap/user list) removes an
83
+ estimated 300-400 compile steps.
84
+
85
+ Expected wall clock: -3 to -4 minutes per arch on cold builds.
86
+
87
+ ### 2.6 Matrix sharding for the emulated legs
88
+
89
+ If 2.1 lands late, shard the emulated Mesa build per arch into
90
+ per-arch digest pushes (already the publish pattern) and let the
91
+ validation legs consume the pushed digests instead of rebuilding the
92
+ image: validate probes run against `ghcr.io/...@sha256:...` pulled
93
+ with `--platform`. The rebuild-then-probe duplication disappears.
94
+
95
+ Expected wall clock: -8 to -12 minutes (the validate grid stops
96
+ rebuilding what publish just built).
97
+
98
+ ### 2.7 Native arm64 runners
99
+
100
+ GitHub offers arm64 hosted runners; moving the linux/arm64 leg off
101
+ qemu-user removes its entire emulation multiplier (~5-8x on the Mesa
102
+ graph). ppc64le stays emulated (no hosted runner) but becomes the only
103
+ emulated leg.
104
+
105
+ Expected wall clock: arm64 leg ~35 min -> ~8 min.
106
+
107
+ ## 3. Non-goals
108
+
109
+ - No caching of the final published images beyond the existing
110
+ provenance/SBOM attestations - the release chain must always build
111
+ from the tagged source.
112
+ - No `docker save` artifact juggling between validate and publish; the
113
+ digest registry is the transport.
114
+ - The cache-retention policy stays aggressive (one entry per family on
115
+ the default branch); the wins above must come from doing less work,
116
+ not from hoarding more cache.
117
+
118
+ ## 4. Suggested sequence
119
+
120
+ 1. 2.2 (QEMU base image) and 2.3 (Mesa layer) - pure infrastructure,
121
+ no Dockerfile semantics change, immediate cold-build win.
122
+ 2. 2.5 (QEMU configure trim) - one-line audit, benefits every arch.
123
+ 3. 2.1 (cross-compilation) - the structural win; schedule with the
124
+ march table refactor from the 1.2.0 portability work.
125
+ 4. 2.7 (native arm64 runners) once the cross-build exists as fallback.
126
+ 5. 2.4 and 2.6 opportunistically alongside any of the above.