@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,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
|
+
}
|