From edf3a5fe80f2f7bbd8008f81f0db142807d1d76e Mon Sep 17 00:00:00 2001
From: Precious Oritsedere
Date: Thu, 24 Sep 2026 16:36:40 +0100
Subject: [PATCH 1/4] count feed quality summary by dataset, not feed
---
app/components/feed-quality/FeedQualitySection.tsx | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/app/components/feed-quality/FeedQualitySection.tsx b/app/components/feed-quality/FeedQualitySection.tsx
index 64c0796..ef4f8e8 100644
--- a/app/components/feed-quality/FeedQualitySection.tsx
+++ b/app/components/feed-quality/FeedQualitySection.tsx
@@ -44,7 +44,7 @@ export function FeedQualitySection() {
const filterQuery = useFeedQualityFilters();
const hasFilters = Object.keys(filterQuery).length > 0;
- const { rows, groups, isLoading, error, retry } = useFeedQuality(
+ const { groups, isLoading, error, retry } = useFeedQuality(
enabled,
filterQuery
);
@@ -53,13 +53,13 @@ export function FeedQualitySection() {
let okCount = 0;
let warningCount = 0;
let errorCount = 0;
- for (const row of rows) {
- if (row.status === "OK") okCount += 1;
- else if (row.status === "WARNING") warningCount += 1;
+ for (const group of groups) {
+ if (group.worstStatus === "OK") okCount += 1;
+ else if (group.worstStatus === "WARNING") warningCount += 1;
else errorCount += 1;
}
- return { total: rows.length, okCount, warningCount, errorCount };
- }, [rows]);
+ return { total: groups.length, okCount, warningCount, errorCount };
+ }, [groups]);
// True while a fresh result is loading (first load or a new filter
// combination). Only the figures and table rows swap to placeholders — the
From cb8bc8cdd2eda260c2cd2c5c76d07ae905aea661 Mon Sep 17 00:00:00 2001
From: Precious Oritsedere
Date: Thu, 24 Sep 2026 16:37:42 +0100
Subject: [PATCH 2/4] call summary counts data providers, not streams
---
app/components/feed-quality/FeedQualitySummary.tsx | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/app/components/feed-quality/FeedQualitySummary.tsx b/app/components/feed-quality/FeedQualitySummary.tsx
index 34244d7..349eddc 100644
--- a/app/components/feed-quality/FeedQualitySummary.tsx
+++ b/app/components/feed-quality/FeedQualitySummary.tsx
@@ -55,11 +55,11 @@ export function FeedQualitySummary({
return (
- Data stream status
+ Data provider status
@@ -72,8 +72,8 @@ export function FeedQualitySummary({
{!loading && total === 1
- ? "data stream tracked"
- : "data streams tracked"}
+ ? "data provider tracked"
+ : "data providers tracked"}
From 9e4ca94893b7a406ec6edc7cdd3651e7c593d16b Mon Sep 17 00:00:00 2001
From: Precious Oritsedere
Date: Thu, 24 Sep 2026 16:38:53 +0100
Subject: [PATCH 3/4] say data providers in quality filter and empty states
---
app/components/feed-quality/FeedQualitySection.tsx | 6 +++---
app/components/feed-quality/FeedQualityStatusFilter.tsx | 2 +-
app/components/feed-quality/FeedQualityTable.tsx | 8 ++++----
3 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/app/components/feed-quality/FeedQualitySection.tsx b/app/components/feed-quality/FeedQualitySection.tsx
index ef4f8e8..e6e6bf7 100644
--- a/app/components/feed-quality/FeedQualitySection.tsx
+++ b/app/components/feed-quality/FeedQualitySection.tsx
@@ -101,7 +101,7 @@ export function FeedQualitySection() {
role="status"
aria-live="polite"
>
- Showing data streams that match your filters above.
+ Showing data providers that match your filters above.
)}
{error ? (
@@ -145,7 +145,7 @@ function EmptyState() {
No data quality data yet.
- OpenActive hasn't assessed any data streams in this window. Check back
+ OpenActive hasn't assessed any data providers in this window. Check back
once data providers have started sharing data.
@@ -156,7 +156,7 @@ function NoMatchesState() {
return (
- No data streams match your current filters.
+ No data providers match your current filters.
Try removing a filter above to widen the search.
diff --git a/app/components/feed-quality/FeedQualityStatusFilter.tsx b/app/components/feed-quality/FeedQualityStatusFilter.tsx
index a358d5c..acd38ea 100644
--- a/app/components/feed-quality/FeedQualityStatusFilter.tsx
+++ b/app/components/feed-quality/FeedQualityStatusFilter.tsx
@@ -101,7 +101,7 @@ export function FeedQualityStatusFilter({
{
const count = filteredGroups.length;
- const noun = count === 1 ? "data stream" : "data streams";
+ const noun = count === 1 ? "data provider" : "data providers";
if (!hasActiveFilters) return "";
return count === 0
- ? "No data streams match the current filters."
+ ? "No data providers match the current filters."
: `${count} ${noun} match the current filters.`;
}, [filteredGroups.length, hasActiveFilters]);
@@ -388,7 +388,7 @@ export function FeedQualityTable({
{!loading && filteredGroups.length === 0 ? (
- No data streams match those filters.
+ No data providers match those filters.
{query
@@ -493,7 +493,7 @@ export function FeedQualityTable({
aria-live="polite"
className="px-3 py-3 text-center text-xs text-oa-grey-500"
>
- Loading more data streams…
+ Loading more data providers…
)}
From d1f43ed16f7781a69832f00c182acaa3a28e33a6 Mon Sep 17 00:00:00 2001
From: Precious Oritsedere
Date: Thu, 24 Sep 2026 16:40:17 +0100
Subject: [PATCH 4/4] document that quality status counts use providers
---
docs/feed-quality.md | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/docs/feed-quality.md b/docs/feed-quality.md
index c8f4d1e..b062bc5 100644
--- a/docs/feed-quality.md
+++ b/docs/feed-quality.md
@@ -28,6 +28,8 @@ If the API fails, the failed key is dropped so Retry can try again.
`groupFeedsByDataset` in `app/lib/feed-quality.ts` groups rows by dataset.
+Each group gets a `worstStatus` (the most severe status among that dataset's feeds). The summary overview and the All / Healthy / Warnings / Errors chips both count **data providers** (dataset groups) by that `worstStatus`, so their totals match the table. Individual feed statuses still show when a group is expanded.
+
The UI has two views (`FeedQualityViewToggle`):
- **Data completeness** - core fields used for headline opportunity figures (dates, location, activity or facility)
@@ -35,7 +37,7 @@ The UI has two views (`FeedQualityViewToggle`):
Completeness bands (high / moderate / low / none / not assessed) are defined in `COMPLETENESS_BANDS` in the same file. Colour cells use those bands.
-Each feeds also has a status: `OK`, `WARNING`, or `ERROR` (shown as Healthy / Warning / Error).
+Each feed also has a status: `OK`, `WARNING`, or `ERROR` (shown as Healthy / Warning / Error).
## Opportunities column