skills/wc-transfer-planner/SKILL.md
Plans between-round FIFA World Cup Fantasy transfers — budgets the round's free transfer(s), forces out players whose nation has been eliminated, chases fixture-swing drops, upgrades on value, and decides when a rebuild is large enough to fire the Wildcard instead of spending free transfers one at a time. Ranks candidate in/out pairs by EV gain over each player's remaining survival horizon (delta xEV weighted by progression_carry) MINUS transfer cost (a free transfer is cheap, a points hit is real, churning the squad for marginal swings is a critic flag), and tags forced/fixture/upgrade priority. Emits a `transfer-plan` signal. Use when called by wc-squad-architect (whose transfer work this skill is the engine for) and by the strategists in the populate stage when their candidate is transfer-adjacent rather than a full rebuild.
npx skillsauth add lyndonkl/claude wc-transfer-plannerInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
The engine behind wc-squad-architect's transfer work. Given the current 15 and the round's signals, it answers four questions in priority order: who is dead weight and must go (eliminated nations), where the fixtures are swinging (chase the drop), where value is left on the table (upgrade), and is the rebuild big enough that the Wildcard beats spending free transfers. It does not pick the squad and it does not present a board — it ranks in/out pairs, budgets the free transfer(s), prices any hit, and recommends (or rejects) the Wildcard, then emits a transfer-plan signal for wc-squad-architect and the Director to act on.
The discipline that defines this skill: a transfer is only worth making if its EV gain over the horizon the player will actually survive exceeds its cost. Two failure modes sit on either side of that line — under-trading (leaving an eliminated player in the squad to rot) and over-trading (transfer thrash: churning the squad chasing every one-band fixture wobble, burning free transfers and paying hits for swings the field hasn't even priced). This skill exists to find the moves that clear the bar and stop at the ones that don't.
This is between-round, transfer-adjacent search. A structural rebuild — most of the squad re-pointed at the surviving nations at the group→knockout transition — is not a transfer plan; it is a Wildcard, and the whole candidate space reopens to the full market (chip-catalog.md §1). The rule for when the rebuild crosses that threshold is below.
wc-squad-architect is this skill's primary caller: it runs the transfer plan whenever the between-round window is open, then folds the result into its transfer-plan signal and the squad it carries to the board.wc-strategist genotype calls it when its candidate is an evolution from the current squad (a few moves) rather than a from-scratch build — A4 (Fixture Exploiter) especially, whose whole thesis is rotating toward the steepest fixture drops via transfers. The skill returns a neutral EV-ranked pair list; the archetype tilt (how aggressively to chase variance, whether to pay a hit) happens in the caller.wc-squad-architect (build-squad), not evolved one transfer at a time. This skill's job on such a round is the recommendation to fire the Wildcard, after which it hands off.- [ ] 1. Read state: FT count this round, whether extra transfers cost points, budget, nation cap, in-the-bank — from tournament-state.md. Read each owned player's elimination-risk horizon.
- [ ] 2. Read signals (never re-derive): the round `fixture` signal (swing_calendar, p_advance, mismatch_list, dead_rubber_flags) and the `player-ev` signals for owned players and transfer targets. Read `ownership` if differentiating.
- [ ] 3. FORCED MOVES — list every owned player whose nation is eliminated (p_advance = 0). These are dead weight: zero future xEV. Mark each a forced OUT for the next window.
- [ ] 4. SWING MOVES — from swing_calendar, list owned players hitting an easy→hard flip (sell) and market targets hitting a hard→easy flip (buy), respecting each one's elimination horizon.
- [ ] 5. UPGRADE MOVES — find in/out pairs where a target's horizon-weighted xEV beats an owned player's at affordable cost (value left on the table).
- [ ] 6. SCORE every candidate in→out pair: net_gain = ΔxEV_horizon − transfer_cost. Rank by net_gain. Tag each pair forced | fixture | upgrade.
- [ ] 7. BUDGET the free transfer(s): assign FTs to the highest-net-gain pairs first (forced moves take precedence even at equal gain). Price any pair beyond the FT count as a hit; keep it only if net_gain still clears the hit.
- [ ] 8. WILDCARD CHECK — count the moves that genuinely clear the bar. If the rebuild scope crosses the Wildcard threshold (rule below), recommend the Wildcard instead of free transfers + hits, and hand off to build-squad.
- [ ] 9. Repair: confirm the post-transfer 15 stays feasible (budget, nation cap, formation) per building-blocks.md repair order. Flag if a move breaks a building block.
- [ ] 10. Emit the `transfer-plan` signal (ordered pairs, FT usage, any hit + its justification, Wildcard recommendation) via wc-signal-emitter. Return its path.
From tournament-state.md:
free_transfers_this_round — how many moves are free. Confirm the count from the live game (league-config.md §Transfers leaves it to be confirmed) and whether free transfers carry over when unused. Before the tournament: transfers are unlimited (build freely — no plan needed). Between rounds: the granted free count is the cheap budget.free_transfers_this_round moves and rank-and-cut to that many.signal-framework.md).league-config.md); in_the_bank = budget − squad_value. Prices are fixed all tournament (no rises/falls), so there is no price-rise meta-game to race — value is captured at purchase, and a transfer's only cost is the FT/hit, never a price change.fixture signal's p_advance ladder, mirrored in tournament-state.md. This is the clock on every asset and the denominator of every EV-gain calculation.A transfer replaces an owned player out with a target in. Its worth is the extra expected points it buys over the rounds the new player will actually survive to play, minus what the move costs:
ΔxEV_horizon(in, out) = Σ_{r = next .. H} [ xEV(in, r) · P(in's nation alive at r)
− xEV(out, r) · P(out's nation alive at r) ] · discount^r
net_gain(in, out) = ΔxEV_horizon(in, out) − transfer_cost
xEV(player, r) is read from the player's player-ev signal for the immediate round and projected forward for later rounds (the same per-round distribution wc-fitness-eval sums). Never re-derive it — read the signal; if a target has no player-ev signal yet, wc-scout → wc-player-ev must run first.P(nation alive at r) is the p_advance survival ladder from the fixture signal (p_reach(R) = Π p_win_tie). This is the progression_carry weighting from fitness-function.md applied to both sides of the trade: the gain from a fixture-swing pickup decays if that player's nation is itself elimination-exposed, and selling a player on a likely semi-finalist forfeits several future rounds, not one. A single-round fixture edge that buys a player whose nation may be gone next week is mostly illusory — this term is what catches that.discount^r — mild horizon discount (uncertainty compounds; near rounds are firmer than far ones), matching the fitness function's progression_carry discount. Weight the near round heaviest.H is the horizon: in the group stage, the remaining matchdays; in the knockouts, the bracket path weighted by p_reach. Do not project EV gain past the round either player's nation is realistically eliminated — that is phantom value.transfer_cost:
transfer_cost = hit_points (e.g. 4). The move must clear it: ΔxEV_horizon > hit_points. A −4 hit for a +2-over-the-horizon upgrade is −EV and a critic flag.free_transfers_this_round and simply take the top-k net-gain pairs.Every candidate pair is tagged with exactly one class. Classes set precedence when free transfers are scarce: a forced move outranks a fixture move outranks an upgrade at comparable net gain, because the forced move's out player has collapsed to zero future value.
(1) FORCED — eliminated-player replacement (highest priority).
A player whose nation is eliminated (p_advance = 0 in the fixture signal) is dead weight: his xEV(out, r) is zero for every future round — he cannot score, cannot be captained, cannot fill an XI slot. Leaving him in the squad is strictly dominated; he must be transferred out next window. Because xEV(out) over the horizon is ~0, any viable replacement has a large positive ΔxEV_horizon, so forced moves almost always clear the bar even on a hit — but spend a free transfer on them first, because they are the cheapest large gains available. (Distinguish eliminated — a hard forced move — from elimination-risk — a nation that could go out soon, which is a fixture/horizon consideration, not yet forced. Also distinguish the dead-rubber flag: a clinched team resting starters in a final group game is a one-round minutes problem, not an elimination — discount that fixture's xEV, but do not force the player out.)
(2) FIXTURE-SWING — chase the difficulty drop (second priority).
From the fixture signal's swing_calendar (built by wc-fixture-progression):
fd_att 4–5 fixture, or a defender into a fd_def 4–5 (shootout) game — transfer out before that round, into a player with a kinder draw. But check the elimination horizon first: do not pay to dodge a future hard fixture in a knockout nation whose own elimination-risk round arrives before the swing — the move is moot (coordinate with tournament-state.md; the swing calendar already carries an elimination_caveat).fd_att 1–2 or fd_def 1–2 run — and a mismatch_list favourite (powerhouse-vs-minnow) is the sharpest case: its attackers become captain candidates and its defenders clean-sheet locks. The field lags fixture turns by ~a round (game-theory-meta.md §4), so move a round early, before ownership rises, to bank value the field hasn't priced — the swing's plan_ahead_lead says how early. This is the A4 Fixture Exploiter move; the EV gain is the ΔxEV_horizon from the better fixture.wc-fixture-progression swing threshold) and a positive horizon-weighted ΔxEV after cost before chasing it.(3) UPGRADE ON VALUE — bank the EV left on the table (third priority).
With forced and fixture moves placed, look for pairs where a target's horizon-weighted xEV simply beats an owned player's at an affordable price — funded by in_the_bank plus the price of the player sold. These are the value plays: a higher-floor pen-taker for a non-taker, a nailed starter for a rotation risk (p60 gap), a deep-run nation's asset for a coin-flip nation's (progression_carry gap). They are lowest priority because the out player still has positive value — the gain is the margin, which must beat the cost. An upgrade is only worth a hit if ΔxEV_horizon over the remaining rounds comfortably exceeds the hit (a multi-round upgrade can; a one-round +1 cannot).
net_gain, with the priority class as the tie-breaker (forced > fixture > upgrade at comparable gain).ΔxEV_horizon > hit_points with margin. A forced move (eliminated player) is the one case that routinely justifies a hit, because the out side is zero. A speculative upgrade rarely is. Every hit on the plan carries an explicit justification (the horizon-weighted gain that beats it); an unjustified hit is a critic kill.The Wildcard gives unlimited transfers for one round (chip-catalog.md §1) — a free full rebuild. Spending free transfers one at a time (and paying hits) to patch a squad that needs many changes is strictly worse than one Wildcard that re-points everything at once. So the decision is scope: how many moves does the squad genuinely need?
Recommend the Wildcard when the rebuild scope crosses the threshold:
N_needed = the number of pairs that genuinely clear the bar this window and over the next 1–2: forced moves (eliminated players) + high-confidence fixture-swing moves + value upgrades whose horizon gain beats their cost.chip-catalog.md §1, CLAUDE.md cadence): budget jumps to $105m, the nation cap loosens, and roughly half the nations are eliminated at once — so a large slice of the squad is simultaneously dead weight and the affordable market just changed. This almost always wants the Wildcard. Do not drip eliminated players out across the first knockout rounds at one free transfer (and a string of hits) each — re-point the whole squad in one move.chip-catalog.md §1).N_needed ≥ ~4–5 moves (and especially if executing them with free transfers would require paying hits across this window and next), the Wildcard's value — Σ net_gain of all needed moves with zero transfer cost — beats free-transfers-plus-hits. Compare explicitly:
value(Wildcard) = Σ ΔxEV_horizon over ALL needed moves (transfer_cost = 0, unlimited)
value(free transfers) = Σ ΔxEV_horizon over the moves you can afford this window
− Σ hits paid to exceed the free count
− (deferred gain lost on moves you must postpone)
→ recommend Wildcard when value(Wildcard) − value(free transfers) > 0
AND no later round has a clearly higher-leverage Wildcard use queued (don't spend the
one Wildcard on a 4-move group patch if the KO transition rebuild is imminent).
chip-catalog.md golden rule): if it is still in hand late and a multi-move need appears, that is the moment.chip-catalog.md §1) — the strategist population must be re-seeded from scratch via wc-squad-architect build-squad, not evolved from the current 15. This skill's output in that case is the recommendation + the rationale (N_needed, the value comparison), and it defers the actual rebuild to build-squad. Coordinate the timing with wc-chip-strategist (wc-chip-timing) — the chip ledger owns the deployment plan; this skill proposes the fire, the chip-strategist confirms the leverage, the manager fires.After applying the chosen pairs, the new 15 must still satisfy the constraint layer (BB6 in building-blocks.md). Run the repair operator in its priority order — formation, then nation cap, then budget, then matchday spread — preserving value-bearing blocks:
transfer-plan signalEmit via wc-signal-emitter to signals/<round>-transfer-plan.md. Per the registry (signal-framework.md), the transfer-plan type is carried by wc-squad-architect; when this skill runs standalone it emits the same shape with emitted_by: wc-transfer-planner.
---
type: transfer-plan
round: <round id, e.g. 2026-grp-md3>
date: <YYYY-MM-DD>
emitted_by: wc-squad-architect | wc-transfer-planner
confidence: <0.00-1.00> # ≤0.35 if FT count / hit-regime / a target's minutes are web-unconfirmed
source_urls:
- <fixture signal path> # swing_calendar, p_advance, mismatch_list
- <player-ev signal paths for in/out players>
- <url confirming free-transfer count and hit rule> # or "manager-provided"
provisional_cost_rule: <true|false> # true until the live game confirms hit vs hard-cap regime
---
state:
phase: <group-mdN | r32 | r16 | qf | sf | final>
free_transfers_this_round: <n> # confirmed from game; note carry-over if applicable
extra_transfer_rule: hit | hard_cap | unconfirmed
hit_points: <n | n/a> # e.g. 4 in the hit regime
budget: <100.0 | 105.0>
in_the_bank: <m>
nation_cap: <current-phase cap>
forced_moves: # eliminated nations — dead weight, OUT next window
- out: { player: <name>, nation: <nation>, reason: "nation eliminated (p_advance 0)", future_xEV: 0 }
in: { player: <name>, nation: <nation>, price: <m>, xEV_next: <n> }
delta_xEV_horizon: <n>
class: forced
funded_by: free_transfer | hit
ranked_pairs: # all candidate in/out pairs, best net_gain first
- rank: <n>
out: { player: <name>, nation: <nation>, price: <m>, horizon_xEV: <n>, elim_risk_round: <round|none> }
in: { player: <name>, nation: <nation>, price: <m>, horizon_xEV: <n>, elim_risk_round: <round|none> }
delta_xEV_horizon: <n> # Σ (in − out) · P(alive) · discount over H
transfer_cost: <0 | hit_points>
net_gain: <delta_xEV_horizon − transfer_cost>
class: forced | fixture | upgrade
swing_ref: <swing_calendar round + direction, if class=fixture>
rationale: <one football-literate line — fixture drop / minutes upgrade / pen-taker / deep-run carry>
plan: # the recommended moves this window
transfers:
- { out: <name>, in: <name>, funded_by: free_transfer, net_gain: <n> }
free_transfers_used: <n> / <available>
hits_taken: <n>
hit_justification: <the horizon gain that beats each hit, or "none — no hit taken">
no_move_recommended: <true|false> # true when the best net_gain is marginal and no forced move pends — bank the FT
feasible_after: { formation: <y/n>, nation_cap: <y/n>, budget: <y/n> }
block_warnings: [ <e.g. "this pair breaks the Norway BB2 spine — sell as a unit or hold"> ]
wildcard:
recommend: <true|false>
N_needed: <n> # moves that genuinely clear the bar this window + next
trigger: group_to_KO_transition | dead_fixture_cluster | none
value_wildcard: <Σ ΔxEV_horizon over all needed moves, cost 0>
value_free_transfers: <Σ affordable ΔxEV − hits − deferred gain>
rationale: <why the rebuild does/doesn't cross the threshold>
handoff: <"re-seed population from full market via wc-squad-architect build-squad" if recommend=true>
defer_to: wc-chip-strategist # chip ledger owns deployment; manager fires
---
Every numeric field declares its meaning so the emitter can range-check it (signal-framework.md). The Director routes this to wc-squad-architect and onto the board; the manager decides — this skill never auto-commits a transfer.
ΔxEV after cost. When the best available move is marginal and no forced move pends, the right plan is zero transfers — bank it.ΔxEV_horizon > hit_points with margin — measured over the rounds the new player will actually survive to play, weighted by progression_carry. Every hit on the plan carries the explicit gain that beats it; an unjustified hit is a critic kill. A one-round +1-point upgrade never justifies a −4.N_needed ≥ ~4–5 (and especially when free transfers would force paying hits this window and next), the Wildcard's zero-cost full rebuild beats drip-feeding transfers — the group→KO transition is the canonical case (budget $105m, cap loosens, half the nations out). Conversely, never burn the Wildcard on a one-or-two-move tweak or to chase a single hot player; and never carry it unused into the semi-finals. On a Wildcard recommendation, hand off to wc-squad-architect build-squad (full-market re-seed) and defer the fire to wc-chip-strategist / the manager.ΔxEV_horizon uses each side's p_advance ladder so a fixture edge bought into an elimination-exposed nation, or a sale that forfeits a deep run, is priced correctly. Never rank a transfer on next-round xEV alone — that is how the field over-trades.xEV comes from player-ev signals; swing_calendar, p_advance, mismatch_list, dead_rubber_flags come from the fixture signal; ownership from the ownership signal. If a target has no player-ev signal, wc-scout → wc-player-ev runs first — do not fabricate a target's minutes or EV.building-blocks.md repair order (formation → nation cap → budget → spread) preserving value-bearing blocks. A transfer that shatters a BB2 clean-sheet spine or strips a BB1 enabler costs more than the FT — flag it; sell the block as a unit or hold. Confirm a legal XI survives every pair.league-config.md — web-search and cite them, plan under both regimes until confirmed, set provisional_cost_rule: true, and cap the cost side's confidence at 0.35 with a "confirm before lock" note (signal-framework.md). Prices are fixed all tournament, so a transfer's only cost is the FT/hit — there is no price-rise race to model.wc-squad-architect and the board. The manager executes transfers manually in the official game (CLAUDE.md operating rule 1) — surface the options and the recommended default, and stop.development
--- name: zettel-note description: The note-writing discipline for this vault's evergreen knowledge graph, modeled on a Zettelkasten reading companion and governed by the vault conventions. Enforces declarative-claim titles, one claim per note (atomicity), own-words prose with no block quotes, the piped [[slug|Title]] link form, the labeled link-relationship vocabulary (Confirms/Contradicts/Extends/Context/Prerequisite/Builds-on/Applies/Example-of/Contrasts-with), 3-6 links per note, and search-
testing
Reads and updates the FIFA World Cup Fantasy tournament state machine (footballfantasy/context/tournament-state.md) — the temporal backbone tracking phase (pre-tournament → group MD1-3 → R32 → R16 → QF → SF → final), budget ($100m group / $105m knockouts), nation cap (3 group, loosening in knockouts), chips remaining, surviving nations, each owned player's elimination-risk horizon, and deadlines. Validates state on load (count/feasibility checks), applies phase transitions, and appends to the append-only state log (never silent overwrite). Use to load state at the start of a run and to commit state changes after the manager makes a move.
development
Validates and persists FIFA World Cup Fantasy signal files to signals/YYYY-MM-DD-<type>.md. Checks the required frontmatter (type, round, date, emitted_by, confidence, source_urls), range-checks declared numeric signals, confirms every factual claim carries a source URL or "manager-provided", rejects unknown signal types, and refuses to persist a signal that fails validation (logging the failure instead). Keeps the inter-agent signal layer auditable so downstream agents can trust what they read and never re-derive it. Use whenever an agent or skill writes a signal.
development
Measures and protects diversity in the FIFA World Cup Fantasy evolution engine — the anti-inbreeding / selection-pressure governor from the Evolution document. Computes how collapsed an offspring set is (pairwise squad overlap %, captain overlap, ownership-profile spread, variance-band coverage); if the population has converged toward one template (premature convergence / local optimum), it injects an under-represented genotype's blocks and/or raises the mutation rate and signals a re-run; and it tunes selection pressure (too high collapses the gene pool, too low makes the board noise). Ensures the manager's board always offers a real choice across the variance spectrum. Use after recombination + mutation, before emitting offspring.