Merge train: #9918, #9950, #9957, #9958, #9976, #9977 - #9981
Merged
Conversation
(cherry picked from commit d8daa4f)
(cherry picked from commit e2b0a90)
(cherry picked from commit 7a44e59)
(cherry picked from commit 6ea7ad9)
(cherry picked from commit c217a23)
(cherry picked from commit 883d334)
Replace whole-map overflow clears with one-entry eviction, and keep content-cache entries pinned while a recorded literal site refers to them. Only dynamic or displaced-site entries can leave the bounded table. Add a sabotage test that crosses both cache bounds, collects dead nursery headers, and proves the recorded literal does not rebuild. (cherry picked from commit ce9e128)
Use scoped handle access in the nursery relocation fixture, gate the Arc import to the matcher feature, and document why matcher kinds are dead in the feature-off layout-only build. Remove the unused test import and unsafe block, and apply rustfmt's module ordering. Claude-Session: https://claude.ai/code/session_011dhBmdn4vGgNibjo3oZqTo (cherry picked from commit dd1c524)
Cache and root one RegExp header for literal-only test call sites, while validating the builtin method on every evaluation and preserving generic fallback semantics for patched prototypes and changed factory callees. Recognize exact zero-argument regex factories by their HIR body and pair cross-function sites with the resolved native callee identity. Reset global and sticky lastIndex before each cached test, expose decline diagnostics, and register all regex cache tables with the GC census. (cherry picked from commit 90e2131)
Document the implementation SHA, source map, validation status, expected diagnostic movement, and the exact full-recompile measurement request. (cherry picked from commit 47370d8)
Keep the merge-train's existing RegExp prototype holder verdicts instead of registering the same three holders twice. Express the literal-site canonical check and its post-call handle reload with the sanctioned across_mut form. Claude-Session: https://claude.ai/code/session_011dhBmdn4vGgNibjo3oZqTo (cherry picked from commit 54c9373)
Append the 2026-09-07 CI-fix handoff with exact fixed code heads, per-item static gate results, disk-skipped cargo gates, and both branch range-diffs. Claude-Session: https://claude.ai/code/session_011dhBmdn4vGgNibjo3oZqTo (cherry picked from commit a93908a)
Add requested-only rows for the common regex-owned tables and reconcile their de-duplicated byte estimates with the heap census side-table total. Cover the emitted inventory and the no-construction-cost contract directly. Claude-Session: https://claude.ai/code/session_011dhBmdn4vGgNibjo3oZqTo (cherry picked from commit 49f551f)
Measure the #9958 site-rooted headers and their gross pinned program lower bound separately from de-duplicated side-table attribution. Include the content and literal-key tables that provide the other owners. Claude-Session: https://claude.ai/code/session_011dhBmdn4vGgNibjo3oZqTo (cherry picked from commit 5e80791)
Record the row accounting, reconciliation contract, sabotage coverage, mainline cherry-pick proof, local gates, and RX2 perrymaster request. Claude-Session: https://claude.ai/code/session_011dhBmdn4vGgNibjo3oZqTo (cherry picked from commit fe38040)
Keep minor remembered sets for boxed roots and the shape table's carrier mutations. Compact both sets after each minor while retaining authoritative full-table walks for major collection. Report whole copied-minor pause time and its scanner share together. (cherry picked from commit 64ef925)
Record the scanner map, sabotage-able test coverage, disk-gated validation, predictions, and the exact perrymaster follow-up request. (cherry picked from commit 194fcb6)
Account for the successful copying-minor path with diagnostic-only wall-time buckets that partition the same interval as pause_us. Include per-table from-space finalization and dead-owner prune detail so the remaining fixed minor cost can be localized from one complete ran line. (cherry picked from commit 0984678)
Make descriptor, closure metadata, template, array named-property, and symbol side-table minor scans proportional to entries that can still move, die, or expose a young strong edge. Keep full scans authoritative and use test-only re-derivation sabotage checks to enforce every write funnel. Narrow descriptor and closure owner retention to collectible metadata keys; long-lived values remain logged only where their transitive edges require it. (cherry picked from commit dae5192)
Record the phase instrument, young-log mappings and sabotage coverage, shape residual analysis, validation results, performance predictions, and the exact perrymaster relink and measurement request. (cherry picked from commit de6bfd5)
Restore the dense full-table walkers for template roots and symbol side tables after MP measurements showed that their keyed young paths cost more. Remove the associated publication upkeep and rederivation tests while leaving the three measured wins and descriptor narrowing intact. Move the built-in closure young log onto hot TLS and update the thread-local and rekey policy inventories for the callable-exports module split. Claude-Session: https://claude.ai/code/session_011dhBmdn4vGgNibjo3oZqTo (cherry picked from commit 151680f)
…minor A minor can only remove nursery owners, so walk the per-object layout tables' young-entry log rather than every standing key. Full collections retain the whole-table prune and rebuild the log from survivors. Replay 19a6cd2 on the #9957 phase-instrument tree. Its runtime hunks are unchanged; the young-log test file keeps both the newer fixed-cost scanner tests and the replayed layout-prune tests. Claude-Session: https://claude.ai/code/session_011dhBmdn4vGgNibjo3oZqTo (cherry picked from commit dd279a8)
Under PERRY_LAYOUT_DIAG, time each existing death-prune walk and emit marginal histograms for surviving mask owners, slot counts, pointer share, and heap space. Price the standing residue as per-key prune nanoseconds and the maximum tag checks masks can save in one full trace. Keep insert provenance in diagnostic-only counters so LayoutSlotMask and the unarmed trace/store representation do not change. Cover kind/bucket routing and prove the unarmed histogram loop stays dark with sabotage-capable tests. Claude-Session: https://claude.ai/code/session_011dhBmdn4vGgNibjo3oZqTo (cherry picked from commit 97b5500)
Record the replay evidence, field derivations, sabotage-capable tests, follow-up rule candidates, and exact Stage LP measurement request. Preserve the binding disk-floor result for the release gates that could not start. Claude-Session: https://claude.ai/code/session_011dhBmdn4vGgNibjo3oZqTo (cherry picked from commit 2278111)
Document the required target cleanup after the final Cargo gates were blocked by the campaign's 12 GB free-space floor. Claude-Session: https://claude.ai/code/session_011dhBmdn4vGgNibjo3oZqTo (cherry picked from commit a4a6978)
Distinguish the two replay tests covered by the focused layout filter from the remaining named test whose full-suite gate was blocked by disk capacity. Claude-Session: https://claude.ai/code/session_011dhBmdn4vGgNibjo3oZqTo (cherry picked from commit 324166e)
- copying.rs reached 2066 lines. The remembered-set scan and pinned-young preflight move to copying/remembered_scan.rs. Their `pub(super)` meant `gc` in the parent and means `copying` in the child, so both are widened to `pub(in crate::gc)` to keep the original reach. - regex_census.rs: `rows` is extended only under `regex-engine`, so the binding is unused-mut without that feature and REQUIRES mut with it. Scoped the allow to the feature-off build rather than dropping `mut`, which breaks the feature-on build. (My first attempt dropped it.) - shapes.rs: #9976 deliberately removed `family_push_back`'s production rekey caller — the scanner-internal rekey note explains why re-entering the writer funnel mid-walk is wrong — leaving shapes_test_support as its only consumer. Gated `#[cfg(test)]` to match. - Five new holders classified: BOX_YOUNG_ROOTS is covered_elsewhere, since every address in that minor remembered set is also in the box registry that scan_box_roots_mut walks; the four test seams and the histogram counter are not_a_gc_pointer. - PASS1_MARKED re-audited: gc/mod.rs gains two module declarations and one reg_scanner! registration, gc/census.rs widens side_tables() and adds census rows plus a test. A scanner registration adds a root SOURCE and runs nowhere between the census boundaries; census reporting runs from the diagnostic dump, not inside a cycle. LAYOUT_DIAG's entry is deleted: the holder became covered, which the gate calls the receipt.
This was referenced Sep 7, 2026
Closed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Merge train: #9918, #9950, #9957, #9958, #9976, #9977 — the two stacks (#9918 ⊂ #9958 ⊂ #9977 regex, #9950 ⊂ #9957 ⊂ #9976 GC), kept out of #9978 so a failure in ~8k lines of GC and regex work stayed attributable.
The conflict worth recording
In
copying.rs, #9976's side of a hunk was empty, which reads as "theirs has nothing to add" and is wrong: it meant #9976 deleted that region, having relocatedfinalize_dead_copied_minor_from_space_side_allocationsintocopying_phase.rswith a new return type. Keeping ours produced a duplicate definition and a type error. The correct resolution splits the hunk — keep #9861'sLAST_COHORT_SPLITtest helpers, which #9976's base predates, and drop the relocated function. An empty side is a deletion, not an abstention.The
[gc-copy-minor]diagnostic line conflicted twice, because #9861 (landed in #9978) added cohort-split fields while #9976 addedpause_us/scan_usand thenphases:. Merged to carry all of them; placeholder and argument counts verified equal (22/22) rather than assumed.Gate fixes
copying.rshit 2066 lines. The remembered-set scan and pinned-young preflight move tocopying/remembered_scan.rs. Notepub(super)meansgcin the parent andcopyingin the child, so a straight move silently narrows reach and the glob re-export then has nothing public enough — both are widened topub(in crate::gc).family_push_backbecame dead in a product build. Before gating it I checked that perf(gc): prune the per-object layout tables from a young-entry log (replay of #9895) + a residue histogram — 4 ms per steady minor on cc #9976 dropping its production rekey caller was deliberate: it is, and the replacement comment explains that re-entering the writer funnel mid-walk would enqueue the same family twice.shapes_test_supportis now its only consumer, so#[cfg(test)]matches.regex_census.rs'srowsis extended only underregex-engine: unused-mut without the feature, required with it. The allow is scoped to the feature-off build rather than droppingmut, which breaks the other configuration.BOX_YOUNG_ROOTSiscovered_elsewhere— every address in that minor remembered set is also in the box registryscan_box_roots_mutwalks, so the log is an accelerator, not an independent holder. The four test seams and the histogram counter arenot_a_gc_pointer.PASS1_MARKEDre-audited.gc/mod.rsgains two module declarations and onereg_scanner!registration; a scanner registration adds a root SOURCE and runs nowhere between the census boundaries.gc/census.rswidensside_tables()and adds census rows plus a test — reporting that runs from the diagnostic dump, not inside a cycle.LAYOUT_DIAG's entry is deleted because the holder became covered, which the gate calls the receipt.Validation
run_lint_gates: 3 of 80 FAILED, all accounted for: public-baseline is pre-existing onmain(verified on a pristine worktree, red since 2026-07-29), and the two API docs gates are an artifact of this session'sCARGO_TARGET_DIRoverride —regen_api_docs.shhardcodes$ROOT/target/release/perry. With the binary placed where it expects, regeneration succeeds and the drift check is clean.