si-rules-check — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited si-rules-check (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Real bug caught by Brett: I wrote Shadows's Opening A T1 as "G2 → play Concealing Shadows (0E) + Mantle of Dread (1E), 1E spent, Innate L1 fires." All three claims are false:
presence_energy_track[0] = "energy0" per the Wiki.presence_cardplay_track[0] = "card1".This skill prevents that class of error. Invoke it before writing any mechanics-dependent section.
si-at-the-table.Do not use this skill for generic strategy commentary (archetype, synergies, adversary matchup prose) — only for mechanical claims.
The skill takes one argument: the spirit slug (matching the filename in data/references/wiki/{slug}.json).
Example: si-rules-check shadows-flicker-like-flame.
A structured markdown brief the writer can reference:
# Shadows Flicker Like Flame — Rules Check
## Starting state (T1, before any growth)
- Energy: 0 (from presence_energy_track[0] = "energy0")
- Card Plays: 1 (from presence_cardplay_track[0] = "card1")
- Hand: 4 Uniques (Concealing Shadows, Crops Wither and Fade, Favors Called Due, Mantle of Dread)
- Elements this turn: 0 of everything (cleared each turn)
## Growth options (pick ONE per turn; "growthtype=one")
- G1 (first=reclaim, second=gain1p): Reclaim all played+discarded. Gain 1 Minor. No presence placed.
→ T1 state after G1: 0E / 1CP (unchanged).
- G2 (first=gain1p, second=addpresence1): Gain 1 Minor. Place 1 Presence Range 1 from ONE track.
→ Place from CP track: reveal card2 → 0E / 2CP (2 cards, 0 energy).
→ Place from Energy track: reveal energy1 → 1E / 1CP (1 card, 1 energy).
- G3 (first=addpresence3, second=energy3): Place 1 Presence Range 3 from ONE track. +3 Energy this turn.
→ Place from CP track: reveal card2 → 3E / 2CP.
→ Place from Energy track: reveal energy1 → 1E+3 = 4E / 1CP.
## Unique cards (cost + speed + elements)
- Concealing Shadows: 0E Fast / Moon, Air
- Crops Wither and Fade: 1E Slow / Moon, Fire, Plant
- Favors Called Due: 1E Slow / Moon, Air, Animal
- Mantle of Dread: 1E Slow / Moon, Fire, Air
## Legal T1 plays (card combinations)
Given starting 0E/1CP + growth choice, enumerate:
**G1 (no track reveal)** → 0E / 1CP:
- 0 cards played, OR
- 1 card at cost ≤ 0: **Concealing Shadows alone** (only legal option).
**G2 via CP track** → 0E / 2CP:
- 0–2 cards played; sum of costs ≤ 0.
- Legal combos: {}, {Concealing}, {Concealing + [any 0-cost Minor drafted]}.
- **Illegal**: Concealing + Mantle (Mantle costs 1E, we have 0E).
**G2 via Energy track** → 1E / 1CP:
- 0–1 cards played; sum of costs ≤ 1.
- Legal combos: {}, {Concealing (0E)}, {Crops Wither (1E)}, {Favors Called Due (1E)}, {Mantle of Dread (1E)}.
**G3 via CP track** → 3E / 2CP:
- 0–2 cards played; sum of costs ≤ 3.
- Legal combos include: {Concealing + Mantle (0E+1E=1E)}, {Crops Wither + Mantle (2E)}, {Favors + Mantle (2E)}, etc.
**G3 via Energy track** → 4E / 1CP:
- 0–1 cards played; sum of costs ≤ 4.
- Legal: any single card.
## Element threshold matching (for the innate)
Innate: Darkness Swallows the Unwary (Fast, Range 1, optional Sacred Site target)
- L1: 2 Moon + 1 Fire → Gather 1 Explorer.
- L2: 3 Moon + 2 Fire → Destroy up to 2 Explorer. 1 Fear per destroyed.
- L3: 4 Moon + 3 Fire + 2 Air → 3 Damage. 1 Fear per Invader destroyed.
Cards' element contributions (from Wiki):
- Concealing Shadows: 1 Moon + 1 Air
- Crops Wither: 1 Moon + 1 Fire + 1 Plant
- Favors Called Due: 1 Moon + 1 Air + 1 Animal
- Mantle of Dread: 1 Moon + 1 Fire + 1 Air
For T1 innate firing (need 2M+1F), minimum requirement:
- 2 cards providing 2 Moon + 1 Fire: {Concealing + Mantle}, {Concealing + Crops Wither}, {Crops Wither + any Moon card}, etc.
- **No single card** provides 2M+1F → innate cannot fire T1 on a single-card turn.
- Therefore: **innate L1 requires at least G3-via-CP-track + 2 qualifying cards, OR deferring L1 firing to T2 via reclaim cycle.**
## What to cite in prose
When writing T1:
- Cite actual E/CP after the chosen growth.
- Name exact cards played with costs summed.
- Only claim innate firing if the summed elements cross the threshold.
- If you can't hit a threshold legally, say so: "Innate L1 does not fire T1; fires T2 after Reclaim."
## Audit hook
If a previously-authored chapter has a T1 block:
1. Re-run this skill for the spirit.
2. Check whether the chapter's claimed E/CP and play combinations are in the "Legal T1 plays" list.
3. If not, flag with `[VERIFY: illegal per rules-check]` and revise.
## Data sources
- `data/references/wiki/{slug}.json` — parsed spirit data (start tracks, growth options, unique cards).
- `scripts/wiki-fetch.py` — re-fetch if data is stale.
- Future: `tools/si-live/common/` Rust crate — canonical rule engine (Phase A+).
## Rules this skill enforces
1. **Starting state = first-uncovered track slots**. Not an assumption.
2. **One track reveal per presence placement** (not both tracks simultaneously).
3. **Growth options are atomic**: `first` + `second` + (optional) `third` effects all resolve together when you pick that growth.
4. **Card plays this turn ≤ current CP**.
5. **Sum of card costs ≤ current Energy**.
6. **Fast cards resolve in Fast phase; Slow in Slow phase.**
7. **Elements accumulate from cards played that turn only; reset at turn end.**
8. **Innate firing requires threshold elements *available at the innate's phase of resolution*; free of energy cost.** See "Innate element timing" below — Fast innates cannot see Slow-card elements.
9. **Special-rule usage (e.g., Shadows of the Dahan's 1E range extension) spends energy from the spirit's pool.**
10. **Invader phase contents by turn** determine which card effects are material vs. dormant that turn. See "Invader phase by turn" below.
11. **Dormant-effect rule**: card clauses gated on Ravage / Damage-from-Invaders are null effects on turns where the trigger does not occur in the target land. Don't cite them as opener value on those turns.
## Invader phase by turn (base-game standard invader deck)
The standard 8-round game has the invader deck advance one column per turn:
| Turn | Explore | Build | Ravage | Notes |
|------|---------|-------|--------|------------------------------------------------------------------|
| 1 | ✓ | — | — | Invader Card 1 = Stage I Explore. No Build, no Ravage. |
| 2 | ✓ | ✓ | — | Card 1 advances to Build column; Card 2 enters Explore. No Ravage. |
| 3 | ✓ | ✓ | ✓ | Card 1 → Ravage (first Ravage of the game); Card 2 → Build; Card 3 → Explore. |
| 4+ | ✓ | ✓ | ✓ | Full cycle continues; each card cycles through Ravage → discard. |
**Implications for opener prose**:
- T1 cards tagged "prevents Ravage", "Dahan take 0 Damage from Ravaging", "Invaders can't Ravage here", "Defend N" → null this turn. Only their Fear / elements / non-Ravage effects are material.
- T2 cards with "prevents Ravage" etc. → still null (no Ravage until T3).
- T3 is the earliest turn these effects are material, and only in lands Ravaged that turn.
**Adversary caveats**: adversary escalation cards can shift this. Sweden front-loads a Build; some Habsburg levels add early Builds. Check the adversary JSON (`data/adversaries.json` / per-level escalation text) before claiming standard base-deck timing.
## Innate element timing
When an Innate Power resolves, it checks its thresholds against elements generated **so far this turn** — i.e., elements produced by cards whose effects have already resolved.
| Innate speed | Can see elements from | Cannot see |
|--------------|----------------------|------------|
| **Fast** | Fast cards played this turn before the innate resolves | Slow cards (resolve later in the turn) |
| **Slow** | Fast cards + Slow cards played this turn before the innate resolves | — |
| **Fast or Slow** (player's choice) | Depends on which phase the player resolves it in | — |
**Corollary**: a Slow card cannot "feed" a Fast innate. The Slow card's elements arrive after the Fast innate's resolution window has closed.
**Worked example — Shadows T1 Opening A**:
- Fast phase: Concealing Shadows plays → 1 Moon + 1 Air in pool.
- Darkness Swallows the Unwary (Fast innate) checks L1 threshold (2 Moon + 1 Fire): pool has 1M+1A → **does NOT fire**.
- Slow phase: Mantle of Dread plays → adds 1 Moon + 1 Fire + 1 Air (pool now 2M+1F+2A).
- Darkness Swallows has already resolved. It does not re-check. **L1 does not fire this turn**.
Authoring consequence: claims like "L1 fires T1 via Concealing + Mantle elements" are **invalid** — the Fast innate can't see Mantle's Slow-phase contribution.
**Elements do NOT persist across turns.** At Time Passes, the element pool resets to empty. T2 starts with 0 elements regardless of T1 plays.
## Dormant-effect detection
Card effects that depend on a trigger outside the current turn are **dormant** on turns where the trigger doesn't fire. When citing such a card in opener prose, you must explicitly say so.
Common dormant clauses + their trigger:
| Clause | Trigger (when material) |
|------------------------------------------------------------|------------------------------------------------------------------------|
| "Dahan take 0/no Damage from Ravaging this turn" | A Ravage happens in target land THIS turn (T3+ in base) |
| "Defend N" | The target land takes Damage from a Ravage THIS turn |
| "Invaders can't Ravage here this turn" | A Ravage would otherwise happen in target land THIS turn |
| "Dahan here deal 2 Damage during Ravages this turn" | A Ravage happens in target land THIS turn |
| "Invaders in this land skip their next Build" | A Build happens in target land THIS turn (T2+ in base; target-specific) |
| "Push N Explorers/Towns that were just brought by Explore" | An Explore placed units in target land THIS turn |
**Rule for opener writers**: on any turn where the trigger doesn't fire, write "dormant this turn; first becomes material on T<N>" rather than citing the effect as the card's T<current> value. The card's Fear / elements / other clauses remain material.
## Phase-timing summary block (included in skill output)
When invoked on a spirit, the skill returns a summary like:
Authors read this block **before** writing T1/T2/T3 prose and cite specific lines when asserting "L1 fires T<N>" or "dormant this turn" in their chapter text.
## Related
- `memory/feedback_verify_mechanics_before_writing.md` — the rule this skill enforces.
- `scripts/wiki-fetch.py` — data source.
- `skills/si-at-the-table/SKILL.md` — consumer of this skill's output for live-game advice.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.