Ordered work queue for long unattended runs. This issue is the source of truth for what to do next; CLAUDE.md points here so the queue survives context compaction.
Work top to bottom. Tick an item only when its definition of done is met and the evidence is posted on its own issue. Anything that needs a human decision goes to Blocked on a human instead of being guessed.
Queue
0f. #1104 — pending asyncHold lifecycle registration. Fixed in
4025527: the lock is held before worker creation; all four lifecycle oracles pass in both modes, including unsuppressed TSan. Full ReleaseSafe gate passes 253/253. The full Debug no-GIL gate exposesapi/thread-lifecycle.jsexpecting zero side effects under a main hold. The identical assertion fails 10/10 times on pinned80e4595. Prove startup/registration ordering before correcting the fixture; retain all four async-lifecycle oracles and run both modes plus unsuppressed TSan.0g. #1105 — Debug no-GIL corpus timeouts. Fixed in
729837d(futex registration) and969c0f5(exact uncaptured block-layout reuse). Full Darwin Debug and ReleaseSafe no-GIL gates pass 253/253 under the unchanged 600-second per-case watchdog. Unchanged validation-storm workload passes both modes in Debug/ReleaseSafe/unsuppressed TSan; 7,621 affected test262 cases and exact VM failure sets are unchanged. Default/verify/mid-GC/TSan fuzz all pass. Evidence posted on #1105.0e. #1103 — CI no-GIL Condition wake-count failure. Fixed in
fea2e17: main holds the lock before worker construction, proving ticket registration before notification. All exact waiter and empty-queue counts pass Debug/ReleaseSafe/unsuppressed TSan in both modes. With #1104 and #1105 resolved, the full unchanged Debug and ReleaseSafe no-GIL gates now pass 253/253. Evidence posted on #1103; new push CI integration remains pending.0. CI: re-pin
bench/frontend_parse.zigin representative matrix v35. Fixed in6cfaa3f: the representative-matrix self-test passes in CI (run 35217156597). The #926/#928 workload commits changed a runner that matrix v34 pins by SHA-256, sobenchmark-comparison-harnessfails with "V34 measured-boundary native runner changed without a matrix version bump" (first seen at2d04e81). Caused by this queue, so it comes first. Done: v35 hash-inherits v34 and re-pins only that runner, following the v30 re-pin (18cd453);tools/representative-matrix.tsand its self-test accept it; the job's check passes locally.0b. Fixed in
7c2e660: unit, TSan unit and focused-engine-tests jobs pass. CI:parser.test.template token storage growth and nesting propagate scratch allocation failuresfails withNondeterministicMemoryUsagein the full unit binary (unit shard, TSan shard, focused-engine-tests) since at least650efda, but passes alone and in the parser-only test root. Something earlier in the process changes how many scratch allocations the parse makes. Done: cause identified, test deterministic in the combined binary.0c. Fixed in
cea5f24: dependency-audit passes in CI. CI:dependency-auditreportstools/exact-parent-regression.tshas an unclassified reference todocs/.data/representative-benchmark-matrix-v34.jsonsince650efda. Check whether item 0 changes it before fixing separately.0d. #1044 — fixed in
9d435e3: the algorithmic-growth self-test now completes within the unchanged default zig-js evaluator budget; both zig-js and JSC Home runs pass, and the aggregate benchmark harness passes all 19 validators. Redundant successful-artifact rebuilds and validation-only formatting traversals were removed while public rendering remains fail-closed. Matrix V48 re-pins only the validator; evidence schemas, validation rules, scored workloads, and publication acceptance are unchanged.1. #932 — fixed in
2688dc9: 63x at depth 4000, 13,814 VM-forced tests identical, 7,317 ReleaseSafe tests with the invariant asserted. — nested destructuring catch parameters are quadratic inside function bodies (x3.9/doubling, 1.87 s at depth 4000). Root cause unknown. Done: hot frames located bysampleon a depth-4000 run, fix landed, before/after growth curve posted, 0 test262 regressions on the affected subtrees.1b. #935 — fixed in
d91ae16: 10 walkers iterate chains; 57/96 crashing runs -> 0/96; 13,773 VM-witness tests identical. — flat expression chains segfault where node runs them: a 2,000-substitution template literal crashes tree mode. Valid, realistic code, so first. Done: left spines walked iteratively in the tree-walker and compiler, preserving evaluation and coercion order; binary, template, logical and comma chains measured and pinned against node; no growth regression on the #926/#928 rows.1c. #936 — fixed in
480516b: 18 shapes x 3 modes SIGSEGV -> RangeError; five paths that relabelled the error fixed; 24,403 tests identical; frontend benchmarks 0.990-1.022. — parser and post-parse analysis overflow on deep nesting. Done:RangeErrorviastack_scan.nearLimitat the mapped chokepoints, a subprocess test intest-runtime, and a moderate valid depth still parsing.1d. #937 — fixed in
b895723: 32/384 compile-only cells SIGSEGV -> RangeError; module import surfacing fixed; 22,316 witness and 24,067 diag tests identical; compile benchmarks 0.984-1.022. — bytecode compiler and its pre-scans overflow on deep nesting. Done: guarded dispatchers and pre-scans, surfaced asRangeErrorrather than a tree-walker fallback, and the #926/#928/#932 measurements re-run.1e. #938 — fixed in
81b49b1: 39 of 232 eval-matrix cells SIGSEGV -> RangeError; deep if-chain 139 -> 2047 levels in both modes; test/language 23,648, test/annexB 1,086, test/built-ins 23,126 and 12 vm-witness subtrees identical (0 flips); committed layout measures 0.995x default and 1.019x tree against a 1.020x no-op control. — tree-walker recursion inside one call escapesstackGuard. Done: hoisting, Annex B scan, destructuring and AST copying charged tostackGuard, including strict and sloppy block nesting, plus the hostprintpath.1h. #940 — fixed in
f2b655d: 8 crashing shapes now answer or raise RangeError, matching node; deep bound call returns 7 as node does; 8 subtrees (19,554 tests) and 3 vm-witness subtrees identical, 0 flips; quadratic bound-name memory split out as #942. — deep runtime chains crash with SIGSEGV where node throws RangeError or runs them:flat(Infinity)on deep or self-referential arrays, trap-less proxy chains (getPrototypeOf, isExtensible, defineProperty, Object.prototype.toString), and bound-function chains for calls andinstanceof. Done: each shape throws the catchable RangeError, or runs where node does (bound calls). Iterate chains that have no user-visible step between links; check the stack where user code can run.1i. #941 — fixed in
8f0947d: the 10-value probe now matches the JSC oracle exactly, including JSC's check-before-separator-coercion ordering (1 coercion, V8 does 2) and recovery after a throwing toString; 6 subtrees (17,264 tests) identical, 0 flips. —Array.prototype.jointhrows RangeError on cyclic arrays where JavaScriptCore and V8 return"1,". Done: re-entered arrays join as empty in join, toString and toLocaleString, with the in-progress set popped on every exit path including a throw, and pinned against the JSC oracle.1j. Module top-level
awaitwhose operand throws — fixed in2dce041: reproduced with two dynamic imports through the corpus runner's module host — the first rejected withSyntaxError: Cannot parse moduleand the second never settled; both now reject with the thrownError: operand, matching node. 4 module subtrees (1,670 tests) identical, 0 flips, pinned by a new module test. —suspendModuleAwait(src/context.zig) evaluates the operand withtry, outsidefinishModuleError, so a throw there may leave the module "evaluating" for later importers. Found by the #938 review, which traced the same gap for hoisting (that one is fixed with #938). Reproduce with two dynamic imports of such a module before fixing.1f. zig-utils/zig-regex#23 — fixed in zig-regex
3e8654e: 14 walkers over pattern spines made iterative; flat patterns go from crashing at ~26,000 elements to compiling at 1,000,000; 3,352 zig-js RegExp/String/literal tests identical, 0 flips; nesting depth split out as zig-regex#25 and the remaining recursive walkers as zig-regex#26. — long regex patterns crash compile and backtracking. Sibling repository; flat patterns must work, since node runs them.1g. #939 — fixed in
b1acc36: head form decided by an exact token scan, so each head parses once; member 411 MB -> 11 MB at depth 18 and depth 200 now parses in 0.01 s; 14,609 tests across 6 subtrees identical, 0 flips; depth 24 pinned. — valid nested classicforheads with function bodies parse in exponential time and memory (431 MB at depth 18; node: 0.2 ms at depth 200). Done: one parse per head, pinned at a depth that exhausts memory without the fix.2. Function-body variants of the frozen growth workloads. — done in
ffc4e58: ten rows frozen (…_in_function_…for all eight #926/#928 shapes, plus acatch_destructurefamily for #932's shape at both scopes). All 18 rows grow x2 per doubling, so no new quadratic was filed; the one x6.24 reading was 3-sample noise (x2.02 at nine samples). The #932 shape costs a flat ~4x more inside a function body without changing slope. The #926 and #928 rows parse top-level scripts only, so they are blind to effects confined to function bodies — #932 is one, and plain nested blocks inside a function also steepen (x2.44 then x4.05). Confirmed separate from #932: the #932 fix leaves that shape unchanged (155.5 ms -> 164.2 ms at depth 4000), so it has its own cause. Done: each #926/#928 shape and the #932 shape wrapped in a function, frozen inbench/frontend_parse.zig, measured, and any new quadratic filed with evidence rather than assumed.3. #930 family 4 — fixed in
3e792ee: strict block andswitchduplicate functions now reject under the owning FunctionNode strictness; 8,775 affected test262 cases identical, 0 flips.4. #930 family 3 — fixed in
0a2c1cb: labelled Annex B functions now contribute var or lexical names according to their containing statement list; 574 affected test262 cases identical, 0 flips.5. #930 family 2 — fixed in
ada64ff: both declaration walkers now traversewithbodies, including #931 catch conflicts; 1,871 affected test262 cases identical, 0 flips.6. #930 family 1 — fixed in
bb48fb2: every function body is checked once as it is parsed, and the scope walk no longer descends into functions; 15 expression-nested positions now reject like node (plus the #931 catch,withand strict-duplicate shapes, pinned inf2bafeb); all 18 #926/#928 rows incl. the item-2 function-body rows stay x2 per doubling (median of 18, interleaved); 22,984 tests across 9 subtrees identical, 0 flips. #930 closed. — function bodies nested in expressions are never walked. The largest item and perf-sensitive: widening the walk is exactly how #928's quadratic could return. Done: fixed, and the #928 frozen rows plus the item-2 function-body rows re-measured with no growth regression.7. #927 — measured (no fix, per this item): siblings quadratic (1,186 MB at N=4096 vs a 61 MB control); deep nesting cubic, worse than predicted (411 MB at N=256, >3 GB at 512). A throwaway build proved the cubic memory is the site-2 clone retained by
deinit(self.arena)(426 -> 43 MB when freed) but time stays cubic from repeated cloning, so the fix is the flattening design question, not an allocator swap. Evidence on #927. — runtime private-environment flattening. Measure first; no fix until the curve is confirmed. The #926 undo-log trick may apply, since the question there is stack-disciplined even though the map carries a payload.8.
checkForHeadVarConflict— fixed inf4100cc: frozenrepresentative_frontend_for_head_*rows confirmed x4.04/x4.29 per doubling; heads now check by declaration order against one per-var-scope record (34.2 ms -> 0.61 ms at 1,024 nested heads,varcontrol unchanged). Kept at parse time because the scope walk still misses expression-nested functions (item 6). Matrix v37; 3,716 tests identical, 0 flips. — re-collects aforbody's var names per lexicalforhead, the same shape as #928. Freeze a workload and measure before filing or fixing.8b. Deep parentheses, object literals and
for awaitheads take 5-13 s to fail at 200,000 levels while arrays take 0.0 s — fixed in320e211: confirmed as the arrow lookahead scanning each(to its match (9.7 s to refuse 200,000 parens in ReleaseFast). Past 64 levels the parser now indexes every paren once; at 64,000 levels parens 0.96 s -> 0.09 s andfor await0.57 s -> 0.07 s (Debug), matching the bracket control. Object literals were already flat in expression position. 2,223 tests across 6 subtrees identical, 0 flips. (#936 gate). Probably a lookahead rescanning each(. Measure growth at depths that parse before filing.8c.
representative_frontend_compile_binding_inventory_destructure_4096fails witherror: InvalidProgramon main. — fixed inffc4e58: lowering traced toa2d301a(#730); the row now pins the lowering's local budget (7 iterator temporaries per declaration) instead of anunsupported_loweringrejection, with matrix v36 re-pinning the runner. Neighbour rows byte-identical; matrix self-test 75/75. Its validator (bench/frontend_parse.zig,validateBindingInventoryCompileProgram) still expects the compiler to reject lexical destructuring declarations withunsupported_lowering, but they now compile. Find the commit that added the lowering, then update the frozen expectation, which needs another matrix version because v35 pins the runner.9. home-tool private-accessor oracle defect — scoped in #943: wider than accessors — every reference to a private method or accessor (instance or static, 14 syntactic positions) is a JSC SyntaxError under home-tool, while private fields work. Cause: home-tool's
ts_emitwrites those member names as string keys atesnext, so the private name is never declared (and unreferenced ones become public"#m"properties). The fix belongs in home-lang/home. — home-tool rejects validget #x()/set #x()references. Scope how wide the blind spot is, since it is the JSC oracle for error-parity work.
Blocked on a human — do not loop on these
HOME_RUN_MAX_MB: a coldsrc/relink peaks near 3.1 GB, sozig build test-parallelcannot complete under the 3072 MB cap. Use the per-module test root (~350 MB) in the meantime; raising the cap is the user's call.- Maximum string length (from #970). zig-js caps a constructed string at 2^26 bytes (64 MiB,
max_string_bytes). That is a policy limit from7bedeab, not a representation limit: string cells hold longer strings. JavaScriptCore allows 2^31-1, V8 about 2^29.repeat,+,concat, template literals and, since7bda007,padStart/padEnd/joinseparators enforce it.joinof large inputs,String.rawandJSON.stringifydo not, so output above 64 MiB works through some builtins and not others. Raising the cap toward JSC's would suit Home; enforcing it everywhere would reject outputs that work today. The choice changes behaviour embedders see, so it needs a decision.
Definition of done, for every item
- Reproduce or measure before changing code. A growth claim needs the owned runner and a control that separates the plausible causes.
- For any behaviour change: pin cases confirmed against node first, then run test262 on the affected subtrees with a before binary built from the pre-change parser and the after binary — 0 fail on both, not just matching counts.
- Commit and push with measured numbers in the body, then post the evidence on the item's issue and tick it here.