Pin EigenScript v0.35.1, drop the record_history opt-out, re-point planted fault 1 - #25
Merged
Merged
Conversation
EigenScript#829 (v0.35.1) bounds the temporal assignment history by program TEXT and arms it per NAME, so the two things orbit.eigs was defending against — an unbounded append-only table, and one dead-code `prev of` in physics.eigs arming it for the whole program — are gone. - .devcontainer/Dockerfile: EIGS_REF v0.35.0 -> v0.35.1 (the only pin site). Preflighted first: the whole suite run against a worktree build of the v0.35.1 tag before the bump, not against `--version`. - orbit.eigs `_run`: the `record_history of 0` / `record_history of hist_was` pair and its comment block are gone. Peak RSS is unchanged by the removal — 134.3 / 134.5 / 134.4 MB with the opt-out, 134.7 / 134.3 / 134.4 MB without, at 30 / 100 / 300 bifurcation frames. The point of the change is the gate, not the cleanup. Planted fault 1 flipped that opt-out back on and required the memory gate to reject the build; on v0.35.1 it no longer produces any growth — measured, not assumed: the same planted tree runs 304 MB at 30 frames and 674 MB at 100 on v0.35.0, and 134.5 / 134.9 / 134.8 MB dead flat on v0.35.1. It sailed through the gate, which is a self-test going green for the wrong reason. So fault 1 is re-pointed rather than deleted: it now makes the bifurcation tick KEEP the frame's plotted points, breaking the same invariant the view's headline comment claims (bifurcation mode does no per-frame work) and re-creating the class the gate exists for. It leaves every structural counter correct — built=1, series=1, points=4000, markers=4 — so only the memory curve can see it, and it fails BOTH RSS checks: 176,384 KB at 30 frames, 279,104 KB at 100, i.e. the 200 MB ceiling on the second rung and +102,720 KB against the 25,600 KB flatness limit. Suite green on v0.35.1: lint (17 files), smoke, lab, orbit_hist, bifurcation, orbit_oracle, orbit_mouse, bif_mem. Closes #24
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 #24
EigenScript v0.35.1 carries #829, the fix for #827 (unbounded temporal
assignment history, armed on dead code — the bug that froze a box while
building this view). This bumps the pin, removes the workaround it made
unnecessary, and — the actual point — re-points the planted fault that the
fix silently retired.
Preflight (before the pin moved)
Built a worktree of the
v0.35.1tag (e2bb217) and ran the whole suiteagainst that binary with the tree unchanged.
--versionis not evidence, sothe fix was confirmed in the binary directly: a live
prev ofloop at 400kiterations peaks 52,992 kB on v0.35.0 and 2,944 kB on v0.35.1; the
dead-code arming repro, 15,488 kB → 3,072 kB.
Every test passed except
test_bif_mem.sh, which failed exactly wherethe issue predicted:
That is the whole issue in one line: the fault could no longer be planted.
What changed
.devcontainer/DockerfileEIGS_REFv0.35.0 → v0.35.1. Re-verifiedit is the only pin site in the repo (
eigs.jsoncarries no runtime dep)._run'srecord_history of 0/record_history of hist_waspair and the comment block above it.Removing the opt-out costs nothing measurable
Peak RSS in the bifurcation view, at 30 / 100 / 300 frames on v0.35.1:
Every difference is inside the ±400 KB run-to-run noise. No regression.
Why fault 1 had to be re-pointed, with the measurement
Same tree, the old fault planted (session history explicitly ON), static leg:
~5.3 MB/frame before, dead flat after. The fault is not weaker on the new
runtime; it does not exist. Deleting it would have left the gate validated by
one fewer fault than it was designed around.
The replacement fault, and why this one
The new fault makes the bifurcation tick keep the frame's plotted points —
it builds the point set every frame and appends it to app state. Chosen over
the two candidates the issue floated, both of which were evaluated and
rejected on measurement rather than taste:
chart_trim/ series cap — this view never callschart_trimand sets no series cap: the sweep is static data handed over once, so there
is no cap to remove.
hover_enabled(the one real per-frame guard in thechart config) is scanned on mouse motion, and the gate's driver sends none,
so flipping it moves nothing.
sim.caphistory bound — real, but it retains one two-element list peradvanced frame: ~15 KB over the whole 300-frame toggle leg against a 25 MB
limit. It is already covered by a planted fault in
test_orbit_hist.sh.What the chosen fault buys: it breaks the invariant this view's headline
comment actually claims ("BIFURCATION MODE DOES NOTHING PER FRAME"), it is the
same class as both retention bugs this repo has had (the unbounded
sim.ptstrail, and F-DYN-13's pinned per-point allocations), and it leaves every
structural counter correct — so only the shape of the memory curve can catch
it, which is precisely the check that needed a witness.
It goes red on both RSS checks (gate run with the quiet flag lifted so the
failing checks print):
Fault 2 still bites, unchanged:
Gate contract satisfied: PASS on a clean build, FAIL on every remaining fault.
Validation
Full suite green on v0.35.1 —
test_lint(17 files clean, no new upstream lintrule fires on this repo's code),
test_smoke,test_lab,test_orbit_hist,test_bifurcation,test_orbit_oracle,test_orbit_mouse,test_bif_mem.Every gfx run was capped (
ulimit -v 1500000) and headless (xvfb-run -a).Docs updated: F-DYN-13 marked fixed upstream with the before/after numbers, and
the README's memory-gate paragraph records why a planted fault was re-pointed.
Closes #24
🤖 Generated with Claude Code