Record verified carried parser phase accounting and stack repair
This commit is contained in:
@@ -630,3 +630,12 @@ only the bundle, so its carried count is F map entries, zero lower occurrences
|
||||
and all source/key/entry UTF-8 bytes. This is a phase-accounting prerequisite,
|
||||
not fulfillment or waiver of stronger parser producer timing requirements for
|
||||
final output acceptance. It grants no editing authority.
|
||||
|
||||
Runtime review of the first carried-phase candidate exposed a stack overflow in
|
||||
an unchanged legacy 128 KiB control during numeric parsing. Remove duplicated
|
||||
policy from the retained guard: the consumed input transfers exact policy into
|
||||
the Budget and syntax limits, while a small guard retains the backing owner.
|
||||
This changes representation without new heap storage or weaker tests. Prefer
|
||||
this to boxing policy or introducing an external policy-owner lifetime. The
|
||||
debugger identifies the active parsing path; it does not prove a sole cause or
|
||||
establish that the representation repair passes before it is actually tested.
|
||||
|
||||
+14
-4
@@ -274,9 +274,19 @@ formatting retains identical inherited failures. Complete non-name comparison,
|
||||
simultaneous namespaces, exact merged edits, inherited caps and combined sizing
|
||||
are verified. The scoped planner comparison/drop test passes on 128 KiB;
|
||||
separate full-pipeline parsing/setup overflows remain explicitly unresolved.
|
||||
Output emission/readmission is not implemented. The next accounting direction
|
||||
and rejected envelope approach are documented in [DECISIONS.md](DECISIONS.md);
|
||||
live ownership and acceptance remain in issue7.
|
||||
The [carried-phase prerequisite](analysis-carried-phase-contract-20260925.md)
|
||||
is implemented privately at **fa7a980418ef99d772e67c66c28dfa7b5181f875**.
|
||||
Its [Windows evidence](experiments/analysis-carried-phase-20260925/README.md)
|
||||
records 12 new passes, strict core Clippy, 553 unchanged inputs and a completed
|
||||
258-name full run with **242 passed / 16 failed**. Exact policy, retained bundle
|
||||
ownership and aggregate phase accounting survive parsing and resolution;
|
||||
legacy checkpoints remain unchanged. An initial full-run stack regression was
|
||||
corrected by retaining a smaller guard, with the existing 128 KiB controls
|
||||
unchanged and passing. The earlier separate setup overflow remains unresolved.
|
||||
New continuation constructors are fixture-only; output creation and accepted
|
||||
editing are not implemented. Stronger parser allocation-timing obligations
|
||||
remain open. [DECISIONS.md](DECISIONS.md) records the scope and rejected
|
||||
alternatives; live ownership and acceptance remain in issue7.
|
||||
The preceding Project [Windows evidence](experiments/analysis-mixed-project-20260924/README.md)
|
||||
distinguishes runtime source **71cadfa0cd0e112caa29588d2494753301f3cb6c** from
|
||||
the formatting-only aaec successor. Strict core all-target Clippy, actual listing
|
||||
@@ -287,7 +297,7 @@ Successor formatting remains failed on eight inherited blocks in five unchanged
|
||||
files; no aaec runtime rerun is claimed. The parent-reviewed portable verifier
|
||||
and all 15 finite controls pass, with independent raw-output/pin readback.
|
||||
This private source is not integrated into the application prerelease. Public
|
||||
source8, complete mixed indexing/edit composition, checked output and UI parity remain
|
||||
source8, mixed edit execution, checked output and UI parity remain
|
||||
unfinished.
|
||||
|
||||
The [reviewed S1/S7 assessment](issue28-s1-s7-assessment-956atf-20260923.md)
|
||||
|
||||
@@ -91,7 +91,7 @@ fn parse_carried(input: CarriedInput<'_>) -> Result<ParsedMixedSyntax<'_>, Diagn
|
||||
|
||||
The borrowed variant supplies a fixture-only carried C=0 route without pretending an owned output is free. It captures exact policy through a narrow internal read-only policy snapshot of an existing sealed witness. There is no independent replacement profile at `parse_carried` invocation. Its bundle is fixed in the input. Test-only tighter-profile construction remains explicitly test-only. The two backing variants describe ownership, not a numeric-zero branch controlling checks.
|
||||
|
||||
Add an optional `CarriedInput<'s>` guard to the existing `ParsedMixedSyntax<'s>`; its current bundle reference is derived from that input for carried construction. It uses the existing bundle lifetime, so no self-reference or extra generic lifetime is needed. In retained mode both references borrow the external stable `RetainedSnapshot`; the syntax cannot outlive it. Keep that guard inside syntax when resolve consumes syntax and places it in `ResolvedMixedProject`. Read-only methods expose no way to remove or replace the guard. Baseline extraction for resolution is an internal scalar read, not a second independently transferable authority.
|
||||
Consume `CarriedInput<'s>` at parser entry, transferring its exact policy into the new Budget and existing syntax ProjectLimits field. Retain only a small `SnapshotGuard<'s>` distinguishing borrowed zero carry from a reference to the allocation-owning RetainedSnapshot. Do not duplicate the full policy inside every later syntax/resolved/index/plan value. The current bundle reference is derived from the same consumed input. This uses the existing bundle lifetime, so no self-reference or extra generic lifetime is needed. In retained mode both references borrow the external stable snapshot; the syntax cannot outlive it. Keep the small guard inside syntax when resolve consumes syntax and places it in `ResolvedMixedProject`. Read-only methods expose no way to remove or replace the guard. Baseline extraction for resolution is an internal scalar read, not a second independently transferable authority.
|
||||
|
||||
Use one shared parse body with an explicit legacy-versus-carried option. Existing parse wrappers select legacy and retain their old checkpoint timing. The carried entry always runs combined checks, including its borrowed C=0 variant. Do not select behavior with `C == 0`. A narrow resolver initialization obtains C from the guard (zero for legacy), seeds Ledger once, and invokes existing `accounting::syntax` once; existing resolved ownership already retains syntax and therefore the guard. No separate wrapper around every later index phase is necessary.
|
||||
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
*.md -text
|
||||
*.py -text
|
||||
*.txt -text
|
||||
*.json -text
|
||||
@@ -0,0 +1,97 @@
|
||||
# Independent carried-phase oracle
|
||||
|
||||
Source inspected: `18073a6f2eabce83fc83997f094e331eec835a16`, before carried implementation. Accepted scope: `harness/analysis-carried-phase-contract-20260925.md`. Expectations below are literal source/grammar/accounting counts, not parser output, measured thresholds or generated model expectations. No Cargo or application evaluator was run.
|
||||
|
||||
## Exact fixtures
|
||||
|
||||
All strings below use Rust escape notation; no BOM. `entry = "main.arcadia"`.
|
||||
|
||||
**E**, existing `project::tests::single("")`, has one file:
|
||||
|
||||
```text
|
||||
main.arcadia = "arcadia 8;\nproject p \"Project\" id \"00000000-0000-0000-0000-000000000001\" {\n\n}\n"
|
||||
```
|
||||
|
||||
**H**, a three-file include chain, has these exact files:
|
||||
|
||||
```text
|
||||
main.arcadia = "arcadia 8;\nproject p \"Project\" id \"00000000-0000-0000-0000-000000000001\" {\ninclude \"part.arcadia\";\n}\n"
|
||||
part.arcadia = "include \"last.arcadia\";\r\n"
|
||||
last.arcadia = "//\u{00e9}\r\n"
|
||||
```
|
||||
|
||||
The last source contains actual U+00E9, not literal backslash escape characters. Its UTF-8 length is **6**: two slashes, two bytes for U+00E9, CR and LF. Traversal order is main, part, last; retained canonical file order is last, main, part. Both fixtures describe only the same project: schema8, UUID suffix1, alias `p`, name `Project`, empty description and all model maps empty. No warnings, expressions or lower occurrences are expected.
|
||||
|
||||
| Quantity | E | H |
|
||||
|---|---:|---:|
|
||||
| File/map entry count F | 1 | 3 |
|
||||
| Individual source byte lengths | 78 | 101,25,6 |
|
||||
| Total source work bytes | 78 | 132 |
|
||||
| Owned path-key bytes | 12 | 36 |
|
||||
| Owned entry-path bytes | 12 | 12 |
|
||||
| Actual retained owner C entries | 1 | 3 |
|
||||
| Actual retained owner C occurrences | 0 | 0 |
|
||||
| Actual retained owner C text | 102 | 180 |
|
||||
|
||||
There is one entry-path allocation in addition to each map key. Source bytes are already included in C.text; parsing charges their work once but does not add them again to live text. No arbitrary prior-owner storage is counted by this minimal fixture.
|
||||
|
||||
## Parser arithmetic
|
||||
|
||||
E significant tokens are exactly `arcadia`, `8`, `;`, `project`, `p`, quoted name, `id`, quoted UUID, `{`, `}`: ten. Nine whitespace runs give nineteen raw scanner events. The project charges one syntax entry. There are no value ends, ordinary position slots, lexical owners, references, frames or Exact operations. M is one file reference plus ten significant-token metadata slots =11; U=1.
|
||||
|
||||
H main has the same ten significant tokens plus include/string/semicolon =13. It has eleven whitespace runs, hence24 raw scanner events. Part has3 significant tokens and2 whitespace runs, hence5 raw events. Last has one comment (including CR) and one LF whitespace event, hence2 raw events and0 significant tokens. Total scanner events31. The project and two includes charge U=3. All value-end/ordinary-position/lexical-owner contributions remain zero.
|
||||
|
||||
| H checkpoint | U | M | Owned C.entries+U+M | Borrowed-zero U+M |
|
||||
|---|---:|---:|---:|---:|
|
||||
| Before traversal | 0 | 3 | 6 | 3 |
|
||||
| Main preprojection | 2 | 3+13=16 | 21 | 18 |
|
||||
| Part preprojection | 3 | 16+3=19 | 25 | 22 |
|
||||
| Last preprojection/final syntax | 3 | 19+0=19 | 25 | 22 |
|
||||
|
||||
E initial owned file sum is2; preprojection/final sum13. Successful new-snapshot Usage is independent of C: E `(bytes78,tokens19,entries1,references0,deepest_frame0)`, H `(bytes132,tokens31,entries3,references0,deepest_frame0)`, numeric work0 for each.
|
||||
|
||||
Discriminating entry-cap cases, with other limits generous:
|
||||
|
||||
- E owned: cap13 returns syntax; cap12 refuses the preprojection sum even though C1, U1 and M11 each fit separately. Do not call cap13 a complete resolve pass.
|
||||
- H owned: cap25 returns syntax; cap24 refuses at part, after main's21 passed. Cap20 refuses at main. These catch missing prior-file U/M and incorrect file attribution.
|
||||
- E borrowed-zero carried: cap12 returns syntax; cap11 refuses preprojection. Legacy cap11 must still return syntax, then fail initial resolver U+M admission12. This distinguishes explicit carried mode from a numeric `C == 0` bypass and from inadvertently changing legacy timing.
|
||||
- Initial owned C+F: E cap1 refuses sum2; H cap5 refuses sum6. Their C values separately fit. Cap2/E or cap6/H clears only the initial checkpoint, not the full parser. If an observable ordering sentinel is needed, use E with test-only ProjectLimits.max_files=0: cap1 gets the initial lowering refusal, cap2 reaches traversal's `project_limit` refusal. Do not describe that deliberately invalid-policy fixture as an admitted positive owner.
|
||||
|
||||
## Resolve and text arithmetic
|
||||
|
||||
Syntax accounting retains U+M entries and T text. E T=alias1+name7=8. H T=8+two include strings12 each=32. These fixtures have no accounting work-stack items: there are no declaration positions, AST values or expressions to visit. The project catalog temporarily retains alias map1 entry/text1, owner map1 entry, and lower tables2 entries/text1. Its peak adds4 entries/2 text. All four entries and both alias copies are subsequently released; no mapped warnings add storage.
|
||||
|
||||
| Exact storage | E zero | E owned | H zero | H owned |
|
||||
|---|---:|---:|---:|---:|
|
||||
| Syntax/final retained entries | 12 | 13 | 22 | 25 |
|
||||
| Maximum resolver entries | 16 | 17 | 26 | 29 |
|
||||
| Syntax/final retained text | 8 | 110 | 32 | 212 |
|
||||
| Maximum resolver text | 10 | 112 | 34 | 214 |
|
||||
| Final lower occurrences | 0 | 0 | 0 | 0 |
|
||||
|
||||
Thus independent combined full-path pairs are E `(entries17,bytes112)` fit versus entries16 or bytes111 refusal; H `(entries29,bytes214)` fit versus entries28 or bytes213 refusal. Each failed coordinate is varied independently with the other sufficient. In both entry failures parser admission passes; the failure is the project lower-table catalog reservation. A zero-C complete resolve fits at the failed owned cap, so carry participation is directly discriminated. Successful final live slots must equal E `(13,0,110)` and H `(25,0,212)`, exactly normal base plus C once; this catches seeding zero, doubling C, or retaining parser checks as extra reservations.
|
||||
|
||||
Text timing can be tested separately: E owned bytes110 admits syntax accounting but later catalog needs112; bytes109 admits C102 and original source78 and completes parsing, then fails while accounting project name (C102+alias1+name7=110). Bytes102/101 tests C text admission at fit/fail;102 is only admission-fit, not full-resolution-fit. H owned bytes212 admits syntax text but catalog needs214; bytes211 fails when part's include text takes180+8+24=212. Canonical ordering means part's include text12 is counted after main's header/include, not before. Both quoted names and paths have already been decoded by the time syntax text accounting refuses. These are not before-decoding guarantees.
|
||||
|
||||
## Exact diagnostic expectations
|
||||
|
||||
Preserve existing transport distinction: parser `ordinary_error` then `located` converts the error's starting offset to a one-character span; resolver `Failure::typed` explicitly restores the full typed span.
|
||||
|
||||
- Parser aggregate/file-slot/C-admission errors at default span become `main.arcadia`, span0..1, line1 column1, code `invalid_source`, no related locations. H cap24 preprojection error is **part.arcadia**, span0..1, line1 column1; H cap20 is main0..1.
|
||||
- Entry resource message: `Source8 lowering entry limit exceeded.` Text resource message: `Source8 index/output byte limit exceeded.`
|
||||
- E legacy cap11 syntax succeeds, then resolve's initial U+M error is main **0..0**, line1 column1, not parser0..1.
|
||||
- Project catalog entry/text refusals above are main **11..73**, line2 column1, code `invalid_source`, same resource message. The header starts at `project` offset11 and ends immediately before `{` offset73.
|
||||
- E bytes109 syntax-text refusal uses that header11..73. H bytes211 syntax-text refusal is **part.arcadia**, include span **0..23**, line1 column1 (its include is the final12-byte addition).
|
||||
- H source include spans are main75..98 and part0..23. They are useful independent include-depth/edge attribution controls.
|
||||
|
||||
## Policy and ownership controls
|
||||
|
||||
Use all six distinct captured Limits values and all ProjectLimits fields, compare exact policy snapshots, and separately exercise real tightened work limits. Do not reconstruct a default profile or subtract C from entry/text limits as a replacement policy.
|
||||
|
||||
- H borrowed-zero bytes132 passes source work; bytes131 refuses complete-source precheck, main0..1. H owned cannot isolate the132-byte source boundary because its C.text180 is already larger; use borrowed mode honestly.
|
||||
- E raw-token19 fits and18 refuses final newline; H31 fits and30 refuses last-file LF at byte5, giving last.arcadia span5..6, line1 column5. C does not consume token events.
|
||||
- H max_files3 versus2 and include depth2 versus1 test retained file/depth policy; max_include_edges2 versus1 tests the second include. Preserve normal traversal/parser diagnostic codes rather than replacing them with storage errors. Keep entry and byte storage limits large enough to reach those checks.
|
||||
- E/H have zero new references, frames and numeric work. Exact snapshot equality can detect widened fields, but these fixtures **cannot** behaviorally prove positive reference/frame/numeric enforcement. Reuse the established admitted reference/nested-value/Exact fixtures with tightened captured policies for those tests; do not pretend empty fixtures exercise them. A preceding witness's nonzero Usage must not be copied into this snapshot.
|
||||
- Every retained positive owner owns exactly the actual bundle counted above, remains alive through returned syntax/resolved guards, and cannot be swapped for an unrelated bundle. Failure returns only diagnostics. Successful owner provenance has occurrence C=0; nonzero occurrence and unreachable arithmetic-overflow injections are explicitly fault-injection tests, not fixture storage or successful constructor evidence.
|
||||
|
||||
No new implementation was inspected or executed. This oracle establishes expected phase behavior only; it neither accepts an emitter, grants editing/install authority, claims universal small-stack behavior, nor closes predecessor before-growth obligations.
|
||||
+53
@@ -0,0 +1,53 @@
|
||||
{
|
||||
"source": "fa7a980418ef99d772e67c66c28dfa7b5181f875",
|
||||
"baseline": "18073a6f2eabce83fc83997f094e331eec835a16",
|
||||
"inputs": 553,
|
||||
"unchanged_old_outcomes": 246,
|
||||
"added_passed": 12,
|
||||
"full_passed": 242,
|
||||
"identical_failure_blocks_after_pid_only_normalization": 16,
|
||||
"identical_fmt_sha256": "c1c6b12861c8117ce6ffc6d6742ebf92618aafb10160ec6f99d370ca72ebab2d",
|
||||
"receipts": {
|
||||
"carried-focused-fa7a980-1": {
|
||||
"source": "fa7a980418ef99d772e67c66c28dfa7b5181f875",
|
||||
"exit": 0,
|
||||
"outcomes": 12,
|
||||
"listing": 0,
|
||||
"log_sha256": "2d8058db7f66c8cf875d6fd1ffe89d15c49ee16a6bb25dc6b97be5fbfa321946",
|
||||
"result_sha256": "2dc067b342ba6409c4ae21b540ee133732c314416b3b7e888b8c9ec7e03a67a9"
|
||||
},
|
||||
"carried-full-fa7a980-1": {
|
||||
"source": "fa7a980418ef99d772e67c66c28dfa7b5181f875",
|
||||
"exit": 101,
|
||||
"outcomes": 258,
|
||||
"listing": 0,
|
||||
"log_sha256": "26b946c38db53e7dc589771e1829908dff3596cbf947ecce2442d1bf1d1896af",
|
||||
"result_sha256": "6b6ec7a335e8c1d03ec5c584e3fe8b444839e27cf3afb9f84bced33c73563743"
|
||||
},
|
||||
"carried-list-fa7a980-1": {
|
||||
"source": "fa7a980418ef99d772e67c66c28dfa7b5181f875",
|
||||
"exit": 0,
|
||||
"outcomes": 0,
|
||||
"listing": 258,
|
||||
"log_sha256": "ee1c0a5367f277720407fb30a33ccdaef68b58fed3c578caceffbae7ef4035c4",
|
||||
"result_sha256": "8f739ce87c1a700bc9a51ea70b7dd8d3f77267123d5883f3cd8a36cc2a4e2c01"
|
||||
},
|
||||
"carried-clippy-fa7a980-1": {
|
||||
"source": "fa7a980418ef99d772e67c66c28dfa7b5181f875",
|
||||
"exit": 0,
|
||||
"outcomes": 0,
|
||||
"listing": 0,
|
||||
"log_sha256": "a16886fc9c1af0f8074c7f2ba51cbb1983f4d493f40faf3164d94b28c64b055d",
|
||||
"result_sha256": "06390bd5ae88d86cb1d24a7e17b0a57096f0a90a84482cfee4a7aa6febdbf3df"
|
||||
},
|
||||
"carried-fmt-fa7a980-1": {
|
||||
"source": "fa7a980418ef99d772e67c66c28dfa7b5181f875",
|
||||
"exit": 1,
|
||||
"outcomes": 0,
|
||||
"listing": 0,
|
||||
"log_sha256": "c1c6b12861c8117ce6ffc6d6742ebf92618aafb10160ec6f99d370ca72ebab2d",
|
||||
"result_sha256": "ad79d2092b8182f3df68ed383f7ad32b3fa48afb029fa13da1ca0463203fa213"
|
||||
}
|
||||
},
|
||||
"scope": "Read-only committed-input/raw-log/artifact comparison; no Cargo execution."
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
# Independent package readback
|
||||
|
||||
**PASS for preservation, binding and reported evidence scope.** Reviewed against source `fa7a980418ef99d772e67c66c28dfa7b5181f875`; the private worktree names that commit and has no tracked modifications. No material package defect or README overclaim found.
|
||||
|
||||
The unchanged ZIP has **53 unique members, 458,509 bytes**, SHA256 `2eca143b706458c1c0217af715fa6f17c01a0b9f85a5313d6a231dabe1aba7c9`. All CRCs pass. Every member name, byte count and hash matches the manifest; 51 file members equal their original evidence and both patch members equal fresh immutable Git diffs (18073→fa7 and d11→fa7). All eight readable mirrors equal their archive and original review-folder bytes. All nine local Markdown links resolve. The archived selected contract equals the root contract, SHA256 `875b26eb850ab75d6e09222be37327a87a5b4c4a6f0557adf9723984f945d5f5`.
|
||||
|
||||
Independent raw reconciliation confirms **12 focused passes; 258 listed tests; full 242 passed / 16 failed; all nine previous stack-named controls passed**. All 246 prior outcomes are unchanged, and all 16 failure bodies match after normalizing only numeric thread identifiers. Strict Clippy exits 0. Formatting exits 1 with the same eight blocks and exact baseline log SHA256 `c1c6b12861c8117ce6ffc6d6742ebf92618aafb10160ec6f99d370ca72ebab2d`.
|
||||
|
||||
Final receipt source, input, log and captured-launcher bindings reconcile. All 553 declared inputs match immutable source blobs and current raw working bytes. The current artifact matches 42,223,104 bytes and SHA256 `c990e77015f2e4535003875abe7d49199cead803ee60677d86cdf056da7d8298`. This audit does not independently reverify remote publication or authenticate unrecorded build environment.
|
||||
|
||||
The initial d11 full abort is preserved with **124 completed passes**, exit3221225725, and its distinct artifact identity. Its focused 12-pass result is not substituted for a complete run. Debugger log/launcher/source/artifact bindings agree; the trace contains the overflow in exact-number parsing and an explicit child kill, so debugger exit0 is correctly not reported as a passing test. Both prologue records bind their respective artifacts. Reading their recorded instructions confirms the stated selected-frame reductions sum to 1,568 bytes, distinguishing the real worker from its same-named 56-byte harness shim. These observations and the completed final regression run do not prove sole causation or a universal stack bound. The older rename full-pipeline setup observation remains explicitly unresolved.
|
||||
|
||||
README scope is accurate: fixture-only constructors, logical phase accounting and delayed syntax-text admission; no emitter, accepted rewritten output, public source8, preview integration, Linux/WSL or universal before-growth claim. Earlier pending source-review statements remain historical evidence alongside the final runtime review. The toolchain record is identified as reused, and the initial executable is identified rather than claimed included in the ZIP.
|
||||
|
||||
Reviewed README SHA256: `0749813ee3606da5893874c692b253bcb7f1bb7864f0448ea102d499a3b951aa`; manifest SHA256: `355fa085134cbba38d119df46b9cb5dbfc009224d005002b5b29ea87886b5e87`.
|
||||
|
||||
Local reproducible inspection: `.local/analysis-carried-phase-review-20260925/inspect_package.py`, SHA256 `f3cafe8f5f212cbab82b444e9c2e40ad90b0b1ef26d5539bbe90709bcff1e6d3`; result `PACKAGE-READBACK.json`, SHA256 `dc009ff9c65b694136cae68c2a20150d01e9b86ce2fd708cc34f0bd2f9535a07`. No archived code, Cargo, test executable or network operation was executed; the prior runtime checker/output was not rerun or overwritten. This report is outside the immutable archive.
|
||||
@@ -0,0 +1,82 @@
|
||||
# Private carried parser phase accounting
|
||||
|
||||
Source **fa7a980418ef99d772e67c66c28dfa7b5181f875** is pushed and ref-verified
|
||||
on `codex/analysis-carried-phase-956atf-20260925`. It implements the limited
|
||||
[carried-phase contract](../../analysis-carried-phase-contract-20260925.md).
|
||||
The private path binds the actual source bundle, allocation owner and exact
|
||||
inherited policy, checks combined logical storage at specified parser phases,
|
||||
then seeds the existing resolver ledger once. Original parser entry points keep
|
||||
their prior checkpoints. New constructors remain fixture-only: this is not an
|
||||
emitter, accepted edited output, public source8 or a published preview change.
|
||||
|
||||
Windows gnullvm, rustc/Cargo 1.98.1: **12 new tests pass**, strict core all-target
|
||||
Clippy passes, and the actual listing contains **258 names**. The full library
|
||||
remains **FAILED: 242 passed / 16 failed**. All 246 prior outcomes and all 16
|
||||
failure bodies match the previous checkpoint after normalizing only numeric
|
||||
thread identifiers. Formatting remains **FAILED**, with the byte-identical
|
||||
eight inherited diff blocks in five files. Linux/WSL checks were not run.
|
||||
|
||||
The [independent runtime review](RUNTIME-REVIEW.md) verifies all 553 declared
|
||||
inputs against immutable Git and raw working bytes, exact launchers, logs and
|
||||
the 42,223,104-byte test artifact, SHA256
|
||||
`c990e77015f2e4535003875abe7d49199cead803ee60677d86cdf056da7d8298`.
|
||||
[Source review](SOURCE-REVIEW.md), [test review](TEST-REVIEW.md) and the
|
||||
[independent oracle](CARRIED-PHASE-ORACLE.md) cover exact policy and fresh Usage,
|
||||
complete OA/SA parity, owned bundle lifetime, once-only retained storage,
|
||||
multi-file limits, original diagnostic locations and postparse text accounting.
|
||||
|
||||
The 78-byte empty source fixture owns 102 source/key/entry bytes and one file
|
||||
map entry. Its carried syntax cap is 13 entries; complete resolution needs
|
||||
17 entries / 112 bytes and retains (13 entries, 0 occurrences, 110 text bytes).
|
||||
The three-file Unicode/CRLF fixture owns (3, 0, 180), needs complete caps
|
||||
29 / 214, and retains (25, 0, 212). Each cap-minus-one control reaches its
|
||||
specified real phase. Borrowed carried-zero mode intentionally refuses a
|
||||
combined syntax total earlier than the unchanged legacy mode. Nonzero carried
|
||||
occurrences and impossible overflow values are explicitly fault injection,
|
||||
not claims of real bundle-owned occurrence storage.
|
||||
|
||||
The [stack investigation](STACK-DIAGNOSIS.md) preserves an initial full-run
|
||||
abort at `d11b99bb` after 124 completed passes. Its focused 12 cases had passed;
|
||||
the existing 128 KiB ordinary-index control then overflowed during parsing.
|
||||
LLDB reproduced the exact artifact's active numeric parsing path. The repair
|
||||
transfers policy into the existing Budget/syntax fields and retains a smaller
|
||||
backing guard, reducing duplicate inline state without adding heap storage.
|
||||
The final full run completes and all nine prior stack-named controls pass.
|
||||
Their source, stack allowances and expected behavior were not weakened.
|
||||
Selected prologues shrink by 1,568 bytes in aggregate; this is not a complete
|
||||
stack measurement or a universal guarantee. The separate older rename-test
|
||||
full-pipeline 128 KiB setup observation remains unresolved.
|
||||
|
||||
[evidence.zip](evidence.zip) contains **53 members, 458,509 bytes**, SHA256
|
||||
`2eca143b706458c1c0217af715fa6f17c01a0b9f85a5313d6a231dabe1aba7c9`.
|
||||
[manifest.json](manifest.json) pins each member. The archive preserves initial
|
||||
and final gates, exact launchers, debugger/prologue evidence, baseline records,
|
||||
source patches, contract snapshots and reviews. Eight readable review/checker
|
||||
files are exact archive mirrors. Historical test executables are identified by
|
||||
receipts; the initial one was retained locally but is not included in this ZIP.
|
||||
The toolchain version text is an unchanged earlier capture, not a new probe.
|
||||
|
||||
Reproduce the final gates from the identified source with the project Windows
|
||||
toolchain, one compiler job, `CARGO_INCREMENTAL=0`, and no lifecycle or
|
||||
RUST_MIN_STACK override:
|
||||
|
||||
```text
|
||||
cargo test --locked --offline -p oa-core --lib -- --list
|
||||
cargo test --locked --offline -p oa-core --lib language::analysis_source::mixed::carried::tests:: -- --test-threads=1
|
||||
cargo test --locked --offline -p oa-core --lib -- --test-threads=1
|
||||
cargo clippy --locked --offline -p oa-core --all-targets -- -D warnings
|
||||
cargo fmt --all -- --check
|
||||
```
|
||||
|
||||
Replay helpers retain the producing machine's layout and must be read before
|
||||
reuse. The [readback checker](inspect_runtime.py) verifies recorded evidence
|
||||
without launching Cargo or the test executable. Receipts bind declared inputs
|
||||
and recorded environment fields, not exhaustive environment state or
|
||||
authenticated build provenance. A debugger exit zero after killing its stopped
|
||||
child is not a passing ordinary test.
|
||||
|
||||
This prerequisite counts the established logical auxiliary domain at named
|
||||
phase boundaries. It neither establishes nor waives stronger parser
|
||||
before-growth obligations. Output construction, the real consumed-owner
|
||||
transition, actual-output equality, editing/history/persistence and application
|
||||
integration remain required work under issue #7.
|
||||
@@ -0,0 +1,41 @@
|
||||
# Independent carried-phase runtime readback
|
||||
|
||||
Reviewed final source `fa7a980418ef99d772e67c66c28dfa7b5181f875`. Disposition: the12 added tests pass and all246 prior outcomes are unchanged. The completed oa-core library run has242 passes and16 inherited failures; the full suite and formatter are not green. No Cargo, product executable or debugger was executed during this review.
|
||||
|
||||
## Method and source binding
|
||||
|
||||
Read `inspect_runtime.py` before executing it with bundled Python `-I -B` and arguments `fa7a980418ef99d772e67c66c28dfa7b5181f875 fa7a980 12`. Its subprocess calls are read-only Git queries. It refuses an existing readback output. No checker correction was necessary. Additional read-only inspection covered launcher behavior, all recorded environment fields, initial aborted records, retained old binary, debugger/prologue evidence and prior archive membership.
|
||||
|
||||
- Checker:7452 bytes, SHA-256 `bc9065192356d06f909abd3af06da2bffddbf88cce04524490bf8c5c404b84da`.
|
||||
- Generated `CARRIED-PHASE-RUNTIME-READBACK.json`:2216 bytes, SHA-256 `0003162f0524e6debecdadd0a2f13b86c67b56db92e5ab60360a876130a445fa`.
|
||||
- All553 declared files match immutable Git blob bytes and current raw disk bytes. Tracked working tree is clean and HEAD is the exact final source. Every gate's manifest equals the independently reconstructed source/path/length/SHA inventory; manifest SHA-256 `b51682b333d96d91167f4da8e4f8e4f4b1d443fbfc875fead918d0db1e1db203`.
|
||||
- Final actual Cargo test artifact:42,223,104 bytes, SHA-256 `c990e77015f2e4535003875abe7d49199cead803ee60677d86cdf056da7d8298`. Current bytes match the receipts and actual Running path in raw logs.
|
||||
- Captured final launcher SHA-256 `51f590750896843210e02df971c7396bf379494e1605bd059ef017e6e4d41ec5` matches its before/after pins. It records actual subprocess return status, verifies inputs before/after, captures immutable helper bytes, and returns nonzero on detected source/helper changes. It does not turn the inherited failures into success.
|
||||
|
||||
The recorded environment is identical for the five final gates: jobs1, incremental0, isolated target `.local/analysis-checked-save-target-20260913`, Cargo/Rustup homes under `.local/toolchain`, and absent RUSTFLAGS, RUSTC, RUSTUP_TOOLCHAIN, RUST_MIN_STACK and ARCADIA_CODEC_LIFECYCLE_PHASE. This is declared-source and recorded-environment evidence, not a complete compiler/toolchain provenance attestation or a scan of every possible untracked dependency.
|
||||
|
||||
## Final raw outcomes
|
||||
|
||||
| Gate suffix `-fa7a980-1` | Exact scope | Result |
|
||||
|---|---|---|
|
||||
| carried-focused | locked/offline oa-core lib, carried test module, one test thread |12pass,0fail,246filtered; exit0 |
|
||||
| carried-full | locked/offline oa-core lib, one test thread |242pass,16fail,0ignored,0filtered; exit101 |
|
||||
| carried-list | same lib target, `--list` |258 unique names; exit0 |
|
||||
| carried-clippy | locked/offline oa-core all-targets, `-D warnings` |exit0 |
|
||||
| carried-fmt | `cargo fmt --all -- --check` |exit1, unchanged baseline bytes |
|
||||
|
||||
Raw outcome rows equal receipt outcomes with no duplicate names. The listing exactly equals full-run names; focused names exactly equal the12 added successful names. All246 prior18073a6 outcomes match by name/status. All16 failure blocks match after normalizing only the numeric thread PID (plus CRLF transport and outer whitespace); no source locations, messages, stack bodies or assertions were generalized away. Format bytes match exactly, SHA-256 `c1c6b12861c8117ce6ffc6d6742ebf92618aafb10160ec6f99d370ca72ebab2d`.
|
||||
|
||||
Prior full/fmt raw logs and receipts were additionally compared byte-for-byte with their members in `harness/experiments/analysis-mixed-rename-plan-20260924/evidence.zip` (584235 bytes, SHA-256 `1c041d181540b474e14e80677cfe287d305951eaee48e492de7f59dcdea2391c`). This avoids relying solely on an editable baseline summary. The machine readback records exact final raw log and receipt hashes for all five gates.
|
||||
|
||||
All nine stack-named prior tests report `ok` in the final full log, including the ordinary-index small-stack case that aborted initially. This is observed execution for this source/artifact/environment, not a universal stack bound.
|
||||
|
||||
## Preserved initial failure and diagnostic scope
|
||||
|
||||
Initial source `d11b99bb4ab1c817951557551db3a3c7cbd5c425` focused run passed12 (raw SHA `f04ee0473478866bc614fa794cd50af6aa2c1f5d56b9e3c1f5a65112933b144b`). Initial full run has only124 completed outcome rows and aborts in `ordinary_index::tests::small_stack_success_and_late_header_failure_leave_no_partial_owner` with exit3221225725 /0xc00000fd STATUS_STACK_OVERFLOW. It has no normal completed full-suite result and must not be relabeled as the16-failure baseline disposition. Raw SHA `705752b2f18d5897719f689083227aa1e2df4e17f6bc07747490337681ef00fe`; its unchanged input-manifest SHA is `8bfaff6784f616a550b98b3a8170781e85fe4715a0b20308d896423c73f4992c`.
|
||||
|
||||
Preserved `artifacts/d11b99b-oa_core.exe` matches42,221,568 bytes / SHA-256 `dccfaee7f43e563fe26517c6a5454cd06f849d7b72d1127a12d28779100e9016`. Debugger raw log SHA `d3ede485caa0714030e7f95f10a64590334df4219ec836d4daf23db0cbea8138` matches its receipt. It shows0xc00000fd with heap/String formatting beneath Exact::parse_decimal/parse_literal, cursor exact_literal, declaration parsing, mixed parse_impl and prior helper callers. LLDB process exit0 is not an application test pass; the debugger killed the stopped process.
|
||||
|
||||
Recorded prologues show fixed worker reservation0x1e48 becoming0x1b08, parse_impl0x2b88 becoming0x2b28, parse_with_profile0x138 becoming0xc8, accepted0x6d8 becoming0x598, and indexed0x6a8 becoming0x5d8. These are static prologue observations, not total runtime stack consumption or proof that one frame alone caused the abort. The final smaller guard retains owner binding and transfers policy without copying it into every later witness. The accompanying test delta changes only access to that guard; exact cases and expectations remain intact (see TEST-REVIEW.md).
|
||||
|
||||
No claim here accepts production output emission, mixed editing/install authority, universal before-allocation admission or broader workspace/package/native runtime behavior. The result supports this private carried-phase prerequisite with its inherited failures and documented timing/stack limitations preserved.
|
||||
@@ -0,0 +1,57 @@
|
||||
# Independent carried-phase production source review
|
||||
|
||||
2026-09-25. **No concrete correctness blocker found; compilation and runtime acceptance pending.** Reviewed uncommitted production changes over `18073a6f2eabce83fc83997f094e331eec835a16` in `.local/as3batch`. Tests were still being authored and are outside this source-review verdict. No source edits, Cargo, application execution or network actions were performed.
|
||||
|
||||
Authority: selected `harness/analysis-carried-phase-contract-20260925.md`, SHA256 `d17c28a8bb138063c8c5fbf3ed5850f3c1531047d217dffa7274e8d6339fb6b9`; independent `CARRIED-PHASE-ORACLE.md`, SHA256 `56d1b57f4322c74bfd52f46483e337213fb6f8edf26d5756228b6e34c83692fd`. Paths below are under `crates/oa-core/src/language/analysis_source/`.
|
||||
|
||||
| Reviewed production file | Exact working-file SHA256 |
|
||||
| --- | --- |
|
||||
| `mixed/carried.rs` | `b376844c42660fec462def3e839ed99db272e5752ba137c885e69cad01c29e6c` |
|
||||
| `mixed.rs` | `78422c978f9eaf490145ec13bf68928a87966e83370fbf7e5076282e1d578b8b` |
|
||||
| `budget.rs` | `24656fe30fe17b3d7ae295b2e1eeb0a5e5e7bc4fbc4f30cdd95e3e72e1b54f66` |
|
||||
| `mixed/project.rs` | `951dfceb111faa10bf795ec73646b794b08cca81e450b02f13a987a49d9f36ee` |
|
||||
|
||||
## Correctness and authority findings
|
||||
|
||||
- **Bound owner and lifetime:** `carried.rs:6–43` keeps policy/owner fields private; CarriedInput is neither Clone nor Copy. Retained backing borrows the actual allocation-owning RetainedSnapshot. The bundle method derives the reference from that backing. `parse_carried` takes only the input, derives bundle and exact policy, and moves the guard into the parser (`:65–69`). Syntax retains the optional guard (`mixed.rs:46–50,401–408`); existing consumed resolve/index ownership retains syntax. There is no returned self-referential owning bundle or exposed guard-removal method. Rust lifetime/type checking still needs compilation.
|
||||
- **Construction is fixture-only:** policy capture, retained fixture construction/input and borrowed input construction are all cfg(test) (`carried.rs:71–119`). The retained fixture counts exactly F entries, zero lower occurrences and the actual entry/key/source UTF-8 bytes with checked additions. It does not claim preallocation admission of its fixture allocation. No production nonzero or zero-carry transition is enabled; no emitter authority is implied.
|
||||
- **Internal parser seam:** `parse_impl` accepts separate arguments and could be misused by future internal code, but its current two callers are fully accounted for: legacy passes None; private parse_carried derives all values and Some(input) from the same guard. No intended API currently allows substitution. This is a sufficient current private caller invariant, not a concrete vulnerability requiring an input-enum redesign. Re-review any future caller or constructor against this invariant.
|
||||
- **Exact policy and independent work:** `Budget::limits` (`budget.rs:67–70`) returns the immutable complete Limits value. Policy capture retains complete ProjectLimits too. The shared parser constructs one new Budget using those values and preserves the previous maximum-policy validation. There is no policy subtraction, default reconstruction, per-include reset, or modification of an existing Budget. Carried slots never enter Usage or numeric work counters.
|
||||
- **Explicit mode preserves legacy checks:** `parse_with_profile` delegates with None. The initial and per-file branches preserve its old independent metadata checks; it gets no new completion check. Some(input) always performs combined checks, including borrowed zero carry (`mixed.rs:282–301,348–358,396–400`). Grammar, scanning, ordinary projection and traversal remain shared and unchanged. Thus the oracle's legacy E cap11 versus carried-zero cap11 distinction is represented directly rather than hidden behind `C == 0`.
|
||||
- **Checked, noncharging aggregation:** `CarriedInput::check` composes C+U+M with existing checked Slots::add and validates all three dimensions through a temporary zero Ledger (`carried.rs:45–61`). The temporary Ledger retains no reservation in the returned witness. All errors propagate immediately through the existing safe diagnostic path. Continuation C is checked before complete-source precheck/traversal; initial C+file metadata is checked before Traversal::new; per-file prospective metadata is checked before position projection; final check follows successful traversal. The old token/value-end/position/owner metadata components occur once.
|
||||
- **Once-only resolver transfer:** `project.rs:438–449` seeds live Slots from the retained guard, or zero for legacy, then calls the unchanged syntax admission once. The existing syntax walk adds U+M, owned text and bounded scratch. Existing catalog/lower releases subtract their recorded local reservations, not C. There is no new release/reset path for the baseline. Resolved retention should therefore equal the zero-carry result plus C exactly; actual cap boundaries still require runtime verification.
|
||||
- **Failure attribution and ownership:** parser failures use the entry or current-file closure at the appropriate checkpoint; resolver errors retain existing canonical file/span transport. The guard and partial syntax are consumed/dropped on refusal, while the external fixture owner remains alive under its own scope. No partial witness, reusable continuation or accepted edited output escapes. Default parser span transport remains distinct from resolver full-span transport as the oracle documents.
|
||||
|
||||
## Temporal scope and stack risk
|
||||
|
||||
This implements phase checks, not admission before every parser allocation. Unit ASTs/tokens and counting scratch already exist before the per-file check; new retained syntax text is accounted only by the existing resolver walk. Existing model/serde/raw-validator and physical allocator/RSS exclusions remain unchanged. No fresh source rescans, Exact conversions, model clones, heap work containers or per-include budgets were introduced by the production path.
|
||||
|
||||
Adding inline CarriedInput to ParsedMixedSyntax and adding a shared parse wrapper can change debug stack frames even on the legacy route. From source field widths on the intended x64 target, the borrowed enum payload is approximately 112 bytes (bundle reference8 + Limits48 + ProjectLimits56), versus a retained reference8; actual enum/Option and frame layout is compiler-dependent and was not measured here. This is a concrete reason to retain compiler/strict-Clippy and existing small-stack regression gates, not evidence of a regression or justification for speculative boxing. Existing upstream environment-sensitive parse-stack failure remains unresolved and separate.
|
||||
|
||||
## Pending acceptance
|
||||
|
||||
Compile/type-check the guard lifetimes and moves, and run strict Clippy before drawing layout/lint conclusions. Independently exercise oracle E/H boundary pairs, exact parser-versus-resolver spans, new-snapshot work counts, retained +C slots, text timing, all inherited policy fields, and zero-mode rejection timing. Entry/text/occurrence overflow injection must remain labeled separately from positive owner provenance; the actual retained owner has zero occurrences. Test failure/drop and unchanged owner bytes through real parse/resolve paths, and preserve prior private/legacy outcomes, 16 inherited full-suite failures and formatting disposition. This review neither certifies unfinished tests nor accepts final emission/readmission or public source8.
|
||||
|
||||
## Committed test-observer supplemental readback
|
||||
|
||||
Reviewed commit `d11b99bb4ab1c817951557551db3a3c7cbd5c425`. The four working production files match that commit. `mixed/project.rs` now has SHA256 `d0b75ec30c4e433d942d8011f13ddc8321a7c060e35c7b0a320b0979fe22bc40`; the other three file hashes above remain exact. The sole additional change in the previously reviewed project file is the cfg(test) `ResolvedMixedProject::phase_state` observer at lines31–34, returning `(&self.syntax, self.storage.live)`.
|
||||
|
||||
The observer returns an immutable borrow tied to the resolved owner and a copied scalar Slots snapshot. It cannot mutate/reset policy, replace the bundle, extract the guard, release ownership or construct a continuation. It is absent from production builds and provides the intended test visibility into real retained state. No authority issue or new source-review blocker found. This supplement does not claim unchanged runtime behavior: compilation and all required runtime gates remain independently pending. No source edit, compiler or application execution was performed for this readback.
|
||||
|
||||
## Targeted slim-guard repair review
|
||||
|
||||
The subsequent d11b99b full run aborted with exit3221225725 at the existing ordinary-index 128 KiB test, despite the 12 focused tests passing. Read-only inspection of `carried-full-d11b99b-1.result.json` and `carried-debugger-d11b99b-1.log` confirms the reported overflow and a fault stack through Exact parsing, the shared parser body and its new wrapper. It does not establish a single quantified cause. The initial source verdict therefore did not establish legacy runtime compatibility; this regression blocks acceptance until repaired and rechecked.
|
||||
|
||||
Reviewed the frozen uncommitted slim-guard candidate relative to d11b99b and the revised selected contract, SHA256 `875b26eb850ab75d6e09222be37327a87a5b4c4a6f0557adf9723984f945d5f5`. **No source correctness blocker found in this targeted repair; runtime effect remains unproven.** Exact candidate hashes:
|
||||
|
||||
| File | SHA256 |
|
||||
| --- | --- |
|
||||
| `mixed.rs` | `9e67891b6610def59d39376ec78fea6151025e977c88d299dafd97b440ab4e89` |
|
||||
| `mixed/carried.rs` | `32cf742631490a624e0522db82ff1d708e5d730b54a117f254ed3a106f05eca0` |
|
||||
| `mixed/carried/tests.rs` | `794c8e987b43d4a652361bf7e31eff314f917955824efdbb1ba74b0216c4018a` |
|
||||
|
||||
`CarriedInput::into_parts` consumes the original input: Borrowed moves its captured exact policy; Retained copies the exact policy values from its immutable owner. Both derive the same bound bundle and small guard in one match. The new Budget and syntax ProjectLimits own the transferred policy, so dropping the original seed before parsing remains valid. No policy borrow from the dropped seed is introduced. Only `CarriedGuard { Borrowed | Retained(&owner) }` travels through the shared parser and later witness; Borrowed source lifetime remains tied by syntax.bundle, and Retained continues borrowing its allocation owner. Private construction/caller invariants remain intact.
|
||||
|
||||
Slots/check arithmetic, once-only seeding, all phase checkpoints, modes and Usage are unchanged. No heap allocation or new logical container reservation is introduced. Removing duplicated inline policy from later witnesses is a smaller change than adding a policy-owner fixture lifetime or boxing the policy; it directly reduces replicated state while preserving the contract. The extra parser wrapper itself is unchanged and may still matter; only the unchanged regression gates can demonstrate recovery.
|
||||
|
||||
The carried test delta changes only the guard-variant identity check and access to the existing direct overflow checks through `into_parts().2`. Expected values and assertions remain intact. `budget.rs` and `mixed/project.rs` are unchanged from d11b99b. The complete existing `mixed/project/ordinary_index/tests.rs`, including the 128 KiB regression, is unchanged from accepted18073; working SHA256 `04e11463a7d489c9984d165d80718d95da027c7613a5b63180f0eaf4038a0395`. No stack size, old fixture, thread setup or old expected outcome was weakened. Compiler, focused/full and required regression evidence must bind the actual repaired commit before acceptance.
|
||||
@@ -0,0 +1,57 @@
|
||||
# Carried-phase legacy stack regression
|
||||
|
||||
The first candidate `d11b99bb4ab1c817951557551db3a3c7cbd5c425` compiled and
|
||||
passed all 12 new carried-phase tests. Its full library run aborted with
|
||||
`STATUS_STACK_OVERFLOW` (3221225725) at the existing
|
||||
`ordinary_index::tests::small_stack_success_and_late_header_failure_leave_no_partial_owner`.
|
||||
That unchanged 128 KiB control passed in the completed 18073a6 baseline.
|
||||
It recorded 124 completed passes before the abort. The aborted run is not a
|
||||
complete test-suite result or the known 16-failure
|
||||
disposition. Its raw log SHA256 is
|
||||
`705752b2f18d5897719f689083227aa1e2df4e17f6bc07747490337681ef00fe`.
|
||||
|
||||
The exact first artifact is 42,221,568 bytes, SHA256
|
||||
`dccfaee7f43e563fe26517c6a5454cd06f849d7b72d1127a12d28779100e9016`.
|
||||
It was preserved locally before replacement. LLDB reproduced its overflow:
|
||||
Windows heap allocation through formatting, Exact::parse_decimal, Budget::exact,
|
||||
binding, declarations::parse, State::parse_typed, Parser::unit, parse_impl,
|
||||
parse_with_profile, parse, accepted, indexed and the original small-stack worker.
|
||||
No index operation is on the active stack at the fault.
|
||||
The debugger log SHA256 is
|
||||
`d3ede485caa0714030e7f95f10a64590334df4219ec836d4daf23db0cbea8138`.
|
||||
Its exit zero follows an explicit debugger kill of the stopped child and is not
|
||||
a passing test. No other application process was stopped.
|
||||
|
||||
Source-bound disassembly observed these prologue reservations: parse_impl
|
||||
11,144 bytes; parse_with_profile 312; accepted 1,752; indexed 1,704; actual worker
|
||||
7,752. A separate test harness shim shares the worker's demangled name and uses
|
||||
56 bytes; the two records must not be confused. These are selected static
|
||||
prologues, not a complete runtime stack measurement or proof of a sole cause.
|
||||
|
||||
The new retained input duplicated the 104-byte Limits/ProjectLimits policy in
|
||||
each later parsed/resolved/indexed/plan carrier. Independent review selected a
|
||||
smaller representation: consume input, transfer exact policy into the Budget
|
||||
and existing syntax limits, and retain only a small backing-owner guard.
|
||||
This avoids a new external policy lifetime or heap allocation. The wrapper,
|
||||
all resource arithmetic, expected values and existing small-stack tests remain
|
||||
unchanged. The corrected candidate is
|
||||
`fa7a980418ef99d772e67c66c28dfa7b5181f875`.
|
||||
|
||||
The corrected artifact is 42,223,104 bytes, SHA256
|
||||
`c990e77015f2e4535003875abe7d49199cead803ee60677d86cdf056da7d8298`.
|
||||
Its 12 focused cases pass and the complete full run returns 242 passed / 16
|
||||
failed, including passes for all nine prior stack-named controls. The originally
|
||||
aborting test is unchanged. Strict all-target core Clippy passes; formatting
|
||||
retains the byte-identical inherited eight diff blocks. Independent raw baseline
|
||||
comparison is recorded separately in the runtime review.
|
||||
|
||||
Corrected selected prologues are parse_impl 11,048 bytes, parse_with_profile
|
||||
200, accepted 1,432, indexed 1,496 and the actual worker 6,920. Their reductions
|
||||
sum to 1,568 bytes; parse remains 280 and the separate harness shim remains 56.
|
||||
This confirms reduced reservations in the inspected frames and a completed
|
||||
ordinary regression run. It is not a full-stack measurement, proof of a sole
|
||||
cause, or guarantee across every environment.
|
||||
|
||||
This investigation does not resolve the separate earlier rename-test full-pipeline
|
||||
128 KiB setup observation, grant a universal stack guarantee or accept emitted
|
||||
output. Raw launchers, receipts, traces and both source versions are preserved.
|
||||
@@ -0,0 +1,88 @@
|
||||
# Carried-phase stack regression: source analysis
|
||||
|
||||
2026-09-25. Read-only source comparison: accepted predecessor `18073a6f2eabce83fc83997f094e331eec835a16` versus carried commit `d11b99bb`. No source/tests edited, no compiler/debugger/test executable run by this agent. Parent owns the exact-artifact LLDB investigation. These are hypotheses and conditional correction recommendations, not a proven failure cause.
|
||||
|
||||
## Observed boundary
|
||||
|
||||
Parent reports all 12 new carried tests pass, but the full run aborts with Windows STATUS_STACK_OVERFLOW `0xc00000fd` at the **unchanged** existing `ordinary_index::tests::small_stack_success_and_late_header_failure_leave_no_partial_owner`. Predecessor full run completed 230 pass / 16 inherited failures including this test. The new abort is therefore a current acceptance regression requiring investigation; the earlier unrelated environment-sensitive rename prerequisite observation does not waive it.
|
||||
|
||||
The recorded log ends at that test, with no phase markers. It does **not** say which of its three sections failed:
|
||||
|
||||
1. Build rich OA bundle, parse/resolve/index/index-ordinary and drop success.
|
||||
2. Independently build the rich typed index, inject a new unowned name into its map, and require late ordinary missing-header rejection and consumed-owner cleanup.
|
||||
3. Construct the unchanged 127-nested-abs literal (128 expression nodes), then parse/resolve/index/index-ordinary and drop success.
|
||||
|
||||
Source: `mixed/project/ordinary_index/tests.rs:416–445`; helper `indexed` at line6 calls `project/tests.rs:147 accepted`, which calls `resolve(parse(...).unwrap())`. Stack allowance remains128 KiB. The test naturally exercises large value returns through several nested helpers; none of those helpers or fixture sizes changed in d11b99bb.
|
||||
|
||||
## Two concrete source changes affecting stack shape
|
||||
|
||||
### A. One extra shared-body wrapper on the legacy parse chain
|
||||
|
||||
Before: `indexed -> accepted -> mixed::parse -> mixed::parse_with_profile [body]`.
|
||||
|
||||
After: `indexed -> accepted -> mixed::parse -> mixed::parse_with_profile [forwarder] -> mixed::parse_impl [body]`.
|
||||
|
||||
References: `mixed.rs:227–260`; diff18073a6..d11b99bb. `parse_with_profile` now forwards bundle, ProjectLimits, Limits and a new None guard, returning a larger ParsedMixedSyntax Result. Even a tiny Rust forwarding function can have debug-build argument/return temporaries and a native frame. The source does not establish how much stack the compiler allocated or whether any forwarding call was optimized away. Inspect actual frame prologues before assigning blame.
|
||||
|
||||
The new checkpoint calls themselves run with `carried=None` on this existing test. CarriedInput::check, its temporary Ledger, and new carried arithmetic are not executed on the legacy path. Therefore adding a heap allocation inside those checks is not a justified fix for this test.
|
||||
|
||||
### B. Inline guard makes every syntax/result carrier structurally larger
|
||||
|
||||
`ParsedMixedSyntax` gained `Option<CarriedInput>` (`mixed.rs:46–50`). CarriedInput contains SnapshotBacking by value. Its Borrowed variant stores both a bundle reference and the entire SnapshotPolicy by value (`mixed/carried.rs:6–27`); SnapshotPolicy holds all Limits and ProjectLimits fields. Even `None` in a legacy witness needs enough inline space for the type's largest Some variant. This increase propagates through `ResolvedMixedProject.syntax`, `IndexedMixedProject.resolved`, AuthoredMixedProject, Result temporaries and helper return slots.
|
||||
|
||||
On this Windows64 ABI the source policy contains six8-byte Limits fields and seven usize ProjectLimits fields (3 traversal +4 model), i.e.104 bytes of policy payload before the reference/discriminant/alignment. This is field arithmetic, **not a measured Rust enum size or compiler frame size**. Compiler layout/niches and debug temporaries must be measured from the exact artifact. The source is enough to identify a plausible repeated-inline-payload increase, not enough to quantify the resulting peak native stack.
|
||||
|
||||
References: `budget.rs:7–14`, `source_project.rs:52–59`, `language.rs:32–37`, `mixed/carried.rs:6–27`, `mixed/project.rs:17–26,43–46`. The retained variant already holds only a reference; its policy stays in the retained external owner. The borrowed variant is the asymmetry.
|
||||
|
||||
The test-only `phase_state` getter is not invoked by this existing test. The resolver's new scalar Slots seed executes but adds no new heap allocation or recursion. It also receives the now-larger syntax value, so its generated frame may grow even if its changed expression is small.
|
||||
|
||||
## What the parent trace should distinguish
|
||||
|
||||
1. Identify the exact stage from the active call stack: scanner/ordinary or typed parser, Exact numeric work, resolver/catalog/admission, index verification, ordinary late failure mapping, or drop. No test rewriting is needed to read the faulting call chain.
|
||||
2. Capture stack base/limit/current SP if available; record native frame deltas/prologues for the largest active frames, especially parse_impl, parse_with_profile, accepted/indexed test helpers, resolve and the worker closure. A tiny source function is not evidence its debug frame is tiny.
|
||||
3. If inspectable, compare the prechange and new generated frames or type layouts. At minimum confirm whether the added forwarding frame and inline carrier payload are present. Do not run application code through arbitrary debugger expressions solely to infer type size; symbols/disassembly suffice if available.
|
||||
4. A deepest frame inside BigInt/Windows allocation does not itself establish arithmetic recursion as the regression. The added ancestors may have reduced available headroom before an unchanged allocation call. Likewise a drop frame would require checking which owner is being dropped before any parser-only correction is selected.
|
||||
5. Repeat an exact artifact only as needed to establish whether this failure has the same environment sensitivity previously observed. A passing retry alone does not undo the failed full run or establish a fix.
|
||||
|
||||
## Smallest allocation-free correction candidates, contingent on evidence
|
||||
|
||||
### Preferred representation correction if enlarged inline carriers matter
|
||||
|
||||
Move the **borrowed variant's policy payload** to an external immutable fixture backing owner, mirroring the retained variant. For example:
|
||||
|
||||
```rust
|
||||
struct BorrowedSnapshot<'s> {
|
||||
bundle: &'s SourceBundle,
|
||||
policy: SnapshotPolicy,
|
||||
}
|
||||
|
||||
enum SnapshotBacking<'s> {
|
||||
Borrowed(&'s BorrowedSnapshot<'s>),
|
||||
Retained(&'s RetainedSnapshot),
|
||||
}
|
||||
struct CarriedInput<'s> { backing: SnapshotBacking<'s> }
|
||||
```
|
||||
|
||||
All constructors remain cfg(test); fixture code holds the borrowed backing owner while returned syntax/resolved/indexed guards exist, exactly as it already holds RetainedSnapshot. The owner captures exact policy once; CarriedInput borrows it, fixes bundle identity and prevents premature drop. The guard then consists of tagged references instead of a copied104-byte policy payload. No new heap allocation, copied String, logical collection entry or uncharged Box is introduced. The policy is inline scalar state in its external owner, outside every syntax/result copy. Exact guard/layout sizes still need compiler verification.
|
||||
|
||||
This changes no check ordering, C arithmetic, Usage, model/public API, allocation ownership or legacy grammar. It strengthens symmetry of both guard variants and respects the accepted borrow-bound ownership design. Required test adjustments would bind a local borrowed fixture backing before obtaining its input; they should not change any expected models, limits, cap values, spans or stack sizes. Existing small-stack tests must remain completely unchanged.
|
||||
|
||||
This is more justified than boxing ParsedMixedSyntax/Project/whole Result: such boxing introduces a real allocation and a new accounting/lifecycle choice unrelated to the accepted logical scope. Do not silently add a Box to fix a native frame without its design and reservation being reviewed.
|
||||
|
||||
### Smaller forwarding correction if the new wrapper is the material delta
|
||||
|
||||
For default legacy parse, call the shared parse_impl directly with None instead of routing through the newly trivial parse_with_profile forwarder; this restores the old number of parser-body callers on the actual failing indexed->accepted->parse route without duplicating grammar or touching checks. The tight-profile wrapper would still add a frame for its callers, so this is not a general representation fix.
|
||||
|
||||
Alternatively an explicitly forced-inline annotation on the tiny forwarding wrapper can remove that frame if the compiler honors it in this debug configuration. It is a code-generation hint, not a semantic stack guarantee, and must be verified from the new artifact and existing controls. Do not mark the entire large parser body always-inline: it can duplicate/inflate callers and makes the intended correction less predictable.
|
||||
|
||||
Do not simultaneously apply unrelated layout/algorithm changes before the trace identifies the relevant ancestors. A narrow representation correction may be preferable if payload replication affects multiple phases rather than one forwarder.
|
||||
|
||||
## Acceptance after any selected correction
|
||||
|
||||
Preserve the original12 carried expected outcomes, all legacy phase timing, exact output-owner Slots and all nine pre-existing passing stack-named controls with unchanged fixtures/stack allowances. Verify production source review for constructor/lifetime/accounting changes and run parent exact-artifact focused/full gates. Retain d11b99bb's full abort record. A proposed fix is not accepted until the original failed control and required broader run complete at the corrected pin, with inherited failures reported separately.
|
||||
|
||||
No correction is implemented here. Await the exact-artifact trace before selecting between these concrete candidates or investigating another actual phase.
|
||||
|
||||
## Trace update and selected candidate
|
||||
|
||||
Parent subsequently reproduced the exact-artifact failure in numeric parsing with the new parse_impl/parse_with_profile ancestors visible, and recorded prologues11,144/312 bytes respectively (other measured active ancestors accepted1,752/indexed1,704/worker7,752; not a total). Parent selected the independent critic's **smaller** representation correction over the external borrowed-policy-owner alternative above: consume the preparse CarriedInput, transfer policy into Budget + syntax.limits, and retain only a slim Borrowed/Retained-owner guard in syntax. Borrowed mode already keeps bundle identity via syntax.bundle; it needs no duplicated policy owner. This avoids a new fixture lifetime requirement or heap allocation, preserves exact policy after transfer, and removes the large inline policy from legacy carriers as well. Parent authorized that narrow source edit, preserving the wrapper and all existing stack tests. Candidate implementation and notes are submitted for review/gates; this report does not claim causal proof or accepted runtime recovery.
|
||||
@@ -0,0 +1,44 @@
|
||||
# Carried-phase independent test review
|
||||
|
||||
Disposition: ready for parent compilation and runtime gates, with no remaining source-level blocker found. This is a read-only test/oracle review, not test execution or acceptance of compiler results.
|
||||
|
||||
Reviewed `crates/oa-core/src/language/analysis_source/mixed/carried/tests.rs` in `.local/as3batch`, final SHA-256 `26730fd70ec13e0a211a3650e041323bbaf8ba3eb30382273165e9b4b378bc6b`, containing12 tests. Compared with the independent `CARRIED-PHASE-ORACLE.md`, accepted `harness/analysis-carried-phase-contract-20260925.md`, existing parser/projection/accounting implementation, and new carried authority shape. No Cargo, source edits, commits or remote writes were performed.
|
||||
|
||||
## Findings resolved before compilation
|
||||
|
||||
The initial frozen test hash `bbee6aab87f99a98ecc3fdab30cea4b998f405d8e07b36e23e7a9cdb52f9e099` had two concrete fixture/assertion defects:
|
||||
|
||||
1. The OA/SA parity fixture used `oa_engineering_property` and `sa_engineering_property`. The mixed parser explicitly rejects these long names before intended resolution/index parity. Implementer replaced them with accepted `oa_property` and `sa_property`.
|
||||
2. The include-policy test assigned full include span0..23 to both depth and edge refusals. Edge cap1 first fails inside `mixed::State::include`, whose ordinary error transport produces span0..1; depth refusal arises from traversal and retains0..23. Implementer separated the expected spans.
|
||||
|
||||
Both corrections were reread in the final hash above. They alter test inputs/expectations, not production policy.
|
||||
|
||||
## Oracle agreement and phase reachability
|
||||
|
||||
The literal empty and three-file fixtures agree with independently authored counts: owned C `(1,0,102)` and `(3,0,180)`; final U/M `1/11` and `3/19`; scanner work `(78bytes,19tokens)` and `(132bytes,31tokens)`; syntax entry caps13/25; complete resolver entry peaks17/29 and text peaks112/214. Final retained Slots `(13,0,110)` and `(25,0,212)` prove C participates exactly once. Assertions cover complete literal empty Project, empty warnings, exact work counters, canonical file order, actual bundle pointer, retained owner guard and unchanged owner contents after witness destruction.
|
||||
|
||||
Cap-minus-one syntax tests name the actual failing file, including part.arcadia for the cumulative three-file case. Entry/text resolver negatives first unwrap successful parsing and assert catalog header span11..73. The identical zero-baseline profile resolves successfully, providing the needed discriminating positive control. Exact-cap full success is supplied by the first test, not inferred from failure arithmetic.
|
||||
|
||||
Legacy cap11 returns syntax and later fails resolver sum12 at span0..0. Explicit carried borrowed-zero cap11 refuses preprojection at span0..1; cap12 clears syntax. This catches both a numeric-zero bypass and accidentally changing original parser timing. Initial C+file-slot tests include the deliberate max_files0 ordering sentinel, accurately described as a test-only inadmissible target rather than successful predecessor provenance.
|
||||
|
||||
Text refusals occur after parse succeeds and quoted names are demonstrably decoded. Empty bytes109 names the header; chain bytes211 names part's include0..23 because accounting uses canonical file order. The source-size and raw-token tests use borrowed-zero mode so owned C.text cannot preempt the intended work boundary. Their seed empty bundle fits each inherited profile. Traversal limits have an exact positive triple3files/2depth/2edges and separate failing coordinates.
|
||||
|
||||
## Added ordinary-position text oracle
|
||||
|
||||
The one ordinary activity with `description "é";` has retained syntax text45 bytes: project alias/name8, ordinary alias/name2, field-span map key11, AST field-map key11, decoded string2, projected Record key11. The projected scalar is `EditKind::Atom`, so no second literal String is counted there. At C.text+44, prior text34 fits and the final11-byte projected key exceeds the ceiling. Projection's `EditField.span` starts at the description keyword and ends after its semicolon, matching the test's exact expected diagnostic.
|
||||
|
||||
This test proves that particular postparse refusal and copied-key contribution. It does not assert that C+45 admits complete resolution; catalog and potentially mapped diagnostics are later phases. It therefore makes no unsupported exact complete-resolver-cap claim for this fixture.
|
||||
|
||||
## Policy, ownership and limits
|
||||
|
||||
Exact snapshots compare all6 Limits fields and all7 scalar ProjectLimits/model fields. Behavioral controls exercise references0, frames0 and numeric72 refusal, then roomy successful resolution for the same typed forms. The independently specified literal1 meter cost73 is also used for a prior nonzero numeric-work witness and a fresh73-unit reparse, detecting accidental accumulation of prior work. Model caps reach typed-record admission or real reference work; seeds remain admissible under each tightened policy.
|
||||
|
||||
No test invokes a production arbitrary-Slots constructor. Retained owner fixture construction derives C from its actual map/source/path/entry bytes; borrowed construction captures a witness's policy without borrowing that witness's lifetime. Dropping the seed before parsing is consistent with the intended copied immutable policy. Nonzero occurrences and usize overflow are explicitly marked fault injection; they are not represented as real successful owner provenance. Sibling test access through the cfg(test) phase_state method appears consistent with its parent-module visibility; compilation remains the authoritative check.
|
||||
|
||||
OA/SA zero-carried parity now reaches the accepted short-word grammar and compares Project, warnings, storage, Usage/numeric work, both index name/occurrence families and original bundle ownership under Unicode/CRLF input. It is equivalence coverage, not a separate authored whole-model oracle; the empty/chain success tests provide their own literal complete Project.
|
||||
|
||||
The tests and this review do not establish universal before-allocation admission, a stack guarantee, production emitter provenance or editing/install authority. Parent owns actual focused/full/list/Clippy/format evidence and inherited failure reconciliation.
|
||||
|
||||
## Final slim-guard delta
|
||||
|
||||
Reviewed committed delta `d11b99bb4ab1c817951557551db3a3c7cbd5c425..fa7a980418ef99d772e67c66c28dfa7b5181f875`. Final tests SHA-256 `794c8e987b43d4a652361bf7e31eff314f917955824efdbb1ba74b0216c4018a`. The only test changes select `GuardBacking::Retained` instead of `SnapshotBacking::Retained` for the same actual-owner pointer assertion, and obtain the consumed input's guard through `into_parts().2` for the same direct overflow checks. No fixture, numeric expectation, cap, diagnostic, case or assertion was removed or weakened. The policy moves into syntax/Budget while the smaller retained guard keeps the owner borrow. Runtime disposition and the preserved initial stack abort are recorded separately in `RUNTIME-REVIEW.md`.
|
||||
Binary file not shown.
@@ -0,0 +1,134 @@
|
||||
"""Reconcile committed Windows carried-phase gates against raw logs and prior outcomes."""
|
||||
from pathlib import Path
|
||||
import hashlib
|
||||
import json
|
||||
import re
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
base = Path(__file__).resolve().parents[2]
|
||||
root = base / '.local/as3batch'
|
||||
directory = base / '.local/analysis-carried-phase-gates-20260925'
|
||||
prior = base / '.local/analysis-mixed-rename-plan-gates-20260924'
|
||||
source, stem, expected_added = sys.argv[1], sys.argv[2], int(sys.argv[3])
|
||||
assert 1 <= expected_added <= 100
|
||||
assert re.fullmatch(r'[0-9a-f]{40}', source)
|
||||
assert re.fullmatch(r'[a-zA-Z0-9-]+', stem)
|
||||
sha = lambda raw: hashlib.sha256(raw).hexdigest()
|
||||
|
||||
def git(*args):
|
||||
return subprocess.check_output(['git', '--no-replace-objects', *args], cwd=root)
|
||||
|
||||
def receipt(folder, name):
|
||||
path = folder / (name + '.result.json')
|
||||
data = json.loads(path.read_bytes())
|
||||
raw = (folder / (name + '.log')).read_bytes()
|
||||
assert data['log_sha256'] == sha(raw)
|
||||
return data, raw
|
||||
|
||||
assert git('rev-parse', 'HEAD').decode().strip() == source
|
||||
assert not git('status', '--porcelain', '--untracked-files=no').strip()
|
||||
scope = ['Cargo.toml', 'Cargo.lock', 'rust-toolchain.toml', '.cargo', 'build', 'crates', 'assets', 'docs', 'examples', 'harness/fixtures', 'vendor']
|
||||
paths = git('ls-tree', '-r', '--name-only', source, *scope).decode().splitlines()
|
||||
blobs = subprocess.check_output(['git', '--no-replace-objects', 'cat-file', '--batch'], cwd=root,
|
||||
input=''.join(f'{source}:{p}\n' for p in paths).encode())
|
||||
offset = 0
|
||||
expected_inputs = []
|
||||
for path in paths:
|
||||
end = blobs.index(b'\n', offset)
|
||||
_, kind, count = blobs[offset:end].split()
|
||||
count = int(count)
|
||||
raw = blobs[end + 1:end + 1 + count]
|
||||
assert kind == b'blob' and (root / path).read_bytes() == raw, path
|
||||
expected_inputs.append({'path': path, 'bytes': count, 'sha256': sha(raw)})
|
||||
offset = end + count + 2
|
||||
assert offset == len(blobs)
|
||||
prefix = ['cargo', 'test', '--locked', '--offline', '-p', 'oa-core', '--lib']
|
||||
focus = 'language::analysis_source::mixed::carried::tests::'
|
||||
commands = {
|
||||
'focused': prefix + [focus, '--', '--test-threads=1'],
|
||||
'full': prefix + ['--', '--test-threads=1'],
|
||||
'list': prefix + ['--', '--list'],
|
||||
'clippy': ['cargo', 'clippy', '--locked', '--offline', '-p', 'oa-core', '--all-targets', '--', '-D', 'warnings'],
|
||||
'fmt': ['cargo', 'fmt', '--all', '--', '--check'],
|
||||
}
|
||||
verified = {}
|
||||
all_receipts = {}
|
||||
for mode, command in commands.items():
|
||||
name = f'carried-{mode}-{stem}-1'
|
||||
data, raw = receipt(directory, name)
|
||||
assert data['source'] == data['head_after'] == source
|
||||
assert data['mode'] == mode and data['command'] == command
|
||||
assert not data['changed_inputs'] and not data['verification_failures']
|
||||
manifest_raw = (directory / data['inputs']).read_bytes()
|
||||
assert sha(manifest_raw) == data['inputs_sha256']
|
||||
assert json.loads(manifest_raw) == {'source': source, 'inputs': expected_inputs}
|
||||
launcher = (directory / data['launcher_copy']).read_bytes()
|
||||
assert sha(launcher) == data['launcher_sha256'] == data['launcher_sha256_after']
|
||||
assert source.encode() in launcher
|
||||
env = data['environment']
|
||||
assert env['CARGO_BUILD_JOBS'] == '1' and env['CARGO_INCREMENTAL'] == '0'
|
||||
assert env['ARCADIA_CODEC_LIFECYCLE_PHASE'] is None and env['RUST_MIN_STACK'] is None
|
||||
assert data['cwd'] == str(root)
|
||||
text = raw.decode()
|
||||
outcomes = re.findall(r'^test ([^\r\n]+) \.\.\. (ok|FAILED|ignored)\r?$', text, re.M)
|
||||
assert outcomes == [tuple(x) for x in data['outcomes']]
|
||||
assert len(outcomes) == len(dict(outcomes))
|
||||
members = re.findall(r'^([^\r\n]+): test\r?$', text, re.M) if mode == 'list' else []
|
||||
assert members == data['listing_members'] and len(members) == data['listing_count']
|
||||
assert len(members) == len(set(members))
|
||||
if mode == 'list':
|
||||
assert len(members) == 246 + expected_added
|
||||
if mode in ('focused', 'full'):
|
||||
counts = tuple(sum(v == state for _, v in outcomes) for state in ('ok', 'FAILED', 'ignored'))
|
||||
summary = re.findall(r'^test result: (ok|FAILED)\. (\d+) passed; (\d+) failed; (\d+) ignored; 0 measured; (\d+) filtered out;', text, re.M)
|
||||
assert len(summary) == 1 and tuple(map(int, summary[0][1:4])) == counts
|
||||
assert summary[0][0] == ('FAILED' if counts[1] else 'ok')
|
||||
assert int(summary[0][4]) == (246 if mode == 'focused' else 0)
|
||||
assert data['exit'] == (101 if counts[1] else 0)
|
||||
assert len(data['artifacts']) == 1
|
||||
for artifact in data['artifacts']:
|
||||
actual = Path(artifact['path']).read_bytes()
|
||||
assert len(actual) == artifact['bytes'] and sha(actual) == artifact['sha256']
|
||||
assert str(Path(artifact['path'])).replace('\\', '/') in text.replace('\\', '/')
|
||||
all_receipts[mode] = data
|
||||
verified[name] = {'source': source, 'exit': data['exit'], 'outcomes': len(outcomes), 'listing': len(members), 'log_sha256': sha(raw), 'result_sha256': sha((directory / (name + '.result.json')).read_bytes())}
|
||||
|
||||
old, old_raw = receipt(prior, 'rename-full-18073a6-1')
|
||||
assert old['source'] == '18073a6f2eabce83fc83997f094e331eec835a16'
|
||||
old_actual = re.findall(r'^test ([^\r\n]+) \.\.\. (ok|FAILED|ignored)\r?$', old_raw.decode(), re.M)
|
||||
assert old_actual == [tuple(x) for x in old['outcomes']]
|
||||
assert len(old_actual) == len(dict(old_actual)) == 246
|
||||
old_out = dict(old['outcomes'])
|
||||
new_out = dict(all_receipts['full']['outcomes'])
|
||||
assert len(old_out) == 246 and len(new_out) == 246 + expected_added
|
||||
assert all(new_out.get(k) == v for k, v in old_out.items())
|
||||
added = set(new_out) - set(old_out)
|
||||
assert len(added) == expected_added and all(new_out[k] == 'ok' and k.startswith(focus) for k in added)
|
||||
assert set(dict(all_receipts['focused']['outcomes'])) == added
|
||||
assert all(status == 'ok' for _, status in all_receipts['focused']['outcomes'])
|
||||
assert set(all_receipts['list']['listing_members']) == set(new_out)
|
||||
assert all_receipts['clippy']['exit'] == all_receipts['list']['exit'] == all_receipts['focused']['exit'] == 0
|
||||
assert all_receipts['fmt']['exit'] == 1
|
||||
|
||||
def failure_blocks(raw):
|
||||
text = raw.decode().replace('\r\n', '\n')
|
||||
return {m[1]: re.sub(r"(?m)^(thread '[^\n]*') \(\d+\) panicked", r'\1 (<PID>) panicked', m[2]).strip()
|
||||
for m in re.finditer(r'^---- ([^\n]+) stdout ----\n(.*?)(?=^---- |^failures:|\Z)', text, re.M | re.S)}
|
||||
|
||||
new_raw = (directory / f'carried-full-{stem}-1.log').read_bytes()
|
||||
old_blocks, new_blocks = failure_blocks(old_raw), failure_blocks(new_raw)
|
||||
assert len(old_blocks) == len(new_blocks) == 16 and old_blocks == new_blocks
|
||||
old_fmt, old_fmt_raw = receipt(prior, 'rename-fmt-18073a6-1')
|
||||
fmt_raw = (directory / f'carried-fmt-{stem}-1.log').read_bytes()
|
||||
assert fmt_raw == old_fmt_raw
|
||||
result = {'source': source, 'baseline': old['source'], 'inputs': len(expected_inputs),
|
||||
'unchanged_old_outcomes': 246, 'added_passed': expected_added,
|
||||
'full_passed': sum(v == 'ok' for v in new_out.values()),
|
||||
'identical_failure_blocks_after_pid_only_normalization': 16,
|
||||
'identical_fmt_sha256': sha(fmt_raw), 'receipts': verified,
|
||||
'scope': 'Read-only committed-input/raw-log/artifact comparison; no Cargo execution.'}
|
||||
destination = Path(__file__).with_name('CARRIED-PHASE-RUNTIME-READBACK.json')
|
||||
assert not destination.exists(), 'Preserve previous readback; use a separately named checker for another source.'
|
||||
destination.write_text(json.dumps(result, indent=2) + '\n', encoding='utf-8')
|
||||
print(json.dumps(result, indent=2))
|
||||
@@ -0,0 +1,223 @@
|
||||
{
|
||||
"source": "fa7a980418ef99d772e67c66c28dfa7b5181f875",
|
||||
"scope": "Private carried-phase prerequisite only. 12 new tests and strict Clippy pass; final full library has 242 passed/16 inherited failures and formatter remains failed. Initial d11 full abort and debugger evidence are preserved; final unchanged stack controls pass. No emitted-output acceptance.",
|
||||
"archive": {
|
||||
"file": "evidence.zip",
|
||||
"bytes": 458509,
|
||||
"sha256": "2eca143b706458c1c0217af715fa6f17c01a0b9f85a5313d6a231dabe1aba7c9"
|
||||
},
|
||||
"members": {
|
||||
"baseline/launchers/843069930cd44278eef940930369b5a85a3b3412e1e50793d78d3d5738298fbe.py": {
|
||||
"bytes": 7674,
|
||||
"sha256": "843069930cd44278eef940930369b5a85a3b3412e1e50793d78d3d5738298fbe"
|
||||
},
|
||||
"baseline/rename-fmt-18073a6-1.inputs.json": {
|
||||
"bytes": 102986,
|
||||
"sha256": "e2c710230fa55bbefb4faeee73dab6b8104ddfb8f0291eef0eba15850799c2ff"
|
||||
},
|
||||
"baseline/rename-fmt-18073a6-1.log": {
|
||||
"bytes": 6446,
|
||||
"sha256": "c1c6b12861c8117ce6ffc6d6742ebf92618aafb10160ec6f99d370ca72ebab2d"
|
||||
},
|
||||
"baseline/rename-fmt-18073a6-1.result.json": {
|
||||
"bytes": 1881,
|
||||
"sha256": "2f2ed68a8b90f5908d309c7a7cf6fd2d275dc3286a4b5dd518bf0d60e33e13c7"
|
||||
},
|
||||
"baseline/rename-full-18073a6-1.inputs.json": {
|
||||
"bytes": 102986,
|
||||
"sha256": "e2c710230fa55bbefb4faeee73dab6b8104ddfb8f0291eef0eba15850799c2ff"
|
||||
},
|
||||
"baseline/rename-full-18073a6-1.log": {
|
||||
"bytes": 40942,
|
||||
"sha256": "a3fef7c640ec9e59484d15b18a5fc8b9a0c25ca9bf01750b1da4431a101c4eec"
|
||||
},
|
||||
"baseline/rename-full-18073a6-1.result.json": {
|
||||
"bytes": 36268,
|
||||
"sha256": "4228f67a45fca37841607d574af9b676d1c144e3a93f6d0dd34bd9c01c625d34"
|
||||
},
|
||||
"baseline/rename-list-18073a6-1.inputs.json": {
|
||||
"bytes": 102986,
|
||||
"sha256": "e2c710230fa55bbefb4faeee73dab6b8104ddfb8f0291eef0eba15850799c2ff"
|
||||
},
|
||||
"baseline/rename-list-18073a6-1.log": {
|
||||
"bytes": 27578,
|
||||
"sha256": "05e09d5280508a784dd97a894c92b8cdeb202c67592498d253e8f8c33b07e6ae"
|
||||
},
|
||||
"baseline/rename-list-18073a6-1.result.json": {
|
||||
"bytes": 29785,
|
||||
"sha256": "1e58a6c4e907fd02c0c5a3e6de18bca3ef0c36c4a2dde2584e8e51b1837d8cda"
|
||||
},
|
||||
"contracts/CARRIED-PHASE-CONTRACT-CRITIQUE.md": {
|
||||
"bytes": 11334,
|
||||
"sha256": "2bd92bf59002b080914d8ac3725c5cdc54d2fb71b8ac1ca388b3372cf14ef591"
|
||||
},
|
||||
"contracts/analysis-carried-phase-contract-20260925.md": {
|
||||
"bytes": 22812,
|
||||
"sha256": "875b26eb850ab75d6e09222be37327a87a5b4c4a6f0557adf9723984f945d5f5"
|
||||
},
|
||||
"diagnostics/carried-debugger-d11b99b-1.log": {
|
||||
"bytes": 12404,
|
||||
"sha256": "d3ede485caa0714030e7f95f10a64590334df4219ec836d4daf23db0cbea8138"
|
||||
},
|
||||
"diagnostics/carried-debugger-d11b99b-1.result.json": {
|
||||
"bytes": 1245,
|
||||
"sha256": "8299bb3c2567cd40d4c3f49123720b3e049db64aa5445c5273c3a0cb6a370b0e"
|
||||
},
|
||||
"diagnostics/carried-full-d11b99b-1.stack-frames.json": {
|
||||
"bytes": 13050,
|
||||
"sha256": "f45f3e7599aef2119eb9bf9b9632cfcc329680b1ca5fbc1d18db932572d4261a"
|
||||
},
|
||||
"diagnostics/carried-full-fa7a980-1.stack-frames.json": {
|
||||
"bytes": 13090,
|
||||
"sha256": "09a30cf7a1e0f19b9c9ad8757304168f133a748e817b887e5f2fe2d33bc918f3"
|
||||
},
|
||||
"diagnostics/debug_stack_d11b99b.py": {
|
||||
"bytes": 1735,
|
||||
"sha256": "e04f71511f1fd8e41023ec4cb359450481ae53f7b67762feffdac0f19124d391"
|
||||
},
|
||||
"diagnostics/inspect_stack_frames.py": {
|
||||
"bytes": 1889,
|
||||
"sha256": "80372b64f336b73570c1ee790c41646d0d7765e781d3489a4aa682b07515a1a6"
|
||||
},
|
||||
"diffs/18073a6-to-fa7a980.patch": {
|
||||
"bytes": 41709,
|
||||
"sha256": "ffafb480c61e399bd21268f387ef67ee1e2abcd5e2d429cd5f9d89134945a8de"
|
||||
},
|
||||
"diffs/d11b99b-to-fa7a980.patch": {
|
||||
"bytes": 9160,
|
||||
"sha256": "9afe7ca6ea381fda3d5d2a246d767409775398feb45ad685b042f5e671014e07"
|
||||
},
|
||||
"gates/carried-clippy-fa7a980-1.inputs.json": {
|
||||
"bytes": 103383,
|
||||
"sha256": "b51682b333d96d91167f4da8e4f8e4f4b1d443fbfc875fead918d0db1e1db203"
|
||||
},
|
||||
"gates/carried-clippy-fa7a980-1.log": {
|
||||
"bytes": 165,
|
||||
"sha256": "a16886fc9c1af0f8074c7f2ba51cbb1983f4d493f40faf3164d94b28c64b055d"
|
||||
},
|
||||
"gates/carried-clippy-fa7a980-1.result.json": {
|
||||
"bytes": 1968,
|
||||
"sha256": "06390bd5ae88d86cb1d24a7e17b0a57096f0a90a84482cfee4a7aa6febdbf3df"
|
||||
},
|
||||
"gates/carried-fmt-fa7a980-1.inputs.json": {
|
||||
"bytes": 103383,
|
||||
"sha256": "b51682b333d96d91167f4da8e4f8e4f4b1d443fbfc875fead918d0db1e1db203"
|
||||
},
|
||||
"gates/carried-fmt-fa7a980-1.log": {
|
||||
"bytes": 6446,
|
||||
"sha256": "c1c6b12861c8117ce6ffc6d6742ebf92618aafb10160ec6f99d370ca72ebab2d"
|
||||
},
|
||||
"gates/carried-fmt-fa7a980-1.result.json": {
|
||||
"bytes": 1882,
|
||||
"sha256": "ad79d2092b8182f3df68ed383f7ad32b3fa48afb029fa13da1ca0463203fa213"
|
||||
},
|
||||
"gates/carried-focused-d11b99b-1.inputs.json": {
|
||||
"bytes": 103383,
|
||||
"sha256": "8bfaff6784f616a550b98b3a8170781e85fe4715a0b20308d896423c73f4992c"
|
||||
},
|
||||
"gates/carried-focused-d11b99b-1.log": {
|
||||
"bytes": 2041,
|
||||
"sha256": "f04ee0473478866bc614fa794cd50af6aa2c1f5d56b9e3c1f5a65112933b144b"
|
||||
},
|
||||
"gates/carried-focused-d11b99b-1.result.json": {
|
||||
"bytes": 4193,
|
||||
"sha256": "49b9d49fc8a659fd5c64d95f3d38e38430d078dc13d9b5ddf3256cdf9b9d7ab7"
|
||||
},
|
||||
"gates/carried-focused-fa7a980-1.inputs.json": {
|
||||
"bytes": 103383,
|
||||
"sha256": "b51682b333d96d91167f4da8e4f8e4f4b1d443fbfc875fead918d0db1e1db203"
|
||||
},
|
||||
"gates/carried-focused-fa7a980-1.log": {
|
||||
"bytes": 2041,
|
||||
"sha256": "2d8058db7f66c8cf875d6fd1ffe89d15c49ee16a6bb25dc6b97be5fbfa321946"
|
||||
},
|
||||
"gates/carried-focused-fa7a980-1.result.json": {
|
||||
"bytes": 4192,
|
||||
"sha256": "2dc067b342ba6409c4ae21b540ee133732c314416b3b7e888b8c9ec7e03a67a9"
|
||||
},
|
||||
"gates/carried-full-d11b99b-1.inputs.json": {
|
||||
"bytes": 103383,
|
||||
"sha256": "8bfaff6784f616a550b98b3a8170781e85fe4715a0b20308d896423c73f4992c"
|
||||
},
|
||||
"gates/carried-full-d11b99b-1.log": {
|
||||
"bytes": 15550,
|
||||
"sha256": "705752b2f18d5897719f689083227aa1e2df4e17f6bc07747490337681ef00fe"
|
||||
},
|
||||
"gates/carried-full-d11b99b-1.result.json": {
|
||||
"bytes": 19576,
|
||||
"sha256": "ead9d4b916d7fa7a1fb868037639e2aea56dedd13d1c841f08167a64bb742261"
|
||||
},
|
||||
"gates/carried-full-fa7a980-1.inputs.json": {
|
||||
"bytes": 103383,
|
||||
"sha256": "b51682b333d96d91167f4da8e4f8e4f4b1d443fbfc875fead918d0db1e1db203"
|
||||
},
|
||||
"gates/carried-full-fa7a980-1.log": {
|
||||
"bytes": 42536,
|
||||
"sha256": "26b946c38db53e7dc589771e1829908dff3596cbf947ecce2442d1bf1d1896af"
|
||||
},
|
||||
"gates/carried-full-fa7a980-1.result.json": {
|
||||
"bytes": 38113,
|
||||
"sha256": "6b6ec7a335e8c1d03ec5c584e3fe8b444839e27cf3afb9f84bced33c73563743"
|
||||
},
|
||||
"gates/carried-list-fa7a980-1.inputs.json": {
|
||||
"bytes": 103383,
|
||||
"sha256": "b51682b333d96d91167f4da8e4f8e4f4b1d443fbfc875fead918d0db1e1db203"
|
||||
},
|
||||
"gates/carried-list-fa7a980-1.log": {
|
||||
"bytes": 29100,
|
||||
"sha256": "ee1c0a5367f277720407fb30a33ccdaef68b58fed3c578caceffbae7ef4035c4"
|
||||
},
|
||||
"gates/carried-list-fa7a980-1.result.json": {
|
||||
"bytes": 31333,
|
||||
"sha256": "8f739ce87c1a700bc9a51ea70b7dd8d3f77267123d5883f3cd8a36cc2a4e2c01"
|
||||
},
|
||||
"gates/launchers/51f590750896843210e02df971c7396bf379494e1605bd059ef017e6e4d41ec5.py": {
|
||||
"bytes": 7661,
|
||||
"sha256": "51f590750896843210e02df971c7396bf379494e1605bd059ef017e6e4d41ec5"
|
||||
},
|
||||
"gates/launchers/d0c116f45de7e9fa64dff58d075c44a840f22920f6c835b4867844bafb6c7ab6.py": {
|
||||
"bytes": 7661,
|
||||
"sha256": "d0c116f45de7e9fa64dff58d075c44a840f22920f6c835b4867844bafb6c7ab6"
|
||||
},
|
||||
"launchers/package_evidence.py": {
|
||||
"bytes": 4632,
|
||||
"sha256": "a0d2b0d938f1449e62db4633a0827f990df72e4def454d05dde5f858a1638125"
|
||||
},
|
||||
"notes/prior-toolchain.txt": {
|
||||
"bytes": 536,
|
||||
"sha256": "1f101518dd1f90bc2cba8d26570a762832aba6debebbbe6aa50f97a944590610"
|
||||
},
|
||||
"reviews/CARRIED-PHASE-ORACLE.md": {
|
||||
"bytes": 10107,
|
||||
"sha256": "56d1b57f4322c74bfd52f46483e337213fb6f8edf26d5756228b6e34c83692fd"
|
||||
},
|
||||
"reviews/CARRIED-PHASE-RUNTIME-READBACK.json": {
|
||||
"bytes": 2216,
|
||||
"sha256": "0003162f0524e6debecdadd0a2f13b86c67b56db92e5ab60360a876130a445fa"
|
||||
},
|
||||
"reviews/RUNTIME-REVIEW.md": {
|
||||
"bytes": 6275,
|
||||
"sha256": "b4622756c4f0d8e813fdc6525cef2ded21226813dd859893376feec00e0fab29"
|
||||
},
|
||||
"reviews/SOURCE-REVIEW.md": {
|
||||
"bytes": 11593,
|
||||
"sha256": "33542cc83877f745cdcaa9090f09b6d9e3af9bf903ab424f59952b78f8398b92"
|
||||
},
|
||||
"reviews/STACK-DIAGNOSIS.md": {
|
||||
"bytes": 3471,
|
||||
"sha256": "b62c7607bfb7868d09fade25d6bdcfdda2557e308425826cc21104311530c674"
|
||||
},
|
||||
"reviews/STACK-SOURCE-ANALYSIS.md": {
|
||||
"bytes": 10966,
|
||||
"sha256": "15ad84c58b163e23c728cdc70cbce8f001bf1b736e780cbb66e0bef2ba21c110"
|
||||
},
|
||||
"reviews/TEST-REVIEW.md": {
|
||||
"bytes": 6960,
|
||||
"sha256": "ce7f8acbd3e8ed5e4cb401ac94dc2390f4d002f0c54138cfe855de190cced6a3"
|
||||
},
|
||||
"reviews/inspect_runtime.py": {
|
||||
"bytes": 7452,
|
||||
"sha256": "bc9065192356d06f909abd3af06da2bffddbf88cce04524490bf8c5c404b84da"
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user