- File:
desktop/src/views/SkillsView.tsx - Problem: Textarea has
onChangehandler updatingcontentstate, but there is NO save button and NO save function. Edits are lost on navigation. - Fix: Add
save()fn callingPATCH /api/skills/{name}/content, add Save button + toast - Route exists: YES —
PATCH /api/skills/{name}/contentin server.py - Priority: CRITICAL
- File:
desktop/src/views/IdentityView.tsx - Problem: Save button is disabled when
content === originalContent(isDirty=false). The save() function itself is correct. The issue is thebtn-primaryclass may have styling that hides the disabled state, or the file fetch isn't populatingoriginalContentcorrectly on first load. - Fix: Investigate CSS for btn-primary:disabled, verify originalContent is set on fetch, add visual dirty indicator
- Route exists: YES —
PUT /api/workspace/filein server.py - Priority: CRITICAL
- Purpose: Browse and manage Cato's hybrid memory (facts, knowledge graph, chunks)
- Backend routes available:
GET /api/memory/files— list memory docsGET /api/memory/content— read memory chunk/fact contentPATCH /api/memory/content— edit memory factsGET /api/memory/stats— facts count, kg_nodes, kg_edges counts
- UI tabs: Facts | Graph | Stats
- Sidebar: Monitoring group → "Memory" (🧠)
- Priority: HIGH
- Purpose: System diagnostics — CLI process pool status, action guard, daemon controls
- Backend routes available:
GET /api/cli/status— warm/cold status per model (claude/codex/gemini/cursor)GET /api/action-guard/status— 3-rule safety gate status, autonomy levelPOST /api/daemon/restart— restart daemon
- UI panels: Process Pool | Safety Gate | Daemon Controls
- Sidebar: Settings group → "System" (⚙️)
- Priority: HIGH
- Purpose: Internal AI diagnostics — query classification, decision memory, contradiction health
- Backend routes needed (NEW):
GET /api/diagnostics/query-classifier— recent tier decisions (A/B/C)GET /api/diagnostics/skill-corrections— correction store entriesGET /api/diagnostics/contradiction-health— Jaccard health summaryGET /api/diagnostics/decision-memory— open decisions + overconfidence profileGET /api/diagnostics/anomaly-domains— domain anomaly summaries
- UI tabs: Query Tiers | Corrections | Contradictions | Decisions | Anomalies
- Sidebar: Monitoring group → "Diagnostics" (🔬)
- Priority: MEDIUM
- Purpose: Visualize session replay results (dry-run audit validation)
- Backend routes available:
POST /api/sessions/{session_id}/replay— trigger dry-run replay
- UI: Step list with match/mismatch badges, timing, summary stats
- Integration: Add "Replay" button to SessionsView.tsx that navigates to ReplayView
- Sidebar: NOT a standalone nav item — launched from SessionsView
- Priority: MEDIUM
- Route:
GET /api/adapters - Handler: List active adapters (Telegram, WhatsApp) and connection status
- Source:
cato/adapters/telegram.py,cato/adapters/whatsapp.py - UI: DashboardView.tsx adapter pills + ConfigView.tsx
- Priority: MEDIUM
- Route:
GET /api/heartbeat - Handler: Last heartbeat timestamp, agent name, uptime
- Source:
cato/heartbeat.py—HeartbeatMonitor - UI: DashboardView.tsx heartbeat section
- Priority: MEDIUM
- Routes:
GET /api/sessions/{id}/checkpoints— list checkpointsGET /api/sessions/{id}/checkpoints/{cid}— get checkpoint summary
- Source:
cato/core/session_checkpoint.py—SessionCheckpoint - UI: SessionsView.tsx — new "Checkpoints" tab
- Priority: MEDIUM
- Route:
GET /api/sessions/{id}/receipt - Handler: Generate signed receipt (cost, actions, hash chain)
- Source:
cato/receipt.py—ReceiptWriter - UI: AuditLogView.tsx — "Download Receipt" button
- Priority: LOW
- Route:
GET /api/diagnostics/query-classifier - Handler: Return recent query tier decisions with reasoning
- Source:
cato/orchestrator/query_classifier.py - UI: DiagnosticsView.tsx
- Priority: MEDIUM
- Route:
GET /api/diagnostics/contradiction-health - Handler: ContradictionDetector health summary (resolved/unresolved counts)
- Source:
cato/memory/contradiction_detector.py - UI: DiagnosticsView.tsx
- Priority: MEDIUM
- Route:
GET /api/diagnostics/decision-memory - Handler: Open decisions + overconfidence profile
- Source:
cato/memory/decision_memory.py - UI: DiagnosticsView.tsx
- Priority: MEDIUM
- Route:
GET /api/diagnostics/anomaly-domains - Handler: Domain anomaly detection summaries
- Source:
cato/monitoring/anomaly_detector.py - UI: DiagnosticsView.tsx
- Priority: LOW
- Memory page (facts browser, stats)
- System page (CLI pool status, action guard)
- Diagnostics page (contradiction health, decision memory)
- Adapters status section on Dashboard page
- Skills page in web UI: verify save button works
- Identity page in web UI: verify save button works
- Verify logo appears in header (favicon-only currently)
| Item | Type | Priority | Chunk | Status |
|---|---|---|---|---|
| SkillsView save button | BUG FIX | CRITICAL | 1 | PENDING |
| IdentityView save debugging | BUG FIX | CRITICAL | 1 | PENDING |
| MemoryView.tsx | NEW VIEW | HIGH | 2 | PENDING |
| SystemView.tsx | NEW VIEW | HIGH | 3 | PENDING |
| ReplayView.tsx + SessionsView btn | NEW VIEW | MEDIUM | 4 | PENDING |
| DiagnosticsView.tsx | NEW VIEW | MEDIUM | 5 | PENDING |
| GET /api/adapters | NEW ROUTE | MEDIUM | 6 | PENDING |
| GET /api/heartbeat | NEW ROUTE | MEDIUM | 6 | PENDING |
| GET /api/sessions/{id}/checkpoints | NEW ROUTE | MEDIUM | 7 | PENDING |
| GET /api/sessions/{id}/receipt | NEW ROUTE | LOW | 7 | PENDING |
| GET /api/diagnostics/* (5 routes) | NEW ROUTES | MEDIUM | 5 | PENDING |
| dashboard.html memory/system pages | WEB UI | MEDIUM | 8 | PENDING |
| dashboard.html identity/skill save verify | WEB UI | HIGH | 8 | PENDING |
Total: 2 bugs, 4 new views, 8 new routes, 1 web UI sync