Skip to content

feat(conformance): judge failed tests, call sites and per-test rows - #466

Merged
vishnuv688 merged 2 commits into
mainfrom
feat/454-user-visible-rules
Oct 27, 2026
Merged

vishnuv688 merged 2 commits into
mainfrom
feat/454-user-visible-rules

Conversation

@vishnuv688

Copy link
Copy Markdown
Member

What & why

Closes #454.

The conformance suite checked how the event stream is built, but not three things a user sees in the dashboard:

  • a failed test with nothing red in its actions;
  • a call site that points somewhere other than the spec;
  • a test with no rows at all.

All three broke in the Selenium adapter (fixed in #453) without any check noticing. This PR adds a rule for each, judged per adapter on the scenario tests and attribution from #465:

Rule Checks
every-test-has-rows Every test the dashboard reports owns at least one row. A test never reported is left to tests-end-as-designed.
failed-test-has-error-row Every test reported failed, or written to fail, has a failed action by shared's commandFailure. An unmapped poll's error does not count, since a passing wait's polls error too.
call-site-names-the-scenario Every row with a callSource names a line inside the spec the runner executed. DevTools' own packages/, any other file, unknown:0 and an out-of-range line all fail.

Each adapter's launch now declares its scenarioFile, and the harness reads it before cleanup, so the Python copy is still readable.

Proof that the rules guard #453. On this branch I reverted every source file #453 changed (core, shared, trace, selenium-devtools), rebuilt, and ran the conformance suite. Selenium failed in all three BiDi modes, and the cross-adapter agreement check failed too. WebdriverIO, Nightwatch and Python stayed green. The three new rules caught all three of #453's bugs:

  • failed-test-has-error-row: the timed-out wait left its failed test with no failed action (once per mode).
  • call-site-names-the-scenario: a poll row named unknown:0 (once per mode).
  • tests-end-as-designed and one-row-per-browser-action: the first test lost its rows.

The run also flagged every-document-anchored, row-replays-its-page, every-browser-request-listed and adapters-agree-on-actions / -snapshots / -requests, all from the lost first test. With #453 restored, the suite passed 15/15 in two runs.

Type of change

  • Bugfix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Polish (an improvement to an existing feature)
  • Breaking change (existing behavior changes for users)
  • Documentation
  • Internal (build, CI, dependencies, tooling)

Packages touched

  • shared (types and contracts)
  • core (framework-agnostic capture/reporting)
  • elements (published element/snapshot API — @wdio/elements)
  • service (WebdriverIO adapter)
  • nightwatch-devtools (Nightwatch adapter)
  • selenium-devtools (Selenium adapter)
  • selenium-devtools-py (Selenium Python adapter)
  • backend (server)
  • app (UI)
  • script (page-injected runtime)
  • trace (Trace mode)

Capability matrix

  • packages/conformance/src/features.ts updated, and tables regenerated with pnpm docs:capabilities, if this adds or changes user-facing behaviour

The Source tab row is now "✅ tested" for all four adapters, since call-site-names-the-scenario holds with no gap. failed-test-has-error-row also backs the Errors row for WebdriverIO and Selenium. every-test-has-rows is listed in INTERNAL_RULES, because it is a precondition of every per-test view rather than a feature.

Notes for reviewers

🤖 Generated with Claude Code

The suite checked how the stream is built but not three things a user
sees: a failed test with nothing red, a call site pointing away from the
spec, and a test with no rows. Each broke in the Selenium adapter
unnoticed. Three rules now judge them per adapter, on the scenario tests
and their attribution: every reported test has rows, every failed test
(or one designed to fail) has a failed action by shared's
commandFailure, and every callSource names a line of the spec the runner
executed, which each adapter's launch now declares. An unmapped poll's
error does not explain a failure, since a passing wait's polls error too.

The call-site rule reads a call source with the dashboard's own parser,
now in shared, so it cannot pass a call site the Source tab would not
resolve.

Python's timed-out WebDriverWait (#461) and Nightwatch's same-millisecond
replace overwriting the failed assertion (#458) are scoped gaps.

Closes #454
@greptile-apps

greptile-apps Bot commented Oct 27, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerView in GreptileConfidence Score: 5/5

[Medium impact] The PR appears safe to merge; no actionable new defects were found.

Summary

Adds three conformance checks for missing test rows, failed tests without a failed action, and call sites outside the scenario file.

  • Reported tests need rows, and failed tests need a failed action.
  • Command source links must point into the scenario that ran.

Diagram

%%{init: {'theme': 'neutral'}}%%
flowchart LR
  Launch[Adapter launch] --> Spec[Read scenario file]
  Launch --> Run[Run scenario]
  Run --> Frames[Recorded rows and tests]
  Frames --> Checks[Check test rows and failures]
  Frames --> Sites[Check call sites]
  Spec --> Sites
  Checks --> Judge[Apply scoped known gaps]
  Sites --> Judge
  Judge --> Report[Run report]
Loading

Reviews (2) · Last reviewed commit: "Merge remote-tracking branch 'origin/mai..." · Reviewed by Greptile

@vishnuv688 vishnuv688 self-assigned this Oct 27, 2026
@vishnuv688
vishnuv688 changed the base branch from feat/455-realistic-scenarios to main October 27, 2026 19:48
…-rules

# Conflicts:
#	packages/conformance/src/allowlist.ts
@vishnuv688
vishnuv688 merged commit 8e420b9 into main Oct 27, 2026
13 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Conformance: rules for what a user sees (failed tests, call sites, every test has rows)

1 participant