Skip to content

Pin EigenScript v0.35.1, drop the record_history opt-out, re-point planted fault 1 - #25

Merged
InauguralPhysicist merged 1 commit into
mainfrom
fix-24-gate-repoint
Aug 3, 2026
Merged

Pin EigenScript v0.35.1, drop the record_history opt-out, re-point planted fault 1#25
InauguralPhysicist merged 1 commit into
mainfrom
fix-24-gate-repoint

Conversation

@InauguralPhysicist

Copy link
Copy Markdown
Contributor

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.1 tag (e2bb217) and ran the whole suite
against that binary with the tree unchanged. --version is not evidence, so
the fix was confirmed in the binary directly: a live prev of loop at 400k
iterations 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 where
the issue predicted:

--- planted fault 1: the temporal-history opt-out removed (the real bug) ---
FAIL: the leaking build passed the memory gate — the gate can't discriminate

That is the whole issue in one line: the fault could no longer be planted.

What changed

  • Pin: .devcontainer/Dockerfile EIGS_REF v0.35.0 → v0.35.1. Re-verified
    it is the only pin site in the repo (eigs.json carries no runtime dep).
  • Workaround removed: _run's record_history of 0 / record_history of hist_was pair and the comment block above it.
  • Planted fault 1 re-pointed (not deleted).

Removing the opt-out costs nothing measurable

Peak RSS in the bifurcation view, at 30 / 100 / 300 frames on v0.35.1:

30 100 300
static, opt-out in 134,272 KB 134,528 KB 134,400 KB
static, opt-out out 134,656 KB 134,272 KB 134,400 KB
toggle, opt-out in 134,272 KB 134,400 KB 135,040 KB
toggle, opt-out out 134,528 KB 134,528 KB 134,912 KB

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:

runtime 30 frames 100 frames 300 frames
v0.35.0 (old pin) 304,384 KB 674,304 KB
v0.35.1 (new pin) 134,528 KB 134,912 KB 134,784 KB

~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:

  • the chart's chart_trim / series cap — this view never calls chart_trim
    and 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 the
    chart config) is scanned on mouse motion, and the gate's driver sends none,
    so flipping it moves nothing.
  • the sim.cap history bound — real, but it retains one two-element list per
    advanced 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.pts
trail, 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):

--- planted fault 1: the bifurcation tick keeps its frame's points ---
  static 30 frames: peak 176384 KB  rc=0  built=1 series=1 points=4000 markers=4
  static 100 frames: peak 279104 KB  rc=0  built=1 series=1 points=4000 markers=4
FAIL: static/100 peaked at 279104 KB, ceiling 204800 KB
  static growth over the frame sweep: 102720 KB (limit 25600 KB)
FAIL: static RSS grew 102720 KB with frame count — that is a leak, not a working set
PASS: planted fault 'framepts' is caught (per-frame retention, every structural counter still correct)

Fault 2 still bites, unchanged:

--- planted fault 2: the build-once sweep guard removed ---
  toggle 30 frames: peak 187192 KB  rc=0  built=1 series=16 points=4000 markers=64
FAIL: toggle/30 built 16 chart series — the build-once guard let go
FAIL: toggle/30 has 64 markers, want 4
PASS: planted fault 'guard' is caught (every view switch rebuilds the sweep)

Gate contract satisfied: PASS on a clean build, FAIL on every remaining fault.

  static growth over the frame sweep: 768 KB (limit 25600 KB)
  toggle growth over the frame sweep: 512 KB (limit 25600 KB)
PASS: peak RSS under 204800 KB and flat in frame count, in both the steady-state and the toggle-every-frame shape
PASS: memory gate green, both planted faults caught

Validation

Full suite green on v0.35.1 — test_lint (17 files clean, no new upstream lint
rule 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

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
@InauguralPhysicist
InauguralPhysicist merged commit ef7f549 into main Aug 3, 2026
1 check passed
@InauguralPhysicist
InauguralPhysicist deleted the fix-24-gate-repoint branch August 3, 2026 10:33
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.

orbit lab: drop the record_history opt-out once EigenScript#827 lands, and re-point planted fault 1

1 participant