5.4 KiB
Rename planner small-stack investigation
2026-09-24, Windows gnullvm development test profile, one Cargo job. These are observed diagnostic results; the proposed test repair still requires execution.
- Source
9388fcf2f0b82daffec93308f42949a612b07330compiled. Its focused run passed four named tests, then aborted in the 128 KiB deep/wide stress test withSTATUS_STACK_OVERFLOW(3221225725). It did not complete the test suite. - The exact original artifact (42,074,624 bytes, SHA256
bd927d4653a8915ee72d5df22096d29edb1853c12d929e20056647b05e565956) subsequently passed all other 16 rename tests. That direct run explicitly skipped the known aborting case and checked the artifact before/after. It does not establish acceptance of the complete 17-test suite. - Diagnostic source
9e8e77e1d81c0e3116fa5777a37792a635bb4317added flushed phase markers only. The deep case completed admission/indexing, original model cloning, successful planning and plan destruction, then desired-model cloning. It aborted after entering the later collision-rejection operation. - Diagnostic source
8159a17dd7e8083ca6b572e9b63f3a300f0d67feadditionally bracketed the shared rejection helper. Its final emitted marker isrename rejected helper: entered; before authored. There is noafter authored; before planmarker. The overflow therefore occurred while rebuilding the source through that nested helper, before the colliding plan invocation. These markers do not identify a particular internal parser instruction, exact compiler frame size, or general application-stack defect.
The proposed narrow repair constructs each fresh source directly in the small worker and invokes/matches the planner directly. It preserves the 128 KiB stack, 128-site deep and 129-site wide fixtures, full admission on that worker, successful planning/destruction, post-equality collision refusal/destruction and non-name refusal/destruction. It does not enlarge the stack, reduce expression sizes, move the tested pipeline to another thread or omit failed cases.
Production rename code remained SHA256
3ce74331c962abfbf63ca7f72b286405b1ca8b266335d77c71103c900cb6e9dd
through all three source snapshots. Original and diagnostic logs/receipts,
committed-input manifests and exact launchers remain in
.local/analysis-mixed-rename-plan-gates-20260924 until portable publication.
Further observed results and scoped evaluator decision
The direct-call repair 70c20c39de4d87633a3275fda3f2bc54b20e50b7 and compact
case-loop f1c095654a5f2a8e1592415b1392644b27169e00 both still aborted in the
same test. Neither is accepted as a repair. Read-only prologue inspection found
worker stack allocations of 10,872 and 5,976 bytes respectively; reducing that
one frame did not establish full-pipeline success. These are static observations,
not complete call-stack size measurements.
Three LLDB runs used the exact f1 artifact (42,076,160 bytes, SHA256
b804768eccb350033fcfd01516d0c3253e43525718f42de7c75cda9a3d91c6fe).
The first stopped on overflow without executing a backtrace command. The second
completed the exact single test successfully under the debugger; the third
overflowed and captured all threads before explicitly killing its owned debuggee.
Debugger process exit zero is not a passing test gate. The differing outcomes
show that this stack boundary is environment-sensitive; no cause for that
variation is claimed.
The third backtrace places the fault in Windows heap allocation reached through
BigInt parsing, Exact::parse_decimal, Budget::exact, Cursor::exact_literal,
syntax::binding, declarations::parse, State::parse_typed, Parser::unit,
mixed::parse_with_profile, the original admission helper, and this test's
authored setup. The rename planner is not on that active stack. Native system
symbol labels lack full OS debug symbols and should not be treated as precise
source attribution; the executable's Rust frames establish the setup path.
Independent evaluator review distinguishes the accepted planner-specific requirement (small-stack comparison, success/drop and late refusal) from a stronger full-pipeline stack claim. Prepare each fresh owner and externally owned desired model on the normal test thread, then move the complete owner into a scoped 128 KiB worker. That worker must invoke the planner, check exact outcomes and destroy its plan/failure/consumed source. Desired remains an external immutable borrow. All six deep/wide and success/collision/non-name cases remain required, with unchanged profiles and expression counts.
This scoped evaluator remains pending runtime validation. It will not fix or validate the previously failing combined parser/setup path on 128 KiB. Preserve that limitation and the failed attempts; existing standalone admission/index small-stack tests are separate evidence only.
Final scoped result
Source 18073a6f2eabce83fc83997f094e331eec835a16 implements that scoped test.
All 17 focused tests pass, including all six 128 KiB planner cases. The full
246-name run completes with 230 passed and the same 16 inherited failures.
Existing standalone small-stack cases keep their prior outcomes. The new test
artifact is 42,081,792 bytes, SHA256
2c8bd7b9a6adfda3f74b74bae00453b1b1348cbed47f04c8e8c1de9152899416.
Strict core all-target Clippy passes; formatting retains the identical prior
failure bytes. These results establish the scoped planner behavior, not repair
of the separately recorded full-pipeline 128 KiB setup failure.