Refresh Dashboards — the one-command derived-views rebuild
Paths.
analysis-results/…andprogress-tracker/…in this skill are the default workspace layout. They resolve throughlocations.yamlin$TRAUST_CONFIG_HOME(docs/setup.md, Storage locations); substitute your configured roots.
Every dashboard is a rebuildable projection of the disposition ledger and
the findings corpus. This skill rebuilds all of them in dependency order
as one sequential deterministic job — the same chain
docs/continuous-operations.md schedules weekly ("Dashboards rebuild"),
packaged so an operator, cron leg, or orchestrator fragment can fire it
as a single command.
Ordering is the whole point:
- Projections — python3 -m traust.cli corpus findings-db, then
harnessing/census/scripts/build_census.py. Everything downstream reads these; a failure here aborts the run (consumers would silently read stale data). - Consumers — executive summary, findings-trends, insecure-patterns, validation-fuzz dashboard, RBAC/tenancy rollup, SLA view, compliance dashboard, ATT&CK coverage rollup, LoC dashboard (cache-only), dependency-exposure, spend dashboard. Each continues on error; failures are collected.
- Scoreboard last —
collect_harness_metrics.pyharvests headline numbers from the dashboards above, so it runs after all of them and appends its usual immutable row tometrics-history.jsonl.
Procedure
Run the chain (deterministic; from the harness root):
python3 -m traust.cli dashboard refresh \ [--workspace-root <path>] [--results-root <path>] \ [--only <stage...>] [--skip <stage>] \ [--spend-actuals] [--note "<snapshot note>"] \ [--list] [--dry-run]--listprints the stage names;--only/--skipselect stages (canonical order is always preserved);--noteis forwarded to the scoreboard's metrics-history snapshot row.Read the summary table back. Report which stages ran, which failed, and the elapsed time. A projection failure means the run aborted — say what did not run and fix the projection before retrying. Consumer failures don't block the others; report each failed stage with its builder so the user can rerun it alone (
--only <stage>).Commit the rebuilt artifacts in
analysis-results/andprogress-tracker/per the workspace convention (dashboards are projections — regenerating them is always safe; history lives inmetrics-history.jsonl, which only appends).
What it does NOT cover
- Spend actuals (python3 -m traust.cli metrics collect-spend --append) reads
Claude Code session transcripts on the operator's workstation, so the
default job skips it to stay orchestrator-portable. Pass
--spend-actualswhen running on a workstation that has transcripts; thedashboards:spend-actualsdrift row guards this leg either way. - LoC language-cache refresh — the
locstage rebuilds the dashboard from the committedgh-languages-cache.jsonlonly (--no-fetch); refreshing the cache sweeps the GitHub API and stays with/loc-dashboardunder the gh-api fleet-sweep constraints. - Agent-built views — the threat register (
/threat-register) involves judgment, not just aggregation, and is rebuilt by its owning skill on its own cadence. The scoreboard reads whatever its latest artifact says. - Campaign-lane artifacts that live in the same dashboards folder —
pqc views, operator-least-priv, rbac-openshift-platform, fuzz,
benchmark — are outputs of their campaign runs (
/pqc-readiness,/operator-priv-profile,/create-fuzzing,/recall-benchmark), not aggregation dashboards; they update when those lanes run. - Deciding when to rebuild — that's
/drift-watch; itsdashboards:*rows remain the dead-timer backstop (scoreboard >7d, spend >4d).
Stages
| Stage | Tier | Builder |
|---|---|---|
findings-db |
projection | python3 -m traust.cli corpus findings-db |
census |
projection | harnessing/census/scripts/build_census.py |
exec-summary |
consumer | harnessing/executive-summary-findings/scripts/build_executive_summary.py |
trends |
consumer | harnessing/findings-trends/scripts/build_trends.py |
insecure-patterns |
consumer | harnessing/insecure-patterns/scripts/build_insecure_patterns.py |
validation-fuzz |
consumer | harnessing/validation-fuzz-dashboard/scripts/build_validation_fuzz_dashboard.py |
rbac-tenancy |
consumer | harnessing/rbac-tenancy-rollup/scripts/build_rbac_tenancy_rollup.py |
sla |
consumer | python3 -m traust.cli metrics sla |
compliance |
consumer | python3 -m traust.cli compliance dashboard |
attack-coverage |
consumer | harnessing/attack-coverage/scripts/build_attack_coverage.py |
loc |
consumer | harnessing/loc-dashboard/scripts/build_loc_dashboard.py --no-fetch (committed gh-languages cache only) |
dependency-exposure |
consumer | harnessing/refresh-dashboards/scripts/build_dependency_exposure.py (portfolio-graph dependency layer + impact/fleet-OSV artifacts; degrades gracefully when absent) |
spend-actuals |
consumer, opt-in | python3 -m traust.cli metrics collect-spend --append |
spend |
consumer | python3 -m traust.cli metrics spend |
scoreboard |
consumer | harnessing/traust-metrics/scripts/collect_harness_metrics.py |
Integrations
- Emits no artifact of its own — every output is owned by the
builder that writes it (census.{json,md,html}, the dashboard files
under
progress-tracker/metrics/dashboards/, findings.db, the scoreboard + metrics-history). Consumers are documented in each owning skill. - docs/continuous-operations.md names this script as the "Dashboards rebuild" scheduled job (orchestrator target: weekly; spend ≤4d).
- /drift-watch routes attention here: when
dashboards:*rows go stale, the refresh command is this script. - /traust-metrics
--refresh-sourcesremains the scoreboard-scoped partial refresh (a skill-level token interpreted by the agent — the collector script itself has no such argparse flag); this skill is the full chain.