- Share-page status filter on the related-briefs drill-down (close named rev-46 follow-up)Rev 46's running state explicitly named 'share-page status filtering' as the next-sprint candidate, citing the rev-46 kind filter as a half-completed narrowing surface that needed status to close. Rev 47 ships it. Every shared brief at /share/<token> now lets external readers narrow the rev-45 tag drill-down by status (Approved / Ready / Archived) in addition to kind. The /api/share/{token}/related endpoint accepts an optional status query param; getRelatedSharedArtifactsByTag validates against an explicit PUBLIC_ARTIFACT_STATUSES allowlist that excludes draft (operators don't share drafts in practice โ the helper hard-excludes it as a safety net so a bug or operator slip can't accidentally leak draft material to a procurement reviewer). Each result row now renders a status pill alongside the existing kind pill so the reviewer can see status at a glance without clicking through. Strategic significance: a SOC 2 / ISO 42001 reviewer auditing decisions tagged #q3-launch is most often interested in the live (approved) set without seeing every superseded archived revision in the same drill-down. Rev 47 closes the rev-46 kind+status narrowing pair on the public surface.
- Decisions log CSV export โ close procurement evidence quartetThe procurement evidence trio (rev 6 JSON full export + rev 7 activity CSV + rev 22 outputs CSV) has been the canonical takeaway artefact set for SOC 2 / ISO 42001 reviewers since rev 22. Rev 47 closes the quartet with a decisions CSV scoped exactly to the rev-9 dashboard 'Decisions log' semantics (status โ {approved, archived}, kind โ brief). Pairs with the rev-46 GET /api/v1/decisions endpoint as the protocol-bound + procurement-friendly read pair. New /api/workspace/decisions-export route + getWorkspaceDecisionsCsv helper. Mirrors the rev-22 outputs CSV column shape (createdAt, updatedAt, kind, status, title, summary, tags, share URL) so a reviewer reading both side-by-side sees one column vocabulary. The decisions CSV is the takeaway artefact a procurement reviewer asks for when their question is 'what has this team *decided* (not drafted, not noted) over the audit window?' โ until rev 47 the only path was to filter the outputs CSV in Excel.
- Stale-task detector panelSurfaces tasks that have been queued or in_progress for >5 days without progress (no updatedAt bump = no workLog entry from the pulse engine + no operator steering = quietly rotting in the queue). Pinned tasks are excluded server-side; pinning is the rev-23 affordance for 'intentionally kept around regardless of staleness.' Pure derived state โ no schema, no migration. Hidden when there are no stale tasks (most workspaces will see nothing here, which is the correct default). Strategic significance: pairs with the rev-12 heartbeat (loop state) + rev-17 stuck-loop banner (cycle cadence) + rev-37 task-unblocked push (transition signal) for the full task-health surface. Those answer 'is the desk alive?', 'is the cycle alive?', and 'is this dependency unblocked?'. Stale-task answers the missing fourth: 'is this task quietly rotting in the queue?' Common causes: blocked on missing context, keeps getting passed over by higher-priority work, or has been superseded but never archived. The dashboard now diagnoses all four failure modes at a glance.
- Dashboard hover polish + panel-target flashCumulative micro-polish โ every rev 22+ has carried one. Three small but cumulative pieces of visual polish: (a) subtle hover transition on every informational app-pill (priority, status, kind, due) so the pill row feels less inert (interactive chips already had hover treatment, informational pills were dead), (b) strengthened panel-target flash so a deep link from a mention permalink (rev 31) or stale-task jumpTo (rev 47) reads with a clearer 'you arrived here' affordance even on amber-tinted panels (stale-task, stuck-loop), (c) refined share-page status pill + kind pill side-by-side layout so the rev-47 status narrowing reads as a sibling to the rev-46 kind narrowing without crowding. The rev-by-rev discipline of one targeted polish per rev is what keeps the dashboard from drifting toward the design-debt smell that hand-rolled SaaS dashboards usually develop after 47 revs.