@legionworks/facet 1.9.0

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 (327) hide show
  1. package/LICENSE-APACHE +202 -0
  2. package/LICENSE-MIT +23 -0
  3. package/README.md +158 -0
  4. package/dist/gallery/chunk-4g8rem85.css +656 -0
  5. package/dist/gallery/chunk-c6s9k9ty.js +5970 -0
  6. package/dist/gallery/frame/artifact.css +8424 -0
  7. package/dist/gallery/frame/chunks/abnfDiagram-N423BO3Z-jj74szbm.js +155 -0
  8. package/dist/gallery/frame/chunks/architecture-TIHT7OUA-cvdjn7dt.js +10 -0
  9. package/dist/gallery/frame/chunks/architectureDiagram-T3A2C74G-n4z77eg6.js +8675 -0
  10. package/dist/gallery/frame/chunks/blockDiagram-VBNYF7ZC-7xsqzrd1.js +3529 -0
  11. package/dist/gallery/frame/chunks/c4Diagram-5PPSVZJV-z2zjs7wx.js +2413 -0
  12. package/dist/gallery/frame/chunks/classDiagram-JCYQIIEL-ve8rngqp.js +47 -0
  13. package/dist/gallery/frame/chunks/classDiagram-v2-OCEON4UE-8cfaxb8z.js +47 -0
  14. package/dist/gallery/frame/chunks/cose-bilkent-JH36ORCC-sn92qexx.js +4822 -0
  15. package/dist/gallery/frame/chunks/cynefin-VYW2F7L2-tqjv913d.js +10 -0
  16. package/dist/gallery/frame/chunks/cynefinDiagram-MW4NZA55-c1c0dj12.js +500 -0
  17. package/dist/gallery/frame/chunks/dagre-VZM6K2ZE-7tyg4yt2.js +476 -0
  18. package/dist/gallery/frame/chunks/diagram-7IWD3JNH-y4eng9sc.js +526 -0
  19. package/dist/gallery/frame/chunks/diagram-B4RE2ZJO-rn3p7j5h.js +673 -0
  20. package/dist/gallery/frame/chunks/diagram-LBJQPF4R-w4a2cm9q.js +255 -0
  21. package/dist/gallery/frame/chunks/diagram-Q27KOJAE-aqc2v7wy.js +575 -0
  22. package/dist/gallery/frame/chunks/diagram-UB23O5K3-xncy8nyd.js +355 -0
  23. package/dist/gallery/frame/chunks/ebnfDiagram-BXEA7PRR-acwgxz16.js +175 -0
  24. package/dist/gallery/frame/chunks/erDiagram-JOGREHBK-mzp5nswt.js +1332 -0
  25. package/dist/gallery/frame/chunks/eventmodeling-45OFAUF4-sg07qr0c.js +10 -0
  26. package/dist/gallery/frame/chunks/flowDiagram-UKHOOZJN-2e5ygs44.js +29 -0
  27. package/dist/gallery/frame/chunks/ganttDiagram-PKOTCBZU-p2hhh7hr.js +2620 -0
  28. package/dist/gallery/frame/chunks/gitGraph-TEB2WS4Q-j6kw0naa.js +10 -0
  29. package/dist/gallery/frame/chunks/gitGraphDiagram-DS77QQ5N-4z9z8wjm.js +1347 -0
  30. package/dist/gallery/frame/chunks/info-DKCQHKI2-mpt80jd3.js +10 -0
  31. package/dist/gallery/frame/chunks/infoDiagram-6WML65LV-5rqm3mgg.js +65 -0
  32. package/dist/gallery/frame/chunks/ishikawaDiagram-WSZJBQD7-b51z96jy.js +975 -0
  33. package/dist/gallery/frame/chunks/journeyDiagram-NVQOT4AX-9jbfp0pk.js +1272 -0
  34. package/dist/gallery/frame/chunks/kanban-definition-27J2QSJJ-4x0vx4se.js +1116 -0
  35. package/dist/gallery/frame/chunks/katex-xfgk95tv.js +14034 -0
  36. package/dist/gallery/frame/chunks/markdown-1s5vwkf2.js +9 -0
  37. package/dist/gallery/frame/chunks/markdown-2h6bwsms.js +3239 -0
  38. package/dist/gallery/frame/chunks/markdown-2x113yh8.js +107 -0
  39. package/dist/gallery/frame/chunks/markdown-30b7rwmp.js +1943 -0
  40. package/dist/gallery/frame/chunks/markdown-356bfj4g.js +2031 -0
  41. package/dist/gallery/frame/chunks/markdown-44n9ea69.js +2406 -0
  42. package/dist/gallery/frame/chunks/markdown-56enrf2r.js +39 -0
  43. package/dist/gallery/frame/chunks/markdown-5avymm8t.js +725 -0
  44. package/dist/gallery/frame/chunks/markdown-6r4svars.js +33 -0
  45. package/dist/gallery/frame/chunks/markdown-6zz8efx2.js +24 -0
  46. package/dist/gallery/frame/chunks/markdown-7jp6prnb.js +19 -0
  47. package/dist/gallery/frame/chunks/markdown-809k7q41.js +55 -0
  48. package/dist/gallery/frame/chunks/markdown-82xmzhzd.js +1076 -0
  49. package/dist/gallery/frame/chunks/markdown-92n37gd4.js +7627 -0
  50. package/dist/gallery/frame/chunks/markdown-ag2sssf8.js +36 -0
  51. package/dist/gallery/frame/chunks/markdown-b4s7ntq2.js +19 -0
  52. package/dist/gallery/frame/chunks/markdown-c9k0fvp1.js +100 -0
  53. package/dist/gallery/frame/chunks/markdown-ceefymn8.js +125 -0
  54. package/dist/gallery/frame/chunks/markdown-d1wfbs70.js +243 -0
  55. package/dist/gallery/frame/chunks/markdown-dy5sgjhc.js +11022 -0
  56. package/dist/gallery/frame/chunks/markdown-dz3z5w30.js +30868 -0
  57. package/dist/gallery/frame/chunks/markdown-eg6ngz7y.js +30340 -0
  58. package/dist/gallery/frame/chunks/markdown-ff5wvb43.js +1149 -0
  59. package/dist/gallery/frame/chunks/markdown-ffg06nfz.js +86 -0
  60. package/dist/gallery/frame/chunks/markdown-fvfncadf.js +472 -0
  61. package/dist/gallery/frame/chunks/markdown-gvyszqpv.js +19 -0
  62. package/dist/gallery/frame/chunks/markdown-gx1p0ew0.js +88 -0
  63. package/dist/gallery/frame/chunks/markdown-gxye5frz.js +65 -0
  64. package/dist/gallery/frame/chunks/markdown-h7pzv34e.js +105 -0
  65. package/dist/gallery/frame/chunks/markdown-hab789t9.js +47 -0
  66. package/dist/gallery/frame/chunks/markdown-hjp6sj8t.js +125 -0
  67. package/dist/gallery/frame/chunks/markdown-jka64qgp.js +1993 -0
  68. package/dist/gallery/frame/chunks/markdown-k8xkn8mw.js +56 -0
  69. package/dist/gallery/frame/chunks/markdown-m7frq8x8.js +112 -0
  70. package/dist/gallery/frame/chunks/markdown-p740v4qm.js +36 -0
  71. package/dist/gallery/frame/chunks/markdown-pxfeh231.js +57 -0
  72. package/dist/gallery/frame/chunks/markdown-pzgd8z3s.js +87 -0
  73. package/dist/gallery/frame/chunks/markdown-qx3cngz2.js +1673 -0
  74. package/dist/gallery/frame/chunks/markdown-rawhfvvc.js +85 -0
  75. package/dist/gallery/frame/chunks/markdown-rd8w0ng9.js +49 -0
  76. package/dist/gallery/frame/chunks/markdown-rm2yxfjj.js +2773 -0
  77. package/dist/gallery/frame/chunks/markdown-s1jatrnk.js +993 -0
  78. package/dist/gallery/frame/chunks/markdown-sgfg5vvq.js +59 -0
  79. package/dist/gallery/frame/chunks/markdown-t4ethv9d.js +409 -0
  80. package/dist/gallery/frame/chunks/markdown-tnmabqvz.js +36 -0
  81. package/dist/gallery/frame/chunks/markdown-tvdpppw8.js +5292 -0
  82. package/dist/gallery/frame/chunks/markdown-v0x27twr.js +22 -0
  83. package/dist/gallery/frame/chunks/markdown-v14td68x.js +36 -0
  84. package/dist/gallery/frame/chunks/markdown-w6sgd54z.js +36 -0
  85. package/dist/gallery/frame/chunks/markdown-xw8dsk8b.js +2125 -0
  86. package/dist/gallery/frame/chunks/markdown-y18mve73.js +85 -0
  87. package/dist/gallery/frame/chunks/markdown-yengsms5.js +427 -0
  88. package/dist/gallery/frame/chunks/markdown-z1wc0v0d.js +1826 -0
  89. package/dist/gallery/frame/chunks/markdown-zazx9h4n.js +329 -0
  90. package/dist/gallery/frame/chunks/mermaid-de7p4v0x.js +30 -0
  91. package/dist/gallery/frame/chunks/mindmap-definition-FAOFIHXS-ra44cbem.js +1216 -0
  92. package/dist/gallery/frame/chunks/packet-7NZHBO7P-xppm5913.js +10 -0
  93. package/dist/gallery/frame/chunks/pegDiagram-VL7TDLO6-a2a4wg03.js +163 -0
  94. package/dist/gallery/frame/chunks/pie-RZYD4A2V-hnbxk152.js +10 -0
  95. package/dist/gallery/frame/chunks/pieDiagram-7S7Q4E2Y-f1vxjtmx.js +311 -0
  96. package/dist/gallery/frame/chunks/quadrantDiagram-CIZ2JOQS-ywafa6kh.js +1390 -0
  97. package/dist/gallery/frame/chunks/radar-I7S5WNFK-ewqd27se.js +10 -0
  98. package/dist/gallery/frame/chunks/railroad-3IZDKUUU-5hy4bdx3.js +10 -0
  99. package/dist/gallery/frame/chunks/railroad-abnf-AHOZXSZD-bh5sxz0d.js +10 -0
  100. package/dist/gallery/frame/chunks/railroad-ebnf-EBAXGLYW-6b9c3zeh.js +10 -0
  101. package/dist/gallery/frame/chunks/railroad-peg-LSFZ7HO6-avc8v39s.js +10 -0
  102. package/dist/gallery/frame/chunks/railroadDiagram-AXF67PYL-qc61wax4.js +131 -0
  103. package/dist/gallery/frame/chunks/requirementDiagram-LRYGKXZP-9bs4786c.js +1295 -0
  104. package/dist/gallery/frame/chunks/sankeyDiagram-W5VNT64P-awt1em8b.js +1339 -0
  105. package/dist/gallery/frame/chunks/sequenceDiagram-SI44F4Z6-qaf9mz3t.js +4324 -0
  106. package/dist/gallery/frame/chunks/sizeCapture-X5ZJPWSS-9fq685xd.js +64 -0
  107. package/dist/gallery/frame/chunks/stateDiagram-OKZ733FA-vx7a7hh0.js +456 -0
  108. package/dist/gallery/frame/chunks/stateDiagram-v2-UEYNNEHI-x4m6ws5t.js +46 -0
  109. package/dist/gallery/frame/chunks/swimlanes-SLNWSIFB-e4mxm1gh.js +8287 -0
  110. package/dist/gallery/frame/chunks/swimlanesDiagram-ULZ7WXOC-0h93e2qq.js +42 -0
  111. package/dist/gallery/frame/chunks/timeline-definition-Z64GVDOM-wp0bhbzg.js +1549 -0
  112. package/dist/gallery/frame/chunks/treeView-QDETBFTQ-hcx7n0vt.js +10 -0
  113. package/dist/gallery/frame/chunks/treemap-6X3UGDF4-av02skdw.js +10 -0
  114. package/dist/gallery/frame/chunks/vennDiagram-T6HMQDX7-pmvk1p7n.js +2566 -0
  115. package/dist/gallery/frame/chunks/wardley-OPB4EBWU-njsp6e40.js +10 -0
  116. package/dist/gallery/frame/chunks/wardleyDiagram-T6FBY63Y-eggmnv4z.js +979 -0
  117. package/dist/gallery/frame/chunks/xychartDiagram-ELKLHX3M-q40tnpe5.js +1954 -0
  118. package/dist/gallery/frame/frame.css +183 -0
  119. package/dist/gallery/frame/runtime/chart.js +42744 -0
  120. package/dist/gallery/frame/runtime/html.js +14 -0
  121. package/dist/gallery/frame/runtime/markdown.js +1403 -0
  122. package/dist/gallery/frame/runtime/mermaid.js +32 -0
  123. package/dist/gallery/frame/runtime/svg.js +14 -0
  124. package/dist/gallery/frame/runtime/tsx.js +52 -0
  125. package/dist/gallery/index.html +104 -0
  126. package/docs/reference/cli.md +163 -0
  127. package/docs/reference/export.md +106 -0
  128. package/docs/reference/html.md +215 -0
  129. package/docs/reference/http.md +85 -0
  130. package/docs/reference/mcp.md +78 -0
  131. package/docs/reference/security.md +119 -0
  132. package/docs/reference/storage.md +93 -0
  133. package/docs/reference/tsx.md +101 -0
  134. package/docs/reference/validation.md +212 -0
  135. package/package.json +89 -0
  136. package/scripts/build-gallery.ts +127 -0
  137. package/scripts/launch-netns.sh +67 -0
  138. package/skills/facet/SKILL.md +100 -0
  139. package/src/cli/client.ts +311 -0
  140. package/src/cli/commands/create.ts +49 -0
  141. package/src/cli/commands/doctor.ts +249 -0
  142. package/src/cli/commands/export.ts +179 -0
  143. package/src/cli/commands/instantiate.ts +35 -0
  144. package/src/cli/commands/list.ts +49 -0
  145. package/src/cli/commands/open.ts +75 -0
  146. package/src/cli/commands/pin.ts +39 -0
  147. package/src/cli/commands/promote.ts +49 -0
  148. package/src/cli/commands/publish.ts +122 -0
  149. package/src/cli/commands/read-back.ts +56 -0
  150. package/src/cli/commands/status.ts +114 -0
  151. package/src/cli/commands/watch.ts +146 -0
  152. package/src/cli/main.ts +522 -0
  153. package/src/cli/output.ts +106 -0
  154. package/src/cli/parser.ts +376 -0
  155. package/src/cli/presenter.ts +212 -0
  156. package/src/cli/service-metadata.ts +134 -0
  157. package/src/cli/spawn-service.ts +326 -0
  158. package/src/css.d.ts +4 -0
  159. package/src/gallery-web/app.ts +1581 -0
  160. package/src/gallery-web/export-menu.ts +121 -0
  161. package/src/gallery-web/export.ts +112 -0
  162. package/src/gallery-web/favicon.ts +54 -0
  163. package/src/gallery-web/frame/entries/chart.ts +6 -0
  164. package/src/gallery-web/frame/entries/html.ts +6 -0
  165. package/src/gallery-web/frame/entries/markdown.ts +6 -0
  166. package/src/gallery-web/frame/entries/mermaid.ts +6 -0
  167. package/src/gallery-web/frame/entries/svg.ts +6 -0
  168. package/src/gallery-web/frame/entries/tsx.ts +6 -0
  169. package/src/gallery-web/frame/frame-payload.ts +91 -0
  170. package/src/gallery-web/frame/renderer-validation.ts +13 -0
  171. package/src/gallery-web/frame/renderers/chart.ts +182 -0
  172. package/src/gallery-web/frame/renderers/dompurify-shim.ts +112 -0
  173. package/src/gallery-web/frame/renderers/html.ts +48 -0
  174. package/src/gallery-web/frame/renderers/markdown.ts +81 -0
  175. package/src/gallery-web/frame/renderers/mermaid.ts +120 -0
  176. package/src/gallery-web/frame/renderers/registry.ts +260 -0
  177. package/src/gallery-web/frame/renderers/svg.ts +393 -0
  178. package/src/gallery-web/frame/renderers/tsx.ts +61 -0
  179. package/src/gallery-web/frame/runtime.ts +501 -0
  180. package/src/gallery-web/frame/styles/artifact.css +8424 -0
  181. package/src/gallery-web/frame/styles/frame.css +183 -0
  182. package/src/gallery-web/frame/styles/html-source.css +23 -0
  183. package/src/gallery-web/frame/view-box.ts +33 -0
  184. package/src/gallery-web/frame-html.ts +72 -0
  185. package/src/gallery-web/index.html +104 -0
  186. package/src/gallery-web/session.ts +107 -0
  187. package/src/gallery-web/sse-client.ts +212 -0
  188. package/src/gallery-web/styles/app.css +420 -0
  189. package/src/gallery-web/styles/tokens.css +112 -0
  190. package/src/gallery-web/styles/verdict.css +186 -0
  191. package/src/gallery-web/swap.ts +64 -0
  192. package/src/gallery-web/theme.ts +40 -0
  193. package/src/gallery-web/view-state.ts +93 -0
  194. package/src/harness-adapters/claude-code/README.md +10 -0
  195. package/src/harness-adapters/claude-code/facet.sh +4 -0
  196. package/src/harness-adapters/codex/README.md +10 -0
  197. package/src/harness-adapters/codex/facet.sh +4 -0
  198. package/src/harness-adapters/mcp/README.md +13 -0
  199. package/src/harness-adapters/mcp/cli-bridge.ts +216 -0
  200. package/src/harness-adapters/mcp/main.ts +15 -0
  201. package/src/harness-adapters/mcp/server.ts +164 -0
  202. package/src/harness-adapters/mcp/tool-schemas.ts +53 -0
  203. package/src/harness-adapters/opencode/README.md +10 -0
  204. package/src/harness-adapters/opencode/facet.sh +4 -0
  205. package/src/runtime/compiled-entrypoints.ts +69 -0
  206. package/src/service/dispatcher.ts +717 -0
  207. package/src/service/export.ts +218 -0
  208. package/src/service/http-utils.ts +55 -0
  209. package/src/service/lexical/expectations.ts +210 -0
  210. package/src/service/lifecycle/idle-controller.ts +125 -0
  211. package/src/service/lifecycle/orphan-cleanup.ts +128 -0
  212. package/src/service/lifecycle/process-lock.ts +235 -0
  213. package/src/service/main.ts +136 -0
  214. package/src/service/process.ts +240 -0
  215. package/src/service/router-guards.ts +239 -0
  216. package/src/service/router.ts +627 -0
  217. package/src/service/security/auth.ts +168 -0
  218. package/src/service/security/host-origin.ts +138 -0
  219. package/src/service/security/http-guards.ts +13 -0
  220. package/src/service/security/leases.ts +182 -0
  221. package/src/service/security/token-store.ts +138 -0
  222. package/src/service/server.ts +356 -0
  223. package/src/service/store/database.ts +61 -0
  224. package/src/service/store/evidence-retention.ts +234 -0
  225. package/src/service/store/migrations.ts +167 -0
  226. package/src/service/store/repository-lifecycle.ts +121 -0
  227. package/src/service/store/repository.ts +732 -0
  228. package/src/service/store/schema.ts +218 -0
  229. package/src/service/stored-verdict.ts +97 -0
  230. package/src/service/stream.ts +301 -0
  231. package/src/service/verdict-enrichment.ts +45 -0
  232. package/src/shared/build/frame-bundle-plugins.ts +61 -0
  233. package/src/shared/build-mode.ts +28 -0
  234. package/src/shared/config/evidence-read.ts +98 -0
  235. package/src/shared/config/limits.ts +56 -0
  236. package/src/shared/config/paths.ts +96 -0
  237. package/src/shared/contracts/artifact-types.ts +2 -0
  238. package/src/shared/contracts/artifact.ts +98 -0
  239. package/src/shared/contracts/commands/_shared.ts +59 -0
  240. package/src/shared/contracts/commands/guards.ts +86 -0
  241. package/src/shared/contracts/commands/index.ts +204 -0
  242. package/src/shared/contracts/commands/names.ts +35 -0
  243. package/src/shared/contracts/commands/requests.ts +149 -0
  244. package/src/shared/contracts/commands/results.ts +200 -0
  245. package/src/shared/contracts/envelope.ts +140 -0
  246. package/src/shared/contracts/events.ts +41 -0
  247. package/src/shared/contracts/observed-counts.ts +19 -0
  248. package/src/shared/contracts/renderers.ts +6 -0
  249. package/src/shared/contracts/validation.ts +296 -0
  250. package/src/shared/errors/facet-error.ts +127 -0
  251. package/src/shared/errors/store-error.ts +68 -0
  252. package/src/shared/evidence-image.ts +37 -0
  253. package/src/shared/export.ts +31 -0
  254. package/src/shared/html/policy.ts +108 -0
  255. package/src/shared/html/style-vocabulary.ts +352 -0
  256. package/src/shared/logging/logger.ts +108 -0
  257. package/src/shared/logging/redact.ts +49 -0
  258. package/src/shared/security/frozen-csp.ts +13 -0
  259. package/src/shared/storage-version.ts +2 -0
  260. package/src/shared/tsx/execution.ts +29 -0
  261. package/src/shared/tsx/import-policy.ts +94 -0
  262. package/src/shared/util/dir-permissions.ts +94 -0
  263. package/src/shared/util/mermaid-nodes.ts +230 -0
  264. package/src/shared/util/process.ts +67 -0
  265. package/src/shared/util/time.ts +21 -0
  266. package/src/shared/version.ts +3 -0
  267. package/src/validation/sandbox/limits.ts +41 -0
  268. package/src/validation/sandbox/netns.ts +177 -0
  269. package/src/validation/tier0/chart.ts +177 -0
  270. package/src/validation/tier0/dom-shim.ts +54 -0
  271. package/src/validation/tier0/html.ts +408 -0
  272. package/src/validation/tier0/markdown.ts +285 -0
  273. package/src/validation/tier0/mermaid.ts +98 -0
  274. package/src/validation/tier0/runner.ts +504 -0
  275. package/src/validation/tier0/svg.ts +321 -0
  276. package/src/validation/tier0/tsx/allowlist-resolver.ts +77 -0
  277. package/src/validation/tier0/tsx/ast-policy-capabilities.ts +238 -0
  278. package/src/validation/tier0/tsx/ast-policy-shared.ts +71 -0
  279. package/src/validation/tier0/tsx/ast-policy.ts +181 -0
  280. package/src/validation/tier0/tsx/compiler.ts +156 -0
  281. package/src/validation/tier0/worker-dispatch.ts +211 -0
  282. package/src/validation/tier0/worker-entry.ts +96 -0
  283. package/src/validation/tier0/worker-input.ts +75 -0
  284. package/src/validation/tier1/browser-process.ts +147 -0
  285. package/src/validation/tier1/cdp-pipe.ts +281 -0
  286. package/src/validation/tier1/entries/chart.ts +5 -0
  287. package/src/validation/tier1/entries/html.ts +6 -0
  288. package/src/validation/tier1/entries/markdown.ts +5 -0
  289. package/src/validation/tier1/entries/mermaid.ts +5 -0
  290. package/src/validation/tier1/entries/svg.ts +5 -0
  291. package/src/validation/tier1/entries/tsx.ts +5 -0
  292. package/src/validation/tier1/frame-target.ts +162 -0
  293. package/src/validation/tier1/harness-entry.ts +261 -0
  294. package/src/validation/tier1/harness.ts +215 -0
  295. package/src/validation/tier1/isolated-probe.ts +94 -0
  296. package/src/validation/tier1/launcher.ts +177 -0
  297. package/src/validation/tier1/limits.ts +80 -0
  298. package/src/validation/tier1/nonce.ts +17 -0
  299. package/src/validation/tier1/protocol-probe.ts +519 -0
  300. package/src/validation/tier1/runner.ts +1122 -0
  301. package/src/validation/tier1/verdict.ts +246 -0
  302. package/src/validation/tier1/webp.ts +69 -0
  303. package/templates/README.md +88 -0
  304. package/templates/bar-compare.vl.json +63 -0
  305. package/templates/capacity-report.tsx +102 -0
  306. package/templates/decision-record.md +24 -0
  307. package/templates/deployment-state.mmd +40 -0
  308. package/templates/exemplar.md +91 -0
  309. package/templates/facet-story.tsx +799 -0
  310. package/templates/fleet-dashboard.html +141 -0
  311. package/templates/html-release-ledger.html +91 -0
  312. package/templates/html-status-report.html +114 -0
  313. package/templates/incident-console.tsx +147 -0
  314. package/templates/legion-boundaries.mmd +23 -0
  315. package/templates/legion-flow.mmd +15 -0
  316. package/templates/legion-sequence.mmd +14 -0
  317. package/templates/legion-state.mmd +7 -0
  318. package/templates/metric-card.svg +29 -0
  319. package/templates/observability-map.svg +101 -0
  320. package/templates/pipeline-audit.md +108 -0
  321. package/templates/release-metrics.vl.json +98 -0
  322. package/templates/service-topology.mmd +47 -0
  323. package/templates/status-report.md +32 -0
  324. package/templates/system-map.svg +53 -0
  325. package/templates/timeseries.vl.json +71 -0
  326. package/templates/tsx-interactive-counter.tsx +19 -0
  327. package/templates/tsx-status-report.tsx +31 -0
