Skip to content

docs: refresh ruby/spec conformance state; bump ratchet floor to 15400 - #451

Merged
tannevaled merged 1 commit into
mainfrom
feat/conformance-floor-docs
Aug 25, 2026
Merged

tannevaled merged 1 commit into
mainfrom
feat/conformance-floor-docs

Conversation

@tannevaled

Copy link
Copy Markdown
Contributor

The ruby/spec language + core ratchet floor was 14850, measured when the
passing total was ~15183; the suites now pass 15459–15461 examples (three
consecutive local runs), so the floor was stale by ~600. This bumps it to
15400 — comfortably below the measured total (margin for the known
random/bytes/require flakes and cross-runner variance) — to lock in the
accumulated conformance wins as a hard floor.

Docs

  • README gains a ruby/spec ratchet subsection: the shrink-only language +
    core lane, and how to run/update it.
  • docs/plan-rbgo.md Phase 8 records the recent core-method batches
    (dump/undump/hex/append_as_bytes, the pack/unpack u and w
    directives, numerator/denominator) and re-frames still ahead around the
    real remaining mass — deep subsystems (IO/File/Dir/ARGF/Time/Process/ENV/
    Marshal), cross-repo engines, and front-end source positions.

No code change; the ratchet lane validates the new floor (local run: 15461 ≥
15400, OK).

🤖 Generated with Claude Code

The ruby/spec language + core ratchet floor was 14850, measured when the passing
total was ~15183; the suites now pass 15459-15461 examples (three consecutive
local runs), so the floor was stale by ~600. Bump it to 15400 — comfortably
below the measured total (leaving margin for the known random/bytes and require
flakes and for cross-runner variance) — to lock in the accumulated conformance
wins as a hard floor.

Docs:
  - README gains a "ruby/spec ratchet" subsection documenting the shrink-only
    language + core lane and how to run/update it.
  - docs/plan-rbgo.md Phase 8 records the recent core-method batches (dump/undump
    /hex/append_as_bytes, the pack/unpack u and w directives, numerator/
    denominator) and re-frames "still ahead" around the real remaining mass: the
    deep subsystems (IO/File/Dir/ARGF/Time/Process/ENV/Marshal), the cross-repo
    engines, and front-end source positions.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@tannevaled
tannevaled merged commit 63e3782 into main Aug 25, 2026
7 checks passed
@tannevaled
tannevaled deleted the feat/conformance-floor-docs branch August 25, 2026 12:23
tannevaled added a commit that referenced this pull request Sep 23, 2026
The ruby/spec figure said 15,400+, which was the FLOOR bumped on 2026-08-25
(#451). Measured on main (68cb53a) against the pinned corpus today: 21,901
passing, four runs 21845/21903/21901/21902, floor 21,740.

Also corrected against the code and .github/workflows/ci.yml:

* the 100% coverage claim ("across all six 64-bit targets and three OSes"):
  the gate runs on ubuntu + macOS only, per-PR arch lanes are amd64/arm64
  without coverage, the exotic four are nightly QEMU + scheduled hardware
* the bound-module count, 181 -> 178 modules across 176 orgs, with the seven
  bound outside the go-ruby-* convention named
* Set (in-tree over object.Hash, not go-composites/set), BigDecimal
  (go-ruby-bigdecimal, not go-composites/bigfloat) and Date (go-ruby-date,
  not go-composites/date)
* the phase badge: plan-rbgo.md marks Phase 6 "substantially landed", not done

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
tannevaled added a commit that referenced this pull request Sep 23, 2026
The ruby/spec figure said 15,400+, which was the FLOOR bumped on 2026-08-25
(#451). Measured on main (68cb53a) against the pinned corpus today: 21,901
passing, four runs 21845/21903/21901/21902, floor 21,740.

Also corrected against the code and .github/workflows/ci.yml:

* the 100% coverage claim ("across all six 64-bit targets and three OSes"):
  the gate runs on ubuntu + macOS only, per-PR arch lanes are amd64/arm64
  without coverage, the exotic four are nightly QEMU + scheduled hardware
* the bound-module count, 181 -> 178 modules across 176 orgs, with the seven
  bound outside the go-ruby-* convention named
* Set (in-tree over object.Hash, not go-composites/set), BigDecimal
  (go-ruby-bigdecimal, not go-composites/bigfloat) and Date (go-ruby-date,
  not go-composites/date)
* the phase badge: plan-rbgo.md marks Phase 6 "substantially landed", not done

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
tannevaled added a commit that referenced this pull request Sep 23, 2026
…), and the claims that had drifted (#637)

* README: measured ruby/spec conformance, and the claims that had drifted

The ruby/spec figure said 15,400+, which was the FLOOR bumped on 2026-08-25
(#451). Measured on main (68cb53a) against the pinned corpus today: 21,901
passing, four runs 21845/21903/21901/21902, floor 21,740.

Also corrected against the code and .github/workflows/ci.yml:

* the 100% coverage claim ("across all six 64-bit targets and three OSes"):
  the gate runs on ubuntu + macOS only, per-PR arch lanes are amd64/arm64
  without coverage, the exotic four are nightly QEMU + scheduled hardware
* the bound-module count, 181 -> 178 modules across 176 orgs, with the seven
  bound outside the go-ruby-* convention named
* Set (in-tree over object.Hash, not go-composites/set), BigDecimal
  (go-ruby-bigdecimal, not go-composites/bigfloat) and Date (go-ruby-date,
  not go-composites/date)
* the phase badge: plan-rbgo.md marks Phase 6 "substantially landed", not done

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* README: the subsystems that landed since the feature list was written, and a plain limitations section

Verified item by item against main (68cb53a) with a probe run through the
built binary, MRI 4.0.5 on the same host as the oracle:

* Process (spawn/exec, the wait family, process groups, priorities, rlimits) —
  and that Process.fork does NOT exist
* Fiber#raise / #kill / storage / blocking?
* IO.popen / fcntl / select / read_nonblock
* File.realpath / realdirpath, and FileTest — 11 of MRI's 26 predicates, with
  the 15 that are missing named
* autoload, defined?(super), module_function, the predefined globals with MRI's
  per-name setters, trace_var
* Thread#backtrace: current thread only; another thread raises
  NotImplementedError

New "Not implemented" section. __LINE__ is always 0 — rbgo records no line map —
which costs const_source_location, warn(uplevel:) and every backtrace line
number; the section shows the rbgo/MRI output side by side. The other entries
each carry their open issue (#610 #615 #621 #630 #631 #632 #633 #635 #636),
with the two that are harness rather than VM marked as such.

Errno was NOT claimed at 158 constants: main has 28. The full table is in
#629, still open.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* README: use one thousands separator throughout the new figures

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* README: re-measure against d498ddc — #629 merged after the first baseline

#629 (FileTest, the Errno subsystem, realpath_rec, the stat surface) merged at
17:10Z, ten minutes after the 68cb53a baseline this branch was written against.
Two statements were left wrong in the conservative direction. Rebased onto
d498ddc, rebuilt, re-measured everything.

ruby/spec, four consecutive runs on d498ddc: 21982, all four identical (the
68cb53a runs spread 21845-21903 on #615; it did not fire this time, but the
issue is open, so the text still says to run more than once and take the low
run). Detail sweep: 21983 pass, 1321 fail, 740 error, 473 skip, 2191 of 2206
files producing a result, 91.4% of the 24044 examples that ran.

The floor on main is still 21740; #638 is open to take it to 21970. Every place
the floor appears now says which one it is and names #638, rather than carrying
a number that goes stale when that PR merges.

Errno: was "28 constants, not MRI's 158". Measured on d498ddc, Errno.constants
is 158 under rbgo AND under MRI 4.0.5. Dumping every name/value pair from both
and joining them: all 158 names present in both, 32 disagree, and all 32 are
the same shape -- rbgo reports 0 where MRI on darwin has a real number (EAUTH
0 vs 80, EBADRPC 0 vs 72, EDEVERR 0 vs 83). The other 126 match exactly. That
is #633, and 32 is the number that matters rather than the 81 constants that
read 0 in rbgo, because MRI reads 0 for 49 of them too.

FileTest: was "11 of MRI's 26 predicates", with 15 listed as not implemented.
Measured: FileTest.methods(false) is 26 under both, name for name identical.
Differentially tested all 26 against MRI 4.0.5 over a temp tree (regular file,
empty file, directory, symlink, executable, FIFO, missing path, /dev/null,
/dev/disk0): 252 assertions, 0 disagreements.

Everything else in the limitations table re-probed on d498ddc and still holds:
Numeric#to_int NoMethodError, File::Stat#== identity ([false, true] vs MRI's
[true, true]), __LINE__ 0, const_source_location nil, Thread#backtrace of
another thread NotImplementedError, no Process.fork. All nine issues still open.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* README: the limitations section names d498ddc too

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* README: the floor IS 21,970 — #638 merged

#638 merged at 18:02Z. FLOOR on origin/main is 21970, which I re-read from the
tree. Three mentions phrased it as a pending proposal and are now simply wrong.

The arithmetic mattered more than the link. Every sentence built on a floor of
21,740 has been recomputed: the margin is 12, not ~240, and it appeared as
"~240 above the floor" in two places and "the gap is ~240 examples" in a third.

Rewrote the floor-vs-score explanation rather than swapping the number into it.
The old wording said the measured total "normally sits above" the floor and the
floor is "raised deliberately after a win", which reads as the floor lagging out
of laziness and leaves a reader wondering why 21,982 and 21,970 are nearly
equal. #638 states the actual rule, and its own arithmetic confirms it -- its
lowest run was 21981 against a floor of 21970, eleven below:

  the floor is set a handful of examples below the LOWEST observed run --
  enough to absorb the #615 jitter, and no more, because a floor slack enough
  to hide the loss of a whole spec file would defeat what the ratchet exists
  to catch.

So a small gap is the ratchet working; a large one would mean it had gone slack.
My own four runs give a margin of 12 against the same rule.

Provenance: the measurement was taken on d498ddc. main is now 2200e17, whose
only change is the FLOOR file, so I rebuilt and compared -- the binaries are
byte-identical (sha256 32cd4f9e...), and the figures carry over rather than
being assumed to.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
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