🎛 Dashboard
This node’s instruments, one section each — vitals, deploys, the 🚦 fleet, the LightNode map, the UX suite. Open a section below; the headline numbers stay visible up here even when everything is shut.
!📊 Vitals & model check
Live page health, published as a dataset and displayed by the standard grid and chart — the metrics chain is itself an LC component chain (Shift-X-ray it). Sampling is **off by default**: flip the switch on the card. Heap is Chrome/Edge only.
Page vitals collector.
{: .vitals #page_vitals interval="2" }
[Heap over time](#)
{: .chart bind="page_vitals" type="line" x="t" y="heap_mb" title="JS heap (MB)" }
[Samples](#)
{: .datagrid bind="page_vitals" rows="8" hints="t: seconds since the switch was flipped | heap_mb: JS heap in use (Chrome/Edge only) — sawtooth = allocate then garbage-collect, a rising floor = leak | dom_nodes: elements in the DOM — grows here because each sample adds chart points | lc_components: upgraded LC components (model wrap tokens) | listeners: dataset subscriptions (this chart + this grid) | transfer_kb: bytes over the network since load | lcp_ms: Largest Contentful Paint — when the main content became visible | cls: Cumulative Layout Shift — how much the page jumped while loading (0 = rock steady)" }
And a structural check: every binding declared on this page — `bind=`, `bound-to=`, avatar targets and `at:` walks — must resolve to something real. The same check gates CI on the example pages.
Model integrity.
{: .modelcheck }
### !📡 Fleet metrics — every page, every deploy
The live card above measures only the page you're on; pages here are independent documents. So the **CI suite does the rounds**: on every deploy it visits each page and records heap, DOM size, components, transfer, LCP and console errors — identical conditions, every run. Newest run on top.
[fleet stat](#)
{: .stat bind="fleet_trend" format="📡 {pages} pages · max {heap_max_mb} MB" requires="pages" }
[metrics](/assets/metrics.json)
{: .dataset #fleet_metrics }
[Per page](#)
{: .datagrid bind="fleet_metrics" rows="15" hints="run: which CI run measured it | page: every page the UX suite visited | heap_mb: JS heap after the page was exercised — compare pages, watch for climbers | dom_nodes: elements in the DOM at the end of the scenario | lc_components: upgraded LC components on the page | transfer_kb: bytes downloaded | lcp_ms: Largest Contentful Paint | console_errors: console errors during the scenario (0 is the only good number)" }
[trend](/assets/metrics_trend.json)
{: .dataset #fleet_trend }
[Heaviest page per run](#)
{: .chart bind="fleet_trend" type="line" x="run" y="heap_max_mb" title="Max page heap (MB) per run" }
### !🌐 Network map
Drag to rearrange. Click any node to open its card.
The live network map.
{: .lightnodes }
Most recent forks first — click a row to visit.
[Recent forks](#)
{: .datagrid bind="lightnodes" rows="6" hints="node: who forked | repo: the fork | forked: when the fork was created | updated: last push to the fork — is it alive? | level: forks-of-forks distance from the root | stars: its stargazers" }
### !🚀 Deployment activity
[deploys-data](#)
{: .deploys count="10" }
[deploys stat](#)
{: .stat bind="deploys" pick="first" format="🚀 last: {status} {state} · {when}" }
[Latest runs](#)
{: .datagrid bind="deploys" rows="10" hints="status: outcome icon — ✅ success, ❌ failure, 🔄 running | commit: first line of the commit message | workflow: which pipeline ran | state: completed conclusion or current phase | when: how long ago it started | author: who pushed" }
### !🚦 Fleet status
Each node watches its own fleet — the downstream targets its content
publishes to. **pending** = files a publish would change (0 = that target is
current); **tested** = the latest UX suite verdict there. A node with no
downstream targets (yet) shows an empty board.
[fleet](/assets/fleet_status.json)
{: .dataset #fleet_status refresh="30" }
[status](#)
{: .datagrid #fleet_master bind="fleet_status" rows="8" empty="This node publishes to nothing downstream — no fleet to watch." hints="target: which node — click a row to arm the buttons below | pending: files a publish would change — 0 means current | tested: latest UX suite result there | when: that run's timestamp" }
[fleet actions](#)
{: .classroom_actions scope="fleet" }
### !🗺 Backlog
The private backlog — priorities and states (`refined → planned → drafted →
shipped`), stored as data so it can one day drive feature flags. Lives only
on this node; an empty board here means this node keeps no backlog.
[backlog](/assets/backlog.yml)
{: .dataset #backlog }
[items](#)
{: .datagrid bind="backlog" rows="15" empty="This node keeps no backlog." hints="priority: 1 = next up | item: the thing | flag: refined (understood) · planned (next) · drafted (in progress) · shipped (done) | notes: context" }
### !🧪 UX test results
[run the suite](#)
{: .test_runner }
[fast](/assets/ux-fast.json)
{: .dataset #ux_fast refresh="30" }
[fast check](#)
{: .stat bind="ux_fast" format="⚡ fast check · {scenarios} scenarios · {commit} · 🕒 {run}" requires="scenarios" ok-when="scenarios_failed==0" stale-after="129600" }
[full suite](#)
{: .stat bind="ux_summary" format="✅ full suite · pedia · {scenarios} scenarios · 🕒 {run}" requires="scenarios" ok-when="scenarios_failed==0" stale-after="172800" }
A **nightly** run gives the lab a fast **smoke + component-spec** check against the live site (the ⚡ line — page loads plus every component's embedded `.feature`); it can also be dispatched by hand anytime. The full [BDD UX suite](https://github.com/michelzam/lightcodepedia/tree/main/tests/features) — every `Scenario` from every `.feature` — runs in **pedia**, free, after every deploy, and that verdict is the authority (the ✅ line). The lab mirrors it nightly rather than paying private minutes to run the same code twice, so the number on this board is pedia's and says so. Each row below is one `Scenario` from the latest **full** run against the live site.
[ux-results](/assets/ux-results.json)
{: .dataset #uxtests refresh="30" }
[Latest scenarios](#)
{: .datagrid bind="uxtests" rows="25" hints="status: ✅ passed / ❌ failed in the latest run | scenario: the Gherkin scenario name | feature: which .feature file it lives in | tags: @mobile runs on an iPhone viewport | seconds: how long it took | run: when the suite ran — click a row for the full step trace" }
### !📋 Full Gherkin report
[summary](/assets/ux-summary.json)
{: .dataset #ux_summary refresh="30" }
[totals](#)
{: .stat bind="ux_summary" format="{features} features · {scenarios} scenarios · {steps} steps · 🕒 {run}" requires="steps" ok-when="scenarios_failed==0" stale-after="1209600" }
[failures](#)
{: .stat bind="ux_summary" format="{scenarios_failed} scenarios · {steps_failed} steps failed" requires="scenarios_failed" ok-when="scenarios_failed==0" }
Every step of every scenario from the latest run, with timings. Also available [in its own tab](/assets/ux-report.html).
[Behave report](/assets/ux-report.html)
{: .embed-page height="700" fresh="true" }