Arch Review Dashboard
Operator arch review with 3 panels.
The Architectural Intelligence Review Dashboard gives platform operators a cross-tenant view of the knowledge graph: new observations as they arrive, deviations from established patterns grouped by project, and a histogram of how confident the system is in its current graph state.
This surface is operator-only (/admin/arch/review) and intentionally cross-tenant - operators see activity across all organizations in one place.
Overview
The dashboard queries three separate endpoints, each backed by createArchReviewSdk() in src/lib/arch/review.ts:
| Panel | API route | Data source |
|---|---|---|
| Recent Observations | GET /api/admin/arch/review/recent | observations table, last 24 h |
| Drift Summary | GET /api/admin/arch/review/drift-summary | graph_nodes where type='deviation' |
| Confidence Histogram | GET /api/admin/arch/review/confidence-histogram | graph_nodes where type in pattern/convention/decision |
Panel: Recent Observations
Shows a paginated feed of observations written to the knowledge graph in the last 24 hours, ordered newest first.
Filtering and pagination
| Parameter | Type | Default | Notes |
|---|---|---|---|
orgId | string? | null (all orgs) | Restrict to a single tenant |
sinceMs | number? | 86400000 (24 h) | Look-back window in milliseconds |
limit | number? | 50 | Max 200 per page |
before | ISO-8601? | null | Cursor - createdAt strict upper bound |
The endpoint uses a +1 fetch pattern: it fetches limit + 1 rows and returns the createdAt of the last row as nextCursor. Pass nextCursor back as before to get the next page without a separate COUNT(*) round-trip.
// GET /api/admin/arch/review/recent?limit=2
{
"items": [
{
"id": "obs_...",
"orgId": "org_...",
"projectId": "proj_...",
"agentId": "agent_...",
"kind": "file_operation",
"content": "Refactored auth middleware to use Cedar PEP...",
"source": "session",
"weight": 0.55,
"createdAt": "2026-06-02T14:31:00.000Z"
}
],
"nextCursor": "2026-06-02T14:31:00.000Z",
"limit": 2,
"since": "2026-06-01T14:31:00.000Z"
}Observation fields
Prop
Type
Panel: Drift Summary
Aggregates all graph_nodes rows of type='deviation' into a per-project breakdown with severity counts.
// GET /api/admin/arch/review/drift-summary
{
"projects": [
{
"projectId": "proj_...",
"projectName": "rensei-platform",
"orgId": "org_...",
"total": 7,
"bySeverity": { "low": 2, "medium": 4, "high": 1 },
"mostRecentAt": "2026-06-01T22:15:00.000Z"
}
],
"total": 7,
"generatedAt": "2026-06-02T14:35:00.000Z"
}Projects are sorted by total descending. A mostRecentAt of null means no deviations have been dated for that project.
Severity comes from the properties.severity field on each graph_nodes deviation row. Values not in low|medium|high are bucketed as medium.
Panel: Confidence Histogram
Counts graph nodes (patterns, conventions, decisions - deviations excluded) by their importance_weight column in five fixed buckets.
// GET /api/admin/arch/review/confidence-histogram
{
"buckets": [
{ "min": 0.0, "max": 0.2, "label": "0.0-0.2", "count": 3 },
{ "min": 0.2, "max": 0.4, "label": "0.2-0.4", "count": 11 },
{ "min": 0.4, "max": 0.6, "label": "0.4-0.6", "count": 42 },
{ "min": 0.6, "max": 0.8, "label": "0.6-0.8", "count": 28 },
{ "min": 0.8, "max": 1.01, "label": "0.8-1.0", "count": 9 }
],
"total": 93,
"generatedAt": "2026-06-02T14:35:00.000Z"
}A healthy graph clusters at 0.4-0.8. A large proportion of nodes at 0.0-0.2 indicates many low-signal observations that have not yet been corroborated by multiple agents.
Operator access
All three routes call requireOperator(). Authenticated users without the operator role receive a 403. There is no tenant-scoped version of this dashboard; project teams use the project-level /intelligence/arch/ routes instead.
Related pages
- Arch Query Layer - the platform-native read path over
graph_nodes - Tech-Stack Fingerprinting - how observations are fingerprinted for cross-project transfer candidacy
- AST Extraction - how
file_operationobservations become graph nodes - Knowledge Graph Store - the
graph_nodesandobservationstables this dashboard reads from