[quality] no test runs a validator over a merged e2e data overlay, so a fixture's invalidity cannot be told from drift
Maintainers usually reply within 1 day
A pull request for this has already been merged.
- #1269 by @hivecommons-hive — merged
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 20/100
- Issue type
- Feature
- Clarity
- Mostly clear
- Activity status
- Active
- Tech stack
- javascript
- Domain
- testing
Research direction
Start from applyOverlay() in tests/tools/e2e-data-fixtures.cjs and runScriptInSandbox() in tests/helpers-script-sandbox.mjs, then read tests/e2e-data-fixture-integrity.test.mjs to see the existing overlay checks. Copy the inventory-with-a-reason pattern from GATES_NOT_RUN_BY_CI in tests/workflow-scripts.test.mjs. Done means a new tests/e2e-data-fixture-validity.test.mjs pins each overlay's validator-error delta, but PR #1269 is already open against this issue, so coordinate with it first.
Written by the indexing model from the issue text.
Description
Finding
tests/e2e-data-fixture-integrity.test.mjs establishes four properties of every
committed data overlay under tests/e2e/fixtures/data/ and
tests/e2e/fixtures/data-<name>/: it names a real data file, it still applies to
it, it still changes it, and its description names the source file whose arm it
covers.
None of those asks what the merged document is. An overlay can apply cleanly
and still produce a document that scripts/validate-<name>.mjs — the gate every
pull request runs over the real file — would reject. Nothing in the repository
runs a validator over a merged fixture at all.
Several overlays deliberately produce a rejected document, and that is correct:
the degraded arms the variant build exists for are only reachable from a document
the collector is not supposed to produce (clearing metrics.generatedAt, emptying
community-people.fetchedAt). The problem is not that they are invalid. The
problem is that a deliberate rejection and one acquired by accident look
identical from CI:
- A validator that gains a rule — a new required field, a tightened host list —
starts rejecting every overlay that appends a record. The fixture still applies,
still patches, still builds, and the arm stays reached, so no test says anything;
but the appended record now describes a shape the real file may no longer hold,
and the browser coverage it buys is coverage of a document the site cannot ship. - An overlay written against the validator's rules can drift out of them without
being edited. This has already happened.
tests/e2e/fixtures/data/members.jsonstates in its owndescriptionthat its
appended record "is valid perMEMBERSHIP_STATUSESin
scripts/validate-members.mjs", and the merged document is in fact rejected:
coverage-fixture-org: member-and-contributor status must carry both source roles,
because the record carries an emptymembershipSources. - An overlay whose deliberate invalidity is silently repaired stops producing the
degraded document its arm needs — the same silent retirement the integrity
test's "still changes the document" case exists to catch one level up.
Evidence and provenance
- Repository revision
365e11f(main), clean checkout,npm ci, node v26.10.0. - Each overlay was merged with its real
data/file throughapplyOverlay()from
tests/tools/e2e-data-fixtures.cjsand the merged tree handed to its validator
viarunScriptInSandbox()fromtests/helpers-script-sandbox.mjs. Errors are
reported as the delta against the same validator run over the unmodified
tree, so findings that are a property of the sandbox (which mirrorsscripts/
anddata/but notstatic/, so asset-existence rules report against both runs)
cancel out.
| overlay | validator errors the merged document adds |
|---|---|
data/case-studies.json |
900002: missing or duplicate url |
data/community-groups.json |
none |
data/community-people.json |
10 (roster, image host, profile link, x4 records) |
data/members.json |
coverage-fixture-org: member-and-contributor status must carry both source roles |
data/metrics.json |
none |
data-no-revision/metrics.json |
metrics.json: source revisions are required |
data-variant/awards.json |
verifiedAt must be a parseable date ... |
data-variant/case-studies.json |
caseStudies must be a non-empty array, generatedAt must be a parseable date |
data-variant/community-groups.json |
checkedAt must be ISO 8601 |
data-variant/community-people.json |
fetchedAt must be strict ISO 8601 |
data-variant/members.json |
none |
data-variant/metrics.json |
generatedAt must be ISO 8601 |
data-variant/radar-reports.json |
generatedAt must be a parseable date, radarReports must be a non-empty array |
- Unit.
npm run test:unit:coveragerun locally at this revision:
src files | 100.00 | 100.00 | 9015/9015 lines | 2713/2713 regions. This is
harness scope, so it is filed as test-infrastructure, notcoverage-gap. - End-to-end. Not claimed and not needed: the fixtures are harness input, which
the Playwright run never loads as source (collectE2ECoverageattributes only
paths undersrc/). Playwright's chromium could not be launched in this
environment (it needs ~20 OS libraries andinstall-depsrequires root), so no
local e2e percentage is asserted anywhere above.
Recommendation
One deliverable, one file, one PR: a guard that records each overlay's effect on
its validator exactly, in the same inventory-with-a-reason idiom the repository
already uses for GATES_NOT_RUN_BY_CI (tests/workflow-scripts.test.mjs), SKIPS
(tests/e2e-data-dependent-skips.test.mjs) and FLOORS
(tests/e2e-coverage-gate.test.mjs).
- Add
tests/e2e-data-fixture-validity.test.mjspinning, per overlay, the set
of validator errors the merged document produces that the unmodified file
does not — so an overlay that starts, stops, or changes how it is rejected
fails by name, with the reason on the record.
Deliberately not split per overlay: it is one table in one file, and separate
PRs over the same lines would force each other to rebase. Deliberately not
placed in tests/e2e-data-fixture-integrity.test.mjs: that file is held by open
PR #1260.
Nothing here is under .github/workflows/, so there is no permission obstacle.
Priority
- Impact: medium (one overlay's stated contract is already wrong against the
validator, and nothing reports it) - Effort: low
Filed by quality agent (hold-gated mode)
🐝 Hive Agent: quality | Instance: hosted-available-lke648397-260827-5n31 | SHA: 5ccc4e5
— hive: agent=quality backend=copilot model=claude-opus-5 copilot=1.0.88
- Dominant language
- JavaScript
- Stars
- 0
- Forks
- 2
- Avg merge
- 10h 13m
- Merged PRs (30d)
- 597
Getting set up
Starts the project's dev container in your browser, under your own GitHub account.
- No Dockerfile or Docker Compose file
- Has a pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from cncf/endusers
-
agent/quality hive/claimed-by-quality hive/hosted-available-lke648397-260827-5n31 quality stage/010-actionable stage/030-pr-in-progress testing
Difficulty 2/5 Half a day Newbie friendliness 82/100
cncf/endusers#1598 · 6 comments ·
Maintainers usually reply within 1 day
-
[architect] Four scripts.mjs compute repo root via URL.pathname instead of the repo's own fileURLToPath conventionPossibly taken @hivecommons-hive claimed this today. Openagent/architect architecture hive/hosted-available-lke648397-260827-5n31 stage/040-covered-by-pr tech-debt
Difficulty 2/5 Half a day Newbie friendliness 35/100
Maintainers usually reply within 1 day
-
[scanner] EndUserTalkSchedule hardcodes 'MST' in every slot badge instead of rendering the data file's timezone fieldPossibly taken @hivecommons-hive claimed this today. Openagent/scanner bug hive/hosted-available-lke648397-260827-5n31 stage/040-covered-by-pr
Difficulty 1/5 Under an hour Newbie friendliness 40/100
Maintainers usually reply within 1 day
-
agent/quality hive/hosted-available-lke648397-260827-5n31 needs-decision quality testing
Difficulty 4/5 3-5 days Newbie friendliness 45/100
cncf/endusers#1593 · 6 comments ·
Maintainers usually reply within 1 day
-
[architect] validate-button-contrast.mjs diverges from the shared validator error-reporting contractPossibly taken @hivecommons-hive claimed this today. Openagent/architect architecture hive/hosted-available-lke648397-260827-5n31 stage/040-covered-by-pr tech-debt
Difficulty 2/5 1-3 hours Newbie friendliness 35/100
Maintainers usually reply within 1 day
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
HarperFast/harper#3275 ·
Maintainers usually reply within 1 day
-
bug release:v5.34
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
Jason-Vaughan/TangleClaw#2504 ·
Maintainers usually reply within 1 day
-
bug status: needs triage
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
mastra-ai/mastra#27538 · 1 comment ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 73/100
-
Difficulty 1/5 Under an hour Newbie friendliness 94/100
Foundryborne/daggerheart#2497 ·
Maintainers usually reply within 1 day