You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Purpose: Single source of truth for pending work in the OpenWatch Go rebuild (app/).
Updated at the end of each AI session.
Last Updated: 2026-06-14
Active Tree: app/ (Go backend + React/TypeScript frontend)
Frozen Tree: backend/ (legacy Python/FastAPI — FROZEN as of 2026-06-04, see CLAUDE.md)
6 integration test helpers silently discarded TRUNCATE TABLE hosts errors caused by Q1 FK additions (transactions, host_rule_state)
CardServerIntel cache-shape collision fix
#475
New card shared a queryKey with the existing intelligenceStateQuery but expected a different value shape — silently rendered "Not collected yet" everywhere
Activity service wired into main + host_id filter crash fix
#477
The service had WithActivity but no caller — /api/v1/activity returned 503. After wiring, host_id-filtered queries crashed with invalid input syntax for type uuid: "" (audit leg's '' = $hostPH predicate). system-activity AC-13 added
host_monitoring_history as 5th source leg + Recent activity card rewrite
#478
system-activity v1.0.0 → v1.1.0. Card now consumes the unified /activity?host_id=X feed
Matches mockup. View all links to /hosts/{id}?tab=activity (tab is a TabStub today)
Active Work — Host Detail Overview Tab (~90% complete)
Item
Priority
Status
Notes
Top failed rules card
P1
Done (PR #515)
Live against GET /hosts/{id}/compliance/failed-rules with catalog titles
Compliance trend (last 30 days) card
P1
Done (PR #518)
Live sparkline against the 80% target line from posture_snapshots (system-posture-snapshots); GET /hosts/{id}/compliance/trend. Fleet equivalent powers the hosts-list avg-compliance delta
Open exceptions count on Server intelligence tile #6
P2
Done (PR #522)
Live active-exception count via useHostExceptions; the Watchlist row + Compliance-tab Waived/Pending badges + the Settings fleet approver queue (PR #523) all ship the exception governance loop
Updates-pending count on Server intelligence tile #1
P2
Placeholder
Renders "No updates pending" always. Needs: collector to surface available_updates field on the snapshot (apt/dnf unattended-upgrades parsing)
Active Work — Host Detail Other Tabs
Tab
Priority
Status
Notes
Compliance
P1
Stub
TabStub placeholder. Needs: per-host compliance summary from host_rule_state
Packages
P1
Partial
Reads intelligenceStateQuery.data.packages — works when collector has run. UI exists in pages/host-detail/InventoryTabs.tsx
Services
P1
Partial
Same shape as Packages — reads intelligenceStateQuery.data.services
Users
P1
Partial
Same shape — reads intelligenceStateQuery.data.users
Network
P1
Wired
Renders intelligenceStateQuery.data.network_interfaces + listening_ports + firewall from host_system_info
Audit log
P2
Stub
Needs host-scoped audit_events API hook
Activity
P1
Stub
Where "View all" lands today. Needs full-feed renderer with cursor pagination + source/severity filters on the unified /api/v1/activity?host_id=X endpoint
Remediation
P2
Not started (scoping required)
Host-mutating fixes (apply + rollback). The last scan-plan piece; plan + the five decisions in docs/engineering/scan_remaining_work.md
Terminal
P3
Stub
Browser-based SSH terminal. Web terminal lib + SSH-WS bridge needed
Activity Feed Follow-ups (from #478/#479)
Item
Priority
Notes
Build out the Activity tab at /hosts/{id}?tab=activity
P1
"View all" on the Recent activity card lands on a TabStub today. Tab should render the full feed (paginated, source/severity filters, time-range)
SSE auto-refresh of host_activity query key
P2
useLiveEvents.ts invalidates ['host_intelligence_events', hostId] + ['intelligence_state', hostId] on intelligence.event. Should also invalidate ['host_activity', hostId] on any of: intelligence.event, monitoring.band.changed, alert.fired, scan.completed
Filter NULL→online transitions on first-contact
P3
Dev-fleet backend restarts wipe previous_state so every reboot writes a NULL→online row, dominating the feed. Real fleets won't see this pattern — defer until production reports it
SMTP/SES dispatcher. User preferences table (which alert types). RBAC-gated. The Q1 notification-channels work (Slack/email/webhook) is the foundation
In-app notifications
P1
Planned
Bell icon with unread count, drawer, mark-as-read. Sources: alerts, scan completions, exception approvals, system events. RBAC-filtered. WebSocket or SSE delivery (the existing SSE bus can carry it)
Dashboard layout customization (drag/drop)
P2
Planned
3 tiers per spec AC-12: full (admins), limited (analysts), none (auditor). Preset structure ready, needs @dnd-kit/core + persistence
Frontend uses replace-on-save (<ReplaceCredentialModal> runs POST → DELETE). Real PATCH would close the orphan-credential failure mode
POST /api/v1/bulk/hosts/analyze-csv + import-with-mapping
P2
Deferred
Today the wizard runs CSV analysis client-side and submits row-by-row — no atomic semantics, no "update existing", no row caps
Standalone SSH-key vault
P3
Deferred
Today every credential owns its own key material; no first-class "SSH key" resource. Worth doing when rotation cadence forces N-credentials-share-1-key
specter check --test is at 0 errors and gated in CI (#512), but still emits ~185 warnings from top-of-file // @ac summary blocks that duplicate per-test annotations. Non-blocking under the non-strict gate. Can't be a mechanical sweep: de-annotating risks dropping source-walk coverage for any AC covered only via its header block — needs a per-AC check first. Once clean, the gate could be tightened to fail on warnings too
CI / Flakes
Item
Priority
Notes
internal/license.TestVerify_P99Latency flake under -race
P3
Tight <1ms p99 budget. Bump to 2ms, skip under -race, or pre-warm verifier
internal/audit.TestEmitSync_Latency flake
P3
p99 latency assertion, sensitive to CI runner load. Hit on PR #477 — single rerun cleared
internal/queue.TestEnqueue_LatencyP99 flake
P3
Same shape — hit on PR #479, single rerun cleared. Trend: three p99 flakes in one session — consider widening all budgets or moving them to a perf-suite that doesn't gate merges
How to Use This File
Starting a session: Read this file alongside CLAUDE.md and SESSION_LOG.md
Picking work: Default to the highest-priority "Active Work" sections, then the OpenWatch OS or OpenWatch+ planned items
Completing work: Move the row out of "Active" into "Recently Completed", note the PR
Discovering new work: Add to the most appropriate section
Ending a session: Update statuses, prepend SESSION_LOG, create a handoff file in docs/handoff/ if the next session will be a different operator