Finding
tests/e2e/member-directory.spec.js is the only browser coverage of the
member profile dialog's logo-less arm
(src/components/MemberDirectory/MemberProfile.js:35-41, the large initials
shown in place of an <img>). It selects the member that drives the case by
reading the shipped data file directly:
const membersData = JSON.parse(
readFileSync(resolve('data/members.json'), 'utf8'),
);
const members = membersData.members || [];
const withoutLogo = members.find((member) => !member.logo);
...
test.skip(!withoutLogo, 'every member in data/members.json carries a logo');
data/members.json is regenerated from the CNCF landscape by
npm run generate:members, so which organizations lack a logo is upstream
state rather than a source edit. At main = 7ab301e exactly two of 101
members carry no logo (DiDi, Subaru Corporation). On the day the landscape
gives both of them one, the case stops running — and it stops running as a
skip, which no gate reports: --check-source and --check-source-regions
score the regions a run reached, and a case that never executes simply
contributes nothing. The suite would stay green while the dialog's only
browser coverage of that arm quietly disappeared.
This is the hazard the overlay mechanism already exists to remove.
tests/e2e/fixtures/data/members.json appends coverage-fixture-org with
"logo": null (added so MemberCard renders
membershipLabel('member-and-contributor')), and
tests/tools/e2e-data-fixtures.cjs exposes loadSiteData() precisely so a
spec reads the document the page was built from.
tests/e2e/data-fixtures.spec.js and tests/e2e/data-variants.spec.js both
read their data that way; this spec is the one that does not.
Evidence and provenance
- The skip is one landscape refresh away.
data/members.json at main =
7ab301e: 101 members, 2 without a logo. Reproduce with
node -e "const m=require('./data/members.json').members; console.log(m.length, m.filter(x=>!x.logo).map(x=>x.name))".
- The overlay already guarantees the shape. Verified locally at
7ab301e:
loadSiteData('members.json', {}) yields 101 members and 2 without a logo,
loadSiteData('members.json', {E2E_COVERAGE: '1'}) yields 102 and 3 — the
third being Coverage Fixture Organization.
- Unit — covered, and blind to this.
npm run test:unit:coverage
(TZ=UTC node tests/tools/coverage-report.mjs, node v26.10.0) run locally
on 2026-10-07 at 7ab301e: src files at 100.00% lines / 99.96% regions,
with MemberProfile.js fully covered through tests/tools/fake-dom.mjs.
The unit gate therefore cannot notice the browser case retiring.
- E2E — the case runs today. CI artifact
e2e-coverage, id 11466369399,
workflow Validate repository, job End-to-end coverage, run
37585915961:
src/components/MemberDirectory/MemberProfile.js at 100.00% lines /
92.31% regions. The initials arm's region
(35:24:38:15) carries a non-zero count, so this issue is about keeping
that true, not about reaching it.
This is a regression-risk / test-infrastructure finding, not a
coverage-gap: no source path is under-tested today. The defect is that a
passing suite can stop testing something without saying so.
Recommendation
Read the members through the overlay and make the coverage build assert the
shape instead of skipping on it:
Coordination
The change touches tests/e2e/member-directory.spec.js only. It does not edit
tests/e2e/fixtures/data/members.json, tests/e2e/fixtures/data-variants/members.json
(occupied by #1104), tests/tools/e2e-data-fixtures.cjs or
tests/e2e-data-fixtures.test.mjs (occupied by #1110 and #1113), or any
workflow file.
Priority
- Impact: medium (a green suite that can silently stop covering a shipped UI
arm, with no gate able to report it)
- Effort: low
🐝 Hive Agent: quality | Instance: hosted-available-lke648397-260827-5n31 | SHA: 7ab301e
— hive: agent=quality backend=copilot model=claude-opus-5 copilot=1.0.88
Finding
tests/e2e/member-directory.spec.jsis the only browser coverage of themember profile dialog's logo-less arm
(
src/components/MemberDirectory/MemberProfile.js:35-41, the large initialsshown in place of an
<img>). It selects the member that drives the case byreading the shipped data file directly:
data/members.jsonis regenerated from the CNCF landscape bynpm run generate:members, so which organizations lack a logo is upstreamstate rather than a source edit. At
main=7ab301eexactly two of 101members carry no logo (
DiDi,Subaru Corporation). On the day the landscapegives both of them one, the case stops running — and it stops running as a
skip, which no gate reports:
--check-sourceand--check-source-regionsscore the regions a run reached, and a case that never executes simply
contributes nothing. The suite would stay green while the dialog's only
browser coverage of that arm quietly disappeared.
This is the hazard the overlay mechanism already exists to remove.
tests/e2e/fixtures/data/members.jsonappendscoverage-fixture-orgwith"logo": null(added soMemberCardrendersmembershipLabel('member-and-contributor')), andtests/tools/e2e-data-fixtures.cjsexposesloadSiteData()precisely so aspec reads the document the page was built from.
tests/e2e/data-fixtures.spec.jsandtests/e2e/data-variants.spec.jsbothread their data that way; this spec is the one that does not.
Evidence and provenance
data/members.jsonatmain=7ab301e: 101 members, 2 without a logo. Reproduce withnode -e "const m=require('./data/members.json').members; console.log(m.length, m.filter(x=>!x.logo).map(x=>x.name))".7ab301e:loadSiteData('members.json', {})yields 101 members and 2 without a logo,loadSiteData('members.json', {E2E_COVERAGE: '1'})yields 102 and 3 — thethird being
Coverage Fixture Organization.npm run test:unit:coverage(
TZ=UTC node tests/tools/coverage-report.mjs, node v26.10.0) run locallyon 2026-10-07 at
7ab301e:src filesat 100.00% lines / 99.96% regions,with
MemberProfile.jsfully covered throughtests/tools/fake-dom.mjs.The unit gate therefore cannot notice the browser case retiring.
e2e-coverage, id11466369399,workflow
Validate repository, jobEnd-to-end coverage, run37585915961:
src/components/MemberDirectory/MemberProfile.jsat 100.00% lines /92.31% regions. The initials arm's region
(
35:24:38:15) carries a non-zero count, so this issue is about keepingthat true, not about reaching it.
This is a regression-risk / test-infrastructure finding, not a
coverage-gap: no source path is under-tested today. The defect is that apassing suite can stop testing something without saying so.
Recommendation
Read the members through the overlay and make the coverage build assert the
shape instead of skipping on it:
tests/e2e/member-directory.spec.jsselects its members vialoadSiteData('members.json')fromtests/tools/e2e-data-fixtures.cjsrather than
readFileSync('data/members.json')E2E_COVERAGE=1a missing logo-less member fails the case(a committed overlay that no longer supplies one is a broken fixture),
while the plain
End-to-end testsjob — which does not apply overlays —keeps the existing skip, because there the case genuinely depends on
upstream data
Coordination
The change touches
tests/e2e/member-directory.spec.jsonly. It does not edittests/e2e/fixtures/data/members.json,tests/e2e/fixtures/data-variants/members.json(occupied by #1104),
tests/tools/e2e-data-fixtures.cjsortests/e2e-data-fixtures.test.mjs(occupied by #1110 and #1113), or anyworkflow file.
Priority
arm, with no gate able to report it)
🐝 Hive Agent:
quality| Instance:hosted-available-lke648397-260827-5n31| SHA:7ab301e— hive: agent=quality backend=copilot model=claude-opus-5 copilot=1.0.88