chore: update coverage stats and badges - #19
Merged
Conversation
matthewevans
enabled auto-merge (squash)
April 8, 2026 17:08
ntindle
added a commit
to ntindle/phase
that referenced
this pull request
Jun 17, 2026
… as 2/2 Cybermen under controller (phase-rs#3461) * fix(parser): Combat-damage trigger 'put the top two cards of that player's library onto the battlefi * fix(engine): reconcile Cybership manifest with upstream zone-move API The upstream merge refactored the manifest/morph zone-move pipeline. Two post-merge fixes keep cluster phase-rs#19's Cybership behavior compiling against the new API: - Pass `ability.source_id` to `manifest_card` (upstream added the required `source_id` attribution parameter to the zone-move call). - Handle the new `ControllerRef::ParentTargetOwner` variant in `resolve_enters_under`, mapping it to `TargetFilter::ParentTargetOwner` (CR 108.3 owner resolution + CR 110.2a entry-controller designation), mirroring the existing `ParentTargetController` arm. Behavior is unchanged: Cybership's combat-damage trigger still moves the top two cards of the damaged player's library onto the battlefield as 2/2 Cyberman artifact creatures under the Cybership controller (CR 110.2a). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(PR-3461): unify manifest controller resolution via canonical authority Address maintainer review: delete the hand-rolled `resolve_enters_under` in manifest.rs and route the CR 110.2a `enters_under` override through the single canonical authority `change_zone::resolve_enters_under_player` (promoted to pub(crate)), which wraps `filter::controller_ref_player`. This eliminates the two latent bugs of the divergent resolver (TargetPlayer/TriggeringPlayer collapse; silent DefendingPlayer/ChosenPlayer fallback) so Manifest resolves controller overrides identically to ChangeZone/ChangeZoneAll. Add a discriminating end-to-end integration test that crews and attacks Cybership, asserting the top two cards of the damaged player's library enter face-down 2/2 Cyberman artifact creatures under the Cybership controller's control (CR 110.2a) while ownership stays with the library owner. Fix two semantic merge collisions from origin/main: zones.rs and issue_3285_face_down_public_zone.rs each call the now-7-arg `manifest_card` with the pre-controller 6-arg signature; pass `None` (CR 701.40a default). --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Co-authored-by: Matt Evans <matt.evans.dev@gmail.com>
This was referenced Jul 4, 2026
matthewevans
added a commit
that referenced
this pull request
Jul 12, 2026
…e (U20) (#5630) The three remaining `.iter_mut().rev().find(..)` walk-backs in `apply_clause_continuation` chose their antecedent by scanning `defs` backward in place — an undisclosed positional coupling of exactly the kind U6 exists to delete. Each now names its antecedent through the assembler's single binding authority (`AssemblyEnv::resolve`). Two new roles, both LIVE (`live_role_predicate`), never cached: * `DamageDealer` — the `DealDamage` an excess-damage rider redirects from (CR 120.4a). Membership is the effect variant ALONE: the scan bound the nearest `DealDamage` unconditionally and then overwrote `excess`, so folding `excess.is_none()` into the role would resume the walk past an already-written def and bind an earlier one the old code never reached. * `DigLook` — the private-look `Dig` that BOTH `ExileLookedAtCard` (CR 608.2c) and `ExileOneOfThemFaceDown` (Hideaway, CR 702.75a) bind back to. ONE role, because the two scans it replaces had byte-identical predicates: they are the same antecedent, named twice. Membership is `Effect::Dig` ALONE, NOT `reveal: false` — the private-look condition (CR 701.20e) is the RECOGNIZERS' filter, already applied upstream when they decided to emit these continuations at all. Importing it into the selector would walk PAST a revealed `Dig` to an earlier one the old scans never reached — the mirror image of narrowing `GenericEffectHead` to "has a static". Both roles are LIVE for the reason #19 converted `DigOrMill` cached->live: `refresh` only runs where `defs.len()` changes, and all three of these mutations are length-preserving (a `*previous.effect = ExileTop` variant rewrite, an `*excess = Some(..)` field write, and a `sub_ability` nested in place). A cached registry for them would be stale by construction. Neither role reuses `DigOrRevealUntil`/`DigOrMill` (strict supersets) nor collapses to `LastEmitted`: both are output-identical today only because every hit is at depth 0, which is a property of the current card pool, not of the grammar. Ride-along (U6-0e review follow-ups): * Delete the two STALE `NodeStatus::Dropped` mentions (the `Absorbed`-or- `Dropped` doc phrase, and `DefWitness`'s ABA carve-out sentence — the ABA argument is now unconditional, since every witness refers to a live allocation). The six remaining mentions are KEPT: they record WHY the variant is gone, which is what stops a future third state. * `tail_pop_mirroring_a_mid_vector_removal_is_caught` absorbed its stray into `id_at(0)`, a false parenthood claim that assert (b) would also have caught — the test only observed assert (a) because (a) runs first. Absorb into `id_at(1)` instead, which is a TRUE parenthood claim, so identity is the only false assert and the test no longer depends on assert order. Co-authored-by: matthewevans <matthewevans@users.noreply.github.com>
lgray
added a commit
to lgray/phase
that referenced
this pull request
Jul 14, 2026
…NOT run The plan is final at e677fef. The review that is supposed to gate it has not been executed: one reviewer was handed the 1,865-line plan + the review-engine-plan skill + CLAUDE.md + eight attack targets at once and blew its context (no worktree, no test, no report). Run it DECOMPOSED -- one target per reviewer, only the sections it needs. Adds ADVERSARY-MANDATE.md (the framework: the repo's own review-engine-plan gate, 11 required checks, targets ranked) and rewrites the handoff's next-action section. Three highest-value checks, in order: 1. C1's revert-probe has NO backing fixture -- nominated by the plan's own author against its own work. Damping Sphere's deltas cancel exactly against affinity; Hum of the Radix reads 'each ARTIFACT spell' and Sprout Swarm is a green instant. A phase whose revert-probe has no fixture can pass for the wrong reason. 2. Is 'P4 and P7 are the only ACCEPT-ward phases' true? P5 relaxes the cover and P10 coarsens state equality. If even one other phase removes a rejection, the central risk table is wrong. 3. Is P7's class gate discriminating? Flip ability_scan.rs:2456 in a throwaway worktree: Intruder Alarm must un-reject AND Gaea's Cradle must still fail closed. Un-reject both => a HOLE in the catastrophic direction, not a fix. Also records error phase-rs#19 for the consolidation pass: team-lead's 'no test anywhere asserts !sibling' is measurably FALSE (ability_scan.rs:5215). The precise version is stronger -- the positive guard that exists (fixed_drain, :4879) references no object filter at all, so it is NON-discriminating and gave false comfort. Plan-only. Zero files modified under crates/. Assisted-by: ClaudeCode:claude-opus-4.8
lgray
added a commit
to lgray/phase
that referenced
this pull request
Jul 14, 2026
The prior planning docs describe an engine that no longer exists. Re-measured every load-bearing citation against main @ efc76ca (the docs were written against a tree 768 commits behind) and two central claims are refuted: - "there is no live object-growth path" -> FALSE. try_offer_object_growth_shortcut drives the captured recast on a clone (game/engine.rs:1656). - "the offer carries no iteration count" -> FALSE. ShortcutDecisionSchema .iteration_count: IterationCount::{Fixed,UntilLethal} (decision_template.rs:203). PR-7 shipped ~90% of the spec. The live blocker is REACHABILITY, not capability: fire_time_conditions_read_growing_class (resource.rs:1457, consumed by two gates) vetoes if ANY object in scope trips ability_reads_sibling_mutable -- and sibling:true is the fail-closed DEFAULT for typed filters (ability_scan.rs:2420, "stay CONSERVATIVE"). 84 such sites on main (54 Axes::CONSERVATIVE + 30 sibling:true). Each is individually rules-correct; the firewall is a disjunction over ~100 Commander permanents, so composed they veto by construction. The suite missed it because its fixtures build boards that cannot exist (no lands, empty library). New: LOOP-SHORTCUT-SPEC-AND-STATE.md -- spec, verified CR/MTR layer, what main already does (do not rebuild), why it never fires, and the one experiment that decides the rest (stub the firewall to always-accept, port the fixture, run it). The six prior docs are banner-marked STALE (historical only; rules reasoning and soundness rules still good, code facts not). Also repaired their internal integrity first, so the archive is at least self-consistent: Appendix B now runs 1..19 in order (phase-rs#18 was filed before phase-rs#17, and phase-rs#19 was an IOU), the MTR addendum no longer sits above the section titled "READ THIS FIRST", and the error count is no longer simultaneously 17, 18, and 19 in one document. Assisted-by: ClaudeCode:claude-opus-4.8
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Automated update of README coverage badges from latest card data.