Skip to content

fix(engine): support non-first spell triggers - #7233

Merged
matthewevans merged 15 commits into
phase-rs:mainfrom
keloide:card/ichneumon-druid
Aug 11, 2026
Merged

fix(engine): support non-first spell triggers#7233
matthewevans merged 15 commits into
phase-rs:mainfrom
keloide:card/ichneumon-druid

Conversation

@keloide

@keloide keloide commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Summary

Implements the reusable fire-time “other than the first [qualifying] spell” trigger class and uses it for Ichneumon Druid. Existing exact-Nth spell triggers remain EQ; malformed or partially supported text fails closed instead of silently broadening.

Files changed

  • crates/engine/src/types/ability.rs — parameterizes NthSpellThisTurn with a backward-compatible comparator.
  • crates/engine/src/parser/oracle_trigger.rs — parses the non-first spell family and strict-rejects incomplete tails.
  • crates/engine/src/game/triggers.rs — evaluates the comparator at trigger fire time.
  • crates/engine/src/game/coverage.rs — accurately renders non-first constraints.
  • crates/engine/src/parser/oracle_trigger_tests.rs — parser, strict-failure, serde, and compatibility coverage.
  • crates/engine/tests/integration/ichneumon_druid.rs and main.rs — real casting-flow regression.
  • crates/engine/tests/integration/curse_misc_triggers.rs — removes a noncanonical partial-Aura fixture.
  • crates/engine/src/game/engine_phase_trigger_regression_tests.rs and tests/integration/lady_loki_agent_of_chaos.rs — explicit/wildcard constraint audit.
  • crates/mtgish-import/src/convert/trigger.rs and crates/phase-ai/src/features/spellslinger_prowess.rs — cross-crate EQ constructor and timing documentation updates.

Track

Non-developer

LLM

Model: gpt-5.6-terra
Tier: Frontier
Thinking: high

Implementation method (required)

Method: /engine-implementer

CR references

  • CR 603.2 — event-time trigger matching and the per-caster spell-history comparison.
  • CR 603.4 — this qualifier is not an intervening-if and is therefore not rechecked at resolution.
  • CR 601.2a — spell-cast event/controller provenance.
  • CR 120.1 and CR 120.2b — damage source and recipient.

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.

  • ./scripts/check-parser-combinators.sh — passed: Gate G PASS and Gate A PASS.

  • git diff --check upstream/main...HEAD — passed.

  • rustfmt --check --edition 2021 <all modified Rust files> — passed.

  • cargo fmt --all, Cargo tests/checks, card-data generation, and coverage report — CI-owned: installed stable Cargo rejects the workspace's nightly-only codegen-backend manifest feature; rustup and Tilt are unavailable locally.

  • Final independent /review-impl — CLEAN / LGTM for the current rebased head.

Gate A

Gate A PASS head=7924729f8e7d8514deb47fe173878f886a1a79d7 base=448e9867fb82c26cc1e15ce40fed6c40ec4fe427

Anchored on

  • crates/engine/src/parser/oracle_trigger.rs:15894 — existing per-caster Nth-spell parser and constraint seam.
  • crates/engine/src/game/triggers.rs:9539 — existing SpellCast event-controller/per-caster history matcher.

Final review-impl

Final review-impl PASS head=7924729f8e7d8514deb47fe173878f886a1a79d7

Claimed parse impact

  • Ichneumon Druid — supported as a fire-time GT 1 instant-spell trigger.
  • The generic typed/untyped “other than the first … spell” class for you, an opponent, or a player.
  • Curse of Shaken Faith remains explicitly unsupported because its complete Oracle text adds the unimplemented or copies a spell event leg; this avoids a false-green partial parse.

Scope Expansion

None. The shared constraint parameterization is required to implement the selected card's reusable spell-history class. No protected architecture path or cross-span boundary is touched.

Validation Failures

Local Rust compilation and tests could not run: stable Cargo rejects the workspace's nightly-only codegen-backend manifest feature, and neither rustup nor Tilt is installed. CI must run the Cargo, integration, card-data, and coverage checks.

CI Failures

None.

Summary by CodeRabbit

  • New Features
    • Added support for spell triggers based on comparisons such as “after your first spell,” with actor- and spell-specific filters.
    • Improved trigger wording for first, exact-number, and subsequent spell conditions.
    • Team-aware opponent checks now correctly distinguish teammates from opposing players.
  • Bug Fixes
    • Corrected per-turn spell-count evaluation and malformed trigger handling.
  • Tests
    • Added regression coverage for multi-spell triggers, team interactions, filtering, parsing, and compatibility.

@coderabbitai

coderabbitai Bot commented Aug 11, 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: 837eff9e-c0c1-4b0b-8a25-76fb4225b6c5

📥 Commits

Reviewing files that changed from the base of the PR and between 379eeed and 8e0efb4.

📒 Files selected for processing (1)
  • crates/engine/src/parser/oracle_trigger.rs

📝 Walkthrough

Walkthrough

The change adds comparator support to NthSpellThisTurn, updates runtime evaluation and formatting, parses “other than the first” spell triggers, and adds parser and integration coverage.

Changes

Spell trigger matching

Layer / File(s) Summary
Comparator constraint and runtime evaluation
crates/engine/src/types/ability.rs, crates/engine/src/game/triggers.rs, crates/engine/src/game/coverage.rs, crates/engine/src/game/engine_phase_trigger_regression_tests.rs
NthSpellThisTurn now stores and evaluates a Comparator. Equality remains the serialization default. Formatting supports greater-than and ordinal equality wording. Existing constructions specify Comparator::EQ.
Non-first spell trigger parsing
crates/engine/src/parser/oracle_trigger.rs
The parser recognizes actor-specific “other than the first” triggers, validates qualifiers and pronouns, rejects malformed forms, and emits Comparator::GT constraints.
Parser and serialization validation
crates/engine/src/parser/oracle_trigger_tests.rs, crates/engine/tests/integration/lady_loki_agent_of_chaos.rs
Tests cover exact and non-first spell triggers, filters, rejected forms, comparator defaults, serialization, and expanded enum fields.
Integration coverage and downstream construction
crates/engine/tests/integration/ichneumon_druid.rs, crates/engine/tests/integration/main.rs, crates/engine/src/game/trigger_matchers.rs, crates/engine/tests/integration/curse_misc_triggers.rs, crates/mtgish-import/src/convert/trigger.rs, crates/phase-ai/src/features/spellslinger_prowess.rs
Integration coverage verifies later opponent instants and team-aware opponent matching. Import conversion and AI documentation use the expanded constraint shape. Obsolete Curse of Shaken Faith coverage is removed.

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

Sequence Diagram(s)

sequenceDiagram
  participant OracleTriggerParser
  participant parse_spell_history_filter
  participant TriggerConstraint
  participant SpellHistory
  OracleTriggerParser->>parse_spell_history_filter: Parse shared spell qualifiers
  parse_spell_history_filter-->>OracleTriggerParser: Return spell history filter
  OracleTriggerParser->>TriggerConstraint: Create NthSpellThisTurn with Comparator::GT
  SpellHistory->>TriggerConstraint: Evaluate the caster spell count
Loading

Suggested labels: area:engine, quality

Suggested reviewers: matthewevans, jacobwoodson

🚥 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 and concisely describes the main change: adding engine support for non-first spell triggers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
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.

@keloide
keloide force-pushed the card/ichneumon-druid branch from 11a9fb9 to 7924729 Compare August 11, 2026 11:50
@matthewevans matthewevans self-assigned this Aug 11, 2026
Co-authored-by: keloide <75585494+keloide@users.noreply.github.com>
@matthewevans matthewevans added the bug Bug fix label Aug 11, 2026
@matthewevans

Copy link
Copy Markdown
Member

Maintainer fixup pushed at 3dd1a31bc82baaa5086e31a25733b96abcaba2b6 to restore the parser combinator error-type anchor and apply the integration-module ordering required by rustfmt. HOLD: keeping this PR draft pending CI and the parse-diff artifact generated for this exact head; no approval or enqueue action yet.

@matthewevans matthewevans removed their assignment Aug 11, 2026
@github-actions

github-actions Bot commented Aug 11, 2026

Copy link
Copy Markdown

Generated for head 8e0efb41b225b87cb66dbdc5d8de5f7b6ff17387.

Parse changes introduced by this PR · 175 card(s), 21 signature(s) (baseline: main 2f90392f2a8c)

🟢 Added (1 signature)

  • 1 card · ➕ trigger/unknown · added: unknown (active in=battlefield)
    • Affected (first 3): Curse of Shaken Faith

🔴 Removed (1 signature)

  • 1 card · ➖ trigger/SpellCast · removed: SpellCast (active in=battlefield, valid target=attached permanent)
    • Affected (first 3): Curse of Shaken Faith

