Skip to content

ci: the per-PR repsel matrix arms cannot reproduce the relocating-minor defect class (evac base is push-only) #6993

Description

@proggeramlug

The hole

scripts/gc_repsel_matrix.sh runs on pull requests with --arms pr:

PR_ARMS="default,verify_evac,cons_scan_off,shipped_default"

and on push with --arms all (.github/workflows/test.yml, gc-stress job).

But the evacuating base that #6981 established as the discriminator needs both halves together:

PERRY_GC_INCREMENTAL=0 PERRY_CONSERVATIVE_STACK_SCAN=off

and that combination appears only in --arms all (evac_minor / cons_scan_off_force). cons_scan_off on its own is pressure + precise roots with incremental mode still on, which does not take the relocating path.

Measurement

Built the five #6982 crashers from aa1c15028 (i.e. unfixed) and ran each PR-gated arm. All green:

                        default  verify_evac  cons_scan_off  shipped_default
repsel_canonical_i32    0        0            0              0
typedarray_param_read   0        0            0              0

The same binaries crash immediately under PERRY_GC_HEAP_LIMIT=8 PERRY_GC_INCREMENTAL=0 PERRY_CONSERVATIVE_STACK_SCAN=off (SIGBUS/SIGSEGV, copied_objects 4 579 / 5 965).

So the entire "raw reference held across a relocating collection" class — #6951, #6972, #6982, #6991, #6992 — is invisible to the per-PR gate. It can only go red after merge, on push.

Why I did not just fix it

Adding evac_minor to PR_ARMS today would fail every PR: 13 of 21 corpus cells are still red on that arm (2 crashes + 11 mismatches after #6982's fix). The gate has to become green-able first.

Suggested shape

  1. Land the outstanding rooting fixes (fix(gc): operand temporaries are precise roots — collection methods, constructor args, string-method receiver (#6970, #6969, #6971) #6983, gc: compiled constructor receiver goes stale across the globalThis-population collection (unmasked by #6982) #6991, gc: proven-this method value is lost across a relocating minor (TypeError: bump is not a function) #6992, gc: scalar-replaced object/array locals holding heap values are not precise roots #6968) until the evac_minor column is green or has a documented, enumerated skip list.
  2. Then add evac_minor to PR_ARMS, with the remaining known-red cells in an explicit allowlist (same provenance discipline as test-parity/known_failures.json, cf. test-parity: audit known_failures.json — every entry needs an issue # and date #797) so new breakage is caught but known breakage does not block.
  3. Until then, consider a non-blocking evac_minor PR run so the signal is at least visible on the PR page rather than only after merge.

Related: #6981, #6982, #6991, #6992, #6977, #6950.

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