16 cards got phantom buff effects scraped from flavor and reminder text; fixed.
Status & technical detail
Class C spurious buff ops (buff verb in non-effect text)
Single-writer board (lane 1 maintains; rigs never edit). State as of 2026-09-08 ~13:00 ET.
Trunk: feat/rust-port + wip/r8-merge + wip/cycle2-merge-backup @ f496aeda (S3 L1-L4 + unit-activation + UNL-213 landed). 1.0.0 BAR LOCKED by Tai 09-08 02:48: rules-complete = 1.0.0, XP system + generic-op class in scope (02:51). ETA reported to Tai: 2-3 weeks, Sep 22-29 base case.
UNL-091 L6 COST LEG LANDED (UNL-035 queue, 09-09 ~15:25, coordinator): statics.ts self_cost_this branch now derives BOTH UNL-091 legs - the plain L6 "This costs 2 less" gated all[level 6, not level 11] via the existing costLegThresholds instead-chain encoding, composing with the L11 instead leg so exactly one is live at any pool (6-10: -2E; 11+: -4E; volatile re-arm on band drop). levelSegmentFullyDerived gained the plain shape, so UNL-091 conditional_buff marker suppresses (funnel 2: derivation and marker never both live). Catalog regen carries both legs; Rust calculate_cost_modifier_set consumes unchanged (L6 consumer). Pins: TS xp-s3-l7l8 2-mod shape + chain shape + volatile band walk, xp-s3-level-gate census block; Rust catalog_carries_l6_play_cost_level_gates (UNL-091 1->2 legs) + unl091_self_cost_level_eleven_l6 (walk 5/6/10/11/drop-8). Gates: tsc clean; targeted xp 56/56 + statics/catalog/classifier/cost 326/328 (both failures standing baseline names); cargo 215/215; golden 1517-set BYTE-IDENTICAL. Full suite in flight at commit time. REMAINING QUEUE: ##184 (UNL-059/059A L16 choose-denial); ##186 (B3) inbound; UNL-095 grant merge parked.
Level 7/8 card restrictions now check live XP in the Rust engine - the XP stack is fully live in Rust.
S3 L7/L8 PRECONDITION RUST CONSUMERS LANDED (09-09 ~14:25, coordinator): op_precondition_allows gains level/not_level arms reading the RESOLVING player live pool (TS evaluateEffectPrecondition parity) - covers UNL-031 dual buff legs (+3 level6/+1 not_level6) and UNL-038 stun leg via the exported effectProfile op preconditions (both op paths, chain-item :8641 and ability-ops :12218, already routed through the gate). activate_gear now refuses the unmet leg of UNL-049 ability-level metadata.precondition pair BEFORE the activationCondition check (TS activateGearAbility mirror, live pool at commit). NEW model.rs level_gated_window_min_xp (TS levelGatedWindowMinXp mirror: squash + positional [Level N][>] match) + fire_triggers_ctx L8 gate skipping level-gated windows while owner live pool < N (UNL-040 play trigger suppressed below 6). No export/catalog change needed - op/ability-level preconditions were never quenched (quench is staticMods-only; export comment updated to say so). Pins (5): unl049_level_gate_refuses_unmet_leg_at_activation + unl049_level_gate_opens_at_threshold (behavioral, Honeyfruit leg split), l7_l8_op_precondition_level_arms_read_live_caster_pool, catalog_carries_l7l8_preconditions (export surface), level_gated_window_min_xp_matches_ts_semantics. Gates: cargo --lib 215/215; golden 1517-set BYTE-IDENTICAL; full suite 2143/2154 with the 9 baseline names byte-identical + 2 replays-route timeout flakes (51s/62s under box starvation) that pass 6/6 in isolation (environmental, same class as worker-SIGKILL). XP S3 Rust consumer stack now COMPLETE for landed TS families (enter_ready, keyword_grant, might, play_cost, preconditions). REMAINING QUEUE: UNL-035 L6 leg (costLegThresholds + instead-chain); ##184 (UNL-059/059A L16 choose-denial); ##186 (B3) inbound; UNL-095 grant merge parked.
Level-6 XP costs now work in the Rust engine; dashboard tooling moved to trunk.
S3 L6 COST RUST CONSUMER + DASHBOARD TOOLING ON TRUNK (09-09 ~14:00, coordinator): 485f1489 dashboard generator+deploy script+README cherry-picked from feat/kanban-dashboard (39a24f9f+fe103c72, parent-approved; generated index.html gitignored, stays off trunk) - first deploy live at https://riftbound-kanban-preview.pages.dev (current through f89e37c7). L6: calculate_cost_modifier_set now heads sources with the PLAYED CARD itself (UNL-059/059A self cost ladder legs) and gates via gate_live_with_env per-source-owner live pool (caster env for self legs; in_combat snapshot preserved); 'play_cost' un-quenched; catalog carries UNL-091 level(11) -4E + UNL-059/059A bands (3-5: -2E/-1calm, 6-10: -4E/-2calm, 11+: -6E/-3calm); quench count 15 -> 2. Pins: catalog_carries_l6_play_cost_level_gates + behavioral unl059_self_cost_ladder_follows_caster_live_pool_l6 (band walk incl. volatile drop 11->5 falls back a band) + unl091_self_cost_level_eleven_l6. Gates: tsc clean; cargo 210/210; xp-s3+cost 82/82; golden 1517-set BYTE-IDENTICAL (4 traces reference UNL-059/091, none shifted). Full suite in flight at commit time. REMAINING QUEUE: L7/L8 precondition consumers; UNL-035 L6 leg (instead-chain); ##184; ##186 (B3) inbound; UNL-095 parked.
Fixed the 16 cards that had phantom buff effects from flavor text (##187).
##187 CLASS C LANDED 83c76b87 (09-09 ~13:50, F2 patch absorbed clean via git am --3way onto post-L3/L4 tip 1ace8193): sentence-level buff-noun/debuff-reduce guards in matchEffectClasses + ACTION_CLASS_MAP fallback no longer resurrects buff without verb basis. Buff class off 15 records, debuff off 6, zero gains; true positives pinned (OGN-207, SFD-101/101-P, OGN-164/SFD-232/VEN-SP4, UNL-102/162/201, OGN-078/153). Gates at absorb: tsc clean; quirks-187 4/4; card-catalog+classifier-regressions+xp-s3 296/298 (both failures = standing baseline pair); cargo 207/207; golden 1517-set BYTE-IDENTICAL; Class A re-verify 76 ops all magnitude-carried (OGN-147 op dropped per F2 seam note 1 - its 'buff me' shares the spend-a-buff sentence, flagged for a later-lane proper parse; old +2 was wrong anyway). Full suite in flight. QUIRKS ##187 flipped FIXED. OGN-065 extra catch noted. Baked enriched JSON stale for the 21 dropped records until next enricher regen (same arrangement as prior classifier fixes).
Level 3/4 might boosts now work in the Rust engine.
S3 L3/L4 MIGHT RUST CONSUMER LANDED (09-09 ~13:45, coordinator): static_might_bonus now self-scoped (scope.self===true, TS staticMightBonus mirror) with gate_live_with_env carrying the controller LIVE pool; NEW aura_might_stat_sum (TS auraMightStatSum mirror: board creatures/artifacts + legend slot EXT-3 via aura_sources, scope.self != true, gate env live pool, tokens_only + empowered_only honored, aura_scope_covers zone/board) wired into calculate_stat_modifiers after the self block; legacy aura_buff text scan skipped when the source carries might aura descriptors (TS carriesMightAuraMods guard). StaticScopePredicate gains empoweredOnly (VEN-130). 'might' un-quenched in RUST_LEVEL_CONSUMER_AFFECTS; catalog regen carries exactly the 11 level-gated might carriers (UNL-016/016-P/047/047-P/075/075-P level 3, UNL-094/191/231/231-STAR level 6, UNL-098 level 11 +4); quench count 26 -> 15. Pins: catalog_carries_l3l4_might_level_gates (11 carriers, gate/amount/scope) + behavioral level_self_might_follows_live_pool_l3 (UNL-016 volatile below/at/drop/regain) + level_aura_might_unl191_legend_slot_live_pool_l4 (legend slot scan; source covered - catalog type 'creature' normalizes to unit, TS mirror) + level_aura_might_unl231_board_source_covers_units_l4. Gates: tsc clean; cargo --lib 207/207; xp-s3 52/52; golden 1517-set BYTE-IDENTICAL (68/1537 traces reference the carriers, none shifted). Full suite in flight at commit time. REMAINING QUEUE: Rust consumers L6 cost + L7/L8 preconditions; UNL-035 L6 leg; ##184; ##186 (B3) + ##187 (F2) patches inbound; UNL-095 grant merge parked.
Level-5 keyword grants work in Rust; 41 buff cards now default to +1 per their printed text.
L5 RUST CONSUMER ecb5a875 + CLASS A BUFF-41 FIX LANDED (09-09 ~12:40, coordinator): ecb5a875 card_has_mechanic_full self_live arm reads controller LIVE xp via gate_live_with_env + xp_pool env; 'keyword_grant' un-quenched in RUST_LEVEL_CONSUMER_AFFECTS; catalog regen; 3 pins (catalog_carries_l5_keyword_grant_level_gates, level_self_keyword_grant_follows_live_pool_l5, level_self_keyword_grant_unl113_dual_at_six). CLASS A (Tai ruling 'Fix the 41 now', iMessage 2026-09-09 12:09, phonemsg-01M23EX4KPG49WP8BEPM76CN1Q): 41 records whose buff-verb ops parsed with no magnitude - buff class template now carries magnitudeHint:1 (explicit printed +N still overrides) + scoped buff-verb fallback in the buildEffectProfile magnitude pass for ops whose winning class is grant/give; equal-to guard keeps the 4 Class B records unset (visibly-wrong at handler default, own lane ##186/B3); Class C spurious-op records filed as ##187/F2. No handler/Rust-code change (hint rides exported ops; ##185 addBuffCounter default-1 stays as defense in depth). Gates: tsc clean; targeted xp-s3+gear-observers 67/67 + buff-adjacent (card-catalog/classifier/long-tail/stats/battlefield) 326/328 with both failures byte-identical to standing baseline names; cargo 203/203; golden 1517-set BYTE-IDENTICAL (no trace shifted; 173/1537 traces reference the 41 ids). Full suite in flight at commit time. REMAINING QUEUE: Rust consumers L3/L4 might, L6 cost, L7/L8 preconditions; UNL-035 L6 leg; ##184; ##186 (B3) + ##187 (F2) patches inbound via parent; UNL-095 grant merge parked.
UNL-102/162 gave +2 might instead of the printed +1; fixed (##185).
##185 FILED + FIXED TS-first (09-09 ~11:40, coordinator; Tai ruling via parent): UNL-102/UNL-162 "[Buff] me" applied +2 might vs printed +1 - parser emits no magnitude, stats.ts buff arm defaulted 2 (B2 pin corrected 2 -> 1). TS fix + Rust port (addBuffCounter no-magnitude default) in one commit; 426.1 binary idempotency + 2 XP cost already correct, unchanged. Corpus: buff-activating traces shift frames (old TS recorded +2) - attributable, rides the open combined redraw window. Flagged out of scope: general modify_stats no-magnitude default (stats.ts amount / Rust unwrap_or(2)) keeps its pinned 2.
XP levels 1-2, unit activated abilities, and UNL-213 grants landed in both engines.
XP S3 L1/L2 + UNIT-ACTIVATION + UNL-213 + L3/L4 LANDED (09-09 ~05:45, coordinator absorbs): 314c9fff L1/L2 level-gated enter-ready TS+Rust (coordinator; 'level' un-quenched affects-scoped to enter_ready; 269ae381 a1 pin flip follow-up - a1 was accidentally left unstaged in 314c9fff, caught + repaired same morning) + dde71d85..e6d29209 B2 unit-activation (UNL-102/162 buff-self shim, UNL-126 class-wide grant, activateUnitAbility + activate_unit bot arms TS+Rust enumeration) + c4558219 F2 UNL-213 grant half (activatedAbilitiesOf merged query; coordinator wired the resolveChainedAbility seam: unit sources merged re-read, gear raw) + 1c07720c A2 L3/L4 might auras + UNL-059/A cost instead-legs (unified Level derive block; census 14 carriers incl. UNL-151; quench made level-affects-scoped). Gates at tip: tsc clean; targeted 156/156; cargo 192/192; golden 1517-set byte-identical through every absorb incl. catalog regen (UNL-102/126/162/213 content + null->[] quench churn; all corpus exposure already in the port-lag class). ##184 FILED (UNL-059/059A L16 always-gated choose-denial, pre-existing, own lane). QUEUED: L5/L7/L8 + UNL-091 L6/L11; Rust consumers for L3/L4/L6 (un-quench per family); B2 follow-ons (Rust actions.rs activate_unit dispatch :19096 mirror, UNL-102 catalog pin); UNL-095 grant merge Rust port still parked; F2 caveat - grantedUnitAbilities frame key flips 6 corpus files at next TS redraw unless Rust serializer mirrors first. Perf-lane flag noted: genesis_parity (2) + replay_smoke (1) FAIL identically on pristine - cycle-6 redraw did not refresh those fixtures (known artifact class, no action).
XP levels 7-8 and UNL-091's cost discount landed in the TS engine.
S3 L7/L8 + UNL-091 LANDED 1fce3a19 (09-09 ~09:47, A2 3bc50f60 absorbed by coordinator): L7 UNL-031 buff-instead dual-op split (+3 level(6) / +1 not_level(6), dispatcher precondition picks exactly one), L7 UNL-049 gated ability pair via metadata.precondition (activateGearAbility refuses the unmet leg; enumerator stays over-approximate per convention; restores the rainbow-rune gain the pinned snapshot dropped), UNL-091 L11 cost-instead via new self_cost_this kind (L6 leg deliberately NOT derived - UNL-035 queue contract: costLegThresholds + instead-chain, gate lands as all[level 6, not level 11]; 6-10 XP gets no reduction until then, record was XP-blocked, no regression), L8 UNL-038 stun leg level(6) precondition (move ungated), L8 UNL-040 trigger-window gate on live owner pool. evaluateEffectPrecondition level/not_level arms (volatile live-pool per Tai ruling). No Rust export change (family-scoped quench). Coordinator conflict resolutions vs 793d5f58: statics.ts union (L5 keyword + L7/L8 resolution-leg shapes), census pins 17 carriers both files. Gates: tsc clean; targeted 125/125 (9 XP suites); cargo 199/199; golden 1517-set byte-identical; full suite 2141/9 with 9 test names + 6 suites BOTH byte-identical to pristine baseline (no OOM extra this run; 201s on warm caches). REDRAW EXPOSURE (A2): 59 golden trace files reference the 5 carrier ids; 9 verified - carrier suite traces FAIL TS replay (Level legs live in replay now), baseline seeds 21/25 PASS 53/84 FAIL; remaining 50 candidates enumerated at /tmp/exposure78.txt on A2's box (request via parent if the redraw lane wants it). XP S3 STACK NOW COMPLETE TS-side (L1-L8); REMAINING QUEUE: Rust consumers per family (L3/L4 might, L5 keyword_grant, L6/UNL-091 cost, L7/L8 precondition arms - un-quench per family); UNL-035 L6 leg; UNL-059 L16 choose leg (##184, own lane); addBuffCounter Rust port; UNL-095 grant merge (parked).
Level-5 keyword grants and unit-ability activation landed in Rust.
S3 L5 + ACTIVATE_UNIT RUST FOLLOW-ON LANDED (09-09 ~08:20, coordinator): 36d0caee F2 L5 keyword grants absorbed clean (UNL-047/047-P Deflect(3), UNL-075/075-P Ganking(3), UNL-113/113A Deflect+Ganking(6); kwGrants consumer reads live xpPool - intentional behavior change from ungated legacy scan, mid-turn revocation pinned; 6 records drop conditional_buff; census pins 14 -> 16, L1/L2 pin rows gain keyword_grant affects; TS-only, no catalog/regen churn). a95d59bf activate_unit Rust dispatch (TS activateUnitAbility mirror: own-ability list, recycleSelf closed, killSelf paid to trash, XP validated pre-payment, timing gates, zone-agnostic ability-link resolution) + activate_gear XP validate-before-pay ordering fix + UNL-102 catalog pin. Gates: tsc clean (L5); targeted 28/28 + 63/63; full suite 9 failed tests byte-identical to baseline names + effects/combat suite-level worker SIGKILL (OOM, environmental; same class as B2-boundary score-reasons kill); cargo 198/198; golden 1517-set byte-identical. QUEUED: L7/L8 (A2 in flight) + UNL-091 L6/L11; Rust consumers for L3/L4 might + L5 keywords + L6 cost (un-quench per family); Rust addBuffCounter modify_stats port (no corpus exposure yet - golden identical); UNL-095 grant merge Rust port still parked; grantedUnitAbilities frame-key Rust serializer mirror before next TS redraw. QA RIG 6 CAVEAT (parent relay 08:15): fleet probe covers 'offered and playable from hand' only - XP gains/spends, level gates, enter_ready timing NOT covered; bucket stability is not proof the new XP mechanics fire; behavioral coverage needs a targeted scenario driver (unassigned). SANDBOX DUTY-CYCLE NOTE (parent runbook relay 08:15): task-agent sandboxes suspend between agent turns - detached background loops (full jest suites, sweeps) get CPU only during live turns; throughput = wake cadence x turn length; 'silent 45 min' is not wedge evidence. At 07:35-07:52 a full-suite run starved this box so hard that even builtins timed out (119s x 9 probes); suite still completed (2422s vs 916s prior, suspension-distended) with results intact. Lesson: start detached suites, then keep turns short and let wake cadence drive polls instead of rapid in-turn probing.
The whole XP system (gain and spend) now works in the Rust engine.
RUST XP PORT LANDED 40eab5ea (09-09 ~05:09, coordinator lane-1): S1 gain ops (gain_xp arms both op ladders - flat/per_friendly_unit/optionalEnergyCost pay-when-able - + per-kill bracket UNL-192 gainXpPerKill) + S2 spend gates ('Spend N XP' head parse on ChampionAbilityCost + Equip/Empower costs; validate+pay wired into activate_legend/activate_gear/equip_gear/try_pay_additional_cost; duel-log spend strings byte-matched to TS) + level-gate machinery (StaticEvalEnv.xp_pool closure, level arm live-read fail-closed absent env, wired through enter_ready_env). GameState xp pool + xp_gained_this_turn ledger, begin_turn reset. Gates: cargo 189/189 (5 new acceptance pins: champion/equip Spend-leg parse, level-gate env live-read, pool+ledger+begin_turn, UNL-201 legend end-to-end spend incl. pool-short clean reject); golden_traces 1517 diverged set byte-identical to cycle-6 baseline - NO flips, XP parity not yet gate-visible (XP-active suites diverge at seq 0 pre-existing). PARKED: UNL-095 grant_ability + granted-ability merge on combat_win not yet ported. NEXT: TS L1/L2 (Level enter-ready descriptors + legacy ungated scan narrowing, atomic, per xp-s3-level-gate-spec), then S3 lanes A (L3/L4) land on top.
Re-recorded all 1,536 reference games after the combat and trigger changes; 1,520 changed.
CYCLE-5 REDRAW ABSORBED 2fd22cfc (base af44c3c5, redraw lane): 1520/1536 traces changed, determinism clean, catalog zero-drift, no churn outside tests/traces. Committed-harness reproducibility spot-verified byte-exact (seeds 10/13/28 regenerated == package digests). Gate 1517 FAIL / 19 PASS - informative-RED port-lag, my run's divergence set byte-identical to the lane's fail-seqs log.
False alarm during a corpus review: a replay misread bot picks as game events.
INTEGRITY INCIDENT + RESOLUTION: absorb initially held when my instrumented replay picked play_card where the new trace had advance_phase. Redraw lane bisected the churn to f748d08b (##169 legend gate) and exonerated its runner. My replay had measured the bot PICK, not the emitted EVENT - the harness reject-guard converts a rejected pick to advance_phase, and the ##169 gate correctly rejects legend plays from hand. Lesson: bisect at the emitted-event level, not the bot-pick level.
All 87 odd trace changes traced to legend plays now correctly rejected.
ATTRIBUTION: 87x play_card->advance_phase = legend plays (VEN-143 class) now correctly rejected; f748d08b corpus-neutrality claim RETRACTED (pickPlayableCards admits legends into the deck pool - always did). ##175 FILED (deck-pool + enumerator hygiene, rides next redraw). 3 winner flips ##139 gear activations (seed-17 OGN-120, seed-48 OGN-204, seed-99 SFD-078); 2 terminator flips to infinite_loop (seed-17/31); remainder downstream of the legend-gate class. Nothing untraceable left.
Cycle-6 re-record of all reference games absorbed; the parity freeze lifted.
CYCLE-6 REDRAW ABSORBED f7357db7 (09-09 ~04:57, redraw lane delivery on 2f0fd0c8): combined window closed - 1535/1536 traces + catalogs (1423, byte-identical to tip-scripts regen at absorb; 10-record XP delta verified per-record). Golden gate 1517 FAIL == pre-redraw port-lag baseline byte-identical / 19 PASS; 7 action changes + 22 winner flips individually attributed (5 UNL legend suites = S2 spend gates gating seq-0 activation); determinism clean. DEFERRED-PARITY WINDOW CLOSED. Freeze LIFTED: behavioral TS absorbs resume - queued: S3 Level gates L1-L8 (L1 + legacy enter-ready narrowing ATOMIC), unit activation, UNL-213 grant. Rust XP port (S1/S2 spend gates + gates) is now the top port-lag class.
XP tracking added to game state; Wily Newtfish's conditional Ganking fixed.
XP S0 + UNL-108 LANDED (09-09 ~01:15, coordinator + lane F): d79c0b6d S0 (xp frame key both engines + per-turn gain ledger + UNL-095 ability payload frames; golden 1517->1539 by design, 22 previously-green files flip on the key, deferred-parity window per redraw-checklist 0.5) + 44a838b2/2263519d UNL-108 conditional-static consumer on the ledger (##183 FILED+FIXED: pre-existing unconditional-Ganking text-scan leak). COMBINED REDRAW WINDOW TS-COMPLETE (##179 + 4a + XP frames) - offered to parent 01:02, redraw lane decision pending. Remaining XP: S3 Level-gate consumers (volatile per Tai), B2 gaps UNL-102/126/162/135/213.
Clean stat auras (phase 4a) plus XP gain and spend landed in TS.
STATICS-4A + XP S1+S2 ABSORBED (09-09 ~00:55, coordinator): lane A stat-auras 4a ae5104d0 (11 records - 7 scoped + Darius OGN-243/a + SFD-236/STAR text-identical INCLUDED per coordinator adjudication; OGS-013 global-read behavior fix riding; gates tsc clean / p4a 11/11 / adjacent 90/90 / full-suite failure set == pristine 0356bda9 / traces 1517 identical) + B2 XP S1+S2 stack 94636cab..b511976a (7 commits: contract shim + gain_xp flat/scale, Hunt synthesis all 19, play gains UNL-092/034/158, UNL-053/136/107, F10 killSelf, UNL-157, UNL-116/A, UNL-143/A enemy_alone_here, UNL-095 grant_temp_ability op, UNL-192 per-kill deaths ledger, UNL-109 pay-when-able; S2 'Spend N XP' in activated-cost grammar paid in gear + champion-legend + Equip paths, cost.xp unfail-closed at 3 gates; xp suite 45/45; 14d86107 coordinator test-strictness hygiene). GAPS NOT BUILT (B2-reported): unit-activation entry point (UNL-102/126/162), UNL-135 hand-pick, UNL-213; UNL-108 excluded pending S0 per-turn gain ledger. NEXT: S0 (TS PlayerState.xp + per-turn gain ledger + serializer frame key + Rust mirror same window) - frame-key change flips golden traces BY DESIGN, paired with combined redraw (##179 66-seed + 4a seeds 2/3/41 + XP frames).
'Enter ready' machinery done in both engines; all acceptance suites green.
STATICS-2 COMPLETE: enter_ready machinery (8 gates, engine-private deaths ledger) + all 4 rig acceptance suites absorbed (62/62 + modal 4/4 = 66/66 scoped). ##173 FIXED TS-first (spawned-token aura bypass; corpus exposure seeds 21/61 folded into this redraw). ##174 LANDED 09-08 ~midnight (##181): Rust enter_ready consumer live at deploy (b4de6618 foundation + bb3d1b9f B2 deaths ledger + defbcd5b consumer incl. legend-zone aura scan per Tai ruling); 184/184 lib, traces 1517-set identical, 7 phase-2 gate types un-quenched (14 mods land). ##171 FILED (UNL-122 spell-history precondition, deferred XP-class). ##172 FILED (promo parenthetical breaks exact-name consumers, systemic).
Modal 'choose one' dispatch fix absorbed (Aphelios class).
Rust regex cache landed: 88 sites, 79% faster on the bot bench.
Older 'fixed' entries re-checked; one real residue found and filed (##176).
LANE-F RESIDUE VERIFICATION DONE (bodies vs tip): one LIVE parity residue -> ##176 FILED (Rust OGN-277 Back-Alley Bar fires no buff observers; Simian repro). Lane-F follow-up FIRED: committed jest+cargo regression matrices for the six FIXED-partial dispatches (##93/96/105/112/113/114), ##93 repro included.
The search bot's 2x slowdown is more game content, not an engine bug.
PERF FLAG RESOLVED: search-bot 2x slowdown = behavioral expansion (+35% actions/game, +20% turns, per-action cost flat ~0.22-0.25s both eras) - more live effects post-regen landing on MCTS budget. No engine change; bot-side budgeting is the knob.
Prep for statics phase 3: 7 genuine grant-keyword auras confirmed.
STATICS-3 PREP STARTED: B2 census absorbed 3894d5b2 (7 records / 5 bases verified genuine grant-keyword auras). Design inputs recorded: legend-zone aura source enumeration (Lucian/Rumble), two-hop equipment grants (Lucian), new source_in_showdown gate (Syndra, fail-closed), sameLocationAsSource live scope (Taric), Accelerate grant consumer = play/add-cost pipeline (Rek'Sai). Phase-3 arms purely additive - no corpus-churning narrowing (probe-verified).
Lane roster update: several lanes released, others reassigned.
Lane roster: G/H/rig-2 released; B1+B2 on phase-3 prep; lane 2 on its 4 requiresSelection suspects; lane A delivered ##170; lane F on regression matrices; redraw lane idle post-delivery, corpus lock released.
Queue: power-cost Rust port, castmatrix triage, the XP system, and more.
QUEUED: ##165 Rust port; castmatrix triage; XP system IN FLIGHT (Tai fired the build 09-08 11:39 PM; rulings: volatile Level auras, legend-zone scan DONE in ##174, all-65 floor; slices S0-S4 per docs/xp-system-implementation-spec-2026-09-08.md); UNL-035 self-cost-reduction (cost-statics phase); "expire temporary effects via beginTurn" pre-existing flake triage; jest141 slim fixture now LANED (agent fired 09-08 ~13:00 off 64a905c3, target: suite green in-sandbox under 2GB, assertion-identical, CI workflow still passing).
Checked 4 suspect cards: all correctly gated; reasoning logged.
LANE-2 TRIAGE LOGGED (4 requiresSelection suspects, all gates CORRECT - whitelist declined for the right reason): (a) analyzeSpellTargeting needs a 'player'/opponent-scope branch + opponent-hand pick op (VEN-085/OGN-156; preps UNL-101 Call to Battle rider) - both engines via _spellTargeting regen; (b) UNL-103 Disposal Order rides the modal family (##111 residue) + graveyard multi-pick; (c) UNL-013 Lotus Trap rides a damage-modifier op family (damage-doubling rider has no op today).
Statics phase 3 batch 1: 11 aura records now derive from card text.
PHASE-3 BATCH 1 LANDED a931c3cc (coordinator machinery, 09-08 PM): derivation arms + aura query points for the 11 batch-1 records (UNL-041, OGN-015, SFD-071, SFD-054/054A, SFD-183/241, SFD-029, SFD-181/240, OGN-074). Catalog sweep clean (only batch-1 records rederive). P3-1 (Farron self-Assault) + P3-3 (Jax self-Quick-Draw) FIXED via generalized carrier replacement; Taric innate Shield restored (text have/gain guard had nulled it). Acceptance 17/17 + census pins flipped 21/21; full TS suite failure set identical to baseline (9 known flakes). DEFERRED: UNL-146 Repeat (NO generic Repeat consumer exists - keyword_repeat is a marker-only handler; same shape as D-1 Vision) and Rek'Sai's Accelerate consumer (only non-hand play path is effect-driven play_from_graveyard, costs ignored - no election point); Rek'Sai's descriptor IS derived with parsed cost payload. 'here' adjudicated uniform = source's current location. NEXT: Rust port of the phase-3 arms + aura query (per per-phase loop), then batch-2 scoping.
19 spells the engine wrongly rejected now cast legally (TS side).
CASTMATRIX TRIAGE LANDED adc4ce5e (09-08 ~22:10, lane absorb): ##179 - gear-scope enumeration arms + requiresTarget play-gate carve-out fix all 19 valid-leg records TS-side; full-suite failure set 9 (strict subset of baseline 10). Corpus: 66/141 exposed seeds flip by design, rides next redraw window. FOLLOW-UPS: Rust gear-arm mirror + ##167 reaction-class direct-dispatch probe DONE same-day (lane-1; pins landed, 164/164, traces 1517-set unchanged). OPEN: OGN-180 over-offer quirk candidate.
Statics phase 3 batch 1 mirrored into the Rust engine.
PHASE-3 BATCH 1 RUST PORT LANDED (coordinator adjudication lane-1, 09-08): rust-engine mirrors the phase-3 arms + aura query (##178) - scope/keywordCosts schema, gate_live_with_zone, aura_keyword_membership/value_sum, card_has_mechanic_full, assault_bonus_value_full; consumers wired incl. quick-draw hand-zone read + ganking move gates. cargo test --lib 160/160 (8 new); golden traces 1517 identity set unchanged; catalog regen 12 cards, quench count unchanged. NEXT: batch-2 scoping.
Design calls for phase 3: gear grants land on the equipment card.
PHASE-3 DESIGN CALLS (coordinator, 09-08): Q-1 gear-grant conferral = option (a) - grant lands on the Equipment card; unit-side keyword query consults attached equipment's grants (single confer point, matches B2's Lucian two-hop finding). D-1: Vision SCOPED OUT of the first phase-3 batch (no generic Vision consumer exists; SFD-065/OGN-100 deferred). EXT-1 sameBattlefieldAsSource, EXT-2 zone 'hand' grants, EXT-3 legend-zone aura source scan all APPROVED for phase-3 machinery. P3-1: descriptor REPLACEs carrier text read (Kayle ruling convention). P3-3 Jax enricher mis-parse ("Draw" inside "Quick-Draw") -> enricher regen review.
Cycle-4 re-record: printed power costs changed 1,520 of 1,536 reference games.
CYCLE-4 REDRAW ABSORBED d74ac2b0 (base 252d680, redraw lane): 1520/1536 gated traces changed, determinism clean (sharded == single-process byte-identical), 17 unchanged plausible (no power-costed openers). Gate 1519 FAIL / 17 PASS - entire RED is port-lag class (Rust needs ##165 port); zero fails on unchanged traces. Flags adjudicated: 1502 same-action state deltas (power pools recorded from game start), 17 seq-0 action changes (opening play now illegal under power payment, individually named), 40 full-baseline winner flips, 1 terminator flip (seed-102 victory_points -> timeout/infinite_loop at 13-turn recorder bound; pacing change, spot-verified). Nothing untraceable.
Wave-1 stack landed: bogus targets are now zero in both engines.
WAVE-1 STAGED STACK LANDED (all verified individually + combined): lane-G ##167/##168 (6 commits; castmatrix: TS 378 bogus-accepted -> 0, Rust 4961/519 -> 0, 0 valid-leg diffs), lane-A ##151 (TS Flow enumeration arm + canPlayCardFromTrash probe; Rust bot targets:[] mis-target fix - 8 of 18 Flow printings), lane-H ##139 (TS gear-activation enumeration arm). Combined gate at 2de82710: tsc clean, cargo 124/124, jest quirk suites 56/56 x3 runs. Corpus churn class for A/H arms rides the NEXT redraw (baseline-bot action space where Flow cards sit in trash / gear activations).
Closed out ##107-109 with 30 regression tests in both engines.
Legends can no longer be cast from hand (Tai ruled it a bug).
Sweep refreshed stale QUIRKS statuses (7 fixed, 8 partial, 1 superseded).
Fixed a coin-flip test that used wall-clock randomness.
Lesson logged: rebuild scopes must re-verify against live code, not stale notes.
WAVE-1 REBUILD OVERCOUNT NOTE: 4 of 6 lane scopes (G/H/F/A) found their core work already merged Sep 5 (cdbd781/a6d9070/2220c3b/179061d). Cause: rebuild spec mapped scopes from open-looking headers + stale picture, not re-verified bodies. Rule: future rebuild specs re-verify body state against live tip before scoping; 26f6bcba header sweep is the truth baseline.
Rust charged runes before validating targets; reordered to match TS.
Lane-G side finding: Rust parked bogus casts behind optional additional-cost prompts before validating targets (TS validates first) - hoisted target-gate block to TS's position; target-rejected casts no longer pay runes first (latent divergence, corpus-neutral). Gotcha for fixture writers: committed Rust catalog snapshot already carries ##165 power costs - fixtures need domain-correct runes.
Rig 6's repo access token rotated after upstream cleanup.
Infra: rig-6 PAT rotated (riftbound-engine-rig6-readonly, Oct 7 2026, vaulted; upstream revocation from orphan-token cleanup). Rig-6 re-sweep go sent at absorb-aligned tip.
Queue: the big batched re-record, a slim test fixture, castmatrix triage, residues.
QUEUED: B5+statics-2 batched redraw (folds ##86/##136 classifier fixes, ##150 combat_bonus magnitude, VEN-166 each-split op-modeling) - redraw lane assigned; slim-catalog jest141 fixture; castmatrix triage (205 valid:fail->ok / 19 cards + 133 in-pair / 29 cards); ##170 regex sweep; FIXED-partial residues ##93/96/105/112/113/114; lane-A Tier-8 Flow heuristic arm (declined for now, rides a later heuristic pass); VEN-113 Kennen temporary Flow grant stays open (temporary-grant machinery). (batch-A cycle-1 MERGE landed 09-07 03:41; merge = wip/batch-a 51f1fb9 + replay.rs 3a01fcf + docs; tsc clean, cargo 48/48). Gates: r21 GREEN 1521/1521; r22c replay.rs-equivalence GREEN (0 fails full corpus, seed 77 155/155). golden_traces harness regression (rig 4 flag, 04:10): e5a8efe keyed setup on (catalog, decks), so quick/scenario traces after a catalog-loading full trace replayed with catalog decks - 20 seq-0 failures; verify per-file was never affected (gates stand). Fixed 3a01fcf, full golden_traces GREEN 80.7s.
Fixed a leak that stamped turn numbers into hashed game frames (#148).
Rust log-format debt assigned to lanes 1 and 2.
All 11 game-outcome flips traced to real fixes; none unexplained.
Six queued fixes from the B3 pile applied (##144-150).
Counter-spell guard fast-tracked (##149).
Counter un-shadow guard (##149) - lane 2 - APPLIED fast-track; 6 hash-only traces ride the redraw
Domain-cost enforcement now matches printed rune costs.
Domain-cost enforcement (F9 follow-through) - rig 1 - APPLIED 611e184 (corpus-inert; accelerate test semantics corrected to tap+recycle)
Gear cost-parsing fixes applied; the win-condition trigger is held.
Counter-spell lane (##133/134) in flight.
Cycle-3.5 re-gate: 1,531 of 1,536 reference games pass.
Cycle-3.5 re-gate COMPLETE on 3088931 (redraw lane, ~9:06 PM): gate 1531 PASS / 5 FAIL, all 5 redrawn-changed traces (port-lag). Corpus absorb LANDED 1bbb434 (182 changed traces + coverage, manifest verified byte-for-byte).
All trace flags adjudicated; nothing unexplained.
Flag adjudication COMPLETE: seed-57 seq65 = ##163 verbatim-candidates (both legal, bot takes candidates[0]); seed-6 seq0 = AE-2 Cleave combat_bonus->keyword_grant migration (flip exactly at 572f886; OLD line was the implausible one). Carried cycle-3 flags 14/87/42/36 stand. R1 double-equip targeted redraw list EMPTY (0/119 traces).
Rust's Ganking check was missing granted keywords; seed 26 fixed.
Seed-26 alignment FIXED a25bea3: Rust has_ganking lacked the ##136 granted_keywords arm (TS cardHasMechanic order: listed -> granted -> descriptor -> text); cargo 88/88, seed-26 171/171, other 4 fails byte-identical. Gate posture 1532 PASS / 4 FAIL (port-lag: suite-OGN-299 seq4, suite-OGN-249 seq80, suite-SFD-007 seq0, suite-SFD-007-P seq1).
Found: the importer dropped every printed power cost (545 cards).
##165 FILED 5b00be0 (9:11 PM): enricher data-drop class - transformChampionDump parseCost hardcoded powerCost/powerType null; 545 raw records carry power costs (363 units / 141 spells / 41 gear; 502 single-domain, 43 multi-domain), 0/1423 enriched did. Found via Tai's Premonition demo question (SFD-087: 2 energy + 3 Mind power).
Tai ordered the power-cost fix first; 43 hybrid-cost cards verified by hand.
##165 CYCLE ORDERED FIRST by Tai (9:12 PM), ahead of the B5+statics-2 batched redraw (lever-1 batching superseded): power-cost breakage invalidates corpus traces. P0 LANDED 480930a (~9:21 PM): parseCost reads dump `power` field, powerDomains arm for multi-domain; dry-run regen validation = exactly the 502 single-domain records change, cost-only. NO catalog regen committed - waits on rig 5's 43-card overrides table (data-pinned/power-domain-overrides.json, totals must equal dump pip count). Lane A = P1 TS payment tests (quirk lane 2), Lane B = P3 rust parity prep (rig 4), both based on 480930a. Regen + full corpus redraw serialized under the lock.
Power-cost payment tests landed; 43 hybrid cards confirmed as printed.
P3 LANDED 23ea42e (rig 4 recycle-pay allocator tests 6/6); casing trap filed ##166. Rig 5's 43-card table DELIVERED 9:30 PM with render evidence: ALL 43 print HYBRID pips (each pip payable as either domain of the pair) - joint-key encoding ({"mind/body": N}) accepted, data-pinned/power-domain-overrides.json committed. P0.5 LANDED d042a81: hybrid legs in both allocators (mirrored claim order), cargo 97/97, tsc clean, corpus-inert pre-regen. P2 REGEN COMMITTED 8bd041b (~9:36 PM, parent go 9:35): 545 records change - enriched cost fields only (502 powerCost/powerType + 43 powerDomains), rust powerCost only, 1423 both sides. NEXT: full corpus redraw (redraw lane) under the lock, expect massive cost-driven churn, all traceable to printed costs by construction.
Post-import cleanup: test fixtures updated; castmatrix harness landed.
Post-regen trunk maintenance (09-07 late): 90adc55 fixture fixup (7 champion_leader + 1 bot enumeration tests died on printed power costs - energy-only fixtures, not engine defects; cargo release 97/97); 2d4a336 redraw-checklist 0.5 ("gate green" only at absorb-aligned tips; parity-clean standard in deferred-absorb windows; answers perf lane's 822660d red-vs-own-corpus question - KNOWN ARTIFACT, no QUIRKS); 7ede7a2 weaponmaster test #[test] restore (attribute accidentally dropped by aeff25c Sep 5, latent failure exposed by ##165, fixture fixed, 98/98; dead-code sweep = no other silent tests); e84afcc+8797add castmatrix harness landed + triaged: QUIRKS ##167 (Rust play_card target-identity gap, 5468 cells/534 cards), ##168 (TS bogus-target acceptance, 378/44), ##169 (legends castable via play_card, rules-ruling candidate); 205 valid:fail->ok + 133 in-pair-fail cells queued for post-redraw per-card triage. Rig 2 silent-offer class noted: decks with zero runes of a demanded domain lose offers invisibly; all 4 committed rust decks audited SAFE.
Tai approved the speed levers; statics phases 2-5 partitioned and pre-staged.
Temporary-grant machinery (the AE stack) merged into trunk.
AE stack + battlefield arm + adjudication fixes MERGED onto 822660d: 710df35 AE-1 [Temporary] machinery (##136 engine leg), 572f886 AE-2 combat keyword grants w/ 807.2/814.2 summing (##150 residue), b4a4d03 AE-3 probes + gear/unit_or_gear bot arms, c2ca429 AE-3a rb_web gkw observability, 25a2ecf battlefield scope arm, 21f5979 VEN-072 empower_count regression fix, 9364a46 ##163 explicit-candidate prompt enumeration (both bots), 2d9afef ruleRefs 713/714->807/814 housekeeping (103 cards, inert). Catalogs regenerated on merged tree: zero drift pre-housekeeping, scoped-only post.
Cycle-3 trace flags adjudicated: all traced to real changes.
Cycle-3 redraw adjudication COMPLETE: VEN-072 = statics-merge Rust empower arm overcount (fixed); terminator flips 11/22/90 = ##163 harness wedge (fixed, ##152 NOT a regression); seed-42/36 action changes CLEAN (QUIRKS #74 Rengar occupancy deploy grant, 9213c17, printed-text traceable); port-lag seeds 52/102/81/56 all PASS on merged tip vs fresh regens (52 = AE-2 Blood Rush descriptor ahead of pre-merge corpus, resolves on re-gate).
Corpus absorption deferred per the sequencing ruling.
Corpus absorption DEFERRED per sequencing ruling (parent 14:44): redraw lane re-gates the corpus on the merged tip post-push; lane 1 absorbs the final corpus after.
Begin/end-phase triggers for board permanents done in both engines (##137).
##137 board-permanent begin/end-phase dispatch - lane 1 - CLOSED (cycle 2): TS FIXED-partial + RUST PORT d170b0e + lane-2 mirror verified equivalent (their 0006/0008 superseded; their patch caught one gap in mine - triggers-twice amplifier on the battlefield arm - fixed 5fc4da9). Mushroom Pouch facedown fails closed in Rust (hidden-card state unported; corpus-exact). Marker ledger: OGN-101/109, VEN-005/006/133, OGN-160, UNL-088
Cycle-2 re-record: zero changes, all 1,536 games identical.
CYCLE-2 REDRAW COMPLETE 09-07 ~9:05 (redraw lane, gate 59f6cb3): ZERO CHURN - all 1536 traces + coverage.json byte-identical (whole-tree hash). Pouch-armed case never materialized. Corpus lock RELEASED. Gate on 59f6cb3: 1527 PASS / 9 FAIL = rig-4 pre-existing drift set (seeds 3/27/43/70/74/77/90/94 + suite-UNL-106), all classified stale/verified-vs-regens by lane 2. Coverage 1396/1423 (98.1%)
Lane-2's Rust debt sweep closed: everything stale, no real debt.
Lane-2 REAL_DEBT sweep CLOSED: 0007 replay terminal-event drain guard (6ec2f1f, ##160) + 0009 moonfall activation stamping (b9ea29e, ##161) applied; 0006/0008 superseded by d170b0e (##159 filed for the class). Final classification: 109 committed-golden failures all stale-class, zero real debt; debt seeds 1/25/39/96/99 PASS vs fresh trunk-TS regens (lane-1 re-verified)
Bots no longer freeze on unaffordable mandatory choices (##162).
##162 bot Stuck class FIXED 09-07: play_card parked mandatory additional-cost choices with no cost-feasibility probe (TS playCard:3011 parity) - 27/40 evo-champion seeds stalled on OGN-208 Cruel Patron; probe fix 97a0b9c (lane 1, 0/40 post-fix) + gear enumeration arm 227302e (ftc 138d6e62 cherry-pick). Invariant adopted: every FIXPASS-C validator scope needs a matching enumeration arm
All 1,423 card images now load without failures.
Trunk snapshot marked as the cycle-3 base.
TRUNK TIP 7145a39 = CYCLE-3 BASE (parent ruling 09-07 ~9:05)
Cycle-2 merge stack: champion-leader Rust port, classifier cluster, and more.
Cycle-2 merge stack (on 12870e5, tsc+cargo 61/61 green): ##147 champ-leader Rust port (rig 1), classifier cluster COMPLETE ##143/##130/##132/##138/##138b/##129 (rig 5), ##154 Mundo/Glowstone op-fidelity + marker flip (rig 5 ops, lane-1 flip), ##135 Reflection FIXED (rig 4; copyOf-other HELD pending choice prompt - selection-prompt workstream), ##141 recordMove attribution FIXED (rig 2, playerIndexOverride), Rust 425 counter port ##133/##134+##149 mirror (lane 2; deferred-resume empty-chain caveat open). OUTSTANDING: ##151 Flow (rig 4 regenerating post-wipe), rig-2 jest141 needs canonical-env run, lane-2 full-corpus Rust regression counts
Nine pristine-trace failures triaged: port debt, not regressions.
Baseline-drift triage (rig 4 flag): 9 pristine-trunk golden failures = 5 counter seeds (425 port flips green) + 77/90 Emperor's Dais + 27 prevention chunking (lane-1 port-debt) + suite-UNL-106 unattributed
New finding: Sona's ready-4-runes fires without battlefield presence.
NEW Sona over-fire sub-finding (OGN-073/VEN-SP2 ready-4-runes fires without battlefield presence) - QUIRKS entry pending, fix rides ##137 window-condition work
Parser windows for VEN-005/006 parked in-lane.
Parser windows VEN-005/006 - dispatch follow-up - PARKED in-lane
Statics phase 1: cost modifiers done, 35/35 acceptance green.
Phase 1 (Option A, cost modifiers, 7-card acceptance set per ##131) - MERGED onto cycle-3 base at 0bd7d0f (Sep 7 ~9:20 AM): gates green (tsc clean, cargo lib 81/81), 5-seed fresh-regen parity 5/5 PASS, zero catalog drift vs merged regen. Parity fix riding the merge: TS serializer now emits empowerCount conditionally (Rust already did; without it every empower_unit diverged replay) - frames now churn vs cycle-2 goldens at first empower, folded into redraw flags. Statics acceptance harness statics-acceptance.tmp.ts was never committed (rig sandbox); 17 new cargo statics tests + tsc stand as the committed gate, harness rebuild from docs/statics-phase-1-acceptance-scenarios.DRAFT.md deferred unless redraw disagrees. wip/statics-p1 @ 2befe09 (PUSHED): PHASE-1 CARD WORK COMPLETE - rig 6: schema/Marauder/Rengar/RuinRunner/Ambessa/Kayle+keyword_grant/Vex (b4276d3..ae79357), rig 2: Galio 2befe09, rig-1 domain-cost base 7e7dd5e; tsc clean, cargo lib 60/60. SCHEMA FROZEN at b4276d3. Divergence attribution done (all stale-trace, printed-text traceable; seed-24 carrier presence proven via frame dump). ACCEPTANCE GREEN: 35/35 via scripts/dev/statics-acceptance.tmp.ts on 2befe09 (all 7 cards TS-engine verified; doc corrections bd76736). NEXT: cycle-3 merge + redraw (flags: 0003/0004/0005/0006/0008 + empowerCount frame churn).
Statics phases 2-5 (about 131 cards) parked.
Phases 2-5 (remaining ~131 statics) - after the 4-5d window - PARKED
Buff objects, Bard, and misc items parked for cycle 3.
Discrete buff objects, Bard leg, 291 look, VEN-003/105 staging (##128 residue), bogus ids - PARKED for cycle 3
Target prompts accept made-up card ids; API robustness gap (##152).
##152 target-prompt selection membership never validated (10 min>0 cards + 21-card min=0 cluster; API robustness, no corpus/gate exposure) - PROPOSED rig 5 (selection surface), non-blocking; rig-6 finding 07:03
Classifier cluster all applied; only ##152 left.
Champion-leader Rust port applied; parser gaps next.
Rust champion-leader subsystem ##147 - rig 1 - APPLIED; NEXT parser gaps VEN-108/UNL-084
Mirror Image fixed and applied; Flow delivery in progress.
recordMove attribution fixed (##141); one test still needs a canonical run.
##141 F10 recordMove attribution - rig 2 - APPLIED FIXED (QUIRKS filed); NOTE: recordmove-attribution-141.test.ts still wants a canonical-env jest run (every sandbox here OOM-kills it, exit 137 at 2GB and 6GB heaps; rig-2 tsc-clean + surgical corpus proof accepted as interim verification, per Tai/parent ruling 09-07 ~6:13 AM); NEXT phase-2 statics queue
Temporary keyword-grant machinery applied (AE lane).
Win-condition ops under review (OGN-160, UNL-088).
Win-condition ops (OGN-160 ops:null, UNL-088 win) - lane 1, dispatch cycle-2 review
OGN-143 double-apply fix queued for the next catalog batch.
F-95b OGN-143 double-apply - lane 1, next catalog batch post-merge (3b)
The redraw lane owns re-recording reference games; cycle 1 delivered.
Redraw lane (agent RB redraw lane): owns cycles 1-3 regen+gate, corpus lock via parent, sharded redraw - cycle 1 DELIVERED (determinism byte-identical; decisive-point action neutrality independently verified)
Fast gate tooling committed (verify + replay).
Fast gate standard: committed `riftbound-engine verify` + xargs (replay.rs e5a8efe) - DONE
The redraw procedure doc is still owed.
docs/redraw-checklist.md (procedure + sharding convention) - lane 1 - OWED at cycle-1 handoff
riftlens: recognition core, web app, and catalog pipeline shipped.
A recognition core shipped (hardening: corner precision, specular suppression); B web app + overlay live at riftlens.lol/app; C catalog pipeline done (1,423 images) - SHIPPED
riftlens: tournament ops parked.
D tournament ops (board-state export, match recording) - PARKED (later)
Class C spurious buff ops (buff verb in non-effect text)
Class B variable-magnitude buffs ("+:rb_might: equal to X")
UNL-102/UNL-162 "[Buff] me" applied +2 might - card text is +1
UNL-059/059A L16 "can't be chosen" leg derives an ALWAYS-gated choose_permission deny - ungated protection live at tip
UNL-108 Wily Newtfish: conditional static read as unconditional - cardHasMechanic raw text-scan fallback matched "[Ganking]" inside the conditional sentence
Statics phase 4a: clean stat auras - descriptor-driven might query; Darius census-gap adjudication
Rust phase-2 port (##174): enter_ready deploy consumer + phase-2 gate family
OGN-180 Fading Memories target offer includes base units - "unit at a battlefield" qualifier lost at the scope mapping, both engines
TS valid-leg cast rejections: gear-scope enumeration gap + requiresTarget play-gate over-reach (castmatrix 205-class triage, 19 records)
Rust phase-3 port: catalog-carried aura descriptors + aura query mirror (card_has_mechanic_full, assault/shield consumers, quick-draw hand-zone, ganking moves) - coordinator port 2026-09-08
Rust ready op's source fallback misses board_artifacts - OGN-152 Mistfall targetless "ready it" fizzles on a gear source
Rust OGN-277 Back-Alley Bar special case pushes damage_boost inline without firing buff observers
Harness deck pool admits legends; enumerator offers legend plays the engine rejects
export-rust-catalog computes _entersUntapped with no player context - Rust enters aura carriers READY where TS taps them
Engine-spawned tokens bypassed enter_ready auras
Promo printings carry the collector parenthetical in record.name - exact-name consumers miss cross-printing matches
UNL-122 Crescent Guardian: "If you've played a spell this turn" precondition on its additional cost is unrepresented
Rust actions.rs compiles regexes per call (155 Regex::new sites on f748d08b) - perf debt, sweep task, OPEN
Legend cards castable via play_card in BOTH engines (OGN-255 class)
TS playCard resolves casts with bogus target ids once legal targets are stripped (378 matrix cells / 44 cards) - target-validation gap, FIXED (B+C lane, pending cycle-4 absorb)
Rust play_card validates declared-target COUNT but not IDENTITY at cast time (5468 matrix cells / 534 cards accept bogus target ids; TS throws) - parity gap, FIXED (B+C lane, pending cycle-4 absorb)
Latent casing trap in power-cost keys: non-lowercase power keys silently dropped in both engines (parity-pinned, inert today - no fix scheduled)
Power costs dropped wholesale by the enricher: parseCost hardcodes powerCost/powerType null, 545 raw records carry power, 0/1423 enriched do (catalog-data class, outcome-affecting, FIX IN FLIGHT - Tai ruled 2026-09-07 9:12 PM ET via iMessage that the fix precedes the B5+statics-2 batched redraw; P0 enricher parse landed 480930a, catalog regen + full corpus redraw pending)
Rust bot equip enumeration re-offered already-attached gear (TS self-play filters !attachedTo) - rig 2 R1 "double-equip" was menu divergence, not state corruption
Self-play + Rust bot target-prompt enumeration ignored explicit prompt candidate lists - off-list submissions wedged mandatory prompts post-##152 (cycle-3 terminator flips, seeds 11/22/90)
Rust play_card parked mandatory additional-cost choices without a cost-feasibility probe - an unaffordable play wedged into an unresolvable prompt (ftc client lane, bot Stuck class, SYSTEMIC in bot games)
Rust apply_moonfall_debuff never stamped activationState (lane-2 debt seed 96)
Rust replay mirror drained open target prompts on ANY actor=system event, including the end-of-game terminal record (lane-2 debt seed 1)
Rust legend_window_holds begin_phase arm fell through to true for unrecognized conditionals - conditional triggers would fire unconditionally once dispatch existed (lane-2 debt seed 25; ##137 follow-up)
UNL-088 Gutter Palace win condition unmodeled - fail-closed
OGN-160 Dazzling Aurora reveal-until-unit modeled as recycle_card + cost_reduction junk
Rust golden-trace debt: seeds 27/77/90
VEN-005 Forsaken Baccai / VEN-006 Oasis Raider begin_phase abilities had empty triggerWindows
OGN-109 Dr. Mundo / VEN-133 Glowstone classifier op-fidelity
Sona legends (OGN-073, VEN-SP2) over-fired end-of-turn rune readies - location-conditioned window never evaluated (cycle-2 ##137 review finding, FIXED TS)
Target-prompt selections are count-validated but not membership-validated - bogus instance ids resolve (rig-6 re-verify sweep, API robustness)
STANDING GAP (parked lane): [Flow] has no engine implementation
VEN-012 Perfect Execution: combat_bonus grants never carry a magnitude (+1 for [Assault 3])
Op-modeled counter spells skip the legacy special-spell cascade (lane-2 un-shadow guard v2, FIXED TS)
F-95a: awaken-step temporary buffs eaten by the same begin_turn resolve (FIXED both engines)
OGN-281 Hallowed Tomb: Chosen Champion return never offered (FIXED TS + Rust; rig 1 port)
Pending-effects resume snapshots dropped abilityName/triggerType (was orphan #98, FIXED TS)
conquer_or_hold abilities fire in TS (was QUIRKS #94, FIXED both engines)
killTemporaryPermanents killed any card whose text MENTIONS [Temporary] (Finding AD): 15 unit printings died at their own Beginning Phase (FIXED TS + Rust mirror)
UNL-133 Blast Cone: classifier hint 'ally' contradicts printed 'enemy' - prompt candidates are friendly, text says move an ENEMY unit FIXED (rig 5, cycle 2)
B3.5 selection planner is scoped to printed selecting clauses - classifier hints on non-selecting text no longer prompt (r20 gate-red rollout)
F10: recordMove misattributes out-of-turn plays (stamps currentPlayerIndex) - poisons Crumbling Sands precondition, markPlayMoveCountered, Legion 425.1.b (lane-2 finding, FIXED rig 2)
Lane-2 forced-play clean bill: 21 cards verified correct, all 5 meta-deck champions deploy cleanly
Gear activated abilities have no public TS-engine invocation path (OGN-242 Baited Hook, UNL-088 Gutter Palace, VEN-075 Platewyrm Egg) - lane-1-gated (lane-2 forced-play, known)
UNL-198 Moonfall partial: no battlefield chosen, may-move never executes ('ally' misparse), -2 debuff binds to one declared target (lane-2 forced-play F9, documentation only)
OGN-160 Dazzling Aurora is a TOTAL no-op, and begin_phase/end_phase dispatch scans only the champion legend - board permanents never receive these triggers (lane-2 forced-play F8, SYSTEMIC)
UNL-070 Turn to Dust silent no-op: classifier scraped a phase_trigger from reminder text; [Temporary] never granted (lane-2 forced-play F7, documentation only)
UNL-200 Mirror Image silent no-op: parseTokenSpecs returns [] for "becomes a copy of that unit" (lane-2 forced-play F6, documentation only)
Counter restrictions bypassed fleet-wide by the same legacy shadowing; legacy path splices the link instead of setting countered (lane-2 forced-play F5, documentation only)
UNL-106 Repulse can never counter: legacy tryHandleCounterSpell shadows the #64 counterChainItem path (lane-2 forced-play F4, documentation only)
VEN-154 Public Execution kills the caster's own unit, never the enemy; "less Might than" unmodeled (lane-2 forced-play F3, documentation only)
Documented approximation gaps from the lane-2 meta-deck hunt (documentation only; statics phase 1 weight)
OGN-179 Acceptable Losses kills nothing: "[Action] Each player kills one of their gear" yields zero effectProfile ops, silent graveyard (lane-2 meta-deck hunt, documentation only)
OGN-115 Promising Future resolves to nothing: classifier derives one generic op, GENERIC_OP_SKIPPED (lane-2 meta-deck hunt, documentation only)
Spell-target classifier scanned trigger conditions and Flow reminder parens as selections: 28 printings flip (SFD-144 class, FIXED TS; Rust data-only via catalog); VEN-003/VEN-105 staged-prompt machinery parked
B3.5: trigger-sourced selection-hint ops now defer/auto-resolve/fizzle across every executor; mandatory additional-cost kills are the controller's choice; Rust Accelerate pay path (FIXED both engines)
F5: choice prompts enumerated pay-only in self-play (Batch 3a clause 3, FIXED both engines)
requiresTarget computed over unstripped text + passive "choose me" phrasing: 12 printings wrongly target-gated (Batch 3a Irelia-class, FIXED TS; Rust data-only via catalog)
Accelerate reminder parenthetical read as rules text: 36 printings entered untapped when accelerate cost unpaid (Batch 3a AG, FIXED TS; Rust data-only via catalog)
FINDING AA (OGN-292 unit_chosen_by_spell draw) closed - works since b479d5d
Void Gate effect_amplifier had no damage consumer (Batch 4 Finding Q, FIXED both engines)
Battlefield conquer look-2/recycle resolved as a plain free draw (Batch 4 Finding U, FIXED both engines)
Battlefield conquer rune-recycle unimplemented (Batch 4 Finding S, FIXED both engines)
Battlefield hold re-fire of units' conquer effects unimplemented (Batch 4 Finding Z, FIXED both engines)
Battlefield conquer "spend a buff to draw" drew for free (Batch 4 Finding V, FIXED both engines)
Battlefield hold "buff a unit" never landed, no choose-unit prompt (Batch 4 Finding O, FIXED both engines)
Optional additional-cost CHOICE prompts + reminder-parenthetical parse poisoning
flexiblePlacement token specs (OGS-015 Recruit the Vanguard)
choose_unit observer dispatch (E+F batch, seventh slice - both engines)
kill_stunned observer dispatch (E+F batch, sixth slice - both engines)
unit_would_die death-replacement dispatch (E+F batch, third slice - both engines)
attach_equipment observer dispatch (E+F batch, first slice - both engines)
Battlefield-ability observer dispatch surface (item-D triggerTypes, both engines)
draw_second (Frigid Jewel UNL-074) - runtime per-turn draw counter, hash-neutral
attack_defend_alone (Mask of Foresight OGN-060) - engagement-choke observer
opponent_scores (Sumpworks Map UNL-085) - scoring-choke observer
main_phase_start (VEN-067 Bottled Constellation)
leaves_board self-trigger dispatch (E+F batch, eighth slice - both engines)
Op-level targetHint flattened friendly/enemy scope to 'any' (fixed)
Accelerate additional cost never parsed in the dump mirror (fixed)
Modal "choose one" branches modeled additively; dispatch still owns choice (Aphelios) (fixed)
Triggered "you may deal N to a unit" pings self-targeted with no prompt (BUG-15, fixed)
Triggered clauses scraped an empower op from the "[Empowered]" CONDITION marker (BUG-15, fixed)
Counterspell targets resolve by chain link id, handler matched card ids (fixed)
played_discarded_killed self-trigger dispatch (E+F batch, fifth slice - both engines)
ready_other observer dispatch (E+F batch, fourth slice - both engines)
conquer_or_hold abilities are dead in TS (parity: dead in Rust too)
buffed observer dispatch (E+F batch, second slice - both engines)
Combat priority advance missing on normal (non-chain) plays (Rust port gap)
ChainItemState::to_frame emitted keys TS never serializes (Rust frame artifact)
Trigger-fired empower/disempower ops fall back to the source card (Rust port gap)
Single-slot pending_spell_resolution orphaned concurrent deferred spells (Rust port gap)
Heedless Resurrection killed-unit cost cap unenforced (F13c, both engines)
Heedless Resurrection graveyard summon charged its cost (F13b, Rust port gap)
OGN-144 Spoils of War - bare on-play gear effect, no trigger phrasing
Battlefield self-replacement is unmodeled (residue, item D 2026-09-05).
Bucket-A observer arms: empower_other, banish_own, enemy_unit_death, recycle, unit_becomes_mighty, combat_win.
Observer window arms: promo "the" variant, end-of-turn dispatch, marker-op hint exclusion.
Legend observer dispatch: champion-legend triggers fire on game events (TS-first + Rust mirror).
Family B landed: empower/disempower op support TS-first.
"Disempower me/this" activation costs unmodeled (QA sweep BUG-4 / S26) - legend half fixed TS-first.
Champion-legend become_empowered triggers dropped in the Rust port (QA sweep BUG-8 / S30b) - port parity fix.
"When you empower something else, empower me" never empowered the champion legend (QA sweep BUG-9 / S31)
Legend-activation gate false-positived on parenthetical reminders and bare Empower cost runs (QA sweep BUG-5 / S23b)
Unit take-control is unmodeled (residue, rig 3 BUG-13 audit 2026-09-05).
Static/continuous effects derive no entries (design item, parent ruling 2026-09-05 - DEFERRED to an engine modeling decision, not a parse gap).
Static play-permission clauses are unmodeled (residue, parent ruling 2026-09-05).
Sett OGN-290's would-die replacement clause is unparsed (residue, parent ruling 2026-09-05).
"Use only to play X" activation restrictions are unmodeled (residue, parent ruling 2026-09-05).
Rebuttal (VEN-152) emitted zero ops - counter half fixed TS-first.
Conditional / additional-cost clauses fired unconditionally
Defiant Dance (SFD-196) buffed both targets
"Enough to kill" is not removal
Trigger clauses split from their effect sentence
Parenthesized reminder text generated ops and abilities (audit finding #1)
Counterspells misparsed into garbage ops that FIRED
Also surfaced #52 (SFD-123 enrichment trigger-folding), filed for
Enrichment folds Corrupt Enforcer's (SFD-123) two triggers into one combat_win ability with spurious ops - documented (Group C).
Target-prompt submissions never validated, bots always resolved empty
Kai'Sa (OGN-247/299) reaction add-rune never parses - pre-existing gap, documented-not-blocking.
Combat-victory dropped combat_win unit triggers
Battlefield selection is a choice in the engine, but best-of-1 says random (informational - no engine gap).
"Burn N" is mill, never damage - a coordinated TS-first fix.
Rainbow [A] pips paid as chaos
Identical configured battlefields stall setup forever.
Rune variant ids normalize at hydration; the snapshot keeps the variant.
A rune paying both energy and power is tapped AND recycled - semantics retained; the Akali parse behind the old example is fixed (Group D1).
Champion-ability affordability rejected tapped runes for power
Legend-context effect ops ran with no targets, boardTarget, or battlefieldTarget
Legend activation paid before it checked for an effect
Trigger-path ops now receive the play targets - a coordinated TS-first fix.
Begin-phase advance is blocked by ANY unresolved prompt - not just the END step.
Battlefield abilities carry create_token ops with tokenSpec metadata.
The Papertree (SFD-219) floods on hold - the flood log is unconditional.
The scoring op ignored printed optional costs
Battlefield hold abilities run gain_resource + channel_rune ops, and the rune log reports the REQUESTED amount.
Spell-path deal_damage fizzles when the target left the board.
Empty stun/ready op targets: enemy-hint self-hit fixed.
deployPermanentCard snapshots the open-battlefield check before play triggers fire.
advance_phase is a no-op while a reaction chain awaits a response.
effectiveCombatPower includes calculateStatModifiers.
Back-Alley Bar (OGN-277) has a hardcoded unit_move_from battlefield effect.
Awaken resets activation on artifacts too.
return_to_hand ignores text qualifiers when the text says "return all units".
moveUnitToBase trigger order.
playCard logs "Cost modified" BEFORE the canPayCost check.
recycle_card shuffles with the live engine rng, but only when a card moved.
The `scoring` op awarded VP silently
"Each player kills" spells defer into per-player prompts.
Effect-driven moves default autoEngage: true
Showdown play sets focus to the ACTOR
Duel log trims to 200 entries
Channel-fallback spells.
resolveSourceCardName falls back to the catalog name.
Zero-cost payment skips resource recalculation.
Death triggers fire after the graveyard push
triggerAbilities' battlefieldTarget falls back to the source card's current battlefield
effect_amplifier gating.
Effect ops run BEFORE the ability-activation stamp
attach_gear's engine path only logs.
Bounced cards keep their stale board location.
tapMovedUnit mutates stale card objects in any zone.
Tokens never enter the graveyard.
advance_phase out of combat abandons the engagement
Tank/Deflect damage assignment.
Effect ops run even when `automated: false`.
Empty op targets fall back to the source card - enemy-hint case fixed TS-first.
Riptide Rex (OGN-092) kills itself and clears its own battlefield's contest.
Possession (OGN-203) claims a battlefield.