bench: Component G — the F-PARITY harness, measured; W8 FALSIFIERS + POLICY closed - #38
Merged
Merged
Conversation
…POLICY closed
Closes the last two rungs of D-LGJ-W8. Both turned out to be narrower than
the board said, and one of them was already done.
SCOPING FIRST, because it changed the work. §12 says "W8 carries only those
marked [W8]" and marks exactly TWO of eight F-*: F-HYDR and F-PARITY. The
other six (F-PAR/F-ORD/F-ONE/F-SPARSE/F-ACK/F-LAND) are pre-registered for
the COMPUTE wave. The board's "spec §12 F-* pre-registrations" wording
implied all eight.
* F-HYDR was ALREADY SHIPPED as GraphHopTest's G3 gate -- allocation flat
at a 384-byte floor across 10-vs-500 rows.
* F-PARITY is this commit.
POLICY was discharged at the A3 freeze (PR #20), not last. §3.9 lands the
policy artifacts "BEFORE workers" and every one exists dated 2026-08-18:
root CLAUDE.md including §13's compute additions, EPIPHANIES.md:683 storno,
the STATUS_BOARD row, LATEST_STATE, PR_ARC_INVENTORY. The gate ladder's
"... -> FALSIFIERS -> POLICY" ordering is misleading, and the board carried
POLICY as remaining for nine days.
COMPONENT G. `G_HopExecutionBoundary`, three arms over `openWithEdges`:
native `lgj_hop` (mask in, mask out, no row id ever produced) against the
two scalar oracles preserved VERBATIM from GraphHopTest -- reused rather
than rewritten precisely because they are already cross-checked against each
other and against native on every change, so a divergence here is real and
not a fresh transcription bug. Swept on BOTH axes §3.8 requires: rows
{4096, 65536} x frontier {1%, 25%}. All three arms must agree on the
destination set in @setup before anything is timed, plus an anti-vacuity
guard that refuses a fixture whose hop reaches nothing.
The Vector-API arm §3.8 calls "optional" is absent deliberately and says so:
it would be a second implementation of the kernel, and building one before
the scalar arms had been measured is the taste-before-measurement §3.8
forbids.
AND IT WAS MEASURED, not merely seeded. JMH jars fetched per README, .so
built, full sweep run:
arm 1%/4096 1%/65536 25%/4096 25%/65536
java_scalar_classidScan 8.5 150.6 204.0 7173.6
java_scalar_facetMatches 394.9 7142.3 433.8 10071.5
native_hop 479.0 24798.3 521.2 23633.9 us/op
Native is slowest at EVERY configuration, 2.6x-165x. The ranking is the less
interesting half; the shape is the finding. native_hop is FLAT in frontier
density (479->521 at 4096; 24798->23634 at 65536 -- a 25x bigger frontier
costs nothing) and ~LINEAR in population (16x rows -> ~52x time). A hop whose
cost tracks the population it ignores rather than the frontier it starts from
is doing full-population work.
Root-caused, exports.rs:1589-1599: the classid mask is built across the WHOLE
population once per participating facet -- 32 full-width sweeps per hop --
and only then intersected with src. The decode/scatter half IS
frontier-bounded; the sweep before it is not. ~2.1M strided classid reads per
call at 65536 rows before one edge is decoded. Filed as
ISS-LGJ-HOP-SWEEPS-FULL-POPULATION.
The remedy is deliberately NOT here: src_snapshot is known before the loop so
the sweep could be bounded to words where src has bits, but that is a kernel
change and §12 scopes W8's F-PARITY to "seeds the HARNESS only" on a
component §3.8 declares non-gating. A kernel rewrite in a bench commit widens
the PR past what the measurement authorises.
NOT a verdict on mask-native execution: allocation independence is pinned
separately (G3) and unaffected, the no-row-id guarantees are structural. This
is the throughput-placement axis §3.8 says a measurement decides.
Caveats carried rather than buried, in RESULTS.md and ISSUES.md both: the
per-call createMask+close has no scalar analogue and was NOT isolated
(implausible as the story, named anyway); native absolutes are noisy
(+/-12844 on 24798) on a shared 4-vCPU container so the ordering is robust
and the absolutes are not; one machine, one run.
Component G writes its own results/jmh-results-G.csv -- different fixture,
different axes, deliberately not merged into the A-F tables. (The first run
overwrote jmh-results.csv; caught by git status and restored.)
ALSO CORRECTS WAVE_STATUS_CHECKLIST's ruff_r2il paragraph, which was wrong
twice -- the file that exists to stop stale cross-repo claims had become one.
It said PR2 was a "drill-down proposer" gated on PR1 corpus numbers, both
unmerged. Measured: PR1/O1 is DONE (CORPUS-PROFILE-RESULT.md, 100.00% inline
fit on all four binaries), PR2 is DONE (ORACLE-RESULT.md, ZERO mismatches
over 35,946 matched op sites), and PR2 was never a drill-down proposer -- the
gate deliverable is the round-trip oracle. The real open item is O6, the
MemorySpace schema-widening decision, which scopes O5/PR3's ogar_codebook
mint. Wrong text quoted, not deleted, per append-only.
Board artifacts land in this same commit per the hygiene rule: STATUS_BOARD
row flipped to COMPLETE, ISSUES entry, checklist correction.
Gates: bench compiles clean under the run.sh command line (javac -proc:full,
JDK 26.0.2); Component G's own @setup cross-check passed at all four
configurations, which is the harness gating itself.
|
Important
This repository does not receive automatic reviews because it has fewer than 10 stars. ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_668e0561-aad8-4e52-a71a-dd3b4108e738) |
AdaWorldAPI
marked this pull request as ready for review
August 27, 2026 13:06
This was referenced Aug 27, 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.
Closes the last two rungs of D-LGJ-W8. Both were narrower than the board said, and one was already done.
Scoping first, because it changed the work
§12 says "W8 carries only those marked [W8]" and marks exactly two of eight
F-*. The other six (F-PAR/F-ORD/F-ONE/F-SPARSE/F-ACK/F-LAND) are pre-registered for the compute wave. The board's "spec §12 F-* pre-registrations" wording implied all eight.GraphHopTest's G3 gate, allocation flat at a 384-byte floor across 10-vs-500 rows.POLICY was discharged at the A3 freeze (PR #20), not last. §3.9 lands the policy artifacts "BEFORE workers", and every one exists dated 2026-08-18: root
CLAUDE.md(incl. §13's compute additions),EPIPHANIES.md:683storno, theSTATUS_BOARDrow,LATEST_STATE,PR_ARC_INVENTORY. The ladder's… → FALSIFIERS → POLICYordering is misleading; the board carried POLICY as remaining for nine days.Component G
G_HopExecutionBoundary— nativelgj_hop(mask in, mask out, no row id ever produced) against the two scalar oracles preserved verbatim fromGraphHopTest. Reused rather than rewritten precisely because they are already cross-checked against each other and against native on every change, so a divergence here is real rather than a fresh transcription bug.Swept on both axes §3.8 requires: rows {4096, 65536} × frontier {1 %, 25 %}. All three arms must agree on the destination set in
@Setupbefore anything is timed, plus an anti-vacuity guard refusing a fixture whose hop reaches nothing.The Vector-API arm §3.8 calls "optional" is absent deliberately, and the class says so: it would be a second implementation of the kernel, and building one before the scalar arms had been measured is exactly the taste-before-measurement §3.8 forbids.
And it was measured, not merely seeded
JMH jars fetched per README,
.sobuilt, full sweep run.java_scalar_classidScanjava_scalar_facetMatchesnative_hopNative is slowest at every configuration, 2.6×–165×. The ranking is the less interesting half — the shape is the finding:
A hop whose cost tracks the population it ignores rather than the frontier it starts from is doing full-population work.
Root cause, localized —
exports.rs:1589-1599The classid mask is built across the whole population once per participating facet — 32 full-width sweeps per hop — and only then intersected with
src. The decode/scatter half is frontier-bounded; the sweep before it is not. ~2.1 M strided classid reads per call at 65 536 rows before one edge is decoded.Filed as
ISS-LGJ-HOP-SWEEPS-FULL-POPULATION.The remedy is deliberately not in this PR
src_snapshotis known before the loop, so the sweep could be bounded to words wheresrchas bits, or skipped for a facet whose intersection is empty. That is a kernel change, and §12 scopes W8's F-PARITY to "seeds the HARNESS only" on a component §3.8 declares non-gating. A kernel rewrite inside a bench commit widens the PR past what the measurement authorises.What this does not say
Not a verdict on mask-native execution. Allocation independence is pinned separately (G3) and unaffected; the no-row-id guarantees are structural. This is the throughput-placement axis §3.8 says a measurement decides — "Promotion/demotion of the placement follows that measurement — never taste." It now has one.
Caveats carried, not buried (in
RESULTS.mdandISSUES.mdboth): the per-callEngine.createMask+ close has no scalar analogue and was not isolated — implausible as the story at 470 µs on 4096 rows, and it would not scale withrows, but named anyway. Native absolutes are noisy (±12 844 on 24 798) on a shared 4-vCPU container: the ordering is robust, the absolutes are not. One machine, one run.Component G writes its own
results/jmh-results-G.csv— different fixture, different axes, deliberately not merged into the A–F tables. (The first run overwrotejmh-results.csv; caught bygit statusand restored.)Also corrects a stale cross-repo claim — in the file that exists to prevent them
WAVE_STATUS_CHECKLIST.mdsaidruff_r2ilPR2 was a "drill-down proposer" gated on PR1 corpus numbers, both unmerged. Measured against the repo:CORPUS-PROFILE-RESULT.md, 100.00 % inline fit on all four binariesORACLE-RESULT.md, zero mismatches over 35,946 matched op sitesThe real open item is O6 (the
MemorySpaceschema-widening decision), which scopes O5/PR3'sogar_codebookmint. Wrong text quoted rather than deleted, per append-only.Board hygiene
Same commit, per the rule:
STATUS_BOARDrow flipped to D-LGJ-W8 COMPLETE,ISSUESentry, checklist correction.Gates
run.sh's exact command line (javac -proc:full, JDK 26.0.2)@Setupcross-check passed at all four configurations — the harness gating itselfGenerated by Claude Code