Skip to content

chore: update coverage stats and badges - #19

Merged
matthewevans merged 1 commit into
mainfrom
chore/update-coverage-badges
Apr 8, 2026
Merged

chore: update coverage stats and badges#19
matthewevans merged 1 commit into
mainfrom
chore/update-coverage-badges

Conversation

@matthewevans

Copy link
Copy Markdown
Member

Automated update of README coverage badges from latest card data.

@matthewevans
matthewevans enabled auto-merge (squash) April 8, 2026 17:08
@matthewevans
matthewevans merged commit d0be37c into main Apr 8, 2026
2 checks passed
@matthewevans
matthewevans deleted the chore/update-coverage-badges branch April 8, 2026 17:12
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>
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
@tp5grphwkt-cell tp5grphwkt-cell mentioned this pull request Aug 3, 2026
4 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant