Skip to content

fix(runtime): match node on the gap-suite regressions - #12149

Draft
steinybot wants to merge 45 commits into
PerryTS:mainfrom
steinybot:steiny/ci2-gap-regressions
Draft

steinybot wants to merge 45 commits into
PerryTS:mainfrom
steinybot:steiny/ci2-gap-regressions

Conversation

@steinybot

@steinybot steinybot commented Oct 7, 2026 •

Copy link
Copy Markdown
Contributor

Merge in this order:

  1. fix(docs): the my-bindings fixture reads buffers inside a no-GC scope #12112
  2. fix(ext): ext-crate tests root values through RuntimeHandleScope #12113
  3. fix(runtime): audit the new raw stores and classify addresses with addr_class #12114
  4. ci: register the dark GC witnesses and isolate the new test counters #12115
  5. refactor: split five files back under the 2000-line cap #12116
  6. fix(runtime): root raw handles across calls and correct the handle ratchets #12117
  7. fix(runtime): instanceof never mints a class object for a builtin id #12118
  8. fix(gc_effects): exempt aHash's random-source init from the indirect-call taint #12119
  9. docs: regenerate the API reference #12120
  10. fix(runtime): clear the gates that #12109 left red #12121
  11. fix(runtime): match node on the gap-suite regressions #12149 (this PR)

Problem

CI on main is red again after #12025. Commits since then broke check, warnings, cargo-test, gc-call-effects, self-test-checkers, gap-suite and fourteen lint steps, so no PR can show a green build. Each later failure in a job was hidden behind an earlier one.

Solution

Fix each breakage in its own PR. Each PR targets main and holds every fix above it in the order list, so the last PR is the one that can run fully green. Merge in order: each diff then shrinks to its own fix.

In this PR

Fixes the gap-suite regressions. Main's gap shards are usually cancelled by the next push, so about 30 tests had been failing unseen. None comes from this chain: base and tip give identical results. This PR also merges current main and fixes the gates that main's newest commits left red. Main has since fixed some of the regressions itself, and this PR takes main's fix in each case.

Changes

  1. Brand-check the Function.prototype call and apply thunks (diff). Once lowering stopped folding apply.call(undefined, ...), those calls reached thunks that never checked this. They returned undefined where node throws a TypeError.

    // `Function.prototype.call.call(undefined)` reaches here with the
    // non-callable receiver as `this`; the value-call bridge would return
    // `undefined` for it instead of the spec `TypeError`.
    if unsafe { crate::object::fn_proto_receiver_not_callable(target) } {
    crate::object::throw_fn_proto_not_callable("call");
    }

  2. Match node on the other regressions (diff). Function property delete, Intl subclass fields, the bind/call/apply alias fold, toLocaleString, util.inspect depth, Temporal constructor, the CJS exports.undefined wrapper, and the macOS hot-TLS asm.

  3. Fix the gap harness and record iterret (diff). The harness strips the new GC banner and uses an expected file when Node crashes. Both snapshot changes come from CI's Linux reports: 2159 now passes, and iterret_generator_prototype is recorded against Generator objects own next/return/throw, so a patched %GeneratorPrototype% method is ignored #12148.

  4. Give perry-ext-zlib's test runtime the stdlib features (diff). a139abd declared the dev-dependency without features, so the well_known guard test failed.

    # Same feature set as the shipped runtime, as every perry-ext-* crate keeps it
    # (#6303 `default`, #6314 `stdlib`); `ext_crates_bundle_a_full_featured_perry_runtime`
    # in well_known.rs guards it.
    perry-runtime = { workspace = true, features = ["default", "stdlib"] }

  5. Keep three fixtures within their purpose (diff). 79dc03e chose miniz_oxide, whose bytes differ from node's, so the zlib fixtures check the round trip and the decoded CRC. The gc_11828 and cb-sqlite fixtures drop loops and churn that timed out on CI but test nothing extra.

  6. Fix the gates that main's newest commits left red (diff). Each one also fails on main at 6521c0c.

    • warnings: accessor_entry_pair gets its only caller's cfg, and an unused import goes.
    • cargo-test: PERRY_B4_SABOTAGE changes emitted code, so it now keys the build cache.
    • Store-site, addr-class and string-payload gates: audit markers on new raw writes, is_handle_band in byte_word_address, and OwnedStringBytes in one test.
    • Inventories that still named deleted or rewritten code: shape census, thread-exit verdicts (new REGIONS map), registry floor, ephemeron seed rekey, native-handle ledger, and the rooting doc's workflow path.
    • weakmap-owned-index-validation.md is now a historical record for the knob gate. The run that it records used PERRY_GC_STRESS_SEED and PERRY_GC_STRESS_RATE, which no parser reads, so that run was not GC-stressed.

    pub(crate) fn byte_word_address(bits: u64) -> Option<usize> {
    let tagged = (bits & crate::value::TAG_MASK) == crate::value::POINTER_TAG;
    if !tagged && (bits >> 48) != 0 {
    return None;
    }
    let addr = (bits & crate::value::POINTER_MASK) as usize;
    if crate::value::addr_class::is_handle_band(addr) {
    return None;
    }
    if tagged {
    return Some(addr);
    }
    raw_byte_word_is_owned(addr).then_some(addr)

  7. Regenerate the call-effects tables (diff). macOS is generated locally. Linux and Windows come from CI's jobs on this branch, and CI's macOS output matches the local one.

🤖 Generated with Claude Code

https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7

steinybot and others added 30 commits October 7, 2026 10:39
read_buffer_bytes takes a NoGc scope since PerryTS#12103, so the fixture no
longer compiled, and the warnings and check jobs stopped there. The
fixture's tests also call runtime-backed perry-ffi functions, so they
take perry-ffi with runtime-link as a dev-dependency, like the ext
crates.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
The runtime does not export the shadow-stack entry points on native
stack-map targets. The http, net, streams and ws test modules called
them, so they no longer compiled and the warnings job failed.

On those targets the guards' shadow frames rooted nothing. The net and
http tests now hold the values that must survive a collection in a
RuntimeHandleScope. The guards call gc_init(), which registers the
runtime-handle scanner that program startup would register.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
…dr_class

The GC store-site, address-classification and SSO inventories failed
on main.

- Store sites: the new raw writes get audit markers. None of them
  stores a GC reference in a heap slot, so no barrier was missing.
- Address classes: the new GcHeader casts use the gc and addr_class
  helpers, and the clone writer's handle floors use is_handle_band.
- SSO: the stream emitter's shape fast paths read a key's header
  through heap_string_header, which declines a short string.

The clone writer now returns an empty string for a STRING_TAG payload
in the handle band, where it read memory before. The method-site
helpers now decline a misaligned or out-of-range address before they
read a header. Both baselines go down.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
Four lint steps failed on main.

- Local binding audit: receiver_kind reads a typed-array hint. The
  emitted guard checks the receiver's kind at run time, so a wrong
  hint only loses the fast path. The allowlist records it as
  runtime-validated.
- Test registration: the checker now accepts a #[path] declaration
  in a sibling file. native_payload_lifecycle.rs was declared that way
  and its tests already ran.
- Test registration: three test_gap_gc fixtures join the GC corpus.
  The fixture-env parser accepts PERRY_GC_PROTECT_OLD_SWEEP, which
  two of them set. protected_poll_reclaim gets the parity-env line
  that its header describes, so its collections now run.
- Per-test global sinks: the new test counters use per_test_global!.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
Each split moves whole functions or inline test modules into a child
file. Module paths and test names do not change.

- dynamic_dispatch.rs: build_direct_method_args moves to
  dynamic_dispatch_args.rs.
- node_stream_readwrite.rs: the chunk and byte collectors move to
  node_stream_chunk_collect.rs.
- method_site.rs: prime_inherited and the constfn tests move to child
  files.
- delete_rest.rs and read_holder.rs: their inline test modules move
  to child files.

The buffer-layout and address-class baselines follow the moved
node_stream lines. Their totals do not change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
…tchets

Six ratchet steps failed on main.

- Raw-handle debt: each flagged site now uses with_*_ptr for a call
  that cannot collect, or RuntimeHandle::across_* where an allocating
  call comes before a re-read. The baseline falls from 861 to 848.
- iterator_push_pending read a raw promise and iterator after
  js_array_alloc and js_array_push_f64. It now roots both values and
  re-reads them after each call.
- Native-handle ledger: the zlib Statics rule required a field that
  no longer exists, so it counted 0 tables. It now counts the streams
  and listeners maps, which are keyed by i64 handles.
- Unrooted locals: the collection-point matcher matched "gc(" inside
  no_gc(. Names now match only at the start of an identifier. The
  self-test plants both cases.
- Thread-exit globals and registry lifetime: delete the entries for
  INLINE_OWNING_U32_CACHE and VERDICT_CLASSES, which no longer exist.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
The perry-runtime test binary aborted in the stream instanceof test, so
cargo-test stopped before most suites ran.

- instanceof: live_chain_answer and the native-subclass static arm
  passed builtin class ids, such as PassThrough's, to
  class_constructor_ref_value. Only a compiled class has a class
  function object. Both now check is_compiled_class_id and fall back
  to the declared chain walk. A release build no longer mints a bogus
  pinned closure for a builtin id.
- Regex program cells: init_program_cell wrote None through a
  temporary after it zeroed the payload, which copied stack bytes into
  the cell. It writes a field only if the field does not already read
  as None.
- The residual-prototype relocation test registers the object-model
  scanners. Its setPrototypeOf calls fill the canonical-keys trie, and
  without a scanner a copying minor left stale key cells. CI crashed
  on this intermittently.
- Stale tests: the thread-exit closure and symbol side-table tests
  follow PerryTS#11931, and the macOS length test follows PerryTS#10694.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
The guarded writes in init_program_cell sit outside the window of the
existing POINTER_FREE marker, so the store-site inventory flagged
them. They fill a fresh, unpublished cell whose fields hold no GC
pointer.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
…call taint

Since PerryTS#11992, NATIVE_CALLABLE_EXPORTS builds an ahash::RandomState in
its thread-local initializer, and every HotKey slow path reaches that
initializer. aHash's RAND_SOURCE OnceBox init makes one indirect call.
The call drops the losing Box<dyn RandomSource>, which is always a
DefaultRandomSource with no drop glue. The classifier treated the call
as unknown, so about 740 macOS symbols became Reenters, js_arena_alloc
among them.

A new indirect rule exempts that one instantiation. A forbid rule on
set_random_source keeps the exemption sound. The thread-creation rule
also matches Arc's new alloc::rcs::arc path, which the nightly bump
renamed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
The table is regenerated from this branch's release archives with
scripts/gc_call_effects/regen.sh macos-aarch64. With the aHash rule,
js_arena_alloc stays AllocOnly and 809 symbols stay Leaf. The changed
rows come from runtime code that changed after the last regeneration.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
On linux-x86_64 the NATIVE_CALLABLE_EXPORTS taint reaches a different
aHash initializer: OnceBox<[[u64; 4]; 2]>::init for the fixed seeds.
get_fixed_seeds fills that table from getrandom, and the register call
in init is that getrandom or dealloc path. CI's fresh Linux table
still had AllocOnly at 3 and js_arena_alloc as Reenters without this
rule.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
docs/src/api/reference.md is empty on main, so the check job's API docs
drift step fails. scripts/regen_api_docs.sh output restores it from the
manifest. docs/api/perry.d.ts does not change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
The holder census matched a static only when the line started with
`static`. A one-line `per_test_global!(static X: T = ...)` was
invisible, although it expands to a real static outside tests. That
made the iterator_close CALLS entry read as stale. DECL now accepts
the macro prefix, and the self-test plants that form.

The thread-exit audit shares the census, so it now sees the timer
STORE map. Its entry names purge_agent_timers, which retire_agent
calls to drop the exiting agent's partition.

GC_INIT_DONE's frontier pin is deleted. The ext-http test guard now
calls gc_init, so the bare-name graph reaches it. The holder is a
Cell<bool> and never needed coverage.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
PerryTS#12109 (node:sqlite on native payloads) failed six checks on main.

- File size: native_payload.rs's hidden JS-state group moves to the
  native_payload_state.rs child. The public paths are re-exported.
- Address classes: install_own_builtin_accessor guards with
  is_handle_band. The guard also rejects 0x10000..0x100000, where no
  heap object lives.
- Raw-handle debt: the native-payload tests and native_payload_birth
  pass handles through with_mut_ptr and with_const_ptr.
- Native-handle ledger: PerryTS#12109 removed three sqlite handle tables, so
  the census fell below the fixed floor of 200. The floor now follows
  the ledger: the census may not drop below 90% of the recorded totals
  or below 150. The self-test plants a collapse and a 20% drop.
- GC holders: four holders lost their accidental coverage with the
  sqlite scanner. Each gets a researched not_a_gc_pointer verdict.
- Warnings: drop an unneeded unsafe block and two unused imports.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
…12121)

The thread-local policy ratchet in self-test-checkers failed on main.
Fourteen raw thread_local! declarations become perry_thread_local!, so
their address comes from the per-thread hot cache. The two
alloc_census.rs declarations stay raw and are recorded: the allocator
hook reads them before the runtime's TLS exists, and a HotKey's first
touch would allocate and re-enter that hook.

The async_context.rs and builtin_closure_metadata.rs counts are
re-recorded lower. The PASS1_MARKED holder pin follows the edited
allocation_pacing.rs after a re-audit of its window.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
The table lacked the js_perry_bytes_* and js_perry_stream_* entry
points that the scoped byte API and native-payload streams added, so
the lint job's ABI consistency step failed. This is the output of
scripts/runtime_abi_check.py --emit-wasm-abi.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
…2121)

The table is CI's fresh output from the gc-call-effects
(windows-x86_64) job on this chain. That job cross-builds the archives
with cargo-xwin, which this branch's author cannot run locally. The
committed table had 13 symbols in a weaker class than the archives
prove.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
…TS#12121)

z8 failed on main and on this chain. It bounded anonymous RSS on a
process that had run about 5000 tests. mimalloc commits and purges
memory in 5 to 11 MB steps on its own schedule. CI showed a
one-time 6.4 MB step, then a fall. On macOS the RSS probe read 0, so
the test could not fail there.

The test now bounds the thread's retained heap after a full
collection: arena bytes, external bytes and payload-reported native
bytes. The peak may sit less than 64 KiB above the warm batch, so a
leak of 44 bytes per stream fails. A new retain_chunk sabotage keeps
every finished chunk alive while every counter stays green, and the
bound turns the test red.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
The table is CI's fresh output from the gc-call-effects-linux job on
this branch, with the aHash fixed-seed rule in place. js_arena_alloc
stays AllocOnly, and 811 symbols are Leaf. The committed table
had 9 symbols in a weaker class than the archives prove.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
c346a01 keeps private entries and public properties in separate key
namespaces. Four sites still treated a private entry as a flagged
property, so `static #n = 8; A.#n` read undefined and the key leaked
as a public property.

- Claiming a defined static converts its property slot in place
  (AttrsEdit::ClaimPrivate). It no longer appends an empty private
  entry.
- js_class_object_define_static_private writes the private entry
  directly. [[Set]] now throws "Cannot write private member" there.
- Private get and set find the entry on a class object and in a class
  closure's property bag, so a write no longer creates a public twin.
- Object spread drops private slots by position.

Each class-expression evaluation's prototype also gets its
symbol-keyed methods, under that evaluation's private brand.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
buffer_addr_from_raw stripped any tag to 48 bits, so a plain number
such as fd 65 became a heap address. fs path validation then crashed
on the header read (PerryTS#10694). boxed_primitive_payload read a subnormal
double such as 1e-310 as a raw pointer and crashed in toString. Both
now classify with addr_class::object_ref_addr, which checks the tag
first and asks the allocator about a raw word.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
steinybot and others added 3 commits October 7, 2026 22:46
- Deleting a function's own user property no longer marks the key
  deleted, so the inherited Function.prototype member shows again.
- super.m() in a class that extends a native base such as Map reads
  the home prototype's [[Prototype]].
- An Intl subclass's super() copies the instance fields with define,
  not [[Set]], which hit the inherited getter-only format.
- Lowering no longer folds fnAlias.call(x, ...) into x.bind(...) for
  bind, call and apply. The fold recursed through a patched bind.
- The default toLocaleString runs an inherited user toLocaleString.
- util.inspect with a negative depth prints node's collapsed [Ctor].
- A Temporal value's property read falls back to its prototype.
- The CJS wrapper re-exports undefined, NaN and Infinity under a
  mangled name, so exports.undefined no longer shadows the global.
- The macOS hot-TLS mrs asm is a gc-leaf-function, so an inlined copy
  is not wrapped in a statepoint.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
…#12148

- The harness strips the [gc-sweep-quarantine] banner, as it strips
  [gc-schedule].
- A Node crash is not node_fail when test-parity/expected has the
  test's output. better_sqlite3_close gets an expected file from Node
  26.5.1 with better-sqlite3 on Linux, because the oracle does not
  install that package.
- test_gap_11836 forces only evacuation. 9af2d89 deleted the
  shadow-frame retry that its RS4GC budget used to reach.
- gap_snapshot.py writes both snapshot changes from CI's Linux
  reports: 2159 now passes, and iterret_generator_prototype fails
  until generator methods move to %GeneratorPrototype% (PerryTS#12148).
  known_failures.json follows.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
Main fixed several of this chain's targets in parallel. Main's version
wins where both fixed the same thing:
- the zlib ledger census and its floor
- the residual-prototype test's scanners
- the native_payload and node_stream_readwrite splits

Our raw-handle and addr_class edits are re-applied on main's files. z8
keeps main's scanner set and block-sized batches, with this chain's
retained-heap bound in place of the RSS bound.

Main's new code also failed six gates, fixed here:
- the string payload offset
- one raw-handle site
- the 2 MiB block size in the GC doc
- two holder verdicts
- two per-test counter names
- six warnings

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
@coderabbitai

coderabbitai Bot commented Oct 7, 2026

Copy link
Copy Markdown

Important

Draft PR not reviewed

Draft PRs are not automatically reviewed by default.

  • Trigger a manual review

To automatically review draft PRs, update your CodeRabbit configuration:

reviews:
  auto_review:
    drafts: true
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

steinybot and others added 12 commits October 7, 2026 23:26
The merged main changes the runtime: 2 MiB GC blocks, OS-backed arena
regions, and zlib codecs on native payloads. This is the output of
scripts/gc_call_effects/regen.sh macos-aarch64 at this branch's tip.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
These are CI's fresh outputs from the gc-call-effects jobs on this
branch with main merged. This Mac cannot build the Linux archives or
cross-build the Windows ones. CI's macOS output for the same run
matches the committed macOS table byte for byte.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
…ceiver (PerryTS#12149)

Lowering no longer folds `apply.call(undefined, ...)` into
`undefined.apply(...)`, so these calls reach
function_prototype_call_thunk and function_prototype_apply_thunk.
Neither checked that `this` is callable, so `call` and `apply` on
undefined, null or a boolean returned undefined. Node throws a
TypeError, and test_gap_3662_function_proto_brand_check expects one.
Both thunks now run the brand check that method dispatch uses.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
…erryTS#12149)

a139abd added perry-runtime to perry-ext-zlib's dev-dependencies
without features. Every other ext crate declares it with default and
stdlib, and the well_known guard
ext_crates_bundle_a_full_featured_perry_runtime requires that, so
cargo-test failed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
…purpose (PerryTS#12149)

- zlib_one_shots and zlib_paths: 79dc03e moved deflate to
  miniz_oxide on purpose, and its bytes differ from Node's. Node's
  gzip header also carries the host OS byte. The fixtures now check
  what holds on every platform: the round trip, sync and callback
  agreement, the gzip magic, and the decoded CRC.
- gc_11828: two per-byte JS loops outside the stream under test caused
  276k forced collections and a 10 s CI timeout. The fill uses
  Uint8Array.from and the sampler steps by 97. Moved objects stay near
  14k, so the stream path is still tested.
- cb-sqlite_perry: the harness now compares it against its expected
  file, and the T10 churn of 220k databases timed out on CI. 22k
  databases still catch a leak against the 64 MB bound.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
Main fixed several of this branch's targets itself. Main's version
wins where both fixed the same thing:
- 2c50378 static private fields: our slot claim, static-private
  define and class-object private storage are dropped.
- a09626c buffer words classified by tag: our buffer/query.rs fix
  is dropped.
- the byte-cell series in buffer/backing.rs and buffer/view.rs.
- read_holder.rs, now under the cap without our test split.

Two of our private-member fixes stay, because main's fix does not
cover them: spread drops private slots, and each class-expression
evaluation gets its symbol-keyed methods. The subnormal toString fix
also stays.

Two fixes to code from main:
- alloc.rs uses an empty key slice when a weak collection passes a
  null pointer at length 0.
- buffer_b4.rs gates a Linux-only local, so macOS builds without
  warnings. The
GC-holder JSON merges both sides' verdicts and re-pins PASS1_MARKED.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
Take main's side in the three Rust conflicts. Main rewrote the super
property read, the class-id band check and the dynamic dispatch module.
Delete dynamic_dispatch_args.rs, because main's dispatch module no longer
uses it. Keep main's holder inventory and re-pin PASS1_MARKED for the
policy.rs change in 0ebee67, which only edits a mutator-side parse bump.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
…erryTS#12149)

Gate accessor_entry_pair with the same cfg as its only caller, the probe
module. Without the gate, `cargo check -p perry --bins` fails on dead code.
Drop an unused import from iterator_step_tests.rs.
Add PERRY_B4_SABOTAGE to BUILD_CACHE_ENV_VARS. Each sabotage mode changes
the emitted object, so a cached object must not serve the other setting.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
… main code (PerryTS#12149)

Add GC_STORE_AUDIT markers to seven raw writes that main added. Each one
initializes fresh storage or copies numeric lanes.
Replace the 0x1000 floor in byte_word_address with is_handle_band. The
check now covers the tagged payload too, so a POINTER_TAG handle is never
read as an address.
Read the SSO test's string bytes through OwnedStringBytes instead of an
open-coded StringHeader offset.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
…PerryTS#12149)

Main deleted, retyped or rewrote several entries that the lint inventories
still name. Update each inventory to match the code:
- Shape census: rustfmt split one callsite line, and the RegExp birth now
  calls prepare_shape(receiver).
- Thread-exit verdicts: delete three statics that no longer exist. Classify
  the new REGIONS map as thread_exit_invalidated by `unmap`.
- Registry lifetime: lower MIN_REMOVING to 169. Main deleted or retyped
  every registry that left the list, so the scanner still matches.
- Rekeyed tables: classify the ephemeron seed list as self_pruned by
  clear_seeds.
- Native-handle ledger: delete the stale weakref/index.rs entry.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
…ord (PerryTS#12149)

Main folded gc-root-dominance.yml into the gc-root-dominance job in gc.yml.
That job runs on PRs only with the run-extended-tests label. Update the two
references in gc-rooting-invariant.md.
List weakmap-owned-index-validation.md in HISTORICAL_DOCS. It records one
past run with the knob names that the run used. Those names have no parser.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7

This branch has not been deployed

No deployments
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