Repository navigation
ci: fix main's mechanical and stale reds (fmt, clippy, tokio-ban, tls-budget, Windows dladdr, stale ledgers); list the GC-audit reds for their authors - #14604
Conversation
|
Full output of raw_handle |
|
Full output of string_payload |
|
Full output of thread_exit |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CUQanVsnitcrmYLAWWPc3p
|
No actionable comments were generated in the recent review. Walkthrough
Merge Risk:
|
…ture lock PerryTS#14482 removed the perry-uuid entry from tests/integration/release/packages/next-app-route/provider/Cargo.lock by hand and kept its `[[package]]` header, so two headers sat back to back. TOML reads that as a package table with no keys, and `scripts/tokio_inventory.py --offline` (the `tokio-ban` job) dies on `package["name"]` with KeyError on every PR. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CUQanVsnitcrmYLAWWPc3p (cherry picked from commit cfbb112)
74304a9 added a raw `thread_local!` to crates/perry-runtime/src/wpfacts_check/family.rs, which `scripts/check_thread_locals.py` refuses, so `tls-budget / self-test-checkers` fails on every PR. `crate::perry_thread_local!` takes the same syntax and the same `.with()` calls, as `wpfacts_check/life.rs` already does. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CUQanVsnitcrmYLAWWPc3p (cherry picked from commit 50d4c70)
- perry-wpfacts solve/strs.rs: STRS_K is usize::MAX (the cap is off, model.rs), so `len() > STRS_K` is always false and absurd_extreme_comparisons denies it. Allowed on the two functions with the reason; behaviour unchanged. - perry-runtime math.rs js_math_exp: INV_LN2 and E are written as std::f64::consts::LOG2_E and ::E (approx_constant). Same bits: 0x3FF71547652B82FE and 0x4005BF0A8B145769. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CUQanVsnitcrmYLAWWPc3p
alloc_life::image_base and wpfacts_check::life::symbol call libc::dladdr / Dl_info unconditionally, so `cargo xwin check -p perry-runtime` (lint: Type-check Windows runtime and stdlib) fails with E0425. Off unix they return the values both already return when dladdr finds nothing: 0 and "?". Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CUQanVsnitcrmYLAWWPc3p
Each gate names these as matching nothing any more and asks for deletion;
only those entries are removed, no ceiling or baseline is raised.
- native_handle_ledger.txt: turnloop_h2/mod.rs and turnloop_serve/conn.rs
(ledger 1 table, measured 0). Tables 116 -> 114 vs main, none raised.
- gc_runtime_root_holders.json: 11 holders under "no longer match an
uncovered holder" (IN_FLIGHT, CP_LIVE_COUNT, CP_REFED_COUNT,
MAP_FOREACH_STACK, RUNNING, SET_FOREACH_STACK, NEXT_PORT_ID, ACTIVE,
PENDING x2, DRIVERS). None reappears among new or unclassified holders.
- thread_exit_address_globals.json: fn_metadata_owner.rs INDEX ("stale entry
- no such candidate static").
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CUQanVsnitcrmYLAWWPc3p
test_gap_gc_namespace_call_callee_rooting and test_gap_gc_scalar_ctor_arg_rooting were added by 43d4dd5 but not listed in tests/parity/gc_repsel_corpus.txt, so gc_repsel_matrix.sh never ran them and check_test_registration.py fails lint. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CUQanVsnitcrmYLAWWPc3p
check_gc_doc_claims.py checks that a code span starting with a repo root names an existing path; `tests/parity/<root>/<subject>/` and `tests/parity/snapshots/<platform>-<mode>/<subject>.json` do not, so lint fails. The existing directory stays in the code span and the placeholder pattern moves to its own span. Wording otherwise unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CUQanVsnitcrmYLAWWPc3p
Mechanical: `cargo fmt --all` on main (222 files), which the `lint` job's "Check formatting" step rejects. No hand edits; regenerate with `cargo fmt --all` when rebasing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CUQanVsnitcrmYLAWWPc3p
`cargo fmt --all` changed the code-line count of six allowlisted files; check_file_size.sh asserts exact counts. Only those six entries change (`./scripts/check_file_size.sh --update`), all from formatting: codegen/mod.rs 3677->3709, stmt/loops.rs 8456->8453, object/shapes.rs 4937->4944, snap_census/runner.rs 4749->4768, stdlib streams.rs 2448->2454, run_pipeline.rs 6363->6366. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CUQanVsnitcrmYLAWWPc3p
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CUQanVsnitcrmYLAWWPc3p
bfe1107 to
bb455c1
Compare
…tion into grow_backing_unguarded
…eilings, two integration expectations (#14631) * fix(runtime): RecordArrayHeader size assertion holds on wasm32 `const _: () = assert!(size_of::<RecordArrayHeader>() == 24)` (#14487) pins the 64-bit layout; on wasm32 the `elems` pointer is 4 bytes and the head is 20, so `wasi-execution` fails building the runtime for wasm32-wasip1 with E0080. The head is reached only through the `js_record_array_*` entries and the GC through `elems_slot` (`addr_of_mut!`), so nothing depends on the width: the assertion now pins four u32 counts followed by the pointer with no padding (16 + pointer size), keeping the capacity (+4) and elems (+16) offsets. Checked by compiling the header and both assertions alone for wasm32-wasip1 and aarch64-apple-darwin: the old one fails on wasm32 with the CI message, the new one holds on both. `cargo test -p perry-runtime --lib record_array`: 16 passed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CUQanVsnitcrmYLAWWPc3p * style: cargo fmt --all `crates/perry-runtime/src/lib.rs` landed unformatted after #14604; the lint job's "Check formatting" step rejects it. Mechanical. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CUQanVsnitcrmYLAWWPc3p * chore(gates): delete the raw-handle ceilings the gate reports as matching nothing raw_handle_debt.py lists eleven per-module ceilings whose module now has no debt site ("matches nothing -- DELETE its line so the cleanup cannot be undone"): global_this_webassembly.rs and ten test modules under perry-runtime (gc/tests/..., node_stream_tests*.rs, node_submodules/test.rs). Only those lines go; `--no-raise-vs upstream/main`: baseline 861 -> 861, module ceilings 107 -> 96, none raised. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CUQanVsnitcrmYLAWWPc3p * test(wasm): two integration expectations follow console.log's one-line output #14625 made `console.log(a, b)` print its arguments on one line, as Node does, but left 20_string_from_char_code.expected and 22_cross_module_nested_object.expected in the old one-value-per-line form, so tests/integration/wasm/run_wasm_tests.sh fails both on main. The new contents are Node's output (the cross-module case run with explicit `.ts` imports), and the compiled programs print exactly that; the suite is back to 28 pass / 4 fail with the long-standing set. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CUQanVsnitcrmYLAWWPc3p * chore: changelog entry for #14631 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CUQanVsnitcrmYLAWWPc3p --------- Co-authored-by: Ralic Lo <raliclo@gmail.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Summary
mainfailslint,check,tokio-ban,tls-budgetandwasi-executionon every PR (recently merged PRs carry the same reds). This PR fixes the reds that are mechanical or stale and lists the rest — the GC-safety audits — for the authors to classify, because a wrong verdict there would turn a gate green while removing the check it exists for.Based on
c9b18ad22a(currentmain). It includes #14593 and #14594; those can be closed if this lands.What this PR fixes
c9ed857e1ftokio-ban:python3 scripts/tokio_inventory.py --offlineKeyError →clean (offline);--self-testandtest_tokio_gate.pyOK202599141dtls-budget:check_thread_locals.pyFAIL → OK;--self-testOK;cargo test -p perry-runtime --lib wpfacts_check10 passedb1c63a6eafcheckcheck:cargo clippy -p perry --binsand the host-compatible workspace clippy (CI command) both exit 0;cargo test -p perry-runtime --lib math9 passed; constants bit-identical71816996a1lintWindows type-check (E0425 ×4). Not run locally (needs the MSVC SDK via xwin); unix path unchanged3009c395ecnative_handle_ledger.py --no-raise-vs upstream/main: tables 116→114, none raised3f9b7ec3e9check_test_registration.pyand--self-testOK. The two tests were not run under the GC matrix locally9a26e83c24check_gc_doc_claims.pyand--self-testOK50bb907b04cargo fmt --all -- --checkOK717501869bcheck_file_size.shOK; only the six formatting-changed countsRules followed: no ceiling or baseline is raised; a ledger entry is deleted only where the gate itself reports it stale and the name does not reappear as a new or moved holder; nothing is classified on the authors' behalf.
The element-identity
cargo-testfailure is already fixed onmainby 398e5b4 (my #14598 took the same approach and is superseded).What this PR does not fix (needs the authors)
These require a GC-safety verdict per site (what the slot can hold, whether a barrier or root covers it). Output below is from this branch.
GcHeadercasts and thelayout_slot.rshandle floor (thepush_pop.rsentry moved with its call intogrow_backing_unguarded, split out by 8abbab5; that also fixes thecargo-testfailurenative_string_validators_use_canonical_classifier)GC_STORE_AUDIT(<class>)verdict; theclass_field_setwitness may have moved rather than vanishedperry_probe_getbypasses the receiver-layout authority--self-testmaintoo, on the same changed-source pinswrite_file_input/deferred.rsandgc/life_why.rs(from e6c71cd): each a new table over a ceiling of 0 (the two stale rows are removed by this PR)compile_env == {"PERRY_WRITE_BARRIERS": "0"}failsOther jobs, not touched here:
wasi-execution:const _: () = assert!(size_of::<RecordArrayHeader>() == 24)(crates/perry-runtime/src/record_array.rs, wpfacts, codegen, runtime: an Array of value records is a record array (value records VR-4b) #14487) fails on wasm32, where the header holds a 4-byte pointer. Whether codegen relies on the 24 on 32-bit targets decides the fix.gap-suiteparity regressions and thegc-stressfan-in failure were not examined.Array-type predicate lintself-test: BSDgrep;Validate Windows LLVM runtime npm staging: nollvm-objcopy); both pass in CI.Address-classification audit —
addr_classGC store-site inventory —
gc_store_siteLocal binding type-proof audit —
local_bindingReference-test audit —
reference_testSSO string-unboxing inventory —
sso_unboxObject-header shape-descriptor census —
shape_censusRuntime GC-pointer holder custody audit —
root_holders`--self-test` —
root_holders_selftestPoll-capable reach audit —
poll_reachNative-handle ledger ratchet —
native_ledgerGC matrix liveness gate —
gc_matrixPer-test global sinks —
global_sinksRebasing
style: cargo fmtand the file-size counts are regenerated, not cherry-picked:cargo fmt --all && ./scripts/check_file_size.sh --update.Checklist
feat:/fix:/docs:/chore:prefix convention used in the log🤖 Generated with Claude Code
https://claude.ai/code/session_01CUQanVsnitcrmYLAWWPc3p
Summary by CodeRabbit
Bug Fixes
awaitmodule initialization and handling of deferred namespace imports.Improvements