- task.unblocked Slack + email + outbound notificationCloses the named rev-36 next-sprint candidate. Rev 36 made task dependencies a real queue gate (selectNextTask filters out tasks until every blocker is done) but no push channel told operators when a blocker just flipped to done. Rev 37 adds it: when a task transitions to done β via either updateTaskStatus or the AI completion path in pulse β every dependent task gets re-evaluated; if its remaining blockers are now all done, the assignee gets a Slack ping, an email if Resend is configured, and the new task.unblocked outbound webhook event fires for downstream automations. Best-effort across all three channels: a Slack/email/outbound failure cannot block the originating task's status update.
- PUT /api/v1/tasks/:taskId/blockers β v1 parity for the rev-36 blockers primitiveThe rev-36 dashboard endpoint (PUT /api/tasks/:id/blockers) was dashboard-only. Rev 37 mirrors it onto the bearer-authenticated v1 surface, so the upcoming MCP server's task-dependency tooling needs no custom bridge code. Same 8-blocker cap, same plain-JSONB validation in setTaskBlockedBy() β a deleted blocker degrades gracefully to 'blocker missing' without orphaning the dependent. Closes the last v1 surface gap from the rev-36 list. Indexed in the /api/v1 self-describing endpoint list (and fixes the rev-36 typo that referenced /api/tasks/{id}/blockers).
- Public /changelog/rss.xml feedRSS 2.0 feed at /changelog/rss.xml exposes the last 30 revisions to feed aggregators (Feedly, Inoreader, the dozens of 'what shipped this week' AI-tooling newsletters that read RSS). Marketing surface β visible velocity is the cheapest possible trust signal for procurement teams evaluating governance-first AI tools, and an RSS feed turns the rev-by-rev cadence into a passive distribution channel without the operator's permission. Cache-control public, max-age=300, s-maxage=1800. The /changelog page now exposes it via a Subscribe link and an HTML <link rel='alternate'> in the page head so feed readers auto-discover it. Refactored the releases data into a shared src/lib/changelog-releases.ts so the page and feed never drift.
- 'Now ready' visual cue on tasks where every blocker is doneUntil rev 37, a task whose declared blockers (rev 36) had all transitioned to done was visually identical to a task that was still waiting β only the small TaskBlockers pill changed. Rev 37 adds a more prominent affordance: a brandβpurple 'Ready' ribbon pulses on the corner of the card and the card itself gets a soft brand-color glow. Distinct from a task with zero blockers (no need for a 'ready' affordance), distinct from in_progress (already running). Pairs with the rev-37 task.unblocked Slack/email push β the push is the moment-of-transition alarm, the ribbon is the persistent 'still waiting to start' affordance for the operator scanning the queue. Tucks to bottom-right when the task also matches a rev-29 focus tag so the two ribbons don't overlap.