@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.
- package/LICENSE-APACHE +202 -0
- package/LICENSE-MIT +23 -0
- package/README.md +158 -0
- package/dist/gallery/chunk-4g8rem85.css +656 -0
- package/dist/gallery/chunk-c6s9k9ty.js +5970 -0
- package/dist/gallery/frame/artifact.css +8424 -0
- package/dist/gallery/frame/chunks/abnfDiagram-N423BO3Z-jj74szbm.js +155 -0
- package/dist/gallery/frame/chunks/architecture-TIHT7OUA-cvdjn7dt.js +10 -0
- package/dist/gallery/frame/chunks/architectureDiagram-T3A2C74G-n4z77eg6.js +8675 -0
- package/dist/gallery/frame/chunks/blockDiagram-VBNYF7ZC-7xsqzrd1.js +3529 -0
- package/dist/gallery/frame/chunks/c4Diagram-5PPSVZJV-z2zjs7wx.js +2413 -0
- package/dist/gallery/frame/chunks/classDiagram-JCYQIIEL-ve8rngqp.js +47 -0
- package/dist/gallery/frame/chunks/classDiagram-v2-OCEON4UE-8cfaxb8z.js +47 -0
- package/dist/gallery/frame/chunks/cose-bilkent-JH36ORCC-sn92qexx.js +4822 -0
- package/dist/gallery/frame/chunks/cynefin-VYW2F7L2-tqjv913d.js +10 -0
- package/dist/gallery/frame/chunks/cynefinDiagram-MW4NZA55-c1c0dj12.js +500 -0
- package/dist/gallery/frame/chunks/dagre-VZM6K2ZE-7tyg4yt2.js +476 -0
- package/dist/gallery/frame/chunks/diagram-7IWD3JNH-y4eng9sc.js +526 -0
- package/dist/gallery/frame/chunks/diagram-B4RE2ZJO-rn3p7j5h.js +673 -0
- package/dist/gallery/frame/chunks/diagram-LBJQPF4R-w4a2cm9q.js +255 -0
- package/dist/gallery/frame/chunks/diagram-Q27KOJAE-aqc2v7wy.js +575 -0
- package/dist/gallery/frame/chunks/diagram-UB23O5K3-xncy8nyd.js +355 -0
- package/dist/gallery/frame/chunks/ebnfDiagram-BXEA7PRR-acwgxz16.js +175 -0
- package/dist/gallery/frame/chunks/erDiagram-JOGREHBK-mzp5nswt.js +1332 -0
- package/dist/gallery/frame/chunks/eventmodeling-45OFAUF4-sg07qr0c.js +10 -0
- package/dist/gallery/frame/chunks/flowDiagram-UKHOOZJN-2e5ygs44.js +29 -0
- package/dist/gallery/frame/chunks/ganttDiagram-PKOTCBZU-p2hhh7hr.js +2620 -0
- package/dist/gallery/frame/chunks/gitGraph-TEB2WS4Q-j6kw0naa.js +10 -0
- package/dist/gallery/frame/chunks/gitGraphDiagram-DS77QQ5N-4z9z8wjm.js +1347 -0
- package/dist/gallery/frame/chunks/info-DKCQHKI2-mpt80jd3.js +10 -0
- package/dist/gallery/frame/chunks/infoDiagram-6WML65LV-5rqm3mgg.js +65 -0
- package/dist/gallery/frame/chunks/ishikawaDiagram-WSZJBQD7-b51z96jy.js +975 -0
- package/dist/gallery/frame/chunks/journeyDiagram-NVQOT4AX-9jbfp0pk.js +1272 -0
- package/dist/gallery/frame/chunks/kanban-definition-27J2QSJJ-4x0vx4se.js +1116 -0
- package/dist/gallery/frame/chunks/katex-xfgk95tv.js +14034 -0
- package/dist/gallery/frame/chunks/markdown-1s5vwkf2.js +9 -0
- package/dist/gallery/frame/chunks/markdown-2h6bwsms.js +3239 -0
- package/dist/gallery/frame/chunks/markdown-2x113yh8.js +107 -0
- package/dist/gallery/frame/chunks/markdown-30b7rwmp.js +1943 -0
- package/dist/gallery/frame/chunks/markdown-356bfj4g.js +2031 -0
- package/dist/gallery/frame/chunks/markdown-44n9ea69.js +2406 -0
- package/dist/gallery/frame/chunks/markdown-56enrf2r.js +39 -0
- package/dist/gallery/frame/chunks/markdown-5avymm8t.js +725 -0
- package/dist/gallery/frame/chunks/markdown-6r4svars.js +33 -0
- package/dist/gallery/frame/chunks/markdown-6zz8efx2.js +24 -0
- package/dist/gallery/frame/chunks/markdown-7jp6prnb.js +19 -0
- package/dist/gallery/frame/chunks/markdown-809k7q41.js +55 -0
- package/dist/gallery/frame/chunks/markdown-82xmzhzd.js +1076 -0
- package/dist/gallery/frame/chunks/markdown-92n37gd4.js +7627 -0
- package/dist/gallery/frame/chunks/markdown-ag2sssf8.js +36 -0
- package/dist/gallery/frame/chunks/markdown-b4s7ntq2.js +19 -0
- package/dist/gallery/frame/chunks/markdown-c9k0fvp1.js +100 -0
- package/dist/gallery/frame/chunks/markdown-ceefymn8.js +125 -0
- package/dist/gallery/frame/chunks/markdown-d1wfbs70.js +243 -0
- package/dist/gallery/frame/chunks/markdown-dy5sgjhc.js +11022 -0
- package/dist/gallery/frame/chunks/markdown-dz3z5w30.js +30868 -0
- package/dist/gallery/frame/chunks/markdown-eg6ngz7y.js +30340 -0
- package/dist/gallery/frame/chunks/markdown-ff5wvb43.js +1149 -0
- package/dist/gallery/frame/chunks/markdown-ffg06nfz.js +86 -0
- package/dist/gallery/frame/chunks/markdown-fvfncadf.js +472 -0
- package/dist/gallery/frame/chunks/markdown-gvyszqpv.js +19 -0
- package/dist/gallery/frame/chunks/markdown-gx1p0ew0.js +88 -0
- package/dist/gallery/frame/chunks/markdown-gxye5frz.js +65 -0
- package/dist/gallery/frame/chunks/markdown-h7pzv34e.js +105 -0
- package/dist/gallery/frame/chunks/markdown-hab789t9.js +47 -0
- package/dist/gallery/frame/chunks/markdown-hjp6sj8t.js +125 -0
- package/dist/gallery/frame/chunks/markdown-jka64qgp.js +1993 -0
- package/dist/gallery/frame/chunks/markdown-k8xkn8mw.js +56 -0
- package/dist/gallery/frame/chunks/markdown-m7frq8x8.js +112 -0
- package/dist/gallery/frame/chunks/markdown-p740v4qm.js +36 -0
- package/dist/gallery/frame/chunks/markdown-pxfeh231.js +57 -0
- package/dist/gallery/frame/chunks/markdown-pzgd8z3s.js +87 -0
- package/dist/gallery/frame/chunks/markdown-qx3cngz2.js +1673 -0
- package/dist/gallery/frame/chunks/markdown-rawhfvvc.js +85 -0
- package/dist/gallery/frame/chunks/markdown-rd8w0ng9.js +49 -0
- package/dist/gallery/frame/chunks/markdown-rm2yxfjj.js +2773 -0
- package/dist/gallery/frame/chunks/markdown-s1jatrnk.js +993 -0
- package/dist/gallery/frame/chunks/markdown-sgfg5vvq.js +59 -0
- package/dist/gallery/frame/chunks/markdown-t4ethv9d.js +409 -0
- package/dist/gallery/frame/chunks/markdown-tnmabqvz.js +36 -0
- package/dist/gallery/frame/chunks/markdown-tvdpppw8.js +5292 -0
- package/dist/gallery/frame/chunks/markdown-v0x27twr.js +22 -0
- package/dist/gallery/frame/chunks/markdown-v14td68x.js +36 -0
- package/dist/gallery/frame/chunks/markdown-w6sgd54z.js +36 -0
- package/dist/gallery/frame/chunks/markdown-xw8dsk8b.js +2125 -0
- package/dist/gallery/frame/chunks/markdown-y18mve73.js +85 -0
- package/dist/gallery/frame/chunks/markdown-yengsms5.js +427 -0
- package/dist/gallery/frame/chunks/markdown-z1wc0v0d.js +1826 -0
- package/dist/gallery/frame/chunks/markdown-zazx9h4n.js +329 -0
- package/dist/gallery/frame/chunks/mermaid-de7p4v0x.js +30 -0
- package/dist/gallery/frame/chunks/mindmap-definition-FAOFIHXS-ra44cbem.js +1216 -0
- package/dist/gallery/frame/chunks/packet-7NZHBO7P-xppm5913.js +10 -0
- package/dist/gallery/frame/chunks/pegDiagram-VL7TDLO6-a2a4wg03.js +163 -0
- package/dist/gallery/frame/chunks/pie-RZYD4A2V-hnbxk152.js +10 -0
- package/dist/gallery/frame/chunks/pieDiagram-7S7Q4E2Y-f1vxjtmx.js +311 -0
- package/dist/gallery/frame/chunks/quadrantDiagram-CIZ2JOQS-ywafa6kh.js +1390 -0
- package/dist/gallery/frame/chunks/radar-I7S5WNFK-ewqd27se.js +10 -0
- package/dist/gallery/frame/chunks/railroad-3IZDKUUU-5hy4bdx3.js +10 -0
- package/dist/gallery/frame/chunks/railroad-abnf-AHOZXSZD-bh5sxz0d.js +10 -0
- package/dist/gallery/frame/chunks/railroad-ebnf-EBAXGLYW-6b9c3zeh.js +10 -0
- package/dist/gallery/frame/chunks/railroad-peg-LSFZ7HO6-avc8v39s.js +10 -0
- package/dist/gallery/frame/chunks/railroadDiagram-AXF67PYL-qc61wax4.js +131 -0
- package/dist/gallery/frame/chunks/requirementDiagram-LRYGKXZP-9bs4786c.js +1295 -0
- package/dist/gallery/frame/chunks/sankeyDiagram-W5VNT64P-awt1em8b.js +1339 -0
- package/dist/gallery/frame/chunks/sequenceDiagram-SI44F4Z6-qaf9mz3t.js +4324 -0
- package/dist/gallery/frame/chunks/sizeCapture-X5ZJPWSS-9fq685xd.js +64 -0
- package/dist/gallery/frame/chunks/stateDiagram-OKZ733FA-vx7a7hh0.js +456 -0
- package/dist/gallery/frame/chunks/stateDiagram-v2-UEYNNEHI-x4m6ws5t.js +46 -0
- package/dist/gallery/frame/chunks/swimlanes-SLNWSIFB-e4mxm1gh.js +8287 -0
- package/dist/gallery/frame/chunks/swimlanesDiagram-ULZ7WXOC-0h93e2qq.js +42 -0
- package/dist/gallery/frame/chunks/timeline-definition-Z64GVDOM-wp0bhbzg.js +1549 -0
- package/dist/gallery/frame/chunks/treeView-QDETBFTQ-hcx7n0vt.js +10 -0
- package/dist/gallery/frame/chunks/treemap-6X3UGDF4-av02skdw.js +10 -0
- package/dist/gallery/frame/chunks/vennDiagram-T6HMQDX7-pmvk1p7n.js +2566 -0
- package/dist/gallery/frame/chunks/wardley-OPB4EBWU-njsp6e40.js +10 -0
- package/dist/gallery/frame/chunks/wardleyDiagram-T6FBY63Y-eggmnv4z.js +979 -0
- package/dist/gallery/frame/chunks/xychartDiagram-ELKLHX3M-q40tnpe5.js +1954 -0
- package/dist/gallery/frame/frame.css +183 -0
- package/dist/gallery/frame/runtime/chart.js +42744 -0
- package/dist/gallery/frame/runtime/html.js +14 -0
- package/dist/gallery/frame/runtime/markdown.js +1403 -0
- package/dist/gallery/frame/runtime/mermaid.js +32 -0
- package/dist/gallery/frame/runtime/svg.js +14 -0
- package/dist/gallery/frame/runtime/tsx.js +52 -0
- package/dist/gallery/index.html +104 -0
- package/docs/reference/cli.md +163 -0
- package/docs/reference/export.md +106 -0
- package/docs/reference/html.md +215 -0
- package/docs/reference/http.md +85 -0
- package/docs/reference/mcp.md +78 -0
- package/docs/reference/security.md +119 -0
- package/docs/reference/storage.md +93 -0
- package/docs/reference/tsx.md +101 -0
- package/docs/reference/validation.md +212 -0
- package/package.json +89 -0
- package/scripts/build-gallery.ts +127 -0
- package/scripts/launch-netns.sh +67 -0
- package/skills/facet/SKILL.md +100 -0
- package/src/cli/client.ts +311 -0
- package/src/cli/commands/create.ts +49 -0
- package/src/cli/commands/doctor.ts +249 -0
- package/src/cli/commands/export.ts +179 -0
- package/src/cli/commands/instantiate.ts +35 -0
- package/src/cli/commands/list.ts +49 -0
- package/src/cli/commands/open.ts +75 -0
- package/src/cli/commands/pin.ts +39 -0
- package/src/cli/commands/promote.ts +49 -0
- package/src/cli/commands/publish.ts +122 -0
- package/src/cli/commands/read-back.ts +56 -0
- package/src/cli/commands/status.ts +114 -0
- package/src/cli/commands/watch.ts +146 -0
- package/src/cli/main.ts +522 -0
- package/src/cli/output.ts +106 -0
- package/src/cli/parser.ts +376 -0
- package/src/cli/presenter.ts +212 -0
- package/src/cli/service-metadata.ts +134 -0
- package/src/cli/spawn-service.ts +326 -0
- package/src/css.d.ts +4 -0
- package/src/gallery-web/app.ts +1581 -0
- package/src/gallery-web/export-menu.ts +121 -0
- package/src/gallery-web/export.ts +112 -0
- package/src/gallery-web/favicon.ts +54 -0
- package/src/gallery-web/frame/entries/chart.ts +6 -0
- package/src/gallery-web/frame/entries/html.ts +6 -0
- package/src/gallery-web/frame/entries/markdown.ts +6 -0
- package/src/gallery-web/frame/entries/mermaid.ts +6 -0
- package/src/gallery-web/frame/entries/svg.ts +6 -0
- package/src/gallery-web/frame/entries/tsx.ts +6 -0
- package/src/gallery-web/frame/frame-payload.ts +91 -0
- package/src/gallery-web/frame/renderer-validation.ts +13 -0
- package/src/gallery-web/frame/renderers/chart.ts +182 -0
- package/src/gallery-web/frame/renderers/dompurify-shim.ts +112 -0
- package/src/gallery-web/frame/renderers/html.ts +48 -0
- package/src/gallery-web/frame/renderers/markdown.ts +81 -0
- package/src/gallery-web/frame/renderers/mermaid.ts +120 -0
- package/src/gallery-web/frame/renderers/registry.ts +260 -0
- package/src/gallery-web/frame/renderers/svg.ts +393 -0
- package/src/gallery-web/frame/renderers/tsx.ts +61 -0
- package/src/gallery-web/frame/runtime.ts +501 -0
- package/src/gallery-web/frame/styles/artifact.css +8424 -0
- package/src/gallery-web/frame/styles/frame.css +183 -0
- package/src/gallery-web/frame/styles/html-source.css +23 -0
- package/src/gallery-web/frame/view-box.ts +33 -0
- package/src/gallery-web/frame-html.ts +72 -0
- package/src/gallery-web/index.html +104 -0
- package/src/gallery-web/session.ts +107 -0
- package/src/gallery-web/sse-client.ts +212 -0
- package/src/gallery-web/styles/app.css +420 -0
- package/src/gallery-web/styles/tokens.css +112 -0
- package/src/gallery-web/styles/verdict.css +186 -0
- package/src/gallery-web/swap.ts +64 -0
- package/src/gallery-web/theme.ts +40 -0
- package/src/gallery-web/view-state.ts +93 -0
- package/src/harness-adapters/claude-code/README.md +10 -0
- package/src/harness-adapters/claude-code/facet.sh +4 -0
- package/src/harness-adapters/codex/README.md +10 -0
- package/src/harness-adapters/codex/facet.sh +4 -0
- package/src/harness-adapters/mcp/README.md +13 -0
- package/src/harness-adapters/mcp/cli-bridge.ts +216 -0
- package/src/harness-adapters/mcp/main.ts +15 -0
- package/src/harness-adapters/mcp/server.ts +164 -0
- package/src/harness-adapters/mcp/tool-schemas.ts +53 -0
- package/src/harness-adapters/opencode/README.md +10 -0
- package/src/harness-adapters/opencode/facet.sh +4 -0
- package/src/runtime/compiled-entrypoints.ts +69 -0
- package/src/service/dispatcher.ts +717 -0
- package/src/service/export.ts +218 -0
- package/src/service/http-utils.ts +55 -0
- package/src/service/lexical/expectations.ts +210 -0
- package/src/service/lifecycle/idle-controller.ts +125 -0
- package/src/service/lifecycle/orphan-cleanup.ts +128 -0
- package/src/service/lifecycle/process-lock.ts +235 -0
- package/src/service/main.ts +136 -0
- package/src/service/process.ts +240 -0
- package/src/service/router-guards.ts +239 -0
- package/src/service/router.ts +627 -0
- package/src/service/security/auth.ts +168 -0
- package/src/service/security/host-origin.ts +138 -0
- package/src/service/security/http-guards.ts +13 -0
- package/src/service/security/leases.ts +182 -0
- package/src/service/security/token-store.ts +138 -0
- package/src/service/server.ts +356 -0
- package/src/service/store/database.ts +61 -0
- package/src/service/store/evidence-retention.ts +234 -0
- package/src/service/store/migrations.ts +167 -0
- package/src/service/store/repository-lifecycle.ts +121 -0
- package/src/service/store/repository.ts +732 -0
- package/src/service/store/schema.ts +218 -0
- package/src/service/stored-verdict.ts +97 -0
- package/src/service/stream.ts +301 -0
- package/src/service/verdict-enrichment.ts +45 -0
- package/src/shared/build/frame-bundle-plugins.ts +61 -0
- package/src/shared/build-mode.ts +28 -0
- package/src/shared/config/evidence-read.ts +98 -0
- package/src/shared/config/limits.ts +56 -0
- package/src/shared/config/paths.ts +96 -0
- package/src/shared/contracts/artifact-types.ts +2 -0
- package/src/shared/contracts/artifact.ts +98 -0
- package/src/shared/contracts/commands/_shared.ts +59 -0
- package/src/shared/contracts/commands/guards.ts +86 -0
- package/src/shared/contracts/commands/index.ts +204 -0
- package/src/shared/contracts/commands/names.ts +35 -0
- package/src/shared/contracts/commands/requests.ts +149 -0
- package/src/shared/contracts/commands/results.ts +200 -0
- package/src/shared/contracts/envelope.ts +140 -0
- package/src/shared/contracts/events.ts +41 -0
- package/src/shared/contracts/observed-counts.ts +19 -0
- package/src/shared/contracts/renderers.ts +6 -0
- package/src/shared/contracts/validation.ts +296 -0
- package/src/shared/errors/facet-error.ts +127 -0
- package/src/shared/errors/store-error.ts +68 -0
- package/src/shared/evidence-image.ts +37 -0
- package/src/shared/export.ts +31 -0
- package/src/shared/html/policy.ts +108 -0
- package/src/shared/html/style-vocabulary.ts +352 -0
- package/src/shared/logging/logger.ts +108 -0
- package/src/shared/logging/redact.ts +49 -0
- package/src/shared/security/frozen-csp.ts +13 -0
- package/src/shared/storage-version.ts +2 -0
- package/src/shared/tsx/execution.ts +29 -0
- package/src/shared/tsx/import-policy.ts +94 -0
- package/src/shared/util/dir-permissions.ts +94 -0
- package/src/shared/util/mermaid-nodes.ts +230 -0
- package/src/shared/util/process.ts +67 -0
- package/src/shared/util/time.ts +21 -0
- package/src/shared/version.ts +3 -0
- package/src/validation/sandbox/limits.ts +41 -0
- package/src/validation/sandbox/netns.ts +177 -0
- package/src/validation/tier0/chart.ts +177 -0
- package/src/validation/tier0/dom-shim.ts +54 -0
- package/src/validation/tier0/html.ts +408 -0
- package/src/validation/tier0/markdown.ts +285 -0
- package/src/validation/tier0/mermaid.ts +98 -0
- package/src/validation/tier0/runner.ts +504 -0
- package/src/validation/tier0/svg.ts +321 -0
- package/src/validation/tier0/tsx/allowlist-resolver.ts +77 -0
- package/src/validation/tier0/tsx/ast-policy-capabilities.ts +238 -0
- package/src/validation/tier0/tsx/ast-policy-shared.ts +71 -0
- package/src/validation/tier0/tsx/ast-policy.ts +181 -0
- package/src/validation/tier0/tsx/compiler.ts +156 -0
- package/src/validation/tier0/worker-dispatch.ts +211 -0
- package/src/validation/tier0/worker-entry.ts +96 -0
- package/src/validation/tier0/worker-input.ts +75 -0
- package/src/validation/tier1/browser-process.ts +147 -0
- package/src/validation/tier1/cdp-pipe.ts +281 -0
- package/src/validation/tier1/entries/chart.ts +5 -0
- package/src/validation/tier1/entries/html.ts +6 -0
- package/src/validation/tier1/entries/markdown.ts +5 -0
- package/src/validation/tier1/entries/mermaid.ts +5 -0
- package/src/validation/tier1/entries/svg.ts +5 -0
- package/src/validation/tier1/entries/tsx.ts +5 -0
- package/src/validation/tier1/frame-target.ts +162 -0
- package/src/validation/tier1/harness-entry.ts +261 -0
- package/src/validation/tier1/harness.ts +215 -0
- package/src/validation/tier1/isolated-probe.ts +94 -0
- package/src/validation/tier1/launcher.ts +177 -0
- package/src/validation/tier1/limits.ts +80 -0
- package/src/validation/tier1/nonce.ts +17 -0
- package/src/validation/tier1/protocol-probe.ts +519 -0
- package/src/validation/tier1/runner.ts +1122 -0
- package/src/validation/tier1/verdict.ts +246 -0
- package/src/validation/tier1/webp.ts +69 -0
- package/templates/README.md +88 -0
- package/templates/bar-compare.vl.json +63 -0
- package/templates/capacity-report.tsx +102 -0
- package/templates/decision-record.md +24 -0
- package/templates/deployment-state.mmd +40 -0
- package/templates/exemplar.md +91 -0
- package/templates/facet-story.tsx +799 -0
- package/templates/fleet-dashboard.html +141 -0
- package/templates/html-release-ledger.html +91 -0
- package/templates/html-status-report.html +114 -0
- package/templates/incident-console.tsx +147 -0
- package/templates/legion-boundaries.mmd +23 -0
- package/templates/legion-flow.mmd +15 -0
- package/templates/legion-sequence.mmd +14 -0
- package/templates/legion-state.mmd +7 -0
- package/templates/metric-card.svg +29 -0
- package/templates/observability-map.svg +101 -0
- package/templates/pipeline-audit.md +108 -0
- package/templates/release-metrics.vl.json +98 -0
- package/templates/service-topology.mmd +47 -0
- package/templates/status-report.md +32 -0
- package/templates/system-map.svg +53 -0
- package/templates/timeseries.vl.json +71 -0
- package/templates/tsx-interactive-counter.tsx +19 -0
- 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="'Space Grotesk', 'Geist', 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="'Geist', 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="'Geist', 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>
|