Context
The InfoItem-first design (Section 5.3 of docs/plans/2026-05-15-watched-item-infoitem-first-design.md) called for a "diff-on-view" UI on each WatchedItem detail page:
When Archiver gains a new sub_aspect binding under an InfoItem the operator has subscribed to, the WatchedItem detail page surfaces 'N new sub_aspects available' and a one-click 'add Watches for these' action.
The watched_items.last_reviewed_at column was added in commit 57307ad for this purpose but currently has no UI surface.
Scope
On the WatchedItem detail page (forthcoming via #161):
- Detect new bindings. On render, call
archiver.get_info_item(info_item_id) and partition info_item_sources by created_at:
- Bindings with
created_at > watched_item.last_reviewed_at are "new since last review."
- If none, show "All sub_aspects reviewed" status.
- Review prompt. Surface "N new sub_aspects available" banner with:
- Per-binding row (selector, role, created_at).
- Bulk "Add Watches for these" action that creates Watches with sensible defaults (resolved via the live-inheritance chain).
- "Mark all reviewed" action that stamps
last_reviewed_at = now without creating Watches.
- Audit log entries for
add_watch_from_review and mark_reviewed so the operator can trace why Watches were created.
Acceptance
- WatchedItem detail page shows "N new sub_aspects available since YYYY-MM-DD" when Archiver added bindings after
last_reviewed_at.
- Operator can bulk-create Watches for any subset and the action is auditable.
- Operator can mark-reviewed without creating Watches (signal "I've seen these and chose not to watch").
- "Mark reviewed" stamps
last_reviewed_at = now atomically.
Depends on
Related
Context
The InfoItem-first design (Section 5.3 of
docs/plans/2026-05-15-watched-item-infoitem-first-design.md) called for a "diff-on-view" UI on each WatchedItem detail page:The
watched_items.last_reviewed_atcolumn was added in commit57307adfor this purpose but currently has no UI surface.Scope
On the WatchedItem detail page (forthcoming via #161):
archiver.get_info_item(info_item_id)and partitioninfo_item_sourcesbycreated_at:created_at > watched_item.last_reviewed_atare "new since last review."last_reviewed_at = nowwithout creating Watches.add_watch_from_reviewandmark_reviewedso the operator can trace why Watches were created.Acceptance
last_reviewed_at.last_reviewed_at = nowatomically.Depends on
Related