@@ -0,0 +1,141 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <title>Fleet dashboard</title>
5
+ </head>
6
+ <body class="bg-legion-paper text-legion-ink leading-relaxed">
7
+ <main class="max-w-2xl p-6 gap-6 flex flex-col">
8
+ <header class="flex flex-col gap-2">
9
+ <div class="flex flex-wrap gap-2 items-center">
10
+ <span class="badge">operations</span>
11
+ <span class="badge">tier 1 verified</span>
12
+ <span class="badge">region set: north</span>
13
+ </div>
14
+ <h1 class="text-2xl font-bold">Fleet dashboard</h1>
15
+ <p class="text-legion-muted text-sm">
16
+ Release workers, evidence queues, and exception paths — current operating window.
17
+ </p>
18
+ </header>
19
+
20
+ <section class="stats stats-vertical bg-base-200 shadow" aria-label="fleet statistics">
21
+ <article class="stat">
22
+ <span class="stat-title">ready workers</span>
23
+ <strong class="stat-value">42</strong>
24
+ <span class="stat-desc text-success">✓ capacity above floor</span>
25
+ </article>
26
+ <article class="stat">
27
+ <span class="stat-title">queued revisions</span>
28
+ <strong class="stat-value">18</strong>
29
+ <span class="stat-desc">7 visual read-backs</span>
30
+ </article>
31
+ <article class="stat">
32
+ <span class="stat-title">p95 publish → visible</span>
33
+ <strong class="stat-value">214 ms</strong>
34
+ <span class="stat-desc text-success">−12 ms this window</span>
35
+ </article>
36
+ </section>
37
+
38
+ <section
39
+ class="alert border border-legion-line rounded-box p-4 flex flex-col gap-2"
40
+ role="status"
41
+ >
42
+ <strong class="font-semibold">Verification window stable</strong>
43
+ <span class="text-sm text-legion-muted">
44
+ One parity investigation remains open. New releases continue through the standard evidence
45
+ path.
46
+ </span>
47
+ </section>
48
+
49
+ <section class="card border border-legion-line rounded-box p-4 gap-3 flex flex-col">
50
+ <div class="flex items-center justify-between gap-2">
51
+ <h2 class="text-lg font-semibold">Worker allocation</h2>
52
+ <span class="badge">42 / 48 ready</span>
53
+ </div>
54
+ <div class="grid grid-cols-3 gap-3">
55
+ <div class="bg-legion-paper rounded p-3 flex flex-col gap-2">
56
+ <span class="text-xs text-legion-muted">ingest</span>
57
+ <strong class="text-xl font-semibold">12</strong>
58
+ <span class="text-xs text-legion-cyan">active</span>
59
+ </div>
60
+ <div class="bg-legion-paper rounded p-3 flex flex-col gap-2">
61
+ <span class="text-xs text-legion-muted">validation</span>
62
+ <strong class="text-xl font-semibold">16</strong>
63
+ <span class="text-xs text-legion-cyan">active</span>
64
+ </div>
65
+ <div class="bg-legion-paper rounded p-3 flex flex-col gap-2">
66
+ <span class="text-xs text-legion-muted">visual</span>
67
+ <strong class="text-xl font-semibold">14</strong>
68
+ <span class="text-xs text-legion-cyan">active</span>
69
+ </div>
70
+ </div>
71
+ </section>
72
+
73
+ <section class="card border border-legion-line rounded-box p-4 gap-3 flex flex-col">
74
+ <div class="flex items-center justify-between gap-2">
75
+ <h2 class="text-lg font-semibold">Current releases</h2>
76
+ <span class="text-xs text-legion-muted">revision-bound evidence</span>
77
+ </div>
78
+ <div class="overflow-x-auto">
79
+ <table class="table table-zebra w-full">
80
+ <thead>
81
+ <tr>
82
+ <th class="text-left">release</th>
83
+ <th class="text-left">stage</th>
84
+ <th class="text-right">workers</th>
85
+ <th class="text-right">verdict</th>
86
+ </tr>
87
+ </thead>
88
+ <tbody>
89
+ <tr>
90
+ <td>north-2026.08.14.3</td>
91
+ <td><span class="badge">visual</span></td>
92
+ <td class="text-right">8</td>
93
+ <td class="text-right text-legion-cyan">✓ ok</td>
94
+ </tr>
95
+ <tr>
96
+ <td>core-2026.08.14.2</td>
97
+ <td><span class="badge">canary</span></td>
98
+ <td class="text-right">6</td>
99
+ <td class="text-right text-legion-cyan">✓ ok</td>
100
+ </tr>
101
+ <tr>
102
+ <td>edge-2026.08.14.1</td>
103
+ <td><span class="badge">review</span></td>
104
+ <td class="text-right">4</td>
105
+ <td class="text-right">→ hold</td>
106
+ </tr>
107
+ <tr>
108
+ <td>archive-2026.08.13.9</td>
109
+ <td><span class="badge">complete</span></td>
110
+ <td class="text-right">0</td>
111
+ <td class="text-right text-legion-cyan">✓ retained</td>
112
+ </tr>
113
+ </tbody>
114
+ </table>
115
+ </div>
116
+ </section>
117
+
118
+ <section class="grid grid-cols-2 gap-4">
119
+ <article class="card border border-legion-line rounded-box p-4 gap-2 flex flex-col">
120
+ <h2 class="text-lg font-semibold">Queue controls</h2>
121
+ <ul class="flex flex-col gap-2 text-sm">
122
+ <li>✓ rejected inputs retained as typed envelopes</li>
123
+ <li>✓ browser checks run by revision SHA</li>
124
+ <li>→ operator review required for promotion</li>
125
+ </ul>
126
+ </article>
127
+ <article class="card border border-legion-line rounded-box p-4 gap-2 flex flex-col">
128
+ <h2 class="text-lg font-semibold">Open attention</h2>
129
+ <p class="text-sm text-legion-muted">
130
+ Reconcile the observed-count investigation before expanding the canary allocation.
131
+ </p>
132
+ <button class="btn btn-primary" type="button">Review evidence</button>
133
+ </article>
134
+ </section>
135
+
136
+ <footer class="text-xs text-legion-muted">
137
+ Static dashboard · no external assets · all classes from the vendored vocabulary.
138
+ </footer>
139
+ </main>
140
+ </body>
141
+ </html>
@@ -0,0 +1,91 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <title>Release ledger</title>
5
+ </head>
6
+ <body class="bg-legion-paper text-legion-ink leading-relaxed">
7
+ <main class="max-w-2xl p-6 gap-6 flex flex-col">
8
+ <header class="flex flex-col gap-2">
9
+ <div class="flex flex-wrap items-center justify-between gap-2">
10
+ <span class="badge">release ledger</span>
11
+ <span class="text-xs text-legion-muted">2026-08-13 · r42</span>
12
+ </div>
13
+ <h1 class="text-2xl font-bold m-0">Verification ledger</h1>
14
+ <p class="text-legion-muted text-sm m-0">
15
+ A compact handoff for shipped revisions, open work, and the evidence that closes each
16
+ item.
17
+ </p>
18
+ </header>
19
+
20
+ <section class="alert border border-legion-line rounded-box p-4">
21
+ <span class="font-medium">Release state: ready for gallery review.</span>
22
+ </section>
23
+
24
+ <section class="grid grid-cols-3 gap-4">
25
+ <div class="stat card border border-legion-line rounded-box p-4">
26
+ <div class="text-xs text-legion-muted">artifact types</div>
27
+ <div class="text-xl font-semibold">7</div>
28
+ <div class="text-xs text-legion-cyan">full surface</div>
29
+ </div>
30
+ <div class="stat card border border-legion-line rounded-box p-4">
31
+ <div class="text-xs text-legion-muted">review stages</div>
32
+ <div class="text-xl font-semibold">2</div>
33
+ <div class="text-xs text-legion-cyan">policy and browser</div>
34
+ </div>
35
+ <div class="stat card border border-legion-line rounded-box p-4">
36
+ <div class="text-xs text-legion-muted">blocked</div>
37
+ <div class="text-xl font-semibold">0</div>
38
+ <div class="text-xs text-legion-muted">no action required</div>
39
+ </div>
40
+ </section>
41
+
42
+ <section class="card border border-legion-line rounded-box p-4 gap-3 flex flex-col">
43
+ <div class="flex items-center justify-between gap-2">
44
+ <h2 class="text-lg font-semibold m-0">Revision queue</h2>
45
+ <button class="btn" type="button">Review evidence</button>
46
+ </div>
47
+ <div class="overflow-x-auto">
48
+ <table class="table table-zebra w-full">
49
+ <thead>
50
+ <tr>
51
+ <th class="text-left">surface</th>
52
+ <th class="text-left">revision</th>
53
+ <th class="text-right">verdict</th>
54
+ </tr>
55
+ </thead>
56
+ <tbody>
57
+ <tr>
58
+ <td>system map</td>
59
+ <td class="text-legion-muted">revision 01</td>
60
+ <td class="text-right"><span class="badge">ok</span></td>
61
+ </tr>
62
+ <tr>
63
+ <td>release ledger</td>
64
+ <td class="text-legion-muted">revision 02</td>
65
+ <td class="text-right"><span class="badge">ok</span></td>
66
+ </tr>
67
+ <tr>
68
+ <td>interactive counter</td>
69
+ <td class="text-legion-muted">observed structure</td>
70
+ <td class="text-right"><span class="badge">ok</span></td>
71
+ </tr>
72
+ </tbody>
73
+ </table>
74
+ </div>
75
+ </section>
76
+
77
+ <section class="card border border-legion-line rounded-box p-4 gap-3 flex flex-col">
78
+ <h2 class="text-lg font-semibold m-0">Review order</h2>
79
+ <ol class="flex flex-col gap-2 m-0">
80
+ <li>Open the gallery and select a revision.</li>
81
+ <li>Confirm the verdict and observed structure.</li>
82
+ <li>Record the release decision against its revision sha.</li>
83
+ </ol>
84
+ </section>
85
+
86
+ <footer class="text-xs text-legion-muted">
87
+ Static HTML · vendored classes only · no external resources
88
+ </footer>
89
+ </main>
90
+ </body>
91
+ </html>
@@ -0,0 +1,114 @@
1
+ <!doctype html>
2
+ <!--
3
+ HTML status report starter.
4
+
5
+ Neutral status / report page that exercises the shipped vocabulary
6
+ without script, event handlers, inline styles, external fonts or
7
+ media, unsupported classes, or Facet markers. Every `class=` token
8
+ on this page belongs to `src/shared/html/style-vocabulary.ts` — the
9
+ vocabulary-drift guard test
10
+ (tests/unit/html-style-vocabulary-doc.test.ts) and the starter
11
+ smoke test (tests/integration/html-starter-template.test.ts)
12
+ enforce that.
13
+
14
+ Publish:
15
+ facet publish --artifact-id <id> --type html \
16
+ --file templates/html-status-report.html
17
+ -->
18
+ <html lang="en">
19
+ <head>
20
+ <title>Status report</title>
21
+ </head>
22
+ <body class="bg-legion-paper text-legion-ink leading-relaxed">
23
+ <main class="max-w-2xl p-6 gap-4 flex flex-col">
24
+ <header class="flex flex-col gap-2">
25
+ <h1 class="text-2xl font-bold">Status report</h1>
26
+ <p class="text-legion-muted text-sm">
27
+ What shipped, what is verified, what is blocked — one page, verdict first, all numbers
28
+ traced to source.
29
+ </p>
30
+ </header>
31
+
32
+ <section class="flex flex-wrap gap-2">
33
+ <span class="badge">tier 0</span>
34
+ <span class="badge">tier 1</span>
35
+ <span class="badge">no script</span>
36
+ </section>
37
+
38
+ <section class="grid grid-cols-3 gap-4">
39
+ <div class="card border border-legion-line rounded-box p-4 gap-2 flex flex-col">
40
+ <span class="text-xs text-legion-muted">verifications</span>
41
+ <span class="text-xl font-semibold">9,412</span>
42
+ <span class="text-xs text-legion-cyan">+261 today</span>
43
+ </div>
44
+
45
+ <div class="card border border-legion-line rounded-box p-4 gap-2 flex flex-col">
46
+ <span class="text-xs text-legion-muted">tampered caught</span>
47
+ <span class="text-xl font-semibold">3</span>
48
+ <span class="text-xs text-legion-muted">unchanged</span>
49
+ </div>
50
+
51
+ <div class="card border border-legion-line rounded-box p-4 gap-2 flex flex-col">
52
+ <span class="text-xs text-legion-muted">p95 publish → visible</span>
53
+ <span class="text-xl font-semibold">214 ms</span>
54
+ <span class="text-xs text-legion-cyan">−12 ms vs last week</span>
55
+ </div>
56
+ </section>
57
+
58
+ <section class="card border border-legion-line rounded-box p-4 gap-3 flex flex-col">
59
+ <h2 class="text-lg font-semibold">Counters</h2>
60
+
61
+ <table class="table table-zebra w-full">
62
+ <thead>
63
+ <tr>
64
+ <th class="text-left">metric</th>
65
+ <th class="text-right">value</th>
66
+ <th class="text-right">delta</th>
67
+ </tr>
68
+ </thead>
69
+ <tbody>
70
+ <tr>
71
+ <td>html revisions</td>
72
+ <td class="text-right">412</td>
73
+ <td class="text-right">+18</td>
74
+ </tr>
75
+ <tr>
76
+ <td>script-free</td>
77
+ <td class="text-right">100%</td>
78
+ <td class="text-right">—</td>
79
+ </tr>
80
+ <tr>
81
+ <td>external images</td>
82
+ <td class="text-right">7</td>
83
+ <td class="text-right">+2</td>
84
+ </tr>
85
+ </tbody>
86
+ </table>
87
+ </section>
88
+
89
+ <section class="card border border-legion-line rounded-box p-4 gap-3 flex flex-col">
90
+ <h2 class="text-lg font-semibold">This week</h2>
91
+
92
+ <ul class="flex flex-col gap-2">
93
+ <li class="flex items-center gap-2">
94
+ <span class="badge">shipped</span>
95
+ <span>static HTML artifact type with vendored styling</span>
96
+ </li>
97
+ <li class="flex items-center gap-2">
98
+ <span class="badge">shipped</span>
99
+ <span>parse5 prediction coupled to Chromium observation</span>
100
+ </li>
101
+ <li class="flex items-center gap-2">
102
+ <span class="badge">next</span>
103
+ <span>executable HTML and TSX artifacts</span>
104
+ </li>
105
+ </ul>
106
+ </section>
107
+
108
+ <footer class="text-xs text-legion-muted">
109
+ Published as a static, script-free HTML artifact. Every class on this page is from the
110
+ vendored vocabulary; every image and font is local or absent.
111
+ </footer>
112
+ </main>
113
+ </body>
114
+ </html>
@@ -0,0 +1,147 @@
1
+ import React, { useState } from "react";
2
+
3
+ type Severity = "all" | "critical" | "warning" | "info";
4
+
5
+ const incidents = [
6
+ {
7
+ id: "INC-482",
8
+ severity: "critical",
9
+ service: "visual verifier",
10
+ summary: "Browser lease saturation in north region",
11
+ owner: "release systems",
12
+ age: "18m",
13
+ },
14
+ {
15
+ id: "INC-479",
16
+ severity: "warning",
17
+ service: "evidence ledger",
18
+ summary: "Retention sweep delayed behind export queue",
19
+ owner: "storage control",
20
+ age: "42m",
21
+ },
22
+ {
23
+ id: "INC-476",
24
+ severity: "info",
25
+ service: "publish intake",
26
+ summary: "New revision volume above weekly baseline",
27
+ owner: "build systems",
28
+ age: "1h 12m",
29
+ },
30
+ ] as const;
31
+
32
+ const severities: Severity[] = ["all", "critical", "warning", "info"];
33
+
34
+ export default function IncidentConsole() {
35
+ const [severity, setSeverity] = useState<Severity>("all");
36
+ const [selectedId, setSelectedId] = useState(incidents[0].id);
37
+ const [autoRefresh, setAutoRefresh] = useState(true);
38
+
39
+ const filteredIncidents = incidents.filter(
40
+ (incident) => severity === "all" || incident.severity === severity,
41
+ );
42
+ const selectedIncident =
43
+ filteredIncidents.find((incident) => incident.id === selectedId) ?? filteredIncidents[0];
44
+ const criticalCount = incidents.filter((incident) => incident.severity === "critical").length;
45
+
46
+ return (
47
+ <main className="max-w-2xl p-6 gap-6 flex flex-col bg-legion-paper text-legion-ink">
48
+ <header className="flex flex-col gap-2">
49
+ <div className="flex flex-wrap gap-2 items-center">
50
+ <span className="badge">incident console</span>
51
+ <span className="badge">{autoRefresh ? "live refresh" : "manual refresh"}</span>
52
+ <span className="badge">{criticalCount} critical</span>
53
+ </div>
54
+ <h1 className="text-2xl font-bold">Incident console</h1>
55
+ <p className="text-sm text-legion-muted">
56
+ Current exceptions across the release and verification surfaces.
57
+ </p>
58
+ </header>
59
+
60
+ <section
61
+ className="alert border border-legion-line rounded-box p-4 flex flex-col gap-2"
62
+ role="status"
63
+ >
64
+ <strong className="font-semibold">{criticalCount} critical incident requires review</strong>
65
+ <span className="text-sm text-legion-muted">
66
+ Auto refresh is {autoRefresh ? "enabled" : "paused"}; selection remains local to this
67
+ console.
68
+ </span>
69
+ </section>
70
+
71
+ <section className="flex flex-wrap gap-2" aria-label="severity filters">
72
+ {severities.map((nextSeverity) => (
73
+ <button
74
+ key={nextSeverity}
75
+ type="button"
76
+ className="btn btn-outline"
77
+ onClick={() => setSeverity(nextSeverity)}
78
+ >
79
+ {nextSeverity}
80
+ </button>
81
+ ))}
82
+ <button
83
+ type="button"
84
+ className="btn btn-primary"
85
+ onClick={() => setAutoRefresh((value) => !value)}
86
+ >
87
+ {autoRefresh ? "Pause refresh" : "Resume refresh"}
88
+ </button>
89
+ </section>
90
+
91
+ <section className="grid grid-cols-2 gap-4">
92
+ <article className="card border border-legion-line rounded-box p-4 gap-3 flex flex-col">
93
+ <h2 className="text-lg font-semibold">Active incidents</h2>
94
+ <div className="flex flex-col gap-2">
95
+ {filteredIncidents.map((incident) => (
96
+ <button
97
+ key={incident.id}
98
+ type="button"
99
+ className="btn btn-ghost h-auto items-start p-3 text-left flex flex-col gap-2"
100
+ onClick={() => setSelectedId(incident.id)}
101
+ >
102
+ <span className="flex items-center justify-between gap-2">
103
+ <strong className="font-medium">{incident.id}</strong>
104
+ <span className="badge">{incident.severity}</span>
105
+ </span>
106
+ <span className="text-sm text-legion-muted">{incident.summary}</span>
107
+ </button>
108
+ ))}
109
+ </div>
110
+ </article>
111
+
112
+ <article className="card border border-legion-line rounded-box p-4 gap-3 flex flex-col">
113
+ <h2 className="text-lg font-semibold">Incident detail</h2>
114
+ {selectedIncident ? (
115
+ <div className="flex flex-col gap-3">
116
+ <div className="flex items-center justify-between gap-2">
117
+ <span className="text-xl font-bold">{selectedIncident.id}</span>
118
+ <span className="badge">{selectedIncident.severity}</span>
119
+ </div>
120
+ <p className="text-sm">{selectedIncident.summary}</p>
121
+ <table className="table table-zebra w-full">
122
+ <tbody>
123
+ <tr>
124
+ <td>service</td>
125
+ <td className="text-right">{selectedIncident.service}</td>
126
+ </tr>
127
+ <tr>
128
+ <td>owner</td>
129
+ <td className="text-right">{selectedIncident.owner}</td>
130
+ </tr>
131
+ <tr>
132
+ <td>age</td>
133
+ <td className="text-right">{selectedIncident.age}</td>
134
+ </tr>
135
+ </tbody>
136
+ </table>
137
+ </div>
138
+ ) : (
139
+ <p className="text-sm text-legion-muted">
140
+ No incidents match the active severity filter.
141
+ </p>
142
+ )}
143
+ </article>
144
+ </section>
145
+ </main>
146
+ );
147
+ }
@@ -0,0 +1,23 @@
1
+ %%{init: {"theme": "base", "themeVariables": {"background": "transparent", "primaryColor": "#1e2030", "primaryTextColor": "#c8d3f5", "primaryBorderColor": "#3b4261", "lineColor": "#545c7e", "textColor": "#a9b1d6", "fontFamily": "ui-monospace, Menlo, monospace", "fontSize": "13px", "clusterBkg": "#1a1b26", "clusterBorder": "#2e2e3a", "edgeLabelBackground": "#16161e"}}}%%
2
+ flowchart TB
3
+ subgraph host [host · operator session]
4
+ CLI[facet cli]
5
+ SVC[service · byte-dumb]
6
+ end
7
+ subgraph netns [network namespace · no egress]
8
+ T0[tier 0 parser worker]
9
+ T1[tier 1 headless shell]
10
+ end
11
+ subgraph browser [your browser · display only]
12
+ SHELL[gallery shell]
13
+ FRAME[opaque frame · nonce CSP]
14
+ end
15
+ CLI --> SVC
16
+ SVC -->|bytes| T0
17
+ SVC -->|bytes| T1
18
+ SVC -->|lease| SHELL
19
+ SHELL -->|one-shot ingress| FRAME
20
+
21
+ classDef ok stroke:#c3e88d,color:#c3e88d
22
+ classDef warn stroke:#ffc777,color:#ffc777
23
+ classDef fail stroke:#ff757f,color:#ff757f
@@ -0,0 +1,15 @@
1
+ %%{init: {"theme": "base", "themeVariables": {"background": "transparent", "primaryColor": "#1e2030", "primaryTextColor": "#c8d3f5", "primaryBorderColor": "#3b4261", "secondaryColor": "#222436", "tertiaryColor": "#16161e", "lineColor": "#545c7e", "textColor": "#a9b1d6", "fontFamily": "ui-monospace, Menlo, monospace", "fontSize": "14px", "edgeLabelBackground": "#16161e", "clusterBkg": "#1a1b26", "clusterBorder": "#2e2e3a"}}}%%
2
+ flowchart LR
3
+ A([source bytes]) --> B[hash + store]
4
+ B --> C{validate}
5
+ C -->|tier 0| D[parse counts]
6
+ C -->|tier 1| E[browser verify]
7
+ D --> F([verdict])
8
+ E --> F
9
+
10
+ %% hue is semantic only — apply sparingly
11
+ classDef ok stroke:#c3e88d,color:#c3e88d
12
+ classDef warn stroke:#ffc777,color:#ffc777
13
+ classDef fail stroke:#ff757f,color:#ff757f
14
+ classDef accent stroke:#86e1fc,color:#86e1fc
15
+ class F ok
@@ -0,0 +1,14 @@
1
+ %%{init: {"theme": "base", "themeVariables": {"background": "transparent", "primaryColor": "#1e2030", "primaryTextColor": "#c8d3f5", "primaryBorderColor": "#3b4261", "lineColor": "#545c7e", "textColor": "#a9b1d6", "fontFamily": "ui-monospace, Menlo, monospace", "fontSize": "13px", "actorBkg": "#1e2030", "actorBorder": "#3b4261", "actorTextColor": "#c8d3f5", "signalColor": "#545c7e", "signalTextColor": "#a9b1d6", "noteBkgColor": "#222436", "noteBorderColor": "#3b4261", "noteTextColor": "#c8d3f5", "labelBoxBkgColor": "#1a1b26", "labelBoxBorderColor": "#2e2e3a", "labelTextColor": "#c8d3f5", "loopTextColor": "#a9b1d6"}}}%%
2
+ sequenceDiagram
3
+ participant agent
4
+ participant cli as facet cli
5
+ participant svc as service
6
+ participant t1 as tier 1 verifier
7
+
8
+ agent->>cli: publish artifact.md
9
+ cli->>svc: envelope facet.v1
10
+ svc->>svc: hash · store · lexical counts
11
+ svc->>t1: verify revision
12
+ t1-->>svc: verdict ok
13
+ svc-->>cli: envelope + verdict
14
+ cli-->>agent: ✓ ok · tier 1
@@ -0,0 +1,7 @@
1
+ %%{init: {"theme": "base", "themeVariables": {"background": "transparent", "primaryColor": "#1e2030", "primaryTextColor": "#c8d3f5", "primaryBorderColor": "#3b4261", "lineColor": "#545c7e", "textColor": "#a9b1d6", "fontFamily": "ui-monospace, Menlo, monospace", "fontSize": "13px"}}}%%
2
+ stateDiagram-v2
3
+ [*] --> dormant
4
+ dormant --> active : first command
5
+ active --> active : requests
6
+ active --> dormant : idle deadline
7
+ note right of dormant : zero processes · zero ports
@@ -0,0 +1,29 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="800" height="420" viewBox="0 0 800 420" role="img" aria-label="metric card template">
2
+
3
+ <rect x="1" y="1" width="798" height="418" rx="14" fill="#16161e" stroke="#2e2e3a"></rect>
4
+
5
+
6
+ <text x="48" y="76" font-family="ui-monospace, Menlo, monospace" font-size="11" letter-spacing="3" fill="#86e1fc">RENDER VERIFICATION</text>
7
+
8
+
9
+ <text x="48" y="116" font-family="&#39;Space Grotesk&#39;, &#39;Geist&#39;, system-ui, sans-serif" font-size="26" font-weight="600" fill="#e6ecff">Tier 1 read-backs</text>
10
+
11
+
12
+ <text x="48" y="238" font-family="ui-monospace, Menlo, monospace" font-size="64" font-weight="600" fill="#c8d3f5">9,412</text>
13
+ <text x="48" y="272" font-family="&#39;Geist&#39;, system-ui, sans-serif" font-size="13" fill="#737aa2">verified renders · 30 days</text>
14
+
15
+
16
+ <g>
17
+ <rect x="614" y="52" width="138" height="28" rx="14" fill="rgba(195,232,141,0.10)" stroke="rgba(195,232,141,0.45)"></rect>
18
+ <text x="634" y="70" font-family="ui-monospace, Menlo, monospace" font-size="12" fill="#c3e88d">✓ OK · T1</text>
19
+ </g>
20
+
21
+
22
+ <text x="48" y="322" font-family="ui-monospace, Menlo, monospace" font-size="14" fill="#c3e88d">▴ +261</text>
23
+ <text x="118" y="322" font-family="&#39;Geist&#39;, system-ui, sans-serif" font-size="13" fill="#737aa2">vs previous 30 days</text>
24
+
25
+
26
+ <line x1="48" y1="356" x2="752" y2="356" stroke="#2e2e3a"></line>
27
+ <text x="48" y="384" font-family="ui-monospace, Menlo, monospace" font-size="11" fill="#545c7e">facet · a-0197 @ 9f2c41ab</text>
28
+ <text x="752" y="384" text-anchor="end" font-family="ui-monospace, Menlo, monospace" font-size="11" fill="#545c7e">2026-08-08</text>
29
+ </svg>