RT 2026-08-05 - area 13 - opus (Opus 5) - yield 12 #169
ms609-agent
announced in
13 · Constrained search correctness
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: unrecorded | 2026-08-05
Migrated record. This round predates the move to Discussions; it is reproduced
verbatim below from
dev/red-team/log.md, which is now closed to new entries. It isposted here so this area has a round record whose
createdAtorders correctly againstthe other areas' — the backfill ran oldest-first for that reason. All fourteen posting
timestamps are later than the rounds they describe; the real date is in the title and
in the
date:field.area: 13 (Constrained search correctness) — opus finder sweep, directed round
reviewed_by: opus finder ac6ece01b95dec79c + opus verifier ad74e7246bc17d134 (A13-01/A13-02) + haiku verifier a67f772b67755c4a0 (A13-03..A13-12 batch)
date: 2026-08-05
tier: opus (Opus 5)
yield: 12 filed (#61-#72: A13-01/A13-02 sev:high, A13-03/A13-04/A13-05 sev:med, A13-06..A13-12 sev:low) + 2 doc fixes applied inline; 0 refuted — all 12 candidates confirmed REAL
notes: Dispatched directly at the user's request ("sounds like we're ready for a proper area 13 sweep now"), immediately after the same-day directed harness re-run (see the entry below) closed out area 13's standing "not a finder" blocker.
Two high-severity findings, both independently reproduced end-to-end. A13-01 (#61):
.PrepareConstraint's joint-satisfiability gate (R/MaximizeParsimony.R:156-181, T-329's fix) is pairwise four-gamete only, which does not imply joint displayability for partial splits (taxa excluded from both groups) — unlike for complete splits, where pairwise ⇒ joint holds by Buneman. Verifier independently enumerated all 105 six-taxon trees and confirmed a 3-split counterexample ({a,b}|{c,d},{a,b}|{c,e},{a,d}|{b,e}) that is pairwise-compatible on every pair but displayed by 0 trees; an end-to-end run then accepted the constraint with no error/warning and returned trees that violate it (score 67 vs unconstrained 65). Aggravating factor found during verification: onlyconsSplitMatrixcrosses to C++, neverconsZero, so C++ actually enforces a different, stricter proposition than what the R gate validated — in the repro this makes the C++-level splits mutually incompatible, which is why the search freezes on top of the original silent-violation risk. A13-02 (#62):map_constraint_nodes(ts_constraint.cpp:207,:217) iteratestree.postorder, confirmed internal-nodes-only (ts_collapsed.h:23), so a single-tip 1-group constraint split can never map unless that tip happens to be a root child —constraint_node[s]stays -1 forever, freezing every phase touching that split..PrepareConstraintdoesn't filter size-1 rows. Verifier's control repro (25 taxa) isolated a clean 12-step cost for an otherwise-free vacuous single-tip constraint, and corrected the finder's "totally frozen" framing to "measurably degraded, not fully frozen" (1068 < 1090 Wagner baseline) — kept the finding, tightened the claim.Ten more filed at med/low, all confirmed by the haiku batch verifier against current HEAD line numbers. A13-03 (#63, med): loose (
violates_constraint_posthoc+has_posthoc) vs strict (constraint_node[s]<0+active) gates diverge across phases, full call-site inventory across Wagner/sector/TBR/drift/spr_search/prune-reinsert/nni_perturb/fuse/parallel-fuse — including a genuine serial-vs-parallel-fuse mismatch (parallel-fuse trigger is loose, its own verify half is strict). A13-04 (#64, med):consensusConstrainauto-constraints (has_posthoc=falseby construction) are invisible to the sector phase's gate but the sector phase's post-accept resync fires regardless, freezing the rest of the replicate — opt-in only (consensus_constraindefaults false), distinct from the already-ruled-down T-13-B. A13-05 (#65, med):tree_fusehas noConstraintDataparameter at all — constraint-blind internally, makes fuse near-inert under a constraint (relies entirely on caller-side repair/discard). A13-06 (#66, low):anneal_searchhas no post-move constraint verification, unlike every sibling phase — mitigated because the pre-move screen is argued sound for its SPR-only move set andannealCyclesdefaults0L, so filed as defence-in-depth not a proven hole. A13-07 (#67, low):impose_one_passcomputesmove_out_roots/move_in_rootsonce per pass but consumes them stale across re-anchored moves within that pass — silently ineffective repair, not corruption (T-333 still catches actual invalidity). A13-08 (#68, low):topology_spr's root-child no-op bail is still counted as a successful move bytry_move, defeatingimpose_constraint'smoves==0convergence check. A13-09 (#69, low): drift's RFD re-apply failure path is the one exit skipping the constraint resync every sibling exit performs — assessed practically unreachable, filed for consistency. A13-10 (#70, low):spr_searchleavescdstale on return, safe today only because every downstream caller happens to re-init. A13-11 (#71, low):extract_consensus_splitsdedups by 64-bit hash alone with no bitset comparison — theoretical collision risk feeding the same freeze mechanism as A13-04. A13-12 (#72, low):expand_and_reinserttakes aConstraintData* cdparameter it never reads — dead/misleading, and a natural spot to close part of A13-03's gate inconsistency if enforcement is ever added here.Q3 (false-negative direction of
regraft_violates_constraint) answered as a resolved negative — do not re-hunt. Traced everyClipZone×constraint_complementcombination including thebelow==cnboundary exception and thecn==parent(clip)splice-out case. Thestraddle→UNCONSTRAINEDbranch is sound for SPR (the clip's internal induced bipartitions are invariant under relocation) and is only unsound for TBR (rerooting moves the attachment leaf, changing which clip-internal edges induce which whole-tree bipartition) — which is exactly why the TBR (ts_tbr.cpp:2867) and drift (ts_drift.cpp:741) backstops exist, and both are correctly placed with correct resync on every reject path. The residual exposure from this line of attack is A13-06 (anneal_search's missing backstop), not a hole in the predicate itself. One over-rejection case noted but not filed separately (when the clip subtree iscn, every regraft is rejected even though it's harmless) — that's issue #54's territory, not a new bug.Q4 (laminar/nested consistency across TBR/Wagner/sector) answered: the divergent axis is loose-vs-strict (A13-03), not nesting. Every path tests each constraint split independently and none assumes or mishandles laminarity — confirmed by direct code read, not just absence of a counterexample.
Ruled out this round, do not re-trace: constraint-metadata resync on TBR / prune-reinsert / ratchet / sector revert paths (all correct — A13-09/A13-10 are specifically about narrower exit paths, not a general resync failure); per-worker
ConstraintDatacopies in parallel mode (T-336 still holds); split canonicalisation agreement betweents_splits.cpp::canonicalize_splitandbuild_constraintpost-T-384 (now largely cosmetic for mapping, polarity handled symmetrically);structurally_valid()(T-333) remains a complete check as documented.Not yet examined, flagged as the obvious next seam:
Resample.R/SuccessiveApproximations.Ralso call.PrepareConstraint(R/Resample.R:311,R/SuccessiveApproximations.R:71) and route tots_resample_search/ts_parallel_resample/ts_successive_approx— not traced this round for whether they carry the fuse/sector/pool gates at all. Also latent, not yet a bug:impose_constraint's repair always targets making the canonical side the clade regardless of which side is cheaper to realise (ts_constraint.cpp:741-753), which combined with A13-07 probably explains part of the heuristic's weak convergence on nested/complex constraints.Doc fixes applied inline (not filed, comment-only):
src/ts_constraint.h—regraft_violates_constraint's doc no longer references a nonexistentaboveparameter and now states explicitly it's screening-only (every caller must re-verify the applied move);impose_constraint's doc replaced the false "after return, all constraint splits are displayed" contract with the actual heuristic contract (bail-out cap, per-move revert, return value doesn't distinguish repaired-from-gave-up).Seam status: still yielding (12 filed from 12 candidates, 0 refuted) → next area-13 visit, once rotation reaches it, should stay opus with a fresh agent, targeting the
Resample.R/SuccessiveApproximations.Rseam named above first.All reactions