@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,101 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="1200" height="760" viewBox="0 0 1200 760" role="img" aria-label="Observability architecture map">
2
+ <defs>
3
+ <linearGradient id="control-gradient" x1="0" y1="0" x2="1" y2="1">
4
+ <stop offset="0" stop-color="#222436" />
5
+ <stop offset="1" stop-color="#1a1b26" />
6
+ </linearGradient>
7
+ <linearGradient id="signal-gradient" x1="0" y1="0" x2="1" y2="0">
8
+ <stop offset="0" stop-color="#86e1fc" stop-opacity="0.18" />
9
+ <stop offset="1" stop-color="#c3e88d" stop-opacity="0.08" />
10
+ </linearGradient>
11
+ <linearGradient id="alert-gradient" x1="0" y1="0" x2="0" y2="1">
12
+ <stop offset="0" stop-color="#ffc777" stop-opacity="0.22" />
13
+ <stop offset="1" stop-color="#ff757f" stop-opacity="0.08" />
14
+ </linearGradient>
15
+ </defs>
16
+
17
+ <g aria-label="signal sources">
18
+ <rect x="48" y="78" width="260" height="500" rx="18" fill="url(#control-gradient)" stroke="#3b4261" stroke-width="2" />
19
+ <text x="76" y="122" font-family="ui-monospace, Menlo, monospace" font-size="13" letter-spacing="2" fill="#86e1fc">SIGNAL SOURCES</text>
20
+ <text x="76" y="154" font-family="system-ui, sans-serif" font-size="24" font-weight="600" fill="#e6ecff">Release surface</text>
21
+
22
+ <g>
23
+ <rect x="76" y="190" width="204" height="82" rx="12" fill="#16161e" stroke="#545c7e" />
24
+ <text x="98" y="223" font-family="ui-monospace, Menlo, monospace" font-size="14" fill="#c8d3f5">publish envelope</text>
25
+ <text x="98" y="247" font-family="system-ui, sans-serif" font-size="12" fill="#828bb8">identity · policy · timing</text>
26
+ </g>
27
+ <g>
28
+ <rect x="76" y="304" width="204" height="82" rx="12" fill="#16161e" stroke="#545c7e" />
29
+ <text x="98" y="337" font-family="ui-monospace, Menlo, monospace" font-size="14" fill="#c8d3f5">tier 0 result</text>
30
+ <text x="98" y="361" font-family="system-ui, sans-serif" font-size="12" fill="#828bb8">parse counts · policy verdict</text>
31
+ </g>
32
+ <g>
33
+ <rect x="76" y="418" width="204" height="82" rx="12" fill="#16161e" stroke="#545c7e" />
34
+ <text x="98" y="451" font-family="ui-monospace, Menlo, monospace" font-size="14" fill="#c8d3f5">tier 1 evidence</text>
35
+ <text x="98" y="475" font-family="system-ui, sans-serif" font-size="12" fill="#828bb8">frame observation · screenshot</text>
36
+ </g>
37
+ </g>
38
+
39
+ <g aria-label="telemetry pipeline">
40
+ <rect x="400" y="78" width="390" height="500" rx="18" fill="url(#signal-gradient)" stroke="#3b4261" stroke-width="2" />
41
+ <text x="430" y="122" font-family="ui-monospace, Menlo, monospace" font-size="13" letter-spacing="2" fill="#86e1fc">TELEMETRY PIPELINE</text>
42
+ <text x="430" y="154" font-family="system-ui, sans-serif" font-size="24" font-weight="600" fill="#e6ecff">Evidence routing</text>
43
+
44
+ <path d="M 452 226 C 520 176, 620 176, 690 226" fill="none" stroke="#86e1fc" stroke-width="3" />
45
+ <path d="M 452 334 C 530 384, 610 384, 690 334" fill="none" stroke="#c3e88d" stroke-width="3" />
46
+ <path d="M 452 442 C 530 392, 610 392, 690 442" fill="none" stroke="#ffc777" stroke-width="3" stroke-dasharray="8 8" />
47
+
48
+ <rect x="438" y="200" width="120" height="52" rx="10" fill="#1e2030" stroke="#86e1fc" />
49
+ <text x="498" y="232" text-anchor="middle" font-family="ui-monospace, Menlo, monospace" font-size="13" fill="#c8d3f5">ingest</text>
50
+ <rect x="632" y="200" width="120" height="52" rx="10" fill="#1e2030" stroke="#86e1fc" />
51
+ <text x="692" y="232" text-anchor="middle" font-family="ui-monospace, Menlo, monospace" font-size="13" fill="#c8d3f5">normalize</text>
52
+
53
+ <rect x="438" y="308" width="120" height="52" rx="10" fill="#1e2030" stroke="#c3e88d" />
54
+ <text x="498" y="340" text-anchor="middle" font-family="ui-monospace, Menlo, monospace" font-size="13" fill="#c8d3f5">correlate</text>
55
+ <rect x="632" y="308" width="120" height="52" rx="10" fill="#1e2030" stroke="#c3e88d" />
56
+ <text x="692" y="340" text-anchor="middle" font-family="ui-monospace, Menlo, monospace" font-size="13" fill="#c8d3f5">retain</text>
57
+
58
+ <rect x="438" y="416" width="120" height="52" rx="10" fill="#1e2030" stroke="#ffc777" />
59
+ <text x="498" y="448" text-anchor="middle" font-family="ui-monospace, Menlo, monospace" font-size="13" fill="#c8d3f5">query</text>
60
+ <rect x="632" y="416" width="120" height="52" rx="10" fill="#1e2030" stroke="#ffc777" />
61
+ <text x="692" y="448" text-anchor="middle" font-family="ui-monospace, Menlo, monospace" font-size="13" fill="#c8d3f5">review</text>
62
+ </g>
63
+
64
+ <g aria-label="operator outcomes">
65
+ <rect x="882" y="78" width="270" height="500" rx="18" fill="url(#alert-gradient)" stroke="#3b4261" stroke-width="2" />
66
+ <text x="912" y="122" font-family="ui-monospace, Menlo, monospace" font-size="13" letter-spacing="2" fill="#86e1fc">OPERATOR OUTCOMES</text>
67
+ <text x="912" y="154" font-family="system-ui, sans-serif" font-size="24" font-weight="600" fill="#e6ecff">Decision surface</text>
68
+
69
+ <rect x="912" y="208" width="210" height="88" rx="12" fill="#16161e" stroke="#c3e88d" />
70
+ <text x="936" y="242" font-family="ui-monospace, Menlo, monospace" font-size="14" fill="#c3e88d">✓ release record</text>
71
+ <text x="936" y="268" font-family="system-ui, sans-serif" font-size="12" fill="#828bb8">evidence bound to revision</text>
72
+
73
+ <rect x="912" y="328" width="210" height="88" rx="12" fill="#16161e" stroke="#ffc777" />
74
+ <text x="936" y="362" font-family="ui-monospace, Menlo, monospace" font-size="14" fill="#ffc777">→ follow-up queue</text>
75
+ <text x="936" y="388" font-family="system-ui, sans-serif" font-size="12" fill="#828bb8">parity drift needs review</text>
76
+
77
+ <rect x="912" y="448" width="210" height="88" rx="12" fill="#16161e" stroke="#ff757f" />
78
+ <text x="936" y="482" font-family="ui-monospace, Menlo, monospace" font-size="14" fill="#ff757f">✗ typed refusal</text>
79
+ <text x="936" y="508" font-family="system-ui, sans-serif" font-size="12" fill="#828bb8">unsafe input stopped early</text>
80
+ </g>
81
+
82
+ <g fill="none" stroke="#545c7e" stroke-width="2" stroke-dasharray="7 7">
83
+ <path d="M 308 231 C 344 231, 366 226, 438 226" />
84
+ <path d="M 308 345 C 352 345, 382 334, 438 334" />
85
+ <path d="M 308 459 C 350 459, 390 442, 438 442" />
86
+ <path d="M 752 334 C 804 334, 842 252, 912 252" />
87
+ <path d="M 752 442 C 812 442, 848 372, 912 372" />
88
+ </g>
89
+
90
+ <g aria-label="legend">
91
+ <rect x="48" y="630" width="1104" height="82" rx="14" fill="#16161e" stroke="#2e2e3a" />
92
+ <text x="76" y="664" font-family="ui-monospace, Menlo, monospace" font-size="12" letter-spacing="2" fill="#a9b1d6">LEGEND</text>
93
+ <line x1="196" y1="660" x2="244" y2="660" stroke="#86e1fc" stroke-width="3" />
94
+ <text x="258" y="665" font-family="system-ui, sans-serif" font-size="13" fill="#c8d3f5">ingest path</text>
95
+ <line x1="396" y1="660" x2="444" y2="660" stroke="#c3e88d" stroke-width="3" />
96
+ <text x="458" y="665" font-family="system-ui, sans-serif" font-size="13" fill="#c8d3f5">verified route</text>
97
+ <line x1="614" y1="660" x2="662" y2="660" stroke="#ffc777" stroke-width="3" stroke-dasharray="8 8" />
98
+ <text x="676" y="665" font-family="system-ui, sans-serif" font-size="13" fill="#c8d3f5">operator review</text>
99
+ <text x="1124" y="690" text-anchor="end" font-family="ui-monospace, Menlo, monospace" font-size="11" fill="#545c7e">facet · observability map · revision-bound evidence</text>
100
+ </g>
101
+ </svg>
@@ -0,0 +1,108 @@
1
+ # Release pipeline audit
2
+
3
+ **Scope:** release control plane · **window:** 2026-08-14 · **verdict:** ✓ verified with two follow-ups
4
+
5
+ > The pipeline accepted only immutable inputs during this audit. Markdown Mermaid labels remain visible, and each diagram's pan/zoom stays confined to its own region.
6
+
7
+ ## Executive signal
8
+
9
+ The release path is structurally sound from source intake through visual verification. Evidence retention and operator handoff remain the two areas that need active review.
10
+
11
+ | Control | Owner | Evidence | State |
12
+ | --------------- | ------------- | ------------------------------ | ----------- |
13
+ | Source intake | Build systems | immutable revision hash | ✓ ok |
14
+ | Tier 0 parse | Validation | lexical counts + policy result | ✓ ok |
15
+ | Tier 1 render | Verification | browser observation | ✓ ok |
16
+ | Release handoff | Operations | signed deployment record | → follow-up |
17
+
18
+ ## Audit boundary
19
+
20
+ ### Inputs reviewed
21
+
22
+ - [x] Revision bytes and content address
23
+ - [x] Validation envelope persistence
24
+ - [x] Browser-backed visual read-back
25
+ - [ ] Operator acknowledgement record
26
+
27
+ ### Invariants
28
+
29
+ 1. A publish request names one artifact type.
30
+ 2. Tier 1 observes the revision selected by its SHA.
31
+ 3. Remote data and executable document features fail closed.
32
+
33
+ ```ts
34
+ type AuditFinding = {
35
+ control: string;
36
+ status: "ok" | "follow-up";
37
+ evidence: string[];
38
+ };
39
+
40
+ const finding: AuditFinding = {
41
+ control: "revision identity",
42
+ status: "ok",
43
+ evidence: ["sha256", "tier0", "tier1"],
44
+ };
45
+ ```
46
+
47
+ ```bash
48
+ facet create --project-id ops-audit --slug release-pipeline-audit --title "Release pipeline audit"
49
+ facet publish --artifact-id <id> --type markdown --file templates/pipeline-audit.md
50
+ facet read-back --artifact-id <id> --revision-sha <sha256> --tier visual
51
+ ```
52
+
53
+ ```json
54
+ {
55
+ "control": "tier1-parity",
56
+ "expected": "ok",
57
+ "evidence": {
58
+ "rendererRootSvgCount": 2,
59
+ "externalImageCount": 0
60
+ }
61
+ }
62
+ ```
63
+
64
+ ---
65
+
66
+ ## Verification path
67
+
68
+ ```mermaid
69
+ flowchart LR
70
+ A[source revision] --> B[content hash]
71
+ B --> C{policy gate}
72
+ C -->|pass| D[tier 0]
73
+ D --> E[tier 1]
74
+ E --> F[retained evidence]
75
+ C -->|deny| G[typed refusal]
76
+ ```
77
+
78
+ The [CLI reference](../docs/reference/cli.md) defines the envelope contract. Use `revision.sha256`, not a later lookup, when retrieving evidence.
79
+
80
+ ## Findings
81
+
82
+ | Finding | Impact | Disposition |
83
+ | --------------------------------------------------------- | ----------------------------- | ----------- |
84
+ | Evidence records are revision-bound | avoids latest-write ambiguity | ✓ retained |
85
+ | Mermaid labels remain visible in markdown gallery renders | diagrams retain text context | ✓ retained |
86
+ | Handoff acknowledgement is external to publish | requires operator evidence | → follow-up |
87
+
88
+ ### Follow-up queue
89
+
90
+ - [ ] Attach the signed handoff record to the release review.
91
+ - [x] Re-run the visual proof after the markdown Mermaid label fix.
92
+ - [x] Keep source bytes and verification evidence separate.
93
+
94
+ ```mermaid
95
+ sequenceDiagram
96
+ participant Build as build system
97
+ participant Facet as facet service
98
+ participant Browser as visual verifier
99
+ Build->>Facet: publish immutable bytes
100
+ Facet->>Facet: validate tier 0
101
+ Browser->>Facet: request revision by SHA
102
+ Browser-->>Facet: observed counts
103
+ Facet-->>Build: retained verdict
104
+ ```
105
+
106
+ ### Operator note
107
+
108
+ > Do not treat a gallery image as a promotion authority. It proves the render path; the release record proves the handoff.
@@ -0,0 +1,98 @@
1
+ {
2
+ "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
3
+ "description": "Release throughput and verification latency — inline data only.",
4
+ "background": "transparent",
5
+ "width": 700,
6
+ "height": 330,
7
+ "title": {
8
+ "text": "Release throughput · verification latency",
9
+ "anchor": "start",
10
+ "color": "#c8d3f5",
11
+ "font": "system-ui, sans-serif",
12
+ "fontSize": 16,
13
+ "fontWeight": 600,
14
+ "offset": 18
15
+ },
16
+ "data": {
17
+ "values": [
18
+ { "release": "R01", "published": 18, "verified": 17, "latencyMs": 214 },
19
+ { "release": "R02", "published": 22, "verified": 22, "latencyMs": 196 },
20
+ { "release": "R03", "published": 25, "verified": 24, "latencyMs": 228 },
21
+ { "release": "R04", "published": 21, "verified": 21, "latencyMs": 187 },
22
+ { "release": "R05", "published": 29, "verified": 28, "latencyMs": 205 },
23
+ { "release": "R06", "published": 31, "verified": 31, "latencyMs": 179 }
24
+ ]
25
+ },
26
+ "transform": [
27
+ { "calculate": "datum.verified / datum.published", "as": "verificationRate" },
28
+ { "calculate": "datum.latencyMs / 100", "as": "latencyScale" }
29
+ ],
30
+ "layer": [
31
+ {
32
+ "mark": { "type": "bar", "cornerRadiusTopLeft": 4, "cornerRadiusTopRight": 4 },
33
+ "encoding": {
34
+ "x": { "field": "release", "type": "ordinal", "title": null, "axis": { "labelAngle": 0 } },
35
+ "y": {
36
+ "field": "verified",
37
+ "type": "quantitative",
38
+ "title": "verified releases",
39
+ "axis": { "titleColor": "#86e1fc" },
40
+ "scale": { "domain": [0, 36] }
41
+ },
42
+ "color": {
43
+ "value": "#86e1fc",
44
+ "legend": { "title": "series", "labelColor": "#c8d3f5", "titleColor": "#a9b1d6" }
45
+ },
46
+ "tooltip": [
47
+ { "field": "release", "type": "ordinal", "title": "release" },
48
+ { "field": "verified", "type": "quantitative", "title": "verified" },
49
+ {
50
+ "field": "verificationRate",
51
+ "type": "quantitative",
52
+ "title": "verification rate",
53
+ "format": ".1%"
54
+ }
55
+ ]
56
+ }
57
+ },
58
+ {
59
+ "mark": { "type": "line", "strokeWidth": 3, "point": { "filled": true, "size": 70 } },
60
+ "encoding": {
61
+ "x": { "field": "release", "type": "ordinal", "title": null },
62
+ "y": {
63
+ "field": "latencyScale",
64
+ "type": "quantitative",
65
+ "title": "latency · 100 ms",
66
+ "axis": { "orient": "right", "titleColor": "#ffc777" },
67
+ "scale": { "domain": [0, 3.6] }
68
+ },
69
+ "color": { "value": "#ffc777" },
70
+ "tooltip": [
71
+ { "field": "release", "type": "ordinal", "title": "release" },
72
+ { "field": "latencyMs", "type": "quantitative", "title": "latency ms" }
73
+ ]
74
+ }
75
+ }
76
+ ],
77
+ "resolve": { "scale": { "y": "independent" } },
78
+ "config": {
79
+ "view": { "stroke": null },
80
+ "axis": {
81
+ "domainColor": "#3b4261",
82
+ "tickColor": "#3b4261",
83
+ "gridColor": "#232330",
84
+ "gridDash": [2, 4],
85
+ "labelColor": "#828bb8",
86
+ "titleColor": "#a9b1d6",
87
+ "labelFont": "ui-monospace, Menlo, monospace",
88
+ "titleFont": "ui-monospace, Menlo, monospace",
89
+ "labelFontSize": 11,
90
+ "titleFontSize": 11,
91
+ "titlePadding": 12
92
+ },
93
+ "legend": {
94
+ "labelFont": "ui-monospace, Menlo, monospace",
95
+ "titleFont": "ui-monospace, Menlo, monospace"
96
+ }
97
+ }
98
+ }
@@ -0,0 +1,47 @@
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
+ subgraph Intake[release intake]
4
+ A([source bytes]) --> B[hash gate]
5
+ B --> C{content policy}
6
+ C -->|accepted| D{{revision queue}}
7
+ C -->|denied| X((typed refusal))
8
+ end
9
+
10
+ subgraph Control[control plane]
11
+ D --> E[(artifact store)]
12
+ E --> F[revision index]
13
+ F --> G{publish mode}
14
+ G -->|static| H[lexical validator]
15
+ G -->|interactive| I[tsx compiler]
16
+ H --> J([tier 0 verdict])
17
+ I --> J
18
+ end
19
+
20
+ subgraph Evidence[verification plane]
21
+ J -->|visual requested| K{{browser lease}}
22
+ K --> L[isolated frame]
23
+ L --> M{observed parity}
24
+ M -->|match| N((tier 1 ok))
25
+ M -->|drift| O{{counter finding}}
26
+ N --> P[(evidence ledger)]
27
+ O --> P
28
+ end
29
+
30
+ subgraph Delivery[operator surface]
31
+ P --> Q[gallery revision]
32
+ Q --> R{operator review}
33
+ R -->|approve| S([release record])
34
+ R -->|hold| T[review queue]
35
+ end
36
+
37
+ classDef ok fill:#1e2030,stroke:#c3e88d,color:#c3e88d
38
+ classDef warn fill:#222436,stroke:#ffc777,color:#ffc777
39
+ classDef fail fill:#222436,stroke:#ff757f,color:#ff757f
40
+ classDef accent fill:#1e2030,stroke:#86e1fc,color:#86e1fc
41
+ classDef muted fill:#16161e,stroke:#545c7e,color:#a9b1d6
42
+
43
+ class A,D,J,K,N,S ok
44
+ class C,G,M,R accent
45
+ class O,T,X fail
46
+ class B,E,F,H,I,L,P,Q muted
47
+ class X,O,T warn
@@ -0,0 +1,32 @@
1
+ # Q3 ingest pipeline — status
2
+
3
+ **Summary.** What changed, what is verified, what is blocked. One paragraph,
4
+ verdict first.
5
+
6
+ ## Numbers
7
+
8
+ | metric | value | delta |
9
+ | --------------------- | -----: | -----: |
10
+ | verified renders | 9,412 | +261 |
11
+ | tampered caught | 3 | +1 |
12
+ | p95 publish → visible | 214 ms | −12 ms |
13
+
14
+ ## Flow
15
+
16
+ ```mermaid
17
+ %%{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"}}}%%
18
+ flowchart LR
19
+ A([source bytes]) --> B[hash + store]
20
+ B --> C{validate}
21
+ C -->|tier 0| D[parse counts]
22
+ C -->|tier 1| E[browser verify]
23
+ D --> F([verdict])
24
+ E --> F
25
+ classDef ok stroke:#c3e88d,color:#c3e88d
26
+ class F ok
27
+ ```
28
+
29
+ ## Next
30
+
31
+ - [ ] one action, one owner, one date
32
+ - [ ] keep the list short enough to finish
@@ -0,0 +1,53 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="960" height="540" viewBox="0 0 960 540" role="img" aria-label="artifact delivery system map">
2
+ <rect width="960" height="540" rx="20" fill="#16161e"></rect>
3
+
4
+ <g transform="translate(56 48)">
5
+ <text font-family="ui-monospace, Menlo, monospace" font-size="12" letter-spacing="3" fill="#86e1fc">ARTIFACT DELIVERY</text>
6
+ <text y="42" font-family="system-ui, sans-serif" font-size="28" font-weight="600" fill="#e6ecff">Verification path</text>
7
+ <text y="70" font-family="system-ui, sans-serif" font-size="14" fill="#737aa2">Bytes stay isolated until a verifier records the rendered result.</text>
8
+ </g>
9
+
10
+ <g fill="none" stroke="#545c7e" stroke-width="2">
11
+ <path d="M 250 264 H 340"></path>
12
+ <path d="M 510 264 H 600"></path>
13
+ <path d="M 770 264 H 824"></path>
14
+ </g>
15
+ <g fill="#86e1fc">
16
+ <circle cx="340" cy="264" r="4"></circle>
17
+ <circle cx="600" cy="264" r="4"></circle>
18
+ <circle cx="824" cy="264" r="4"></circle>
19
+ </g>
20
+
21
+ <g transform="translate(56 196)">
22
+ <rect width="194" height="136" rx="12" fill="#1e2030" stroke="#3b4261"></rect>
23
+ <text x="24" y="38" font-family="ui-monospace, Menlo, monospace" font-size="11" fill="#86e1fc">01 · SOURCE</text>
24
+ <text x="24" y="76" font-family="system-ui, sans-serif" font-size="20" font-weight="600" fill="#c8d3f5">Artifact bytes</text>
25
+ <text x="24" y="106" font-family="system-ui, sans-serif" font-size="13" fill="#737aa2">Immutable revision</text>
26
+ </g>
27
+
28
+ <g transform="translate(340 196)">
29
+ <rect width="170" height="136" rx="12" fill="#1e2030" stroke="#3b4261"></rect>
30
+ <text x="24" y="38" font-family="ui-monospace, Menlo, monospace" font-size="11" fill="#86e1fc">02 · TIER 0</text>
31
+ <text x="24" y="76" font-family="system-ui, sans-serif" font-size="20" font-weight="600" fill="#c8d3f5">Policy</text>
32
+ <text x="24" y="106" font-family="system-ui, sans-serif" font-size="13" fill="#737aa2">Lexical checks</text>
33
+ </g>
34
+
35
+ <g transform="translate(600 196)">
36
+ <rect width="170" height="136" rx="12" fill="#1e2030" stroke="#3b4261"></rect>
37
+ <text x="24" y="38" font-family="ui-monospace, Menlo, monospace" font-size="11" fill="#86e1fc">03 · TIER 1</text>
38
+ <text x="24" y="76" font-family="system-ui, sans-serif" font-size="20" font-weight="600" fill="#c8d3f5">Browser</text>
39
+ <text x="24" y="106" font-family="system-ui, sans-serif" font-size="13" fill="#737aa2">Observed structure</text>
40
+ </g>
41
+
42
+ <g transform="translate(824 196)">
43
+ <rect width="80" height="136" rx="12" fill="#18231b" stroke="#c3e88d"></rect>
44
+ <text x="40" y="58" text-anchor="middle" font-family="ui-monospace, Menlo, monospace" font-size="11" fill="#c3e88d">OK</text>
45
+ <text x="40" y="84" text-anchor="middle" font-family="ui-monospace, Menlo, monospace" font-size="11" fill="#c3e88d">✓</text>
46
+ </g>
47
+
48
+ <g transform="translate(56 408)">
49
+ <rect width="848" height="76" rx="12" fill="#1e2030" stroke="#3b4261"></rect>
50
+ <text x="24" y="30" font-family="ui-monospace, Menlo, monospace" font-size="11" fill="#545c7e">INVARIANT</text>
51
+ <text x="24" y="56" font-family="system-ui, sans-serif" font-size="15" fill="#c8d3f5">A gallery view identifies an exact revision; verification remains a separate recorded verdict.</text>
52
+ </g>
53
+ </svg>
@@ -0,0 +1,71 @@
1
+ {
2
+ "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
3
+ "description": "Facet timeseries template — inline data only; a data.url spec fails closed.",
4
+ "background": "transparent",
5
+ "width": 640,
6
+ "height": 300,
7
+ "title": {
8
+ "text": "Verified renders · weekly",
9
+ "anchor": "start",
10
+ "color": "#c8d3f5",
11
+ "font": "system-ui, sans-serif",
12
+ "fontSize": 15,
13
+ "fontWeight": 600,
14
+ "offset": 18
15
+ },
16
+ "data": {
17
+ "values": [
18
+ { "week": "W01", "renders": 120 },
19
+ { "week": "W02", "renders": 132 },
20
+ { "week": "W03", "renders": 128 },
21
+ { "week": "W04", "renders": 161 },
22
+ { "week": "W05", "renders": 170 },
23
+ { "week": "W06", "renders": 158 },
24
+ { "week": "W07", "renders": 190 },
25
+ { "week": "W08", "renders": 204 },
26
+ { "week": "W09", "renders": 221 },
27
+ { "week": "W10", "renders": 218 },
28
+ { "week": "W11", "renders": 246 },
29
+ { "week": "W12", "renders": 261 }
30
+ ]
31
+ },
32
+ "mark": {
33
+ "type": "line",
34
+ "color": "#86e1fc",
35
+ "strokeWidth": 2,
36
+ "point": { "filled": true, "fill": "#86e1fc", "size": 34 }
37
+ },
38
+ "encoding": {
39
+ "x": {
40
+ "field": "week",
41
+ "type": "ordinal",
42
+ "title": null,
43
+ "axis": { "labelAngle": 0 }
44
+ },
45
+ "y": {
46
+ "field": "renders",
47
+ "type": "quantitative",
48
+ "title": "renders",
49
+ "axis": { "tickCount": 5 }
50
+ }
51
+ },
52
+ "config": {
53
+ "view": { "stroke": null },
54
+ "axis": {
55
+ "domainColor": "#3b4261",
56
+ "tickColor": "#3b4261",
57
+ "gridColor": "#232330",
58
+ "gridDash": [2, 3],
59
+ "labelColor": "#828bb8",
60
+ "titleColor": "#a9b1d6",
61
+ "labelFont": "ui-monospace, Menlo, monospace",
62
+ "titleFont": "ui-monospace, Menlo, monospace",
63
+ "labelFontSize": 11,
64
+ "titleFontSize": 11,
65
+ "titlePadding": 12
66
+ },
67
+ "range": {
68
+ "category": ["#86e1fc", "#82aaff", "#c099ff", "#ffc777", "#c3e88d", "#ff757f"]
69
+ }
70
+ }
71
+ }
@@ -0,0 +1,19 @@
1
+ import React, { useState } from "react";
2
+
3
+ export default function InteractiveCounter() {
4
+ const [count, setCount] = useState(0);
5
+
6
+ return (
7
+ <section className="card bg-legion-paper p-6 w-full max-w-prose">
8
+ <h1 className="text-2xl font-semibold text-legion-ink">Interactive counter</h1>
9
+ <p className="text-legion-muted mt-2">Button presses: {count}</p>
10
+ <button
11
+ type="button"
12
+ className="btn bg-legion-cyan text-legion-ink mt-4 px-4 py-2 rounded"
13
+ onClick={() => setCount((value) => value + 1)}
14
+ >
15
+ Increment
16
+ </button>
17
+ </section>
18
+ );
19
+ }
@@ -0,0 +1,31 @@
1
+ import React from "react";
2
+
3
+ export default function StatusReport() {
4
+ return (
5
+ <section className="card bg-legion-paper p-6 w-full max-w-prose">
6
+ <h1 className="text-2xl font-semibold text-legion-ink">Status report</h1>
7
+ <p className="text-legion-muted mt-2">Verification state for the current release.</p>
8
+ <section className="mt-4">
9
+ <h2 className="text-lg font-semibold text-legion-ink">Counters</h2>
10
+ <table className="table table-zebra mt-2 w-full">
11
+ <thead>
12
+ <tr>
13
+ <th className="text-legion-ink">Metric</th>
14
+ <th className="text-legion-ink">Value</th>
15
+ </tr>
16
+ </thead>
17
+ <tbody>
18
+ <tr>
19
+ <td>Verified revisions</td>
20
+ <td>12</td>
21
+ </tr>
22
+ <tr>
23
+ <td>Open blockers</td>
24
+ <td>0</td>
25
+ </tr>
26
+ </tbody>
27
+ </table>
28
+ </section>
29
+ </section>
30
+ );
31
+ }