4.2 KiB
Context
The current Streamlit dashboard has six visible pages. PostgreSQL is authoritative for scans, findings, queues, and keychecks, but several pages still read compatibility files or filter a pre-limited client-side frame. The dashboard is read-only, loopback-only, supervisor-managed, and disabled by default; those safety boundaries must remain.
Goals / Non-Goals
Goals:
- Present the operational summary and finding lookup on one understandable page.
- Apply one selected UTC time window consistently to all historical statistics.
- Use PostgreSQL for every result, queue, and validation value.
- Accept convenient pasted lookup values without querying or rendering raw secret columns.
- Keep queries bounded and preserve degraded behavior when PostgreSQL is unavailable.
Non-Goals:
- Add scanner lifecycle controls or expose the dashboard beyond loopback.
- Add a REST service, database migration, or write path.
- Preserve retired queue-file and compatibility-file diagnostics in the visible UI.
- Turn the dashboard into a raw log or raw credential browser.
Decisions
-
Keep Streamlit and replace only the visible information architecture. The existing supervisor launch, dependency isolation, read-only connection, redaction, and health checks are valuable. A new frontend/backend split would add operational surface without improving this local dashboard.
-
Render one page with four sections. The order is lookup, time-window KPIs, source/alive breakdowns, then compact runtime health. The lookup is placed first because it is a direct operator task; all secondary diagnostics are omitted or collapsed.
-
Use bound UTC timestamps in SQL before aggregation and limits. Presets cover 1 hour, 24 hours, 7 days, and 30 days; custom start/end values are converted to UTC. This replaces the current newest-5000-rows client filter.
-
Use only authoritative stores. Historical metrics come from
source_cycles,target_scans,findings,keycheck_credentials,keycheck_current_state, andkeycheck_results. Current backlog and pipeline state come from PostgreSQL. Supervisor status andscan_limiter.dbremain valid operational sidecars. Retired queue files, global runner state, TSV summaries, and JSONL metrics are not rendered. -
Normalize lookup input before database access. A 64-hex value is treated as a digest; numeric and UID-like values are searched by indexed identity; credential-like text is SHA-256 hashed in memory and only the digest reaches SQL. Short or structured non-secret metadata uses escaped
LIKEpredicates. No query selects raw payload columns, and the submitted raw value is never echoed. -
Lookup overrides statistical filters. Search results always show current validation state and all bounded matching origins regardless of the selected reporting period or access-tier preset. This avoids hiding a valid credential behind an unrelated dashboard filter.
-
Retain bounded rendering and query failure isolation. Lookup origins and breakdowns have explicit limits. Query failure rolls back the PostgreSQL transaction and degrades only the affected section.
Risks / Trade-offs
- Raw pasted credentials traverse the local Streamlit session before hashing -> Keep loopback-only authority, hash immediately, never log/echo/persist the input, and offer SHA-256 lookup as the safest path.
- Broad metadata lookup can be expensive -> Escape wildcard characters, require a useful minimum length, search indexed exact identities first, and cap returned origins.
- Removing advanced pages hides forensic diagnostics -> PostgreSQL and log files remain available to engineering tools; the operator dashboard intentionally prioritizes clarity.
- Existing helper functions may remain temporarily unused -> Remove the visible routes first and prune only when tests establish that no safety helper depends on them.
Migration Plan
- Add and test the new query/lookup helpers.
- Switch
main()to the single page and disable Streamlit telemetry. - Run focused dashboard tests and a live supervisor-launched desktop/mobile smoke test.
- Keep dashboard startup disabled by default. Rollback is a source revert; no persisted data changes are involved.
Open Questions
None required for the initial implementation.