- Pre-archive warning notification (per-task push to assignee)The rev 47/48/49 stale-task lifecycle worked at workspace scope โ the rev-48 stale_warning Slack push said 'your workspace has N stale tasks', and the rev-49 task.auto_archived event was a closure receipt. Multi-operator teams needed a per-task push to the *assignee* saying 'this is yours and it's about to disappear'. New task.archiveWarnedAt timestamp column + sweepArchiveWarnings() helper + runArchiveWarnings() cron sweep at the end of runDailyDigest() (immediately before runStaleTaskAutoArchive so an assignee gets at least one cron-cycle of heads-up before their task disappears). Per-task Slack post (one message per task so the assignee can deep-link straight to the right card) + per-task Resend email to the assignee + new task.archive_warning outbound event. Rate-limited via the archiveWarnedAt stamp so a second cron tick within the warning window can't double-fire. Closes the missing edge of the rev 47/48/49 lifecycle: workspace-level surface (rev 48) โ per-task per-recipient warning (rev 50) โ workspace-level closure (rev 49).
- One-tap renew button on every stale taskCheapest possible operator action for the rev-48/49 staleness lifecycle. Distinct from rev-23 pin (permanent โ exempts from auto-archive forever) and rev-14 operator-note (which feeds the AI). Renew = 'the queue is right, just keep it visible'. New POST /api/tasks/:id/renew route + matching POST /api/v1/tasks/:id/renew bearer-auth mirror + new TaskRenewButton component that mounts inline on every task showing the rev-48 staleness pill. One click bumps updatedAt + clears the rev-50 archiveWarnedAt stamp so the staleness countdown resets. Distinct from delete-and-recreate (destructive) and pin-and-unpin (visible state change). Closes the friction gap between rev-23 pinning (forever) and rev-14 operator-note (AI direction) โ the operator's 'I'm still working on this, don't auto-archive' affordance.
- Stale-tasks CSV export โ close procurement evidence quintetProcurement evidence pattern grows: rev 6 JSON full + rev 7 activity CSV + rev 22 outputs CSV + rev 47 decisions CSV + rev 50 stale-tasks CSV. SOC 2 / ISO 42001 reviewer asking 'show me everything that's gone quiet over the audit window' now has a one-click answer. New GET /api/workspace/stale-tasks-export route + getWorkspaceStaleTasksCsv() helper. Optional ?thresholdDays=N (1-60) overrides the default 5d staleness floor for different audit lenses ('anything quiet for 14+ days' vs 'anything quiet for 5+ days'). Surfaced as the fifth button in the integrations panel data-export section beside JSON / activity / outputs / decisions.
- GET /api/v1/tasks/auto-archived (audit-trail closure on the v1 surface)Until rev 50 an MCP host could see *current* stale tasks (rev 48 /tasks/stale), the task.auto_archived outbound event (rev 49 push), and the workspace activity log (rev 20 /activity) โ but no single endpoint answered 'what has the desk auto-archived recently?'. Rev 50 closes that gap with a bearer-auth endpoint identifying auto-archived tasks by the synthetic blocker prefix the rev-49 sweep stamps on every row. Bounded query window (default 30 days, max 365). Pairs with the rev-48 /tasks/stale + rev-49 task.auto_archived outbound event as the full audit trail of the rev 47/48/49/50 stale-task lifecycle on the protocol-bound surface.