[P0] Deterministic PlUnit gate is false-green because nested runner replaces main #151
Labels
No labels
bug
documentation
duplicate
enhancement
good first issue
help wanted
invalid
question
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
nsaspy/prolog-rlm#151
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Failure
The advertised deterministic PlUnit gate invoked by:
does not currently execute the aggregate
run_tests/0suite.test/run_tests.plregisters:but later consults
test/run_tool_mcp_async_tests.pl, which registers:SWI-Prolog's
initialization(Goal, main)contract executes the last registered main goal. Therefore the consulted helper replaces the aggregate runner's entrypoint.focused_mainruns onlyrun_tool_mcp_async_casesand halts 0.This exactly matches GitHub Actions logs: the
Run deterministic PlUnit suitestep prints only the canonical async cases and exits successfully; ordinary PlUnit units are never reached.Concrete proof
Draft PR #149 added a deliberately failing conformance test for successful child-result propagation. Current production
rlm_agentstill only forwardskind:failedreplies from children, yet the full deterministic Actions job stayed green. Strengthening the test assertions did not change that. The reason is the aggregate test main is never executed.Impact
This is a repository-wide false-green condition for the deterministic PlUnit gate. CI success since this runner composition was introduced cannot by itself prove the full deterministic test corpus passed.
Other gates such as static load, Tree-sitter FFI, clean pack install, benchmarks, and live OpenRouter are separate and are not claimed broken by this issue.
Required fix
Keep the focused async runner usable standalone without letting it register/replace
mainwhen consumed by the aggregate runner. Prefer one of:initialization(..., main)in a thin standalone entrypoint;test/run_tests.plis the sole owner ofinitialization(..., main)in the aggregate program.Do not merely reorder the directives: that leaves a fragile last-writer-wins entrypoint trap.
Acceptance
swipl -q -s test/run_tests.plexecutes the full PlUnit corpus and exits nonzero when any included test fails;run_tests([rlm_subagent_supervision])on #149's test-only state is demonstrably red before the production success path is implemented;mainagain.Coordination
#149 is actively owned by another worker and already touches
test/run_tests.pl; avoid parallel edits to that branch. The active worker can close this issue from #149 if it fixes the runner while implementing #144.Trust-horizon audit: the false-green condition was introduced by merged #60 at commit
3db30d832f9b124d6b6e6aa3cbe2808914f4ae6e(2026-08-16). That same commit addedtest/run_tool_mcp_async_tests.plwith unconditionalinitialization(focused_main, main)and changed aggregatemain(_)to callrun_tool_mcp_async_casesbeforerun_tests. Therefore deterministic PlUnit green results from #60 forward should not be treated as evidence that the full PlUnit corpus ran unless independently proven by another lane. Draft #152 is the isolated repair; it does not touch active #149.Completed on current main via the stronger runner integrated in #177. Exact current-main verification: runner-integrity 19/19; aggregate 74 suites, 762/762 passed, zero failures/timeouts/blocked/fixme. Stale implementation PR #152 was closed as superseded.