fix: paren-form trailing args (ILO-544) + release/26.8 stabilisation - #789
Merged
Conversation
A paren group committed to being the whole argument list, so fmt2(x)2 AND fmt2(x) 2 both died with ILO-P001 while fmt2(x, 2) and fmt2 (x) 2 worked. Models emit the glued shape constantly: pipeline-report failed 5/5 on it in the ILO-364 N=5 benchmark, about 1000 wasted repair tokens per failure, the single biggest contributor to ilo's 40% task-failure rate vs Python's 0%. At expression head, a completed adjacent-paren call now keeps collecting trailing operands with the same greedy loop the spaced postfix form uses, so all four spellings mean the same call. A field/index chain (f(x).0) closes the list. Mechanism: paren_call_atom flag set by the atom parser, consumed with mem::take at expression head only - operand positions route through parse_call_arg and parse_operand and are untouched, so nested calls and complete calls keep their exact prior parses. Also adds 'test' beside 'alias' in is_decl_start: shadow-test decls fell into script-statement collection when script mode was merged in, breaking ilo check on any file with shadow tests (both cli_check_*_shadow_test unit tests failed on the branch tip). Cross-engine regression tests in tests/regression_paren_form_trailing_args.rs, verified against the unmodified base.
…538)
The index shipped without disabling build.rs's SPEC.md compaction, so
any cargo build overwrote the 2K index with the ~180KB monolith and
CI's sync check failed on the index's own lineage (bit three separate
times during this branch's development). Regeneration and
compact_spec() are removed; cargo:rerun-if-changed=ai.txt keeps the
include_str! embed current; the CI diff step now guards against
accidental clobber instead of enforcing regeneration.
ai.txt's SPACING line also taught the pre-ILO-544 workaround
('func(x)2 fails') as advice - updated to the new contract.
derive_typo_rename anchored its parse on the string END
(strip_suffix("'?")), so when the ILO-504 hoisting advisory appended
prose after the question, every T003/T004/T005 fix_plan silently went
null - the repair loop lost its machine-applicable fixes on the most
common error class. Parse the first quoted name instead.
The .ilo deprecation hint lands on stderr, so every -- err: assertion in a .ilo file failed against 'hint: ... \n^expected'. Filter lines starting 'hint:' in both ilo test (src/cli/test_runner.rs) and the examples harness (tests/examples.rs) - advisory output is not part of a program's error contract, and matching on it made assertions depend on the file extension they happen to run from.
The .ilo->.@ rename left all 136 baselines 'missing', which masked that the typed-HIR/backend rework had intentionally changed every object byte. The test now resolves .@ with .ilo fallback; corpus recaptured (136/136 compile OK). A 3-example capture with the unmodified base binary matched this corpus byte-for-byte, attributing the drift entirely to the backend rework and none to the parser changes on this branch. MANIFEST records the recapture.
bangbang-panic-unwrap, chunks, bang-propagation-result drifted with the emitter rework (587->799 etc). Regenerated per the test's own instructions.
- help_ai_* pinned the retired SPEC-compactor format (FUNCTIONS:/no blank lines); they only passed because the build clobber kept resurrecting the monolith. Now pin the ILO-538 index contract (QUICK START, MODULES, ilo skill get, RESERVED NAMES) plus a 12KB regrowth cap. - json P011 fix_plan test pinned the pre-ILO-501 single-edit shape; renames are occurrence-complete now, so var=5;var carries two edits. - cross-engine parity tests had shadowing duplicate src/path pairs from the .@ rename whose second version used a bare tail call - the documented TCO shape that drops the caller note. Keep the non-tail originals. - fs-builtin fixtures lacked /fs effect sigils, so W051 warnings polluted stderr ahead of the asserted ^err prefix.
Both modules had drifted over their CI caps (2553/1950 and 2010/1700) via accumulated additions. Cuts are dedupes and factual fixes, not lost content: the reserved-builtin list appeared twice; the Running block listed both extension eras side by side; the 'spacing (CRITICAL)' section taught pre-ILO-544 behaviour as gospel (updated to the new contract); adjacent-pair trap, TCO, effects, guards, contracts, pipes prose compressed. Now 1943/1950 and under 1700; TOTAL 13680 under the 14000 cap.
The plugin entry carried DUPLICATE version keys (26.5.0 shadowed by a pre-CalVer 0.13.0), so the marketplace advertised a version scheme retired in May. The 26.8 release cut missed it; marketplace_version_matches_cargo_toml now passes.
The branch tip had unformatted files from the recent rebase (fmt CI would fail every PR); this is the mechanical cargo fmt pass plus: unused Arc import in http_provider cfg-gated to the tools feature that uses it, and two unused variables underscore-prefixed.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Two things in one branch, because the second was unavoidable to ship the first: the ILO-544 parser fix, and the absorption of 16 pre-existing breaks on the release/26.8 tip - this branch is the first fully-green suite run (331 suites, 0 failures) on this lineage since main was merged in.
The headline fix (ILO-544)
A paren-form call rejected ANY trailing operand:
fmt2(x)2ANDfmt2(x) 2both died with ILO-P001 whilefmt2(x, 2)andfmt2 (x) 2worked. Models emit the glued shape constantly - pipeline-report failed 5/5 on it in the N=5 benchmark (~1000 wasted repair tokens per failure), the single biggest contributor to ilo's 40% task-failure rate vs Python's 0%.Now all four spellings mean the same call. Mechanism: a
paren_call_atomflag consumed at expression head only; operand positions are untouched, so nested and complete calls keep their exact prior parses.f(x).0closes the arg list. Cross-engine tests, verified against the unmodified base.Stabilisation (each its own commit)
test- shadow-test decls fell into script mode;ilo checkbroke on every file with shadow tests-- err:assertions matched the .ilo deprecation hint - both harnesses now ignore advisory linesTest plan
Review notes
Solo-reviewed (no working subagent reviewers); the parser commit (4720b08) is the one deserving eyes. N=5 benchmark re-run follows merge - expectation is pipeline-report 5/5 fail -> pass, which was the blocker on publishing the closed-loop result (ILO-539).