feat(test-harness): one machine-written integration PR summary#531
feat(test-harness): one machine-written integration PR summary#531nebasuke wants to merge 5 commits into
Conversation
🧪 Integration tests — full matrix · PR vs
|
| Suite | New failures | Size Δ | Gas Δ | Report |
|---|---|---|---|---|
| solx-tester | ✅ 0 | ✅ 0 of 49,508 | solx-tester-report.xlsx ↓ | |
| Foundry · 25 proj | ✅ 0 (685 pre-existing) | ✅ 0 of 4,972 | ⚪ jitter 80 of 5,214, median <0.1% (not gated) | foundry-report.xlsx ↓ |
| Hardhat · 3 proj | ✅ 0 (40 pre-existing) | ⚪ not collected | ⚪ not collected | hardhat-report.xlsx ↓ |
solx-tester — largest gas changes:
solx-solidity/test/libsolidity/semanticTests/structs/delete_struct.sol[Yul MzB3 0.8.34] 85,899 → 85,902 (+0.0%)
Compile time — wall-clock tripwire, positive = PR slower (authoritative Δ in ci:compile-benchmark)
| Suite | legacy (agg / median) | viaIR (agg / median) |
|---|---|---|
| Foundry · 25 proj | +0.1% / +0.2% | -0.1% / +0.2% |
| Hardhat · 3 proj | +0.2% / +0.3% | +0.7% / +0.7% |
Within noise — no suite ≥ 5%, no project ≥ 15%.
Bytecode size — PR vs baselines (positive = PR larger; contracts built by both only)
| Suite | Pipeline | vs solc | vs released solx |
|---|---|---|---|
| Foundry · 25 proj | legacy | -13.0% | -0.0% |
| Foundry · 25 proj | viaIR | -1.6% | +0.0% |
Suites run the release solx binary. Foundry/Hardhat gas jitters run-to-run (fuzz/invariant tests, CREATE-context deploys), so it never gates.
The integration workflow posted three link-only PR comments; all analysis
of the XLSX reports happened offline. Render the verdict in-tree instead.
New `solx-benchmark-summary` binary + `render_summary` in the converter
compute, from the merged `Benchmark` data model (no XLSX round-trip):
- correctness gate — bytecode size (deterministic, all suites) + solx-tester
gas (deterministic REVM); foundry/hardhat gas is fuzz-noisy and excluded,
with top movers listed when output actually changes;
- new build/test failures vs main;
- a non-gating compile-time tripwire: per-suite legacy/viaIR aggregates,
highlighted at >=5%, with project outliers listed at >=15% (cap 5, +N more);
- full-matrix bytecode size vs solc / released solx.
solx-dev now writes `{foundry,hardhat}-benchmark.json` next to each XLSX and
the workflow emits `solx-tester-benchmark.json`, so the summary reads the
native model directly. The three link comments collapse into one
`integration-test-summary` comment (reusing mshick/add-pr-comment via
message-path) that also lands in the step summary.
e3f3244 to
8ffc4d1
Compare
Redesign the integration summary so a reviewer can call pass/fail from the comment alone, matching the offline review procedure: - Failures now compare PR vs main per paired run: only regressions alarm, pre-existing baselines are stated, and the regressed projects are listed inline. Previously the absolute PR-side counts tripped the verdict, turning every Foundry run red on its long-standing failures. - The single conflated headline becomes three independent verdicts: output invariance, new failures, harness health. A size change now informs (⚠️ , movers inline, never folded) rather than alarms — only new failures and errored suites are ❌. - Internal vocabulary no longer leaks: report links are named (foundry.xlsx), baselines read "vs solc / vs released solx" instead of `00.solc`, mode keys are humanized (E → EVMLA, Y → Yul), and every percentage states its direction (positive = PR larger / PR slower). - Non-gated gas shows its jitter magnitude; absent metrics read "not collected"; compile-time gains a per-project median; the footer notes the suites run the release binary.
8ffc4d1 to
27880aa
Compare
…uietly Review fixes to the summary renderer and binary: - A present-but-corrupt suite JSON no longer aborts the whole summary: the suite renders as errored and the healthy suites still post. - Benchmark data that matches no recognized toolchain naming is a loud "Harness error" verdict + row, and zero collected comparisons render as "⚪ No output data" — never a green checkmark over empty data. - PR runs without a main counterpart are surfaced as unbaselined (verdict line + cell marker) instead of counting every pre-existing failure as a regression against an imaginary zero baseline. - Baseline comparisons (vs solc / vs released solx) sum only contracts built by both toolchains, so a baseline that failed some builds is excluded from the percentage rather than skewing it. - Report links and "+N more" pointers use the real artifact file names (foundry-report.xlsx), passed in by the binary instead of fabricated from the display label. - median() averages the two middle elements for even-length input — previously n=2 reported the maximum as the median. - Compile-time table columns come from the pipelines present in the data instead of a hardcoded legacy/viaIR list, so a new codegen shows up instead of silently vanishing from the tripwire.
- Each suite's summary flag is passed only when its step actually ran, so suites skipped by an earlier hard failure are omitted instead of publicly reported as "Suite errored". - The solx-tester converter runs off the candidate benchmark alone when the main-side baseline is missing: the summary then shows the PR data as unbaselined instead of a bogus "suite errored" (the XLSX comparison still requires both sides). - Dropped continue-on-error from the summary generation step: losing the report must fail the job visibly, not skip the comment silently.
The verbatim-duplicated emit blocks in the foundry and hardhat runners collapse into one helper next to toolchain_name; it pretty-prints and path-annotates write errors, matching the converter's own JSON output for the solx-tester suite.
|
Currently there is a small gas change. I've deliberately NOT rebased, to show how it looks in the case of a change. Claude SummaryThe gas diff is a stale-base artifact, not a change from this PRThe integration summary flags
I also checked the |
PR adding the status of an integration test run as a comment. My goal is that it should be clear if an integration test was successful (with the goals in mind). In particular, the comment states the following:
The original reports are preserved, and are linked in the PR comment.
Claude Summary
Why
The integration workflow posted three link-only PR comments; all analysis of the XLSX reports happened offline (the local
solx-perf-reviewskill'sparse_reports.py). Nothing on the PR told you whether output changed, what failed, or how compile-time moved.What
A single machine-written comment (
integration-test-summary), rendered in-tree in Rust from the converter's nativeBenchmarkmodel — no XLSX round-trip, no Python. Designed so a reviewer can call pass/fail from the comment alone, using the same decision procedure as the offline review.render_summary(solx-benchmark-converter/src/output/markdown.rs) +solx-benchmark-summarybinary.solx-devnow writes{foundry,hardhat}-benchmark.jsonnext to each XLSX (one shared writer); the workflow emitssolx-tester-benchmark.json. The summary reads those.mshick/add-pr-commentviamessage-path), also mirrored to$GITHUB_STEP_SUMMARY.The comment
Three independent verdict lines, each with its numbers:
mainper paired run; pre-existing baselines are stated, only regressions alarm (❌), and the regressed projects are listed inline. A PR run with nomaincounterpart is surfaced as unbaselined (⚪/Every percentage states its direction (positive = PR larger / PR slower); no internal toolchain names leak (
00.solc→ "vs solc", mode keys humanized, report links named per suite).Example (output-preserving, full matrix):
Plus: a compile-time tripwire table (aggregate / median per pipeline, columns from the pipelines present in the data,⚠️ at ≥5%, project outliers at ≥15%, "within noise" line when quiet — authoritative deltas stay with
ci:compile-benchmark), and an always-expanded full-matrix table "Bytecode size — PR vs baselines" with vs solc / vs released solx columns, summed over contracts built by both toolchains only so a baseline that failed some builds is excluded rather than skewing the percentage.Failure behaviour
*-benchmark.json, or a corrupt one) gets an explicit "❌ Suite errored" verdict line and table row; the healthy suites still post.continue-on-erroron the generation step).Verification
actionlint+shellcheckclean (also fixed a pre-existing useless-cat).Cargo.lockchange (deps already present;--frozensafe).Real-data proof is this PR's own CI run — apply
ci:integration(+ci:integration-benchmark-fullfor the full matrix). Supersedes the offlineparse_reports.py.