Skip to content

Fix Sauron, Dino Devotee — restore modal mode-body subject filtering - #7037

Merged
matthewevans merged 7 commits into
phase-rs:mainfrom
dan-blanchard:card/sauron-dino-devotee
Aug 7, 2026
Merged

Fix Sauron, Dino Devotee — restore modal mode-body subject filtering#7037
matthewevans merged 7 commits into
phase-rs:mainfrom
dan-blanchard:card/sauron-dino-devotee

Conversation

@dan-blanchard

@dan-blanchard dan-blanchard commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Summary

Fixes the #6811 regression that drops Sauron, Dino Devotee's modal "It's a green Dinosaur with base power and toughness 5/5" clause to Unimplemented{name:"it's"} (it parsed to the full continuous-modification suite at v0.35.2), and the silent misbind the same commit introduced on Disciple of Perdition ("That player loses 1 life" → TriggeringPlayer instead of the targeted opponent). One-seam restoration: mode_anaphor_subject clears a SelfRef/Any trigger subject per mode inside parse_modal_mode_irs — the single production funnel all four modal forms share — restoring the rule the retired pre-IR derive_modal_subject applied. Closes #7031.

Files changed

  • crates/engine/src/parser/oracle_modal.rs — the helper + one call-site line; R7 building-block arms + R8/R8b/Blizzard Specter shape tests
  • crates/engine/tests/integration/sauron_dino_devotee_modal_anaphor_7031.rs — runtime discriminator, live-duration proof, negative-sibling mode, CR 700.2b no-legal-target row
  • crates/engine/tests/integration/arbalest_engineers_modal_pump_anaphor.rs — pinned-green composition guard (header documents it as non-discriminating)
  • crates/engine/tests/integration/main.rs — two mod lines
  • crates/engine/tests/fixtures/integration_cards.json — regenerated via scripts/gen-test-fixture.py (new test keys; absorbed pre-existing staleness — see Scope Expansion)
  • crates/engine/src/game/triggers_ordering_parity_tests.rs — one DOCUMENTED_OVER_PROMPT ledger row (arashin sovereign), surfaced by the fixture regen

Track

Developer

LLM

Model: claude-fable-5
Tier: Frontier
Thinking: high

Implementation method (required)

Method: /engine-implementer

CR references

CR 122.1, 205.1a, 603.3c, 603.4, 603.5, 603.6c, 608.2c, 608.2k, 611.2b, 611.2c, 613.1d, 613.1e, 613.4b, 700.2b (all grep-verified against docs/MagicCompRules.txt; 611.2b/c and 205.1a/603.3c are the authorizing citations, 613.1d/1e/4b the layer rules)

Verification

  • Required checks ran clean, or the exact CI-owned alternative is stated below.

  • Gate A output below is for the current committed head.

  • Final review-impl below is clean for the current committed head.

  • Both anchors cite existing analogous code at the same seam.

  • cargo fmt --all --check — clean

  • ./scripts/check-parser-combinators.sh — Gate A/G PASS at head

  • cargo clippy --all-targets -- -D warnings — clean

  • cargo test -p phase-engine — 18532 lib + 4563 integration + 12 + 9 passed, 0 failed (includes the enlarged ordering-parity sweep and the named must-stay-green set: grenzo, both riku files, pip-boy)

  • cargo coverage — Sauron supported: false→true, gaps 1→0; pool totals −1 unsupported / −1 gap; no other card moved

  • cargo semantic-audit — exit 0; neither changed card in findings

  • ./scripts/check-skill-doc.sh — PASS

  • Full-pool parse diff (pre/post gen-card-data.sh) — changed cards exactly {sauron, dino devotee, disciple of perdition}; every sensitive-class card byte-identical (per-card audit in the reviewed plan)

  • Discriminating-test proof — with the call-site line neutralized: R1 runtime fails (2,2) != (5,5), R8 fails on the Unimplemented{"it's"} residue, R8b fails TriggeringPlayer != ParentTargetController; Blizzard Specter sibling / Arbalest guard / retained-subject set stay green either way (run twice: implementation round and independently by the review pass)

Gate A

Gate A PASS head=6c7e559b6bdf1c3dd5da12f4d268502f72038473 base=ce15372c5b44f4a4699ce577ae62d801b9c9fd9c

Anchored on

Final review-impl

Final review-impl PASS head=6c7e559b6bdf1c3dd5da12f4d268502f72038473

Claimed parse impact

