Repository navigation
[self-care:debug-logging] Instrument route-empty-state.js with debug-filtered route outcome logging - #14406
Conversation
Instruments createRouteView with a disabled-by-default cao:route-empty-state category logger that reports the resolved outcome (select/not-found/matched/ unavailable) and hasSelection on each route render, without logging the raw route value which may contain user-navigable identifiers. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Dashboard dead viewsDead element views (0):
|
Query complexity reportDashboard query complexityEstimated 107.654542 normalized row-read units to materialize all 146 queries once with shared dependencies reused. Database table coefficients: Deployed table rows:
Model: deployment-weighted-upper-bound. Database tables are weighted by deployed row counts normalized to the largest table; selectivity is 1; all queries materialize once with shared dependencies reused.
|
Mobile dashboard analysisAnalyzed 1 device/browser profile. Mobile analysis measurements
View detailed JSON, accessibility trees, traces, and screenshots in the workflow artifacts. |
Dashboard query parityStatus: passed All 142 dashboard queries matched across 6 backends. |
Dashboard view assessment5/5 selected views passed the informational assessment. The DOM budget is 6000 nodes per loaded view. View assessment results
View-query graphflowchart LR
n0["Navigation indicator: maintenance"]
n1["Query: audit-event-summary-buckets"]
n2["Query: campaign-active-orchestrator-run-presence"]
n3["Query: campaign-audit-summary-plot-inventory"]
n4["Query: campaign-current-problem-error-groups"]
n5["Query: campaign-current-runtime-failures"]
n6["Query: campaign-insight-plot-inventory"]
n7["Query: campaign-insight-tab-counts"]
n8["Query: campaign-issue-tab-counts"]
n9["Query: campaign-operational-value-plot-inventory"]
n10["Query: campaign-operational-value-primary-series"]
n11["Query: campaign-problem-error-groups"]
n12["Query: campaign-problem-items"]
n13["Query: campaign-problem-latest-target-runs"]
n14["Query: campaign-problem-run-evidence"]
n15["Query: campaign-problem-runs"]
n16["Query: campaign-problem-tab-counts"]
n17["Query: campaign-readme-details"]
n18["Query: campaign-readme-orchestrators"]
n19["Query: campaign-runs"]
n20["Query: campaign-runtime-health-groups"]
n21["Query: campaign-runtime-health-runs"]
n22["Query: campaign-runtime-problem-candidates"]
n23["Query: campaign-runtime-problems"]
n24["Query: campaign-unobserved-orchestrator-candidates"]
n25["Query: campaign-unobserved-orchestrators"]
n26["Query: campaign-worker-issues"]
n27["Query: campaign-workflows"]
n28["Query: event-base"]
n29["Query: event-runs"]
n30["Query: maintenance-campaign-updates"]
n31["Query: maintenance-repositories"]
n32["Query: maintenance-repository-upgrades"]
n33["Query: maintenance-repository-versions"]
n34["Query: run-import-status"]
n35["Query: run-incomplete-outcomes"]
n36["Query: workflow-aic-totals"]
n37["Query: workflow-inventory"]
n38["Query: workflow-run-observation-counts"]
n39["Query: workflow-run-totals"]
n40["Query: workflow-runs"]
n41["View: repository-settings / repository-compiler-versions"]
n42["View: workflow-runs / workflow-run-health"]
n43["View: workflow-runs / workflow-runs-route"]
n44["View: workflow-runs / workflow-runs-table"]
n45["View: workflow-runs / workflow-run-details"]
n46["View: campaign-detail / campaign-overview-navigation"]
n47["View: campaign-detail / campaign-readme"]
n48["View: campaign-detail / campaign-settings"]
n49["View: campaign-workflows / campaign-workflow-navigation"]
n50["View: campaign-workflows / campaign-workflow-table"]
n51["View: repository-workflow-inventory / repository-authored-workflows"]
n52["Reusable view: entity-repositories"]
n53["Reusable view: entity-workflows"]
n54["Reusable view: entity-runs"]
n55["Reusable view: entity-events"]
n56["Reusable view: issues"]
n57["Reusable view: firewall-domain-workflows"]
n58["Reusable view: repository-workflows"]
n59["Reusable view: workflow-runs-cards"]
n60["Reusable view: campaign-problem-detail-view"]
n61["Reusable view: run-events"]
n0 --> n30
n0 --> n32
n2 --> n38
n3 --> n1
n4 --> n11
n4 --> n13
n5 --> n22
n6 --> n3
n6 --> n9
n7 --> n6
n8 --> n26
n9 --> n10
n11 --> n14
n12 --> n4
n12 --> n14
n12 --> n25
n13 --> n14
n14 --> n15
n14 --> n23
n15 --> n19
n16 --> n12
n17 --> n18
n19 --> n35
n20 --> n21
n22 --> n20
n23 --> n5
n23 --> n25
n24 --> n2
n25 --> n24
n27 --> n37
n29 --> n28
n31 --> n33
n32 --> n31
n34 --> n29
n37 --> n36
n37 --> n39
n39 --> n34
n41 --> n31
n42 --> n40
n44 --> n40
n45 --> n40
n46 --> n7
n46 --> n8
n46 --> n16
n47 --> n17
n50 --> n27
n51 --> n37
n60 --> n12
|
Instruments
dashboard/site/src/components/route-empty-state.js— the sharedcreateRouteViewhelper backing detail-route views (e.g. problem/outcome detail pages) — with a category-scoped debug logger.Diagnostic gap
createRouteViewresolves one of four outcomes on every route render —select(no value yet),not-found(value present, no match),matched, orunavailable(data-availability short-circuit) — but none of this was observable. Incidents like "the detail page shows the not-found message even though the item exists" or "a route stays stuck on the select message" previously had no first-party signal to distinguish a data-unavailable condition from a genuine no-match.What changed
createDebug('route-empty-state')logger (reusing the existingdashboard/site/src/debug.jshelper — no new abstraction).createRouteView's internalrender()function, emitting{ parameter, outcome, hasSelection }— all already-computed scalars.hasSelectionand the coarseoutcomeenum are recorded.Enabling
Disabled by default. Enable with
?debug=route-empty-state(or?debug=1/ any wildcard matchingroute-empty-state).Privacy / side-effect boundaries
createRouteView's options/return shape), and the existingdashboard-route-changeevent handling are unchanged.Normal-runtime cost
One
isDebugEnabledcheck (already the pattern used across the codebase) per route render; when disabled,createDebugreturns a no-op function so the call is negligible.Validation
npx vitest run test/unit/route-empty-state-debug.test.js test/unit/route-empty-state.test.js— new and existing suites pass (6/6).npm test(full suite via jsdom) — 156 files / 1653 tests passed, 1 pre-existing skip.npm run typecheck— clean.npm run lint— clean (includes Octicon and dashboard.json validation).New tests (
test/unit/route-empty-state-debug.test.js) cover: disabled-by-default behavior, predictable category selection via?debug=route-empty-state, the emitted{ parameter, outcome, hasSelection }metadata for select/not-found/matched/unavailable transitions, and exclusion of the raw (potentially sensitive) route value from logged output.Control Plane
36364312817-1104githubnext/gh-aw-cao