Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion .claude/skills/pr-review-loop/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,11 @@ At sweep start, read `.agents/pr-review/campaign-hotspots.toml` if present (lead
**Public-disposition completion gate:** local events and a zero `review` count are necessary but insufficient. For every PR inspected or reviewed this sweep, live-check GitHub before declaring it processed. A substantive blocker must have a current-head formal `CHANGES_REQUESTED` review, unless an existing current-head requested-changes review already states the same unresolved finding. A non-substantive hold must have a current-head maintainer comment explaining the exact external condition and next step. An approval/enqueue must be live-verified as `APPROVED` plus the expected queue/auto-merge state. Do not let a local `blocked`/`held` event substitute for a visible maintainer response.
3. Every packet (and `recommend` output) carries an advisory `contributor` block — standing, scrutiny, `scrutiny_reasons`, `recurrence`, `first_contribution` — derived from the local event log plus `contributor_standing` overrides; it is `null` only when the PR has no author login. Scale review depth by it: `first_contribution` → full evidence bar, and point the author at the `docs/AI-CONTRIBUTOR.md` gates in the first review comment; `elevated` → dig specifically into the recurring signals named in `scrutiny_reasons`; `maintainer_attention` → include the contributor in the sweep report for the maintainer. `light_touch_eligible` permits a lighter pass only while scrutiny is `normal`.

**Model tier is a hard gate; the agentic harness is a scrutiny signal.** `docs/AI-CONTRIBUTOR.md` §0.1.1 accepts **Frontier tier only**. A PR whose canonical `Model:` line names a non-Frontier model (`claude-sonnet-*`, `claude-haiku-*`, `composer-*`, `gpt-5-4` or below, `codex-5-4` or below), or whose commits show one, is closed as out-of-policy without an implementation review. Separately, a `Co-authored-by: Cursor <cursoragent@cursor.com>` trailer is **not** grounds to close on its own — it raises scrutiny to the full evidence bar and forfeits light-touch, because the observed failure mode is CI-as-correction-loop rather than the harness itself. Judge the PR on its merits; good work under Cursor is still good work.
**Model declarations route review depth; they do not authorize an automatic close.** Frontier remains the requested contribution floor in `docs/AI-CONTRIBUTOR.md`, but a non-Frontier declaration or trailer is an elevated-scrutiny signal, never a `decline` by itself. Do not close a PR merely because its stated model falls below that floor.

For a non-Frontier PR, require the full evidence bar: accurate model declaration, concrete `/engine-implementer` (or a specific `not-applicable`) method record, current-head Gate A and final `review-impl` evidence when applicable, relevant anchors, required verification, and a manual implementation review. A PR with that evidence must be reviewed on its merits. If the evidence is incomplete, request the missing proof or hold it; do not replace the review with a model-policy closure. An explicit maintainer message inviting continued review or asking the contributor to proceed also routes the current head to review, even if older prose describes a model-tier close.

A `Co-authored-by: Cursor <cursoragent@cursor.com>` trailer remains a scrutiny signal, not a closure reason. The behavioural CI-farming pattern — pushing unverified diagnostic commits or deleting passing assertions to obtain green CI — is review evidence on the current diff, not account-level or batch-close evidence. This maintainer-review rule intentionally overrides older automatic-close wording in `docs/AI-CONTRIBUTOR.md` for this workflow.

Check both surfaces, and read what actually matched before acting — a bare `rg cursor` hits `WordCursor` and other identifiers:

Expand Down Expand Up @@ -253,6 +257,8 @@ When the user explicitly authorizes maintainer actions, the loop may pass clean

When delegating labeling, require the handler to classify by the actual diff: ordinary additive engine, parser, or tooling capabilities are **enhancement** by default, even when they touch several files. Reserve **feature** for a genuinely broad mechanic or product change spanning distinct subsystems (for example, a combo workflow that jointly changes engine rules, priority handling, UI, and AI). Never infer `feature` from a `feat:` title, file count, or author identity.

When delegating a PR with a non-Frontier declaration, state explicitly that the declaration is an elevated-scrutiny signal, **not** a decline authorization. The handler must review the current head against the evidence bar above and may only close for a diff-based or independently enforced reason.

Do not perform GitHub mutations from this skill except ordinary review/comment actions explicitly required by the current sweep and policy-configured deferral labels. Approval, queue, update-branch, dequeue, and merge execution still belongs to `pr-contribution-handler`.

## Drift Rule
Expand Down
8 changes: 6 additions & 2 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,16 @@

## LLM

Model: <actual Frontier model identifier | not-applicable (no LLM)>
Model: <actual Frontier model identifier or reported name | not-applicable (no LLM)>
Tier: <Frontier | not-applicable (no LLM)>
Thinking: <high | max | not-applicable (no LLM)>

<!-- Keep Model and Tier as exact, standalone canonical lines. AI-assisted PRs
must report their actual Frontier model, Tier: Frontier, and thinking level. -->
must report their actual Frontier model, Tier: Frontier, and thinking level.
If your harness does not expose an exact model identifier, report the name it
does give you — e.g. "Model: gpt-5.6-sol (via GitHub Copilot; canonical id not
exposed)" — rather than guessing an identifier. See AI-CONTRIBUTOR.md
§0.1.1. -->

## Implementation method (required)

Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -118,13 +118,13 @@ jobs:
./scripts/check-test-card-data-load.sh "$BASE"

rust-test:
name: Rust tests (shard ${{ matrix.shard }}/2)
name: Rust tests (shard ${{ matrix.shard }}/4)
runs-on: ubuntu-latest
timeout-minutes: 30
timeout-minutes: 20
strategy:
fail-fast: false
matrix:
shard: [1, 2]
shard: [1, 2, 3, 4]
steps:
- uses: actions/checkout@v4

Expand Down Expand Up @@ -174,7 +174,7 @@ jobs:
# caught before it lands on the branch that feeds staging/preview.
env:
PROPTEST_CASES: ${{ github.event_name == 'pull_request' && '32' || '256' }}
run: cargo nextest run --profile ci --partition count:${{ matrix.shard }}/2 --workspace --exclude phase-tauri --exclude mtgish-import --features engine/proptest --status-level fail --final-status-level fail
run: cargo nextest run --profile ci --partition count:${{ matrix.shard }}/4 --workspace --exclude phase-tauri --exclude mtgish-import --features engine/proptest --status-level fail --final-status-level fail

card-data-gate:
name: Card data (generate, validate, coverage)
Expand Down
26 changes: 13 additions & 13 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ members = ["crates/*"]
exclude = ["client/src-tauri", "lobby-worker/broker-wasm"]

[workspace.package]
version = "0.49.0"
version = "0.50.0"
license = "MIT OR Apache-2.0"

[workspace.dependencies]
Expand Down
2 changes: 1 addition & 1 deletion client/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "phase-rs-client",
"private": true,
"version": "0.49.0",
"version": "0.50.0",
"type": "module",
"scripts": {
"dev": "vite",
Expand Down
2 changes: 1 addition & 1 deletion client/public/changelog-meta.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
"latestId": 188
"latestId": 189
}
14 changes: 14 additions & 0 deletions client/public/changelog.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,19 @@
{
"entries": [
{
"id": 189,
"date": "2026-08-09",
"title": "Sealed packs and Marvel heroes",
"tags": [
"new-cards",
"card-fixes",
"gameplay",
"interface",
"ai"
],
"body": "✨ New Cards & Mechanics\n• Sealed is now a peer of Quick Draft and Cube Draft: open six packs one at a time, see each pack’s pulls, then review a pool grouped by card type before building\n• Captain Marvel, Apex Avenger; Conduit of Worlds; Galactus; and Avenge now have their core card interactions supported\n\n🛠️ Cards That Now Work Right\n• Brainspoil, Hawkeye, Dwarven Armorer, Archnemesis, Batroc the Leaper, Doom’s Time Platform, Dragon Man, Black Bolt, Galvanic Iteration, and Endless Ranks of HYDRA now follow more of their printed targets, costs, counters, or trigger conditions\n• Delayed-trigger payloads retain their following instructions in the correct order, fixing affected multi-clause cards such as Codie and Power Pack\n• Mana abilities that move cards to or from a library are no longer treated as mana abilities\n\n⚔️ Combat & Gameplay\n• Conditional forced-attack requirements such as Galactus’s now parse and enforce the correct defender choices\n• Cleanup discard triggers, player choices, and restored game state retain their correct game context more reliably\n\n🖥️ Interface\n• The game timeline is easier to act on, and remote scry outcomes no longer get lost when several finish together\n\n🤖 AI\n• AI keeps its choices within the actions the engine issued, handles target-dependent optional costs more safely, and recovers gracefully if an AI worker times out",
"discordUrl": "https://discord.com/channels/1485498006781427802/1486432040332296424/1536203698454274138"
},
{
"id": 188,
"date": "2026-08-08",
Expand Down
Loading
Loading