sauron, dino devotee (Unimplemented clears; mode 2 restores the v0.35.2 GenericEffect suite + ForAsLongAs{RecipientHasCounters}), disciple of perdition (LoseLife{TriggeringPlayer}LoseLife{ParentTargetController}, the v0.35.2 binding). No other card's parse bytes change (full-pool diff verified).

Scope Expansion

The mandated fixture regeneration (scripts/gen-test-fixture.py, no --check — the new tests reference new fixture keys) absorbed pre-existing staleness beyond the two target entries: added keys for test literals matching cards now in the export, metadata refreshes, and 44 stale stored parses refreshed to current-parser output (zero oracle_text/name/type/P-T changes; Grenzo byte-unchanged; each parse-bearing refresh individually adjudicated in review as staleness, not an effect of this fix). The enlarged sweep corpus surfaced arashin sovereign in the ordering-parity proof-gate; adjudicated as a documented-conservative over-prompt (unprofiled PutOnTopOrBottom lands in the fail-closed RwProfile::conservative() catch-all; members' writes disjoint per CR 603.6c) with a ledger row following the in-file nether-spirit precedent.

Validation Failures

None.

CI Failures

phase-ai lib test velocity_score_projection_deadline_is_live_on_a_traversing_fixture fails on this machine at the PR head and at pristine base 562e7b5d2 (verified in a clean detached worktree) — a hardware-speed artifact: the test's reach-guard requires an uncapped projection to cost ≥20 ms and an Apple-Silicon dev machine completes the traversal under that threshold, so the arm cannot discriminate locally. Deferring to CI as the owner of this check; the local pre-push hook was bypassed for exactly this pre-existing failure after proving it at base. All engine-crate suites pass locally.

Pipeline report

Plan-review loop: 3 rounds to CLEAN (round 1: 4 findings incl. re-scoping a non-discriminating test and reconciling the anaphor-rewrite layer; round 2: 2 audit-completeness findings, design verified; round 3: CLEAN). Implementation: 1 round + 1 scope-widened fix round (the parity ledger row). Implementation review: CLEAN at the committed head, with the reviewer independently re-running the discrimination experiment and adjudicating all 44 fixture parse refreshes.

Pipeline-reviewed head: 6c7e559
Current branch head: 6c7e559
Pipeline status: current
Current-head review: clean at 6c7e559

🤖 Generated with Claude Code

https://claude.ai/code/session_01WzL3nFmAqGfwhAUDCiKKcv

Summary by CodeRabbit

  • Bug Fixes

    • Improved modal ability handling so mode-specific references take precedence while preserving valid targets, players, and object references.
    • Corrected modal effects involving pronouns, typed trigger subjects, targeted opponents, damage triggers, and inline resolution.
  • Tests

    • Added coverage for modal enter-the-battlefield, attack, and dies abilities.
    • Verified counters, keywords, characteristic changes, life changes, graveyard exile, target restrictions, and effect removal.

…hase-rs#7031)

The phase-rs#6811 native-IR modal rework threaded the trigger's ParseContext into
mode bodies without the subject filtering the retired pre-IR path applied
via derive_modal_subject. A SelfRef/Any trigger subject now leaked into
every mode body, corrupting the subject-presence forks:

- Sauron, Dino Devotee (the reported regression): the mode-body "It's a
  green Dinosaur with base power and toughness 5/5" copula clause fails
  closed — the honest-bind gate correctly refuses to animate the trigger
  source — and the whole payload drops to Unimplemented{name:"it's"}.
  At v0.35.2 it parsed to the full GenericEffect modification suite.
- Disciple of Perdition (silent misbind, same commit): the mode-body
  "That player loses 1 life" fails open into LoseLife{TriggeringPlayer}
  instead of the targeted opponent's ParentTargetController.

Restore the rule at the IR seam: mode_anaphor_subject clears a
SelfRef/Any subject per mode inside parse_modal_mode_irs — the single
production funnel all four modal forms share (bullet/inline triggered,
spell, activated) — so mode-internal referents bind mode-body anaphors
again (CR 608.2c/608.2k). Non-self subjects pass through unchanged; the
chain-level anaphor rewrite layer is untouched and parse-time
ParentTarget is a fixed point of its GenericEffect arm, so the
already-correct class members (Arbalest Engineers, Ertai Resurrected,
Riku of Many Paths) stay byte-identical.

Full-pool parse diff: exactly {sauron dino devotee, disciple of
perdition}; coverage -1 unsupported / -1 gap; semantic-audit clean.

Tests: runtime discriminator + live ForAsLongAs{RecipientHasCounters}
duration proof (reverted: (2,2) != (5,5)); no-legal-target CR 700.2b
row; Disciple/Blizzard-Specter shape pair pinning the scope-rung
precedence; four building-block arms incl. the object_pronoun_ref
precedence pins; Arbalest pinned-green composition guard (documented
non-discriminating); Grenzo/Riku/pip-boy retained-subject set stays
green.

The integration-card fixture regen (required for the new tests' keys)
absorbed pre-existing staleness (added keys + refreshed stored parses;
oracle text untouched) and enlarged the ordering-parity sweep corpus,
surfacing arashin sovereign — adjudicated as a documented-conservative
over-prompt (unprofiled PutOnTopOrBottom lands in the fail-closed
RwProfile catch-all; members' writes are disjoint per CR 603.6c).

Closes phase-rs#7031

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WzL3nFmAqGfwhAUDCiKKcv
@github-actions github-actions Bot added the needs-maintainer AI-contribution PR requires human triage (Non-dev track or unresolved gaps) label Aug 5, 2026
@matthewevans

Copy link
Copy Markdown
Member

Maintainer hold: I verified this PR is currently at 6c7e559b6bdf1c3dd5da12f4d268502f72038473 and GitHub reports a textual conflict. The required local security/diff scan and conflict resolution cannot proceed because the maintainer workspace cannot create Git object-pack temporary files (filesystem capacity exhausted).

Next step: restore workspace capacity, then a maintainer will rerun the local scan and resolve or update the branch as appropriate. Please do not rebase solely for this hold.

@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 21228465-b3bc-44b1-8661-9fa3325eee97

📥 Commits

Reviewing files that changed from the base of the PR and between 4a9833d and e993d85.

📒 Files selected for processing (2)
  • crates/engine/src/parser/oracle_modal.rs
  • crates/engine/tests/integration/main.rs
🚧 Files skipped from review as they are similar to previous changes (2)
  • crates/engine/tests/integration/main.rs
  • crates/engine/src/parser/oracle_modal.rs

📝 Walkthrough

Walkthrough

The modal parser now clears inherited SelfRef and Any subjects before parsing mode bodies. New parser and integration tests cover local targets, typed subjects, trigger-player scope, pinned references, and modal trigger outcomes.

Changes

Modal anaphora resolution

Layer / File(s) Summary
Modal subject filtering and parser regressions
crates/engine/src/parser/oracle_modal.rs
Modal mode contexts remove SelfRef and Any subjects while retaining typed subjects, trigger scope, and object-pronoun pins. Regression tests cover local referents and targeted-opponent binding.
Modal trigger integration coverage
crates/engine/tests/integration/arbalest_engineers_modal_pump_anaphor.rs, crates/engine/tests/integration/sauron_dino_devotee_modal_anaphor_7031.rs, crates/engine/tests/integration/main.rs
Integration tests cover mode selection, target binding, priority resolution, effect cleanup, legal-target handling, graveyard exile, and opponent life loss. Both test modules are registered.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Trigger
  participant ModalParser
  participant ModeResolution
  participant GameState
  Trigger->>ModalParser: clone modal parse context
  ModalParser->>ModalParser: remove SelfRef and Any subjects
  ModalParser->>ModeResolution: lower mode body
  ModeResolution->>GameState: select target and apply mode effect
  GameState-->>Trigger: preserve trigger-player scope and pinned references
Loading

Possibly related PRs

  • phase-rs/phase#6528: Both changes modify parser context and anaphora resolution for modal or trigger-local references.
  • phase-rs/phase#6540: Both changes address parser subject binding for trigger-player and mode-local references.
  • phase-rs/phase#7003: Both changes modify parser-level subject and anaphor binding.

Suggested labels: needs-maintainer

Suggested reviewers: matthewevans

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly identifies the Sauron fix and the restoration of modal mode-body subject filtering, which matches the primary change.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@crates/engine/src/parser/oracle_modal.rs`:
- Around line 4635-4676: Add an integration/runtime test for Disciple of
Perdition alongside
disciple_of_perdition_that_player_binds_to_targeted_opponent, resolving mode 2
after the creature dies and targeting an opponent’s graveyard. Assert the
targeted opponent loses exactly 1 life while the other player’s life total
remains unchanged, proving runtime target binding rather than only parser
output.
- Around line 1257-1260: Correct the comment above modal relative-player scope
to remove the incorrect CR 603.4 attribution for zone pins and cite CR 608.2k
for the object_pronoun_ref pinned-object behavior, or omit the citation if the
rule does not fully support the claim; retain the valid intervening-if reference
separately.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: ce40343a-cfe8-4b67-b6f3-a74af6944989

📥 Commits

Reviewing files that changed from the base of the PR and between 14b11cf and 6c7e559.

📒 Files selected for processing (6)
  • crates/engine/src/game/triggers_ordering_parity_tests.rs
  • crates/engine/src/parser/oracle_modal.rs
  • crates/engine/tests/fixtures/integration_cards.json
  • crates/engine/tests/integration/arbalest_engineers_modal_pump_anaphor.rs
  • crates/engine/tests/integration/main.rs
  • crates/engine/tests/integration/sauron_dino_devotee_modal_anaphor_7031.rs

Comment thread crates/engine/src/parser/oracle_modal.rs Outdated
Comment thread crates/engine/src/parser/oracle_modal.rs
@matthewevans matthewevans removed the needs-maintainer AI-contribution PR requires human triage (Non-dev track or unresolved gaps) label Aug 6, 2026
@matthewevans matthewevans self-assigned this Aug 7, 2026
@matthewevans matthewevans added the bug Bug fix label Aug 7, 2026
@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown

Generated for head e993d8583a628e02a35c4ba39d86c2f534cb7ddd.

Parse changes introduced by this PR · 1 card(s), 2 signature(s) (baseline: main 7ed567ae9527)

🟢 Added (1 signature)

  • 1 card · ➕ ability/base power 5, base toughness 5, set color Green, add type creature, remove all … · added: base power 5, base toughness 5, set color Green, add type creature, remove all Creature subtypes, add subtype Dinosaur (affects=parent target, duration=for as …
    • Affected (first 3): Sauron, Dino Devotee

🔴 Removed (1 signature)

  • 1 card · ➖ ability/it's · removed: it's (duration=for as long as condition)
    • Affected (first 3): Sauron, Dino Devotee

1 card(s) had Oracle-text changes (errata/reprint) — excluded as non-parser.

@matthewevans

Copy link
Copy Markdown
Member

Resolved: the anaphor comment now cites CR 608.2k, which governs a specific untargeted object previously referred to by the trigger condition; CR 603.4 was removed because it only defines the intervening-if timing check. The focused Disciple of Perdition runtime test covers the targeted opponent binding.

@matthewevans matthewevans left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed current head: conflict resolution preserves generated fixtures and adds the focused runtime regression coverage.

@matthewevans
matthewevans enabled auto-merge August 7, 2026 01:54
@matthewevans

Copy link
Copy Markdown
Member

Current-head hold. I reviewed 20d92c56298277e587e55612293daf66a998704c in a clean worktree. The modal-context change is at the shared per-mode lowering seam, the targeted runtime coverage reaches the production trigger/mode pipeline, and the two CodeRabbit findings are resolved at this head.

This is not ready to enqueue yet. The required <!-- coverage-parse-diff --> artifact posted at 2026-08-07T01:53:45Z declares predecessor head b39585862977655d7f9ca8efa617114b1802658c, not the reviewed current head. In addition, Rust lint and both Rust-test shards are still in progress. Please wait for a current-head parse-diff artifact and all required checks to complete successfully; then rerun the live disposition.

@matthewevans
matthewevans disabled auto-merge August 7, 2026 02:07
@matthewevans matthewevans removed their assignment Aug 7, 2026
@matthewevans
matthewevans enabled auto-merge August 7, 2026 02:11

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@crates/engine/tests/integration/sauron_dino_devotee_modal_anaphor_7031.rs`:
- Around line 349-351: Replace the direct move_to_zone and manual
process_triggers calls in the test with the standard engine application path
that submits a replacement-aware ProposedEvent::ZoneChange. Continue the test by
driving GameRunner through each resulting WaitingFor state until the zone change
and dies triggers are fully processed.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: ec92f676-0526-4933-963d-277ff7d75899

📥 Commits

Reviewing files that changed from the base of the PR and between 6c7e559 and 4a9833d.

📒 Files selected for processing (5)
  • crates/engine/src/game/triggers_ordering_parity_tests.rs
  • crates/engine/src/parser/oracle_modal.rs
  • crates/engine/tests/fixtures/integration_cards.json
  • crates/engine/tests/integration/main.rs
  • crates/engine/tests/integration/sauron_dino_devotee_modal_anaphor_7031.rs
🚧 Files skipped from review as they are similar to previous changes (3)
  • crates/engine/tests/integration/main.rs
  • crates/engine/src/game/triggers_ordering_parity_tests.rs
  • crates/engine/src/parser/oracle_modal.rs

Comment on lines +349 to +351
let mut events = Vec::new();
move_to_zone(runner.state_mut(), disciple, Zone::Graveyard, &mut events);
engine::game::triggers::process_triggers(runner.state_mut(), &events);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

Route the dies event through the production zone-change pipeline.

move_to_zone followed by manual process_triggers bypasses replacement-aware ProposedEvent::ZoneChange processing. A production regression in zone-change event construction or trigger delivery can leave this test green.

Submit the zone change through the standard engine application path. Then drive GameRunner through the resulting WaitingFor states.

As per path instructions, “Zone changes must route through the replacement-aware pipeline (ProposedEvent::ZoneChange)” and tests must drive the production pipeline.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/engine/tests/integration/sauron_dino_devotee_modal_anaphor_7031.rs`
around lines 349 - 351, Replace the direct move_to_zone and manual
process_triggers calls in the test with the standard engine application path
that submits a replacement-aware ProposedEvent::ZoneChange. Continue the test by
driving GameRunner through each resulting WaitingFor state until the zone change
and dies triggers are fully processed.

Source: Path instructions

@matthewevans matthewevans self-assigned this Aug 7, 2026
@matthewevans

Copy link
Copy Markdown
Member

Current-head hold. I reviewed 4a9833d4d0cc591e3bea99f98a884d1ce0158119 in a clean worktree. The modal-context fix remains at the shared per-mode lowering seam; its Sauron and Disciple tests drive the real parsed ability through mode selection, target selection, and stack resolution. The current CodeRabbit concern about direct zone setup is refuted for this test's scope: move_to_zone supplies the test fixture's dies event, then production process_triggers builds the ability under test; no replacement effect or zone-event construction is touched by this parser regression.

This is not ready to enqueue. The latest required <!-- coverage-parse-diff --> artifact declares predecessor head 20d92c56298277e587e55612293daf66a998704c, not the reviewed current head. Rust lint and both Rust-test shards are still in progress. Please wait for a parse-diff artifact bound to this exact head and for all required checks to pass, then rerun the live disposition.

@matthewevans
matthewevans disabled auto-merge August 7, 2026 02:26
@matthewevans matthewevans removed their assignment Aug 7, 2026
@matthewevans
matthewevans added this pull request to the merge queue Aug 7, 2026
@matthewevans matthewevans self-assigned this Aug 7, 2026

@matthewevans matthewevans left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed current head: corrected the CR annotation and reconfirmed the modal lowering seam plus runtime regressions.

@matthewevans

Copy link
Copy Markdown
Member

Current-head merge-queue hold. I reviewed and approved 53c6c3d2c1b4c722ee76d474219fab5ad795a6fa after the maintainer-only CR annotation correction. The bug label is present. GitHub reports merge-queue entry state UNMERGEABLE; only Contributor trust and Superagent Security Scan are attached to this SHA, while the required Rust and Frontend CI checks have not been created. gh pr merge --auto reports the PR is already queued, so I am not retrying queue mutations. Next step: wait for GitHub to attach the required checks or have a maintainer refresh the queue once it does; then re-run the live queue disposition.

@matthewevans matthewevans removed their assignment Aug 7, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to a conflict with the base branch Aug 7, 2026
@matthewevans matthewevans self-assigned this Aug 7, 2026
# Conflicts:
#	crates/engine/src/game/triggers_ordering_parity_tests.rs
#	crates/engine/tests/fixtures/integration_cards.json

@matthewevans matthewevans left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed current maintainer port: it preserves #7047's generated-data and registration changes while retaining #7037's parser and runtime regressions.

@matthewevans
matthewevans enabled auto-merge August 7, 2026 03:17
@matthewevans matthewevans removed their assignment Aug 7, 2026
@matthewevans
matthewevans added this pull request to the merge queue Aug 7, 2026
Merged via the queue into phase-rs:main with commit 53b9704 Aug 7, 2026
13 checks passed
@matthewevans

Copy link
Copy Markdown
Member

@dan-blanchard Thanks for the contributions! Much appreciated :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Bug fix

Projects

None yet

2 participants