Skip to content

main health 2026-09-08: what the local CI replay found (7 reds on main, 3 with fix PRs, the obsolete #7254 pin, a Linux hang, a load-sensitive SIGSEGV) #9974

Description

@proggeramlug

Context: GitHub's hosted runners stalled on 2026-09-07, so the PR gates were replayed locally (perrymaster, Linux x86_64, Ubuntu-like; plus macOS arm64 for some) from .github/workflows verbatim, with main 8b7dc33 as the baseline. The replay found the following on main itself. Fix PRs exist for the first three.

  1. warnings job red — 7 dead-code errors in the product build. RUSTFLAGS="-D warnings" cargo check -p perry --bins compiles perry-runtime without regex-engine, so newborn_parent_needs_barrier and the six REGEXP_PROTOTYPE_* statics in object/regex_proto_thunks.rs are dead there. Fix: fix(runtime): gate the seven regex-engine/test-only items so the product-scope -D warnings check compiles again #9970 (cfg-gated any(test, feature = "regex-engine"); ladder-verified: warnings green, runtime suite 3247/0).
  2. cargo-test red — one perry unit test. commands::compile::build_cache::tests::codegen_env_vars_are_build_cache_inputs: PERRY_SEGVIEW / PERRY_SEGVIEW_DIAG (segment-view lowering, perf(intl): take the view mode's canonicality proof and UTF-8 re-validation off the per-grapheme path #9893) are read by codegen but registered neither as build-cache inputs nor as exclusions — a stale cached object can be served across a lowering-knob change. Fix: fix(cache): PERRY_SEGVIEW keys the build cache, PERRY_SEGVIEW_DIAG is a recorded diagnostic exclusion — fixes codegen_env_vars_are_build_cache_inputs on main #9971 (input + reasoned exclusion + a real cache test).
  3. scripts/run_lint_gates.sh was green by omission. Its extractor accepted only python3 scripts/, ./scripts/ and cargo fmt commands, silently dropping the "Public benchmark evidence freshness" step; its compile tier never ran the product-scope -D warnings check. Fix: tooling(lint): run_lint_gates.sh fails loudly when a lint step yields no command — it silently dropped the public-baseline step #9969 (derives every run: step, fails loudly on an empty derivation, compile tier derived from the warnings/check jobs).
  4. gc-stress fan-in red since 616a2cb: the gc: PERRY_GC_ZEAL + PERRY_GC_VERIFY_EVACUATION reports a stale forwarded pointer in shadow-stack roots (10/10, pre-existing, no CI arm sets the pair) #7254 pin in scripts/gc_instrument_smoke.sh arm 5b is obsolete by design. git bisect run with the script as predicate names 9f790a5 (Add a bridge for SolidJS as on-ramp which maps to perry/ui underneath #4644, "allow retained array-growth aliases in copying verification") as the first commit where the reproducer stops panicking, on Linux and macOS alike; arm 5a stays live (3,894 objects copied under the verifier). Add a bridge for SolidJS as on-ramp which maps to perry/ui underneath #4644 reclassifies gc: PERRY_GC_ZEAL + PERRY_GC_VERIFY_EVACUATION reports a stale forwarded pointer in shadow-stack roots (10/10, pre-existing, no CI arm sets the pair) #7254's Ptr growth alias from "stale forwarded pointer" to a retained alias (its changelog: a false abort). The script's own instruction applies: retire the pinned block and run the file under an ordinary arm — with the reproducer's output checked against node under the pairing. PR in preparation. Note for the smoke's readers: the script exports PERRY_GC_SCHEDULE_ALLOC_KB=0 and PERRY_NO_AUTO_OPTIMIZE=1 globally; a hand-copied arm-5 recipe without them is silent everywhere.
  5. test_gap_webcrypto_async_threadpool hangs on Linux main. Alone, PERRY_RUN_TIMEOUT=60, Node 26.5.1, fast mode: 3/3 "TIMEOUT (killed after 60s)" at 64.5–64.7 s wall on main's build (and identically on an unrelated PR's build). The gap snapshot records it as passing.
  6. Gap snapshot drift under Node 26.5.1 (Linux): test_gap_iterator_prototype_next_patch (node itself exits 1 inside node:internal/per_context/primordials:449 while perry prints the expected output — oracle-side), test_gap_9616_readable_to_web_fs, test_gap_crypto_scrypt_options, test_gap_disposablestack_2875, test_gap_promisify_pipeline_custom_6692 — all "pass → parity_fail" against the snapshot; identical sets on every PR head tested, so they are main's.
  7. Intermittent SIGSEGV in perry-runtime's single-threaded lib suite (Linux, dev profile). Under RUST_TEST_THREADS=1 cargo test --lib -p perry-runtime the binary died 3/3 at async_hooks::test_support::tests::native_async_resource_accepts_string_and_symbol_expandos while a release build ran alongside, 0/18 without that load, never under gdb. Load-sensitive race; a native AsyncResource with string/symbol expandos is a headerless pointer-tagged receiver with side-table expandos.
  8. lint's public-baseline step fails on every host: "public artifact benchmark inputs changed; regenerate it with ./benchmarks/run_public_baseline.sh" (the workflow's own comment dates it to 2026-07-29).

Local-replay notes: gc_ratchet.py check is hard-locked to darwin-arm64 (run measure only on Linux); the gap harnesses refuse an unpinned Node (26.5.1 pinned); cargo test --workspace --lib is not CI's shape (it links ext-crate lib tests CI never builds).

https://claude.ai/code/session_011dhBmdn4vGgNibjo3oZqTo

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions