Si daily challenge
Use when Brett asks for "today's Spirit Island challenge" or says "/si-daily-challenge". Generates a structured daily drill — spirit × adversary × level × scenario × board × player-count × learning goal — seeded by date, varied per reroll, and informed by his playlog history in ~/repos/spirit-island/data/playlog.csv.From its SKILL.md
npx -y skills add bfowle/spirit-island --skill si-daily-challengeAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
3.7 KB, 938 tokens by cl100k_base, as published. Nobody here has run it
si-daily-challenge — Daily Spirit Island Drill
Generates a single daily challenge card for Brett. The selection logic lives in
generate.py (same directory) so the randomization, weighting, and playlog
reads are deterministic and testable instead of hand-rolled in prose.
How to invoke
Default daily run (date-seeded, stable within a single day):
python3 ~/.claude/skills/si-daily-challenge/generate.py
Pipe stdout into your response verbatim — it is already formatted as a markdown challenge card.
Re-rolls and overrides
Pass flags to vary the draw. The script already handles edge cases; prefer a flag over re-describing intent in prose.
| Brett says | Flag |
|---|---|
| "pick a different spirit" | --different-spirit |
| "pick a different adversary" | --different-adversary |
| "different goal" | --different-goal |
| "reroll" / "another one" | --reroll N (bump N each time) |
| "I want harder" | --harder |
| "easier" | --easier |
| "give me X spirit" | --spirit <slug> |
| "vs England" / "against <adv>" | --adversary <slug> |
| "at level N" | --level N |
| "solo" / "2-handed" / "3-handed" | `--players 1 |
| "no scenario" | --no-scenario |
| "with <scenario>" | --scenario <slug> |
Multiple flags compose. If Brett re-runs /si-daily-challenge within the same
day, bump --reroll (1, 2, 3…) so the draw actually changes — the default
seed is the date.
Selection logic (reference — actual behaviour lives in generate.py)
- Spirit — weighted random across all 37 spirits. Priority flag adds +2, full chapter adds +2 (both stack). Recent-5 from playlog are excluded.
- Adversary — from Brett's go-to pool (England / Sweden / Brandenburg- Prussia / France-Plantation). Least-recently-played wins, random tiebreak.
- Level — walks that adversary's
difficulty_levelsladder. Default = lowest rung; +1 after 2 consecutive wins at the current rung against that adversary; −1 after 2 consecutive losses. - Scenario — 20% chance; weighted toward diff_mod ≤ 1.
- Board — one random board per spirit. 70% base (A–D), 30% expansion (JE E–F, HoSI G–H).
- Player count — 55% true solo, 30% 2-handed, 10% 3-handed, 5% 2-player.
- Learning goal — date-rotated through 7 categories;
--different-goalskips one slot.
Output shape
The script prints:
## Today's Challenge — YYYY-MM-DD
**Spirit**: …
**Adversary**: … Level …
**Scenario**: …
**Board**: …
**Player count**: …
**Learning goal**: …
### Read first (15 min)
- Spirit chapter: …
- Fundamentals: …
- Adversary chapter: …
### Turn-1 commit
Before you start, write on paper: "By T3 I will have …"
### After the game
Run `si-post-game` to log; tomorrow's challenge shifts based on results.
A stub-chapter footnote appears when the chosen spirit has no full chapter, pointing Brett at the spirit index + Wiki.
JSON mode
For programmatic callers: generate.py --json emits the raw selection as
JSON (spirit, adversary, level, scenario, boards, goal, player_count, seed).
Anti-alpha note
Never prescribe specific plays. The card names chapters and goals; the chapter has the turn-by-turn detail. Advisory, not prescriptive.
After output
Ask in one line: "Ready for this, or want me to swap the spirit / adversary / goal / level?" — then stop. Don't narrate further.
What ships with it: 1 file
15.6 KB alongside SKILL.md, 1 of them executable
- generate.pyruns15.6 KB