Skip to content

feat(validation): nightly heal sweep with source-bound tools - #132

Merged
majinghe merged 2 commits into
mainfrom
feat/nightly-heal-sweep
Nov 3, 2026
Merged

majinghe merged 2 commits into
mainfrom
feat/nightly-heal-sweep

Conversation

@majinghe

@majinghe majinghe commented Nov 3, 2026

Copy link
Copy Markdown
Collaborator

Why

The catalog's 85 heal cases never ran unattended: they need validation-tools artifacts (bitrot shard verifiers, heal metadata inspector, native regressions) compiled from the exact candidate source SHA, which only the interactive validation job wired up. This brings heal into the nightly fold like every other suite — closing the last coverage gap from #113's catalog.

What it does (nightly 07:00 UTC + manual dispatch)

  1. Resolve the newest successful nightly candidate (same resolver as the sweep)
  2. Dispatch rustfs-validation-tools.yml on rustfs/rustfs with candidate_sha + auto_testing_sha + all three build flags, poll to completion (~20-40 min)
  3. Download the tools / native / shared artifacts and verify the inspector binding to the candidate (inspector.py --candidate — the same identity gate the interactive job uses)
  4. Run 71 heal cases — every procedure-ready case minus the 13 operator-assisted environment scenarios — through the same run_validation_case.sh entry, with per-case 900 s timeout and fleet hygiene between cases
  5. Report grouped by module; the 13 environment scenarios are listed as BLOCKED (they need forced-restart hosts / dedicated multi-set topologies by design — not silently skipped); FAIL/TIMEOUT keep the run red

Notes

  • skip_tools dispatch input reuses the newest existing tools run for debugging
  • Tool-run identity is verified twice: workflow path + success conclusion at build time, and the inspector↔candidate SHA binding at use time
  • First run will establish real per-case durations; loop budget is 480 min (71 cases), job cap 600 min
  • Diagnostic entrances (C11/F07/I05/J02) self-report BLOCKED via their own result writers when applicable

Verification plan

Dispatch from this branch with limit: 5 for a smoke pass, then a full run.

Run every runnable heal.* catalog case (71: procedure-ready minus the
13 operator-assisted environment scenarios) nightly against the newest
successful nightly candidate, like the other suites.

Each run dispatches a validation-tools build on rustfs/rustfs bound to
the exact candidate source SHA, waits, downloads the tools/native/shared
artifacts, verifies the inspector binding, then executes the cases via
the same run_validation_case.sh entry as the interactive job. The 13
environment scenarios are reported as BLOCKED (they need operator
resources by design); a per-case 900s timeout bounds the run.
The native and manager-native tool builds are pinned to reviewed
reference candidates (REVIEWED_CANDIDATES allowlists in native_regressions
and race contracts) and hard-fail on any other source SHA — verified on
run 41650347338 where both jobs failed for the current nightly. Dispatch
the tools build with shared-only; the inspector and shared encoder build
for any candidate.

Exclude the candidate-pinned executors (6 races, A09 nolock, I05/F07
and the C11/J02 diagnostics) alongside the 13 environment scenarios:
60 cases run unattended. Record each case's authoritative verdict from
its result JSON — self-reported BLOCKED stays informational; only
FAIL/INFRA_ERROR/TIMEOUT keep the sweep red.
@majinghe

majinghe commented Nov 3, 2026

Copy link
Copy Markdown
Collaborator Author

Design correction after live verification

Dispatched a real validation-tools build for the current nightly candidate (run 41650347338):

  • heal-metadata-inspector (tools + shared artifacts): success — builds for any candidate
  • native-heal-regressions / manager-native-regressions: fail — both are pinned to reviewed reference candidates via hard-coded REVIEWED_CANDIDATES allowlists ("native regression contract requires the reviewed immutable candidate checkout")

Follow-up inspection of the executors showed the same allowlists gate the case runners: race.py source_contract() and the I05/F07 preflights raise on any non-reviewed source_sha — these cases cannot run against arbitrary nightlies by design.

Branch updated (d180d62):

  1. Tools dispatch now build_shared_heal only (inspector + shared encoder proven to build per-candidate)
  2. Downloads tools + shared artifacts only
  3. Selection excludes, alongside the 13 environment scenarios, the 11 candidate-pinned executors (6 races, A09 nolock, I05/F07, C11/J02 diagnostics) — 60 cases run unattended
  4. Case verdicts are now read from each case's result.json; self-reported BLOCKED (diagnostic gates) is informational, only FAIL / INFRA_ERROR / TIMEOUT keep the sweep red
  5. Report lists both BLOCKED categories explicitly (environment-gated / candidate-pinned)

@majinghe
majinghe merged commit fbaf7f8 into main Nov 3, 2026
1 check 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.

1 participant