🟡 Modified fields (19 signatures)

  • 66 cards · 🔄 trigger/Drawn · changed field constraint: on your 2th draw this turnon your 2nd draw this turn
    • Affected (first 3): Alandra, Sky Dreamer, Atlantean Cavalry, Bard the Bowman (+63 more)
  • 60 cards · 🔄 trigger/SpellCast · changed field constraint: on your 2th spell this turnon your 2nd spell this turn
    • Affected (first 3): A-Cori-Steel Cutter, Aligned Heart, Alphinaud Leveilleur (+57 more)
  • 17 cards · 🔄 trigger/SpellCast · changed field constraint: on your 1th spell this turnon your 1st spell this turn
    • Affected (first 3): Alela, Cunning Conqueror, Arena Trickster, Blightwing Bandit (+14 more)
  • 5 cards · 🔄 trigger/SpellCast · changed field constraint: on your 1th non-creature spell this turnon your 1st non-creature spell this turn
    • Affected (first 3): Esper Sentinel, Shadow in the Warp, The Frightful Four (+2 more)
  • 4 cards · 🔄 trigger/Drawn · changed field constraint: on your 3th draw this turnon your 3rd draw this turn
    • Affected (first 3): Astrologian's Planisphere, Mindless Conscription, Sneaky Snacker (+1 more)
  • 4 cards · 🔄 trigger/SpellCast · changed field constraint: on your 1th instant or sorcery spell this turnon your 1st instant or sorcery spell this turn
    • Affected (first 3): Aquatic Alchemist, Arcane Bombardment, Baral and Kari Zev (+1 more)
  • 4 cards · 🔄 trigger/SpellCast · changed field constraint: on your 1th with {X} in cost spell this turnon your 1st with {X} in cost spell this turn
    • Affected (first 3): Lattice Library, Nev, the Practical Dean, Owlin Spiralmancer (+1 more)
  • 4 cards · 🔄 trigger/SpellCast · changed field constraint: on your 3th spell this turnon your 3rd spell this turn
    • Affected (first 3): Captain Ripley Vance, Emeritus of Conflict, Tempest Trapper (+1 more)
  • 2 cards · 🔄 trigger/SpellCast · changed field constraint: on your 1th enchantment spell this turnon your 1st enchantment spell this turn
    • Affected (first 3): Psemilla, Meletian Poet, Tuvasa the Sunlit
  • 1 card · 🔄 trigger/Drawn · changed field constraint: on your 1th draw this turnon your 1st draw this turn
    • Affected (first 3): Zurzoth, Chaos Rider
  • 1 card · 🔄 trigger/SpellCast · changed field constraint: on your 1th Assassin or Mercenary or Pirate or Rogue or Warlock spell this turnon your 1st Assassin or Mercenary or Pirate or Rogue or Warlock spell this turn
    • Affected (first 3): Discreet Retreat
  • 1 card · 🔄 trigger/SpellCast · changed field constraint: on your 1th Omen spell this turnon your 1st Omen spell this turn
    • Affected (first 3): Dragonsoul Prodigy
  • 1 card · 🔄 trigger/SpellCast · changed field constraint: on your 1th creature spell this turnon your 1st creature spell this turn
    • Affected (first 3): Waystone's Guidance
  • 1 card · 🔄 trigger/SpellCast · changed field constraint: on your 1th instant or sorcery + in graveyard spell this turnon your 1st instant or sorcery + in graveyard spell this turn
    • Affected (first 3): Sevinne, the Chronoclasm
  • 1 card · 🔄 trigger/SpellCast · changed field constraint: on your 1th instant or sorcery or Villain spell this turnon your 1st instant or sorcery or Villain spell this turn
    • Affected (first 3): Lady Loki, Agent of Chaos
  • 1 card · 🔄 trigger/SpellCast · changed field constraint: on your 1th instant spell this turnon your 1st instant spell this turn
    • Affected (first 3): Kalamax, the Stormsire
  • 1 card · 🔄 trigger/SpellCast · changed field constraint: on your 1th multicolored card spell this turnon your 1st multicolored card spell this turn
    • Affected (first 3): Zenith Chronicler
  • 1 card · 🔄 trigger/SpellCast · changed field constraint: on your 2th creature spell this turnon your 2nd creature spell this turn
    • Affected (first 3): Vengevine
  • 1 card · 🔄 trigger/SpellCast · changed field constraint: after your first instant spell this turn
    • Affected (first 3): Ichneumon Druid

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

Copy link
Copy Markdown
Member

Rechecked current head 3cad6630395e2e79c7f6cc12d3e360330eda65a8 in an isolated worktree.

