Repository navigation
chore(quest): no Rust TLA+ checker beats TLC on the route model after FoldSet - #8669
Conversation
Quest-Claim: 869e6201281672f9
… FoldSet Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
No actionable comments were generated in the recent review. WalkthroughThe pull request deletes the document describing a proposed comparison of native TLA+ checkers with TLC. The document also recorded comparison requirements, resource limits, and the m0 decision. Merge Risk:
|
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes: the single-file diff, checked against the rest of the checkout for dangling references.
- Quest file deleted:
quest/m0/tla-native-recheck.mdis removed. The quest's outcome (no Rust TLA+ checker beats TLC) is recorded in the PR description. A repo-wide grep finds no other references to the file.
claude-sonnet-5-5 | 𝕏

Result: still no Rust TLA+ checker qualifies, so the
tlarecipes stay on TLC alone. This reruns moq-dev/moq#8600's comparison after moq-dev/moq#8628 replacedSumOverwith the Community Modules'FoldSet. Every config a checker finishes still gives TLC's verdict and distinct-state count. On the route model, though, none costs fewer core-seconds than TLC, and two still cannot run it at all. #8628 also made TLC about 5x cheaper on route, so the bar a checker has to clear is now higher.This finishes
quest/m0/tla-native-recheck.mdwithout adopting a checker, an outcome its Goal provides for, and deletes the quest file. Nothing else linked it.Result
The three candidates are at the same revisions #8600 tested; none has pushed since. tlaplusplus (
865cf7a) was left out: it is also unchanged, and what disqualified it (exit 1 instead of 12, RustDebugtraces) has nothing to do withSumOver.93dca5c9c29aRing.cfg(426,409 states) at 14x TLC's CPU (2,630 against 183 core-s). OnRouteHandoff.cfgit runs out of memory at the 16 GB cap after 2,186 core-s, at 290,842 of TLC's 407,240 states (TLC: 182 core-s). It has a nativeFoldSet, so the fold was not what made it slow.c8fce23493bbtla-mc: unknown operator choose.FoldSetexpands toFolds.tla'sMapThenFoldSet(op(_,_), base, f(_), choose(_), S), which applies its operator parameterchoose. This is the same bug #8600 hit withSumOver'sf, now inside a library module.c9b885abb93aEach cell is distinct states (or verdict) / core-seconds (user+sys) / peak RSS in GB, at 4 workers:
route/RouteHandoff.cfgroute/Ring.cfgroute/Lag.cfgroute/Loop.cfgRequestsLoopFree/ 432 / 4.5route/Early.cfgroute/LagWide.cfgresume/ThreeRoutes.cfgresume/ResumeReader.cfgTLC's distinct-state counts are the same as #8600's on every config, so #8628 changed the cost and not the state space. Its CPU fell from 912, 1,027, 3,004, 1,874, 7,584, and 12,313 core-s on the route configs to the numbers above. Part of the drop is the move from 8 workers to 4, but most of it is
FoldSet.Why the sweep stops here
The Goal asks for fewer core-seconds than TLC on both the route and resume models. The route model is now 5,850 of the 7,175 core-s these eight configs cost TLC, and no candidate qualifies on it:
Ring.cfg, the one route config it finished. In the first 9 minutes ofRouteHandoff.cfgit found about 30,000 distinct states per minute on 4 workers, against TLC's roughly 625,000 per minute. A fullEarly.cfgorLagWide.cfgrun would take tlx about 7 CPU-hours at itsRing.cfgrate (162 states per core-second, against TLC's 1,800 to 2,300), and probably more than 16 GB.Adoption needs agreement on every exhaustive config, and on route there is no candidate left to check against TLC. The failover, reconnect, subscribe, and JS configs, which #8600 found every finishing checker agreed on, were therefore not rerun.
On resume, tlx (3.9x to 4.5x cheaper) and tla-mc (2.1x to 2.4x cheaper) would still qualify, as they did in #8600. Adopting either for everything except route would leave 80% of TLC's cost on TLC and add a second engine to Nightly, so neither is adopted.
Upstream bugs, for the maintainer to report
None were filed. The quest asks for them to be reported to the maintainer instead.
unknown operator choose. An operator parameter applied inside an operator's body (LET x == choose(s)in the Community Modules'Folds.tla, line 25) is not resolved. The same bug blocked chore(quest): no Rust TLA+ checker agrees with TLC on the route model #8600 (Sum(f(_)) == SumOver(ns, f)). It also prints counterexamples without each step's action, as chore(quest): no Rust TLA+ checker agrees with TLC on the route model #8600 found.RouteHandoff.tlait holds about 44 KB per distinct state and checks states about 20x slower than TLC.Choices made without asking
sh/tlc.pyuses since perf(verify): TLC runs cost fewer core-seconds and share the host #8628 (chore(quest): no Rust TLA+ checker agrees with TLC on the route model #8600 used 8). TLC used the recipe's own flags and heap:-Xmx4g, the pinned Community Modules jar, and-checkpoint 0 -cleanup -noGenerateSpecTE..tlasources from the same release as TLC's jar (202311011627, CommunityModules00d3635), through-liband-library. tlx uses its bundled modules. tla-mc and tla-rs have no nativeFoldSet, so they evaluate its TLA+ definition.Validation
flake.lock. tlx used its pinned1.93.0toolchain; the others used latest stable. Each check, including TLC's, ran as its own sandboxedrunCommandderivation over a copy of the spec's directory, underGNU time -v→prlimit --as=16G→timeout 7200→ the engine. Runs went one at a time throughquest gate. Nothing of the candidates' ran outside the sandbox.Publish.cfgandFailoverRedirect.cfgall four engines gave the same distinct-state counts and verdicts.FailoverRedirect.cfgnow passes onmain; its open finding is gone, unlike in chore(quest): no Rust TLA+ checker agrees with TLC on the route model #8600.Loop.cfgtrace names each step's action (State 2: <Deliver line 523, ... of module RouteHandoff>), as the verify skills' replay steps need.RouteHandoffandRingruns. The rest ran from asystemd-run --userunit. No run was repeated or merged across the two sweeps.flake.nixandrun.shImpact
Public API: none. Wire: none. Quest tree only.
Caused by
None: this measures checkers and fixes no bug.
Follow-ups
None.
Models
Size: M
Implementer: Claude Code, claude-opus-5-5, unknown effort
(Written by Claude Opus 5.5)
Review
Rewritten by
quest reviewafter each round.Head: 94a797d
Base: origin/main at 6034f66
Reviewer: Codex, gpt-6.1-sol, high effort
Session:
01a1d71e-3b76-7de0-8ccf-6efb223c62ad, round 1Score: 10/10,
The diff only deletes a quest plan, with no runtime, API, wire, or test changes and no remaining references to the deleted file.Rounds: 1; findings 0: fixed 0, refuted 0, open 0
Findings: none