certify: the tables bench corpus after #507, and the six control lines that are not failures - #542
Merged
Merged
Conversation
…-table wire The next red behind the map fit control, and the producer's own refusal named it: "record 2 is 2147 bytes, record 0 is 2139 — the table wire elides a field at its default, so a varied value landed on one. Fix the vary mapping, not this check." The diagnosis is one step past what that message says. Nothing landed on a default. A record's TRAILER carries one eight-byte entry per distinct id the record uses, and #507 made an enum ride as its VARIANT's id, so the eight entity slots drawing a weapon at random gave each record its own set of distinct variants and its own trailer length. Record lengths came out in eight-byte steps: 2123, 2131, 2139, 2147, one step per entry the draw added or dropped. The weapon is structure under this wire, so the slot's own index picks it: the eight slots take Fists through Grenade in every record, the set of ids is fixed, and the value still differs from slot to slot. It is the rule the pinned union arm already followed. A flags needs no pin, because TableDamage rides as raw bits and names no id. The goldens re-pin with it. They were the previous form and 2391 bytes, which is a second thing #507 left behind: the producer refused on the vary mapping before it ever reached the byte compare. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Re-pinning the tables bench corpus to the id-table wire exposed it. The gate was green against a corpus still in the previous form, which is the form this port writes, so it was holding the codec to bytes it happened to agree with rather than to the wire the reference now writes. With the corpus current it refuses in its own words: "refusing to bench a codec that does not reproduce the corpus." That is the same rule as tables-elixir-alloc-audit and tables-elixir-soak, so it takes the same dormancy and the same issue. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This was referenced Sep 4, 2026
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.
Certify on main went red again at 64325e1 (run 33893969798), in all eight
testandinline-gatelegs. All eight stop at the same line, and it is oneline,
./build/schema_test_bench_table:The six alarming lines in that log are negative-control output
They are gates going red on purpose, each immediately followed by its own
control announcing success and the chain continuing. Reading them as failures
would have sent this PR after defects that are not there, so here they are with
the line that follows each in the same log:
FAILED: an opened block reports a used extent outside [ … ]tables-block-fuzz-extent-negative-controlblock fuzz extent negative control: removing that check from EVERY emitter turns the fuzzer redFAILED: an opened block carries a count past its DECLARED MAXIMUMtables-block-fuzz-maximum-negative-controlblock fuzz maximum negative control: removing that check from EVERY emitter turns the fuzzer redhostile_test.go:69: FAILED: cook-check panicked on a forged file (slice bounds out of range [8796093022236:176])tables-cook-fuzz-negative-controlmake tables-cook-open— the target had SUCCEEDEDFAIL blob_span_main.cpp:73 blob past the slab: intacttables-blob-span-negative-controlnegative control: a blob larger than a slab, denied its span, overruns the slabFAILED: a forgery OPENED that §7 says Open refuses: a data length one byte longtables-cook-open-lengths-negative-controlnegative control: removing the lengths check turns the cook forgery battery REDFAILED: a data part too short to hold the root OPENED …tables-cook-open-root-negative-controlnegative control: removing the root check turns the cook forgery battery REDThe cook-check panic is worth spelling out, because a panic on hostile bytes is
exactly the shape of the defect #534 fixed one layer up. It is not one here.
tables-cook-fuzz-negative-controlinsertsreturn nilat the top ofcheckDirectorythrough ago test -overlay, which removes cook-check's PASSONE — the directory scan — and then REQUIRES the hostile battery to go red. With
the scan gone, a forged directory offset reaches a slice and panics, and that
panic is the control's whole point: it is what proves the scan is the thing
standing between a forged file and that slice. No tracked file is edited, and
the unsabotaged battery is green:
So the cook and block readers refuse what §7 says they refuse, and this PR does
not touch them.
The one real failure: the tables bench corpus
The producer's own refusal named it, and the diagnosis is one step past what the
message says. Nothing landed on a default. A record's TRAILER carries one
eight-byte entry per distinct id the record uses, and #507 made an enum ride as
its VARIANT's id. The eight entity slots each drew a weapon at random, so every
record got its own set of distinct variants and its own trailer length. The
lengths came out in eight-byte steps, 2123 / 2131 / 2139 / 2147, one step per
entry the draw added or dropped.
The weapon is structure under this wire, so the slot's own index picks it now:
the eight slots take
FiststhroughGrenadein every record, the set of idsis fixed, and the value still differs from slot to slot. It is the rule the
pinned union arm already followed. A
flagsneeds no pin, becauseTableDamagerides as raw bits and names no id.
The goldens re-pin with it. They were still the previous form at 2391 bytes,
which is the second thing #507 left behind: the producer refused on the vary
mapping before it ever reached the byte compare.
The negative control is the draw put back, with
slotkept in use so thecompiler's own
-Wunused-parameteris not what answers:The gate is
make bench-table-check, and it already ridesmake test.And the gate the re-pin exposed
tables-elixir-bench-gatewas green against a corpus still in the PREVIOUSform, which is the form the Elixir port writes, so it was holding that codec to
bytes it happened to agree with rather than to the wire the reference writes.
With the corpus current it refuses in its own words:
That is the rule
tables-elixir-alloc-auditandtables-elixir-soakalreadytake, so it takes the same dormancy and the same issue, #515. It is the only
bench gate affected: every other port's
bench/tables/<lang>/legis a compilegate in
make test, and only Elixir runsleg run --gate.What was run
make testlocally, one C++ build at a time, and the pieces this machine cannotreach (
test-dart,test-elixirand the all-legconformancestep, for wantof a Dart SDK and a BEAM) are covered by a Certify dispatch on the branch.