mirror of
https://github.com/paperclipai/paperclip.git
synced 2026-10-25 17:45:53 +01:00
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>