Manual review is clean: the generalized comparator stays at the existing per-caster NthSpellThisTurn fire-time seam, reuses the spell-history filter, preserves exact-ordinal serialization, and the Ichneumon Druid scenario discriminates own cast, first instant, intervening noninstant, second instant, and later instants. Gate A passes for this head; the full diff has no workflow, instruction, or network-surface changes.

The parse-diff sticky (updated 2026-08-11T14:06:49Z) matches the intended two-card delta: Ichneumon Druid gains the GT 1 instant constraint and Curse of Shaken Faith becomes explicitly unsupported rather than partially parsed. Its embedded generated-head remains 321370a05e3c1ccaa1cc1f0e7afcfc174e9fceba, so the current-head CI/artifact evidence still needs to settle.

HOLD: no approval or enqueue while the current Rust, frontend/WASM, AI, and required external checks are pending. No contributor action is requested.

@matthewevans matthewevans removed their assignment Aug 11, 2026
@keloide
keloide marked this pull request as ready for review August 11, 2026 15:05
@keloide
keloide requested a review from matthewevans as a code owner August 11, 2026 15:05
@matthewevans matthewevans self-assigned this Aug 11, 2026

@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/game/coverage.rs`:
- Around line 4176-4180: Update the match on comparator in the timing
construction to replace the wildcard arm with explicit remaining Comparator
variants, preserving the current formatting behavior for each variant. Keep
Comparator::EQ and the Comparator::GT special case unchanged, and make the match
exhaustive so future enum additions require an explicit formatting decision.
- Around line 4177-4183: Update the Comparator::EQ formatting branch in the
timing description to use correct ordinal suffixes: 1st, 2nd, 3rd, default th,
and th for 11th–13th. Preserve the existing wording and target handling in the
surrounding filter match.
🪄 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: bac59f0e-3f64-44c9-a8eb-b0558ceb65d3

📥 Commits

Reviewing files that changed from the base of the PR and between 448e986 and 3cad663.

📒 Files selected for processing (12)
  • crates/engine/src/game/coverage.rs
  • crates/engine/src/game/engine_phase_trigger_regression_tests.rs
  • crates/engine/src/game/triggers.rs
  • crates/engine/src/parser/oracle_trigger.rs
  • crates/engine/src/parser/oracle_trigger_tests.rs
  • crates/engine/src/types/ability.rs
  • crates/engine/tests/integration/curse_misc_triggers.rs
  • crates/engine/tests/integration/ichneumon_druid.rs
  • crates/engine/tests/integration/lady_loki_agent_of_chaos.rs
  • crates/engine/tests/integration/main.rs
  • crates/mtgish-import/src/convert/trigger.rs
  • crates/phase-ai/src/features/spellslinger_prowess.rs

Comment thread crates/engine/src/game/coverage.rs
Comment thread crates/engine/src/game/coverage.rs Outdated
@matthewevans

Copy link
Copy Markdown
Member

Maintainer fixup pushed at 45748cd3a6c0a1bf4200b81c281666dbcc25e4cf to resolve the two current CodeRabbit findings: Comparator formatting is now exhaustive, and ordinal output is correct for spell and draw constraints (including teen suffixes).

HOLD: this exact head is rebuilding CI, the exact-head parse-diff artifact, and CodeRabbit's independent review. No contributor action is requested; the next sweep will recheck those external gates before approval or enqueue.

@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.

Request changes — the new opponent-trigger class is not team-correct.

🔴 Blocker

[HIGH] Opponent-scoped spell triggers treat a teammate as an opponent in team games. Evidence: the new parser writes TypedFilter::controller(ControllerRef::Opponent) for the Ichneumon Druid form at crates/engine/src/parser/oracle_trigger.rs:16046-16048; match_spell_cast sends the caster through valid_player_matches at crates/engine/src/game/trigger_matchers.rs:1733; and its Typed(ControllerRef::Opponent) arm compares trigger_controller != player_id at crates/engine/src/game/trigger_matchers.rs:691-694. Verified CR 102.3 says, “a player’s teammates are the other players on their team, and the player’s opponents are all players not on their team.” Why it matters: in 2HG, the source controller's teammate casting their second instant satisfies this new an opponent casts … other than the first … trigger and incorrectly takes the 4 damage. The added runtime test is only two-player (crates/engine/tests/integration/ichneumon_druid.rs:16-87), so it cannot discriminate that failure. Suggested fix: make the shared player_matches_filter opponent arms use the established crate::game::players::is_opponent(state, trigger_controller, player_id) authority (already used by the sibling generic matcher in crates/engine/src/game/filter.rs:7018-7022), then add a 2HG regression proving a teammate's later instant does not trigger while an opposing team's later instant does.

Recommendation: request changes. Please make the shared opponent relation team-aware and add the discriminating 2HG runtime coverage; then the non-first trigger can be re-reviewed on its new head.

@matthewevans matthewevans removed their assignment Aug 11, 2026

@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/src/game/trigger_matchers.rs`:
- Around line 686-696: Annotate the team-opponent matching branches in the
trigger filter logic with the locally verified Comprehensive Rules citation,
using the format “CR <number>: <description>” and explicitly stating that
teammates are non-opponents and players::is_opponent supplies this relation.
Apply the annotation near TargetFilter::Opponent and the typed
ControllerRef::Opponent handling without changing their behavior.
🪄 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: 861e5dcb-2f9c-470a-89b7-825ecbc5f937

📥 Commits

Reviewing files that changed from the base of the PR and between 3cad663 and 02e6316.

📒 Files selected for processing (3)
  • crates/engine/src/game/coverage.rs
  • crates/engine/src/game/trigger_matchers.rs
  • crates/engine/tests/integration/ichneumon_druid.rs
🚧 Files skipped from review as they are similar to previous changes (1)
  • crates/engine/src/game/coverage.rs

Comment thread crates/engine/src/game/trigger_matchers.rs
@matthewevans matthewevans self-assigned this Aug 11, 2026
@matthewevans

Copy link
Copy Markdown
Member

Maintainer fixup pushed at 379eeed341de82e8fbb812482db035f453b3bd04: it documents the shared team-aware opponent relation with the locally verified CR 102.3 rule.

HOLD: this exact head is awaiting its new CI run, current-head parse-diff artifact, and CodeRabbit pass. No contributor action is requested; the next sweep will approve/enqueue only after those external checks settle cleanly.

@matthewevans

Copy link
Copy Markdown
Member

Correction to the prior hold: the exact current head is 379eeed3412aef8c379e666a01de069a026a2b4b (the earlier abbreviated expansion was a typo). The verified CR 102.3 annotation and the pending CI, parse-diff, and CodeRabbit conditions are otherwise unchanged.

@matthewevans

Copy link
Copy Markdown
Member

Rechecked current head 379eeed3412aef8c379e666a01de069a026a2b4b.

The exact-head parse-diff is now published, all CI and platform checks other than the two AI-gate jobs are green, and CodeRabbit's current-head pass reports no actionable comments. The prior CHANGES_REQUESTED review is attached to 45748cd3a6c0a1bf4200b81c281666dbcc25e4cf, not this head.

HOLD: only Paired-seed AI gate and Decision-cost perf gate remain in progress. No contributor action is requested. The next sweep will recheck those two external checks and approve/enqueue if they settle cleanly, or surface a current-head blocker if either fails.

@matthewevans matthewevans removed their assignment Aug 11, 2026
@keloide
keloide requested a review from matthewevans August 11, 2026 18:53
@matthewevans matthewevans self-assigned this Aug 11, 2026
@matthewevans

Copy link
Copy Markdown
Member

Rechecked and updated current head 8e0efb41b225b87cb66dbdc5d8de5f7b6ff17387 in an isolated worktree. I merged current origin/main cleanly and corrected one stale parser comment so it describes the shared team-aware ControllerRef::Opponent relation (CR 102.3), rather than the pre-team-model controller != player shorthand.

The prior head completed cleanly, but this new exact head is now rebuilding CI, the parse-diff artifact, the two AI gates, and CodeRabbit. HOLD: no approval or enqueue until those current-head external gates settle cleanly. No contributor action is requested; the next sweep will recheck this head.

@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.

Approved — current head 8e0efb41b225b87cb66dbdc5d8de5f7b6ff17387 is ready for the merge queue.

The comparator extends the existing per-caster NthSpellThisTurn fire-time authority, keeps legacy exact-ordinal serialization, and uses the shared team-aware opponent relation. The current-head parse artifact is published; required CI and AI gates are green. The 2HG scenario distinguishes teammate and opposing-player casts, and the current CodeRabbit pass has no actionable findings.

@matthewevans
matthewevans added this pull request to the merge queue Aug 11, 2026
@matthewevans matthewevans removed their assignment Aug 11, 2026
Merged via the queue into phase-rs:main with commit 6d4090d Aug 11, 2026
19 checks passed
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

Development

Successfully merging this pull request may close these issues.

2 participants