Files
ARCADIA-Studio/harness/experiments/analysis-mixed-rename-plan-20260924/RENAME-PLAN-STACK-DIAGNOSIS.md
T

90 lines
5.4 KiB
Markdown

# 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 `9388fcf2f0b82daffec93308f42949a612b07330` compiled. Its focused run
passed four named tests, then aborted in the 128 KiB deep/wide stress test
with `STATUS_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 `9e8e77e1d81c0e3116fa5777a37792a635bb4317` added 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 `8159a17dd7e8083ca6b572e9b63f3a300f0d67fe` additionally
bracketed the shared rejection helper. Its final emitted marker is
`rename rejected helper: entered; before authored`. There is no
`after authored; before plan` marker. 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.