- Bulk source rename / find-and-replace โ closes the named rev-95 next-sprint candidateRev 95 shipped single-source rename; a workspace with 20+ rss.app/fetchrss bridge feeds wanting a brand rebrand ('Acme โ Globex') still required N inline-rename clicks. Rev 96 collapses that to one operation. New `bulkRenameSources()` helper + `POST /api/sources/bulk-rename` route + matching `POST /api/v1/sources/bulk-rename` v1 mirror in lockstep. Operates either workspace-wide (omit sourceIds) or scoped to an explicit subset (cap 50, mirroring rev-36 source bulk pause/resume/delete). Three-stage UI: type the find/replace text, tap Preview to see exactly which labels would change, tap Apply to commit. The preview is the safety net โ operators verify before pressing the irreversible-feeling button. Activity log records each per-source rename via the same setSourceLabel-style messages as the rev-95 inline rename + a single bulk summary line so the audit trail captures both lineage and operation. **Strategic significance**: closes the explicit rev-95 next-sprint candidate at the named friction point. The source surface is now five operations deep (rev 6 pause/resume/delete + rev 16 health diagnostics + rev 26 keyword filters + rev 36 bulk pause/resume/delete + rev 95 single rename + rev 96 bulk rename) โ every standard source-management action is available without delete-and-recreate.
- Sources CSV export โ closes the procurement-evidence sextet at the source axisThe procurement evidence quintet (rev 6 JSON full + rev 7 activity CSV + rev 22 outputs CSV + rev 47 decisions CSV + rev 50 stale-tasks CSV + rev 60 cost summary CSV) covered every other surface; sources was the missing edge. A SOC 2 / ISO 42001 reviewer asking 'show me your input set with health diagnostics' had to take JSON + filter in Excel. Rev 96 closes the gap with a single procurement-friendly takeaway CSV that includes the rev-16 health diagnostic columns (lastSuccessAt / lastErrorAt / lastErrorMessage), the rev-26 keyword filter columns (includeKeywords + excludeKeywords joined by `|`), and the rev-12 7-day signal-rate column derived from the dashboard's existing per-source count query. New `getWorkspaceSourcesCsv()` helper + `GET /api/workspace/sources-export` route + `GET /api/v1/workspace/sources-export` v1 mirror in lockstep. Filename stamps the workspace slug so multi-workspace operators don't end up with a folder of indistinguishable sources.csv downloads. **Strategic significance**: closes the procurement-evidence sextet โ the takeaway artefact set is now complete across every load-bearing surface. The same six-CSV trust signal that procurement teams already accept on the work / decision / cost / stale axes now applies to the input axis.
- Workspace search reaches sources โ closes the seventh-axis search coverage gapWorkspace search has accumulated six entity types since rev 17 (signals + tasks + outputs + memory + comments + activity). Sources was the seventh and missing axis โ a workspace with 20+ feeds had to scroll the sources panel to find a feed by keyword. Becomes load-bearing after rev 95 made source labels mutable: operators renaming feeds inevitably accumulate names they later want to find by partial match. Rev 96 closes the gap on both the dashboard search and the v1 surface. The dashboard `WorkspaceSearch` component gains a `sources?: SearchSource[]` prop that filters by label + type. The `/api/v1/search` endpoint runs a parallel SQL query against sources joined into the same response shape with a `sources: counts.sources + sources[]` block. Pressing Enter on a source hit scrolls the dashboard to the new `panel-sources` anchor on the sources panel. **Strategic significance**: closes the search-coverage cluster on the protocol-bound side โ MCP hosts wrapping `/api/v1/search` for cross-workspace lookup tooling now reach every load-bearing entity in the workspace.
- Cumulative dashboard polish โ sources panel hover lift + bulk-rename brand vocabularyCumulative micro-polish (every rev 22+ has carried at least one). New subtle `app-item-sm:hover` treatment on the sources panel (220ms ease, brand-color border + soft box-shadow lift) so the four cumulative source affordances (rev-95 rename, rev-6 pause/resume/delete, rev-26 keyword filter, rev-96 bulk rename) read as tactile rather than static โ same pattern as rev-33's panel fade-in. New `.ld-source-bulk-rename*` styling shares the same brand-color gradient + border vocabulary as the rev-95 inline rename so single and bulk rename read as siblings. New `:focus-visible` ring on every chip + button inside the sources panel rows so keyboard-only operators land cleanly across every source affordance. **Strategic significance**: every rev 22+ has carried at least one piece of cumulative polish. The rev-by-rev discipline is what keeps the dashboard from drifting toward the design-debt smell that hand-rolled SaaS dashboards usually develop after 96 revs.