Skip to content

Add cross_lab — the crossings, not more axes; bump pin to v0.32.0 - #14

Merged
InauguralPhysicist merged 1 commit into
mainfrom
cross-lab
Jul 17, 2026
Merged

Add cross_lab — the crossings, not more axes; bump pin to v0.32.0#14
InauguralPhysicist merged 1 commit into
mainfrom
cross-lab

Conversation

@InauguralPhysicist

Copy link
Copy Markdown
Contributor

Every existing lab stresses one axis: concurrent_lab is spawn, observer_lab is observe, io_lab is buffers, parser_lab is eval + listcomp. Eleven isolated axes is not a gauntlet — nothing here crossed anything.

The content also froze on 2026-07-06 while the pin kept advancing, so there was zero coverage of the task layer (v0.29.0), the tape, the buf_* kernels (v0.31.0), or lib/ui (v0.32.0).

The premise

Upstream's 15-finding review the same day produced three sharp bugs, and all three were interactions invisible to any single-feature test:

  • comprehension var × a closure mentioning it (#633, BLOCKER)
  • modal × focus navigation (#631)
  • line numbers × generated scale (#630)

Single features pass. The interaction breaks.

Eight crossings

Using the surfaces that landed after the content froze:

crossing what it pins
observer × task an observed trajectory inside a task doesn't inherit or corrupt main's
task_self × self-detach a task detaching itself reaps cleanly; join doesn't hang
lib/sync × comprehension a lock held across a comprehension
buffer × JIT-hot × observer three layers of assumption at once
eval × task dynamic compilation on a task's copying stack
recursion × task a task's stack is not main's C stack
module state × task share-nothing — the task's mutation must not reach main
error shapes × task thrown VALUE vs {kind,...} dict, both re-raised at join

It earned its keep on the first run

Two BLOCKERs. GAPS.md has open entries again for the first time since June.

EigenScript#642 (NEW) — a comprehension whose loop var shadows a local computes garbage:

define f() as:
    i is 0 - 1
    ys is [i * 2 for i in [1, 2, 3]]   # -> [-2, -2, -2], want [2, 4, 6]

The body reads the outer slot every iteration. rc=0, no diagnostic. Controls (one variable changed each): no outer i[2,4,6]; module scope → [2,4,6]; outer named q[2,4,6]. Identical under EIGS_JIT_OFF=1.

The crossing that found it was lib/sync × comprehension — the lock turned out incidental, and isolating it produced the controls above. It needs no lock and no closure, which is what makes it distinct from #633 and worse.

EigenScript#633 — re-derived independently (the read after such a comprehension is stale while eval sees the leaked value).

Per this repo's policy — no downstream workaround is a fix — the two affected assertions are parked with the exact lines to restore, not pinned to the buggy values. Everything else asserts the pinned runtime's real behavior, so a crossing that starts lying fails the gauntlet instead of going quiet.

Pin v0.30.0 → v0.32.0

Two behind; the crossings need the task layer and buf_*. Verified against the v0.32.0 tag built in a worktree, not local main — main carries unreleased APIs (file_dialog, element-wise log2) that would pass here and fail CI.

Full smoke green (12 workloads), lint clean.

Doc drift fixed while here

  • CLAUDE.md said the pin was v0.30.0, listed 11 workloads, and named the retired T3200 as the hardware target.
  • BASELINE.md marked stale: its 2007 Gateway went to EigenOS. The constrained regime is unchanged — an X540NA/N3350/4GB is not modern hardware either — so the baseline's purpose stands and only the capture is out of date. Needs a re-run on the X540NA.
  • CLAUDE.md now records why this repo exists structurally: EigenScript CI is ~33 min of wall per PR across 17 checks (ASan alone 8+ min), so coverage added there is paid on every PR forever; the same coverage here costs ~30 s. That's as much the point as the workloads are.

Every existing lab stresses ONE axis: concurrent_lab is spawn, observer_lab is
observe, io_lab is buffers, parser_lab is eval + listcomp. Eleven isolated axes
is not a gauntlet. Nothing here crossed anything, and the content froze
2026-07-06 — so there was zero coverage of the task layer (v0.29.0), the tape,
the buf_* kernels (v0.31.0), or lib/ui (v0.32.0), while the pin kept advancing.

The premise: upstream's 15-finding review the same day produced three sharp
bugs, and all three were INTERACTIONS invisible to any single-feature test —
comprehension var x closure (#633), modal x focus nav (#631), line numbers x
generated scale (#630). Single features pass; the interaction breaks.

Eight crossings, using surfaces that landed after the content froze:
observed trajectory inside a task; task_self + self-detach; a lib/sync lock
held across a comprehension; buf ops in a JIT-hot observed loop; eval inside a
task; deep recursion inside a task; module state vs share-nothing task args;
and both error shapes (thrown VALUE vs {kind,...} dict) re-raised at join.

It earned its keep on the first run: two BLOCKERs, and GAPS.md has open entries
again for the first time since June.

- EigenScript#642 (NEW): a comprehension whose loop var shadows a local
  computes garbage — [i * 2 for i in [1,2,3]] yields [-2,-2,-2], the body
  reading the outer slot every iteration. rc=0. Controls: no outer i, module
  scope, and a differently-named outer local are all correct; identical under
  EIGS_JIT_OFF=1. The lock was incidental — isolating the crossing produced the
  controls, and the bug needs no lock and no closure.
- EigenScript#633: re-derived independently (the read after such a
  comprehension is stale while eval sees the leaked value).

Per this repo's policy — no downstream workaround is a fix — the two affected
assertions are PARKED with the exact lines to restore, not pinned to the buggy
values. Everything else asserts the pinned runtime's real behavior, so a
crossing that starts lying fails the gauntlet instead of going quiet.

Pin v0.30.0 -> v0.32.0 (two behind; the crossings need the task layer and
buf_*). Verified against the v0.32.0 TAG built in a worktree, not local main —
main carries unreleased APIs that would pass here and fail CI. Full smoke green
(12 workloads), lint clean.

BASELINE.md marked stale: its 2007 Gateway was retired to EigenOS, so the
numbers aren't comparable to a current run. The constrained regime is unchanged
— an X540NA/N3350/4GB is not modern hardware either — so the baseline's purpose
stands and only the capture is out of date. Needs a re-run on the X540NA.
@InauguralPhysicist
InauguralPhysicist merged commit b9f90a3 into main Jul 17, 2026
1 check passed
@InauguralPhysicist
InauguralPhysicist deleted the cross-lab branch July 17, 2026 06:33
InauguralPhysicist added a commit that referenced this pull request Jul 17, 2026
… repo can't be (#15)

The line I added in #14 said EigenScript CI is '~33 min of wall per PR'.
That is the SUM of the legs — the compute cost. They run in parallel, so
the actual wait is ~10 min, set by the single 8m36s ASan leg. Measured:
recent runs are 8m37s-12m29s end to end.

Also states the thing that limits the argument: the Gauntlet is pinned to
a RELEASED tag, so it is post-release coverage and can never be a
pre-merge gate. A leg moved here would stop blocking the PR that breaks
it and would only surface at the next pin bump. It adds cheap coverage;
it does not subtract upstream cost.
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