Skip to content

ci(inferno): prune omit entries that suppress nothing, and report new ones - #498

Merged
smunini merged 1 commit into
mainfrom
ci/492-inferno-omit-list-audit
Aug 7, 2026
Merged

ci(inferno): prune omit entries that suppress nothing, and report new ones#498
smunini merged 1 commit into
mainfrom
ci/492-inferno-omit-list-audit

Conversation

@aacruzgon

@aacruzgon aacruzgon commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

Stacked on #496, which is stacked on #495. Review those first; this PR's diff is the workflow file alone.

The ordering is load-bearing, not cosmetic: the 12 data_absent_reason entries removed here fail on Postgres until the bare-id reference fix in #495 lands. Merged ahead of it, the next weekly Inferno run would go red on the Postgres legs. The stack enforces that rather than relying on a note.

Summary

OMITTED_TESTS drops test ids from the US Core failure count. An entry that suppresses nothing is worse than no entry at all: it is a test that would go red on a real regression and be silently swallowed instead. #492 found 20 of the 69 entries in that state.

This prunes those 20 and adds a step that reports new ones every run, so the list shrinks as things get fixed rather than accreting.

Refs #492.

Changes

Removed — verified passing on two backends

entries what evidence
12 data_absent_reason_extension + _code_system, all six suites pass on sqlite (#492's audit) and on postgres (six local runs)
3 practitioner_address_test in v6.1.0 / v7.0.0 / v8.0.0 pass in exactly the three suites it was emitted for

The data_absent_reason entries were the ones blocked on #490 — they failed on Postgres until the bare-id reference fix. Their stated reason ("test data does not include DAR extensions/code systems") no longer holds.

Scoped rather than removed — 5 ids the suite never contained

These came from the unconditional block, which assumed every suite has the full capability-statement set and a simple_observation group:

id was now
us_core_profile_support all six v4.0.0+ (absent from v3.1.1)
us_core_instantiate all six v4.0.0+ (absent from v3.1.1)
simple_observation_validation_test all six v6.1.0+ (group introduced there)

Deleting them would have removed live omissions in the suites where they do fail, which is why #492 called for scoping.

Added — "Report omissions that suppressed nothing"

Reports two shapes per run, as job-summary sections plus ::warning:: annotations:

  • stale — the id ran and did not fail, so the omission changed nothing
  • absent — the id is not in this suite at all, so it never could

Deliberately a warning, not a gate. Two reasons, both in the step's comment:

  1. Failing on a stale omission would make a fixed test turn CI red — the backwards incentive that grew this list.
  2. It cannot gate safely anyway. The list is shared across all five backend legs, and an id that passes on one backend may still be suppressing a real failure on another. Pruning needs agreement across the matrix, which a per-job gate cannot see — the job summary can.

Testing

A workflow change can't be proved by a unit test, so this was validated by extracting the actual run: blocks from the YAML and executing them under bash -e against the six suites' real result JSON (the runs behind the numbers in #492). Not a transcription of the logic — the shipped bash, with ${{ matrix.suite_id }} substituted and $GITHUB_ENV / $GITHUB_STEP_SUMMARY pointed at temp files, exactly as Actions wires them.

  • All six suites: both steps exit 0. OMITTED_TESTS round-trips through $GITHUB_ENV and parses as valid JSON in every suite (3 / 5 / 7 / 9 / 11 / 14 entries for v3.1.1 → v8.0.0).
  • Zero ABSENT entries remain in any suite — the scoping is complete.
  • The detector fires. Feeding the five removed ids back in reports all five as ABSENT, while a genuinely-present id in the same list is correctly not reported. A detector that silently returns nothing looks identical to a clean run, so this was worth pinning.
  • Both edge branches exercised. Missing results.json (an early-run failure, reachable via if: always()) prints a notice and exits 0; a list where every omitted id genuinely failed writes the :white_check_mark: summary and exits 0. Neither fails the job.
  • The rendered job summary was eyeballed for v6.1.0 — the artifact a human actually reads.
  • actionlint delta against main is clean: no new warnings or errors. It adds 4 SC2086 (the >> $GITHUB_STEP_SUMMARY form used by all 50 pre-existing instances in this file) and 4 SC2001 (sed 's/^/- /' prefixing multi-line output, which parameter expansion cannot do). Both are info/style and consistent with the file.

It already found 18 more

Running the new audit against the six suites surfaces 18 further stale candidates among the 49 live omissions this PR does not touch:

suite stale omissions found
us_core_v311 1
us_core_v400 1
us_core_v501 3
us_core_v610 5
us_core_v700 4
us_core_v800 4

Mostly service_request, observation_pregnancyintent/pregnancystatus, smokingstatus, specimen and observation_adi_documentation validation tests. Not pruned here — that is Postgres-only data, and per the reasoning above an id passing on Postgres may still be suppressing a real failure on MongoDB or Elasticsearch. Surfacing them across the matrix is precisely what the new step is for; the next full nightly will say which are safe.

Notes

  • One implementation detail worth flagging for reviewers: the new step passes the results filename to jq rather than echo "$RESULTS" | jq. The results carry \n inside result_message, and an echo that interprets escapes expands them mid-string and makes the JSON unparseable. Bash's builtin echo does not do this, so the existing steps are fine on GitHub runners — but the filename form removes the footgun entirely, and I hit it locally under zsh while testing.
  • The 49 live omissions remain unexamined by this PR. Each was added for a stated reason and deserves the same re-check, now much cheaper thanks to the new step.
  • No change to gate semantics: Check test results still fails only on fail/error, and still excludes omitted ids. ci(inferno): the US Core gate ignores skip — postgres passed 25 of 544 tests and reported success for six weeks #491 covers the skip-blindness separately.

@codecov

codecov Bot commented Aug 5, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@aacruzgon
aacruzgon force-pushed the ci/492-inferno-omit-list-audit branch from c22a848 to a677743 Compare August 6, 2026 17:56
… ones

`OMITTED_TESTS` drops test ids from the US Core failure count. An entry
that suppresses nothing is worse than no entry: it is a test that would
go red on a real regression and be swallowed instead. 20 of the 69
entries were in that state (#492).

Removed — verified passing on both sqlite (the audit in #492) and
postgres (six local suite runs after #490/#494):

- the 12 `data_absent_reason` entries. The stated reason — "test data
  does not include DAR extensions/code systems" — no longer holds; both
  tests pass in all six suites. These were blocked on #490 because they
  failed on postgres until the bare-id reference fix landed.
- the 3 `practitioner_address_test` entries, passing in v6.1.0, v7.0.0
  and v8.0.0, the only suites they were emitted for.

Scoped rather than removed — 5 ids emitted for suites that do not
contain them, so they never could have matched:

- `us_core_profile_support` / `us_core_instantiate` are absent from the
  v3.1.1 suite; now emitted from v4.0.0 on.
- the `simple_observation` group only exists from v6.1.0; now emitted
  from there on.

These came from the unconditional block, which assumed every suite has
the full capability-statement set and a `simple_observation` group.

Adds a "Report omissions that suppressed nothing" step so the list gets
pruned as things get fixed instead of accreting. It reports two shapes
per run — ids that ran without failing, and ids not in the suite at all
— as job-summary sections plus `::warning::` annotations.

Deliberately a warning, not a gate. Failing on a stale omission would
make a *fixed* test turn CI red, which is the incentive that grew this
list. It also cannot gate safely: the list is shared across all five
backend legs, and an id passing on one backend may still be suppressing
a real failure on another, so pruning needs agreement across the matrix
that a per-job gate cannot see.

Tests: the audit jq was run against all six suites' result JSON from
local postgres runs. Zero ABSENT entries remain, confirming the scoping
is complete; feeding the five removed ids back in reports all five as
ABSENT while leaving a genuinely-present id unreported, confirming the
detector fires rather than being silently empty. It surfaces 18 further
stale candidates among the 49 live omissions this PR does not touch —
postgres-only data, so they need cross-backend confirmation before
pruning, which is exactly what the new step is for. Workflow YAML parses.

Refs #492
@aacruzgon
aacruzgon force-pushed the ci/492-inferno-omit-list-audit branch from a677743 to 4b75792 Compare August 7, 2026 14:48
Base automatically changed from fix/494-postgres-date-negative-offset to main August 7, 2026 19:53
@smunini
smunini merged commit 3443d37 into main Aug 7, 2026
35 checks passed
@smunini
smunini deleted the ci/492-inferno-omit-list-audit branch August 7, 2026 19:54
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.

2 participants