Task · TSO-0092

Retire the 35-panel ceiling and re-group the whole dashboard tab structure

Description

OWNER DECISION 2026-08-30: there is no panel-count ceiling. The ~35-panel guideline in deploy/grafana/gen/dashboards.py:55 and :94 is retired. Panel count per tab and per tab group does not matter; what matters is that groupings are logical and operationally meaningful and that every panel earns its place. Rows are the tool for density — a tab may carry many rows, and a row may ship COLLAPSED by default when its detail is not needed on first open.

This supersedes the sizing pressure that degraded two Wave 2 deliverables: TSO-0060 folded two WAL panels into one capacity panel and TSO-0065 folded the eviction-age signal into an existing dedup diagnostics panel, both purely to stay under 35. Both consolidations are to be reconsidered on their merits now the constraint is gone; keep a merge only where the merged panel is genuinely the better panel.

Current per-module panel counts (grep of panel( calls, 2026-08-30): health_ingestion 35, health_collection 35, nodemetrics 32, k8saudit 32, tailnet_overview 31, devices_inventory 31, network 28, health_runtime 25, health_delivery 24, health_overview 21, devices_connectivity 21, security_identity 20, cardinality 20, policy_integrations 19, policy_identity 16, security_compliance 15, policy_dns 15, security_audit_trail 14, devices_posture 13, policy_access 10, security_risk 9.

The regroup is a whole-structure pass across both dashboards, not a per-tab tweak, so it is a single-owner job and every other lane that needs a panel returns the panel spec to it rather than editing tabs/ directly.

Acceptance Criteria

Definition of Done

Implementation Plan

F2 lane L owns the whole dashboard regroup as a standalone delivery. It removes the retired panel-ceiling assumptions, re-examines the Wave 2 density compromises, lands logical rows/tabs, and returns a module ownership map naming the Wave 3 lane owner for every deploy/grafana/gen/tabs/*.py module. Root records that map append-only before later lanes edit assigned tabs.

Implementation Notes

WAVE 3 SEQUENCING: this task is freeze pass F2 and runs FIRST, before any other lane produces a panel.

Deliverable is TWO things, not one:

  1. The whole-structure regroup, landed as its own commit.
  2. A MODULE OWNERSHIP MAP published in these notes — which lane owns which deploy/grafana/gen/tabs/*.py file for the rest of the wave, covering every lane that will add a signal.

After that commit, each lane edits its own assigned tab modules directly. builder.py, dashboards.py, maps.py and the layout stay with this task for the whole wave; a lane needing a new sentinel, helper or layout node returns that one request rather than editing shared files.

This deliberately avoids routing every panel back through the root agent. In an unattended overnight run a per-panel round trip serialises eleven lanes behind one and lands the entire signal-coverage gate at the end of the night with nobody awake to fix it.

F2 structure rationale and ownership map (effective after this commit):\n\nOperational grouping: Tailnet keeps Overview plus direct domains for Fleet operations, Network and service telemetry, Security identity and governance, and Policy and configuration. Health keeps Overview plus Data pipeline and Runtime and capacity. Nested fourth-level sub-tabs were removed; rows carry density.\n\nCollapsed-by-default rows are only investigation detail: per-device connectivity; exit-node inventory; subnet routes; DERP detail; object-store throughput and faults; per-entity subrequest fan-out; receiver loss detail; cross-source dedup; log truncation; audit latency; audit schema drift; rollup topology; raw throughput and talkers; raw node-pair talkers; flow-log stream; audit actor correlation; and the raw log explorer. First-open status and primary operational summaries stay expanded.\n\nWave 2 consolidation decisions: split ingress-WAL byte-capacity and entry-capacity views because they have different failure limits and remedies. Split dedup fill from youngest-eviction age and overlap horizon because population pressure and eviction correctness are different questions. The single ingress-WAL alert UID remains intentionally combined: its limit label distinguishes bytes from entries, and it links to the first capacity drill-down with the adjacent entry panel carrying the other view; splitting the deployed rule would create a larger live-resource migration outside F2.\n\nExclusive tab-module ownership for the rest of Wave 3:\n- Lane A: tabs/_devices_common.py, devices_inventory.py, devices_posture.py, devices_connectivity.py\n- Lane B: tabs/tailnet_overview.py\n- Lane C: tabs/network.py, nodemetrics.py\n- Lane D: tabs/security_audit_trail.py, security_risk.py, security_compliance.py, security_identity.py\n- Lane E: tabs/k8saudit.py\n- Lane F: tabs/policy_access.py, policy_dns.py\n- Lane G: tabs/policy_identity.py, policy_integrations.py\n- Lane H: tabs/health_collection.py\n- Lane I: tabs/health_ingestion.py\n- Lane J: tabs/health_delivery.py\n- Lane K: tabs/health_runtime.py, cardinality.py\n- Lane L: tabs/init.py plus shared deploy/grafana/gen/builder.py, dashboards.py, maps.py and layout seams.\n\nGuard evidence: the new structure, required-leaf, optional-gate, collapsed-row and separated-ingest-panel guards include explicit negative tests that inject flattened, dropped, ungated, uncollapsed or re-merged counterexamples and observe the assertions fire.

Formatting correction: the immediately preceding escaped-text block is superseded by this rendered ownership record.

F2 structure rationale and ownership map (effective after this commit):

Operational grouping: Tailnet keeps Overview plus direct domains for Fleet operations, Network and service telemetry, Security identity and governance, and Policy and configuration. Health keeps Overview plus Data pipeline and Runtime and capacity. Nested fourth-level sub-tabs were removed; rows carry density.

Collapsed-by-default rows are only investigation detail: per-device connectivity; exit-node inventory; subnet routes; DERP detail; object-store throughput and faults; per-entity subrequest fan-out; receiver loss detail; cross-source dedup; log truncation; audit latency; audit schema drift; rollup topology; raw throughput and talkers; raw node-pair talkers; flow-log stream; audit actor correlation; and the raw log explorer. First-open status and primary operational summaries stay expanded.

Wave 2 consolidation decisions: split ingress-WAL byte-capacity and entry-capacity views because they have different failure limits and remedies. Split dedup fill from youngest-eviction age and overlap horizon because population pressure and eviction correctness are different questions. The single ingress-WAL alert UID remains intentionally combined: its limit label distinguishes bytes from entries, and it links to the first capacity drill-down with the adjacent entry panel carrying the other view; splitting the deployed rule would create a larger live-resource migration outside F2.

Exclusive tab-module ownership for the rest of Wave 3:

Guard evidence: the new structure, required-leaf, optional-gate, collapsed-row and separated-ingest-panel guards include explicit negative tests that inject flattened, dropped, ungated, uncollapsed or re-merged counterexamples and observe the assertions fire.

F2 review and live-rule disposition:

CodeRabbit completed with five findings. Root fixed the two valid dashboard-copy findings: dedup fill now has a size-series prerequisite rather than the eviction-age prerequisite, and the audit metric-vs-log description now states that the metric is the classified security/lifecycle subset rather than the full log population. No tests were added for prose-only fixes; just test-python and the full just check gate passed afterward.

Three findings were left after verification: the TSO-0092 section-marker report was false (the task has exactly one NOTES begin/end pair and the ownership map is inside it); the ACL auto-approve alert correctly links to the unique Auto-approvers by kind panel at the generated ID, not the different Auto-approved exit nodes panel; and TSO-0082 already carries append-only superseding notes that define interval zero as automatic sweep cadence.

Alert manifests changed because the dashboard regroup renumbered panel IDs. The authorised real push reported 126 resources and zero errors. Direct read-back of ts2o-ingress-wal-near-capacity, ts2o-dedup-set-saturated, and ts2o-dedup-youngest-eviction confirmed their updated dashboard/panel references and live resource timestamps. Dashboards were not pushed through gcx; GitSync remains their only delivery path.

Root pre-dispatch correction to the tab map: the proposed mechanical allocation conflicted with the operational grouping F2 just established. To avoid placing unrelated signals on convenient files, first-group signal ownership is reassigned as follows: lane D owns nodemetrics.py and health_collection.py; lane E owns health_ingestion.py; lane H owns health_delivery.py; lane I owns health_runtime.py; lane C retains network.py. The superseded owners must not edit those files. Other proposed assignments remain provisional until their later lane starts; root will assign any still-unmapped coherent home before dispatch. This is a frozen-seam correction, not a layout change.

Effective ownership-map correction after first-group integration: the earlier module map and the provisional root correction are superseded by this single effective map for the rest of Wave 3. Lane A owns tabs/_devices_common.py, devices_inventory.py, devices_posture.py and devices_connectivity.py. Lane B owns tailnet_overview.py. Lane C owns network.py. Lane D owns nodemetrics.py and health_collection.py. Lane E owns health_ingestion.py. Lane F owns policy_access.py and policy_dns.py. Lane G owns policy_identity.py and policy_integrations.py. Lane H owns health_delivery.py. Lane I owns health_runtime.py. Lane J owns k8saudit.py. Lane K owns cardinality.py. Lane L owns tabs/init.py and the shared builder.py, dashboards.py, maps.py and layout seams. Security modules security_audit_trail.py, security_risk.py, security_compliance.py and security_identity.py remain unassigned until root allocates their next coherent lane; no lane may infer ownership from either superseded map.

Final ownership completion: Lane D also owns security_audit_trail.py, security_risk.py, security_compliance.py and security_identity.py. This removes the only unassigned modules from the effective map; every tabs/*.py file now has one owner.

Remaining-wave handoff after the resilience group landed: security_identity.py transfers from completed lane D to lane G for the admin-auth throttle signal and panel. Lane D retains the other security modules. No concurrent owner remains.

Final Summary

Removed the retired panel ceiling, regrouped both dashboards around operational questions, introduced collapsed detail rows, recorded the tab ownership map, re-examined the Wave 2 consolidations, and kept signal coverage complete through later Wave 3 panels. Implementation SHA 1ea4b8b. Final integrated just check passed at 5b55617; exact-head CI run 33354208183 completed success.

View the source file on GitHub