Skip to content

fix: paren-form trailing args (ILO-544) + release/26.8 stabilisation - #789

Merged
danieljohnmorris merged 11 commits into
release/26.8from
fix/paren-form-trailing-args
Aug 13, 2026
Merged

fix: paren-form trailing args (ILO-544) + release/26.8 stabilisation#789
danieljohnmorris merged 11 commits into
release/26.8from
fix/paren-form-trailing-args

Conversation

@danieljohnmorris

Copy link
Copy Markdown
Collaborator

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)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 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_atom flag consumed at expression head only; operand positions are untouched, so nested and complete calls keep their exact prior parses. f(x).0 closes the arg list. Cross-engine tests, verified against the unmodified base.

Stabilisation (each its own commit)

  • is_decl_start missed test - shadow-test decls fell into script mode; ilo check broke on every file with shadow tests
  • build.rs clobbered the ILO-538 ai.txt index on every build (bit 3x during this branch); regeneration removed, SPACING line updated to the post-544 contract
  • fix_plan silently null on T003/T004/T005 - the ILO-504 hoisting advisory broke the suffix-anchored suggestion parse; repair loop had lost machine fixes on the most common error class (the ILO-543 question, answered)
  • -- err: assertions matched the .ilo deprecation hint - both harnesses now ignore advisory lines
  • AOT byte-identity corpus: .@ rename left 136 'missing' baselines, masking legitimate backend-rework drift; test resolves .@, corpus recaptured, drift attributed to the rework via base-binary capture (byte-identical to this branch's)
  • python-emit: 3 drifted baselines regenerated
  • help_ai_ tests* pinned the retired SPEC-compactor format (passed only via the clobber bug); now pin the index contract + 12KB regrowth cap
  • P011 fix_plan test pinned pre-ILO-501 single-edit shape; occurrence-complete now
  • cross-engine parity tests had shadowing duplicate fixtures from the .@ rename whose second version was the documented TCO note-dropping shape
  • fs-builtin fixtures lacked /fs sigils - W051 polluted asserted stderr
  • js-emit suite deleted - JS backend removed in the backend-trait lock (rode along in the parser commit)
  • skills over token caps (ilo-language 2553/1950, ilo-agent 2010/1700) - dedupes and factual fixes: reserved list appeared twice, Running block listed both extension eras, spacing section taught pre-544 behaviour; now 1943 and under 1700, TOTAL 13680/14000
  • marketplace.json had duplicate version keys (26.5.0 shadowed by pre-CalVer 0.13.0) - single 26.8.0
  • rustfmt sweep + three stray warnings (branch tip was unformatted; fmt CI failed every PR)

Test plan

  • Full suite green: 331 suites, 0 failures (first on this lineage)
  • ILO-544 matrix cross-engine incl. known-arity completion, prefix-op composition, field-chain closure, complete-call tightness
  • AOT drift attributed via 3-example base-binary capture before recapture
  • cargo fmt + clippy clean; both default and --features tools builds

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).

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.
@danieljohnmorris
danieljohnmorris merged commit c97fb87 into release/26.8 Aug 13, 2026
1 check passed
@danieljohnmorris
danieljohnmorris deleted the fix/paren-form-trailing-args branch August 13, 2026 07:52
danieljohnmorris added a commit that referenced this pull request Aug 13, 2026
rust.yml fired only on main/next, so every PR into release/26.8 merged
with no build, test, fmt or clippy gate - the empty check list on #789
and #790. Release branches are the live integration line for a version;
they need the same gate as main.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant