Repository navigation
specdelta: a file can get worse without its pass count moving - #870
Merged
Merged
Conversation
The tool compared **passing** counts. A file that goes from *no examples* to *many failing examples* has a pass delta of zero and never appeared in the report — not even without `-quiet`. That is not hypothetical: it cost a published figure. Measuring the 4.0 version move, these were invisible: ```text core/binding/implicit_parameter_get_spec.rb 0 → 0 +0 fail+error 0 → 14 core/binding/implicit_parameter_defined_spec.rb 0 → 0 +0 fail+error 0 → 13 core/binding/implicit_parameters_spec.rb 0 → 0 +0 fail+error 0 → 10 core/marshal/dump_spec.rb 191 → 191 +0 fail+error 17 → 20 language/predefined_spec.rb 141 → 141 +0 fail+error 20 → 24 ``` The three `core/binding/` files are `pass=0 fail=0 error=0` at 3.4.1 — every example behind a `ruby_version_is "4.0"` guard — and 37 failures at 4.0.9, where the guard opens and three new Binding methods turn out not to exist. "Ten examples of work" was short by about sixty-five, and #799 is corrected. Six more files were reported as **gains** while also gaining failures. The worst reads `+3` in the old output: ```text core/thread/raise_spec.rb 48 → 51 +3 ⛔ fail+error 10 → 26 ``` Nineteen examples arrive at 4.0; three pass and sixteen fail. A pass-only delta cannot say that, and it was quoted as though it could. ## The change A row prints whenever **either** the passes moved or the failures did, carrying `⛔ fail+error A → B`, and the summary counts the pass-neutral ones separately: `N gained failures without losing passes`. They are named apart because such a file is not a regression in the passing total and would otherwise read as nothing at all. The test asserts that `-quiet` does **not** suppress them, since a delta of zero is exactly how they hid, and keeps the control beside it: a file quiet on both engines must still stay out of a `-quiet` report, or every unchanged file would print. ⛔ The lesson behind it was already written down and not applied: ask what the target version **adds** before measuring what moves. A delta cannot see an API absent on both sides of the comparison when the specs for it are guarded away on one of them. Refs #799 Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
tannevaled
added a commit
that referenced
this pull request
Nov 3, 2026
# Conflicts: # scripts/conformance/rubyspec/cmd/specdelta/main.go # scripts/conformance/rubyspec/cmd/specdelta/main_test.go
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The tool compared passing counts. A file that goes from no examples to
many failing examples has a pass delta of zero and never appeared in the
report — not even without
-quiet.That is not hypothetical: it cost a published figure. Measuring the 4.0 version
move, these were invisible:
The three
core/binding/files arepass=0 fail=0 error=0at 3.4.1 — everyexample behind a
ruby_version_is "4.0"guard — and 37 failures at 4.0.9, wherethe guard opens and three new Binding methods turn out not to exist. "Ten
examples of work" was short by about sixty-five, and #799 is corrected.
Six more files were reported as gains while also gaining failures. The worst
reads
+3in the old output:Nineteen examples arrive at 4.0; three pass and sixteen fail. A pass-only delta
cannot say that, and it was quoted as though it could.
The change
A row prints whenever either the passes moved or the failures did, carrying
⛔ fail+error A → B, and the summary counts the pass-neutral ones separately:N gained failures without losing passes. They are named apart because such afile is not a regression in the passing total and would otherwise read as
nothing at all.
The test asserts that
-quietdoes not suppress them, since a delta of zerois exactly how they hid, and keeps the control beside it: a file quiet on both
engines must still stay out of a
-quietreport, or every unchanged file wouldprint.
⛔ The lesson behind it was already written down and not applied: ask what the
target version adds before measuring what moves. A delta cannot see an API
absent on both sides of the comparison when the specs for it are guarded away on
one of them.
Refs #799
🤖 Generated with Claude Code