Files
PaperClipAI/packages
DottaandPaperclip 78e0f80358 PAP-11887 Phase 3b: watchdog state visibility UI
Surface typed watchdog proof outcomes on the issue surface, implementing
the Phase 3a UX spec against the Phase 2 server contract.

Server read path:
- getActiveForIssue (GET /issues/:id/watchdog) now populates
  latestProofOutcome from the most recent issue_watchdog_proof_outcomes
  row (the type existed but the read path never set it). Redacted evidence
  is surfaced verbatim — never re-fetched or unredacted.
- Re-export IssueWatchdogProofOutcomeSummary from @paperclipai/shared.

UI:
- WatchdogOutcomeBadge: outcome -> tone vocabulary (accepted/restored/
  deferred/failed/dismissed), reused by both surfaces.
- WatchdogStateCallout: pinned thread callout with all 8 states (the five
  outcomes + empty/loading/load-failure). Load errors are surfaced with a
  Retry affordance, never silently hidden. Deferred/failed render an
  "Outstanding" strip sourced from blockedBy / activeRecoveryAction so the
  unblock owner+action is visible without reconstructing the thread.
  Fingerprint-drift cue when observed != reviewed.
- IssueProperties: compact sidebar readout under the Watchdog config row,
  sharing the watchdog query key so both surfaces dedupe to one fetch.
- Wired watchdog + monitorNextCheckAt through IssueDetail -> IssueChatThread.

Tests: WatchdogStateCallout component test (7) + server read-path route
test. (The redaction route test in this file was a pre-existing orphaned
Phase 2/security change in the worktree; preserved as it passes.)

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-06-24 21:49:32 +00:00
..