RT 2026-08-05 - area 15 - opus (Opus 5) - yield 26 #153
ms609-agent
announced in
15 · Legacy pure-R search API
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
opus (Opus 5)| effort: default | 2026-08-05 | second pass — opus arm of the tier-economics experimentYield: 26 candidates, 26 confirmed, 0 refuted. Four
sev:high.Filed as 7 grouped issues: #136, #137, #138, #139 (
sev:high), #143, #144 (sev:med), #131 (sev:low). One defect fixed inline.THE TIER EXPERIMENT IS ANSWERED — DO NOT RE-RUN IT
This arm ran over the identical scope with the sonnet arm's entire yield in its do-not-re-investigate block, and still returned 26 candidates including 4
sev:highagainst sonnet's 5 and zero.sev:highThe cheap pass removed no work from the expensive one — opus still read all 2,185 loc — so
C_sonnet + C_opus > C_opus, exactly as the cost argument predicts. The cheap rung was not even much cheaper on this scope.The severity split is the real result: sonnet found broken documented contracts; opus found silent wrong answers. Different class, not different amount.
Standing conclusion:
start_tier: sonneton a never-visited area is not a saving. The genuinely cheap lever this round exposed is verifier routing, not finder tier — the haiku batch cost 41k against the finder's 180k and confirmed 13 rows.(Caveat added after the fable round: the sets are not nested in either direction, so "higher tier finds a superset" is false as stated. The missing control — a second opus pass with no exclusions — is #148.)
The four
sev:high, all silent-failure class#136 —
Ratchet(stopAtScore=)returns the input tree carrying the improved score.edgeList <- candidatesits atR/Ratchet.R:190, below thebreakat:178. Measured on Lobo: returned tree RF-0 from the input,attr(,"score")223, independentTreeLength()230. Two more symptoms share the cause — the target-meeting tree is never added toforestso the success path errors "No trees!?", and the already-met early return omits the score attribute and killsMultiRatchet().#137 —
Ratchet()never forwardsTreeScorerto itsBootstrapper, and...cannot rescue it becauseTreeScoreris a named formal (R/Ratchet.R:82), so argument matching consumes it. Instrumented run: the custom scorer called 0 times during both bootstrap phases against 391 overall. The perturbation and search phases optimise different objectives — in the one function whose reason to exist is a custom criterion.Jackknife()forwards it correctly.#138 —
TreeSearch()'s defaultRootedTBRSwapholds the root fixed. The root split is a hard invariant (one distinct root bipartition over 20,000 calls), so a 150k-step walk reached 45 of 945 7-tip topologies: a mid-rooted start is confined to ~4.8% of tree space, permanently.EdgeListScoreverified root-invariant (230 across rootings), so the loss is pure.#139 — fractional weights truncate to zero before bootstrap resampling.
original_weightis filled byas.integer()truncation (R/PrepareData.R:76) while scoring uses.ScaleWeight(). Uniform fractional weights floor to all-zero, every character resamples to weight 0, every tree ties at 0, andR/CustomSearch.R:74accepts equal scores — soBootstrapTree()/JackknifeTree()degenerate into a random walk, with zero errors, warnings or messages (confirmed viawithCallingHandlers).VERIFICATION CORRECTED THE FINDER THREE TIMES
Do not treat a finder's numbers as the record, even at a 100% confirm rate.
sev:highdowngraded to med — a loud immediate error, not the silent one claimed.NJTree()/rtree()/read.tree()all yield mid-rooted trees";NJTree()is tip-rooted (measured1|47on Lobo), so the package's own?TreeSearchexample is in the benign 78–81% regime.ape::rtree(30)(24|6), a balanced Newick (4|4) andBalancedTree(20)(10|10) are the genuinely confined cases.NNISwapself-hit rate is2/(nTips−2)not1/(nTips−2)(40% at 7 tips, not 19.8%) because a root with two internal children makes both root-adjacent edges self-hitting — a fixer following the finder's number would have excluded one edge and left half the bug live.NNI(-1)is missing one internal edge's entire pair of true neighbours (6 of 8 reachable), not merely padded with duplicates. AndTBRSwap()on a trifurcating root does not misbehave — it HANGS INDEFINITELY (killed after 2+ min), which is why A15-09: exported swappers' argument validation is unreachable or absent — TBRSwap() HANGS on a trifurcating root #144 ismednotlow.Verifier methodology worth reusing, not re-deriving
Both peer verifiers built independent unrooted-neighbourhood enumerators and validated them against the closed forms 2(n−3) for NNI and 2(n−3)(2n−7) for SPR before using them as ground truth (n = 5–10, several shapes). That validation is what licensed them to contradict the finder rather than defer. Rebuild trap: tied n/2 | n/2 splits need lexicographic, not size-based, tie-breaking.
Fixed inline, not filed
R/SuccessiveApproximations.R:111-119— the "Stability not reached" branch emitted its message regardless ofverbositywhile "converged" was gated, so a defaultverbosity = 0call was noisy. Both now inside one gate. An identical ungatedmessage()survives atR/Ratchet.R:291inMultiRatchet(), left for #131's sweep.Ruled out — do not redo
morphy-deprecated.Ris clean: all eight shims delegate to native replacements, none reaches a removed MorphyLib path, none loads a DLL,UnloadMorphy()returnsinvisible(0L),.GapHandler()'spmatchaccepts legacy"inapp". Only cosmetic residue (nTaxa/gapaccepted and not forwarded). Also: the1:nidiom survives nowhere else in scope;RearrangeEdges()'s doubleTreeScorer()call is correctness-safe for deterministic scorers and a hazard only for stochastic ones;Ratchet()'s accept criterion is monotone on the normal exit path;.NonDuplicateRoot()(R/SPR.R:42-54) is correct including its asymmetric branching — do not "simplify" it;TBRSwap()has full neighbourhood coverage (64/64, 106/106).Not chased
TBRSwap()'s residual 1.7–2.65% identity rate — mechanism unidentified, not thebrokenRootDaughtersbug and not a warning path. WhetherSPRSwap()can reachnCandidates == 0and die onparent[[integer(0)]](R/SPR.R:231-248).PrepareDataSA()reachable only through the brokenSuccessiveWeights(), so entirely untested.NNISwap()/RootedNNISwap()deriverootNode <- nTips + 1Lrather than reading it from the edge list.Seam status: still yielding, abundantly. Highest-value next work-shape is not another general finder: audit which advertised custom-criterion entry points work end to end (#137 + #126 + dead
SuccessiveWeights()are one decayed-façade story), and port the validated neighbourhood enumerator to the C++all_spr/all_tbrpaths.All reactions