name: slseoun-patch description: Fetch new Slay the Spire 2 Steam patch notes and turn them into 슬서운변경 rich patch pages, including shell-first publishing, Korean enrichment, exact Codex keyword linking, and required current-game asset synchronization. Trigger for 슬서운변경, STS2 patch notes, Steam patch ingestion, rich patch creation, or a target version like v0.105.0.
slseoun-patch
Create or update STS2 rich patch notes. Steam is the source of truth for patch-note prose; the current local game install is the source of truth for Codex names, descriptions, images, and structural data.
Non-Negotiables
- Run
update-game-assetsfirst when the target patch is newer thandata/sts2/meta.jsonor when patch notes mention changed game content. - Do not finalize Korean rich notes until Codex data reflects the patched game version.
- Use official Korean names from PCK/Codex. Cards with official English names such as
hello worldandnullstay English. - Follow
docs/I18N.mdfor patch-note locale behavior;serviceLocaleselects the patch-note file, while game entity names and hover/link targets followgameLocale. - Every meaningful edit gets its own speculative commit, following
AGENTS.md. - Never construct a Steam store/news URL from the Steam API
gid; use a real store URL from the announcement or user. - Before finalizing a ready patch that touches Compendium resources, run
.codex/skills/sts2-compendium-patch-sync/SKILL.mdafter rich notes and asset extraction so PCK/DLL diffs,data/sts2-changes.json, and lifecycle/deprecated behavior are applied together.
Steam Fetch
Fetch announcements:
curl -s "https://api.steampowered.com/ISteamNews/GetNewsForApp/v2/?appid=2868840&count=10&maxlength=300000&format=json&feeds=steam_community_announcements"
Prefer items with tags containing patchnotes, but also search unfiltered titles because major updates and stable releases may omit the tag. Match the requested version in the title, such as v0.105.0.
Shell-First Mode
Use this when Steam has published the patch but rich notes are not ready yet.
- Add or update the
data/sts2-patches.jsonentry with the real version/date/title/type/Steam URL. - Keep
steamUrllive. - Set
statusto"building"so the index/detail UI labels the patch as being prepared. - Mark the summary as work-in-progress in Korean and English instead of pretending the rich notes are done.
- Do not add placeholder rich note markdown unless there is real content.
- Commit this shell separately before asset extraction or translation work.
Index/detail behavior while status: "building":
- The index card is not a link to the local detail page.
- The index card still shows one muted grayscale thumbnail. If no
artis present yet, the UI falls back to the default STS2 banner; do not omit the thumbnail area in WIP. - Keep the normal type/balance chips, but render them in disabled gray.
- The only colored action is the Steam original chip; it links to
steamUrland opens the real Steam source. - The body shows gray per-letter sine text for "작성 중" / "Building"; do not add a separate "작성 중" chip.
- The card footer shows the date only.
- The detail page renders a stronger building state when markdown files are absent, but should not add another Steam link while building.
Remove status or set it to "ready" when the enriched notes are published.
Patch Representative Art
Use art in data/sts2-patches.json to select one representative image for each ready patch. The same art appears on the patch index card and near the top of the patch detail page.
Preferred sources, in order:
- Patch-relevant epoch art, when a timeline/epoch unlock or theme clearly matches the patch.
- Patch-relevant event background art.
- Patch-relevant card art, especially for headline new cards, major reworks, or new portrait art.
- Patch-relevant Ancient background art from
public/images/sts2/ancients-bg/. - If there is no good patch-specific art, use the text-free STS2 banner at
public/images/sts2/patches/default-art.jpg.
Rules:
- Do not use a grid of up to 8 preview assets for the index anymore. Pick one art image.
- Use exact current IDs and factual asset sources. Valid
art.typevalues arecard,epoch,event,ancient, andimage. - Prefer
art: { "type": "epoch", "id": "REGENT5_EPOCH" }style references over raw paths when the art maps to a known game concept. - Use
imageonly for standalone assets such as the default STS2 banner, and includeimageUrl. - Add
altandaltKowhen the automatic label would be unclear. - For
v0.105.0, use the Friendship epoch art:art.type = "epoch",art.id = "REGENT5_EPOCH", Korean alt text역사: 친구. - If the best art for an older patch is unclear, ask the user or make an explicit recommendation instead of guessing silently.
- Keep
featuredEntitiesonly as a priority-ordered semantic shortlist and fallback source. The current UI no longer renders it as an 8-item thumbnail grid.
Full Rich Patch Workflow
- Fetch raw Steam contents for the target version.
- Save structured English notes to
data/sts2-patch-notes/{version}.md:- Use the Steam title exactly as
# .... - Skip greetings, community fluff, image placeholders, and unrelated promo text.
- Use
##/###sections and bullet items. - Preserve numeric values exactly, including upgrade notation like
5(7). - This is also a rich note file, not raw plain text. Add Codex keyword markup for cards, relics, powers, events, monsters, ancients, and important game terms so
/enand other game-only locale pages keep hover/link previews.
- Use the Steam title exactly as
- Commit the English notes.
- Run or verify
update-game-assetsfor the patched game version. - Translate/enrich Korean notes at
data/sts2-patch-notes/{version}.ko.md. - Update
data/sts2-patches.jsonwith factual summaries,hasBalanceChanges, representativeart, and any usefulfeaturedEntitiesfallback shortlist. - Apply machine-readable data changes:
data/sts2/{eng,kor}/cards.jsondata/sts2/{eng,kor}/relics.jsondata/sts2/{eng,kor}/potions.jsondata/sts2/{eng,kor}/powers.jsondata/sts2-changes.jsonis the SSOT for structured patch changes. Put player-facingdiffs, machine-applicablefieldDiffs, cross-resourcerelatedEntities, and optionalvisualDiffon the sameSTS2Changerecord.- Do not hand-author
data/sts2-entity-versions.json;getEntityVersionDiffs()derives version diffs fromdata/sts2-changes.json. data/sts2/meta.json
- Run
.codex/skills/sts2-compendium-patch-sync/SKILL.mdwhen the patch touched any Compendium resource, monster behavior, asset, localization, or deprecated/removed resource. Treat this as the post-patch guardrail before the patch becomes ready. - Commit each meaningful file group independently.
Compendium Versioning Contract
Every Codex resource changed by a patch needs machine-readable fieldDiffs in data/sts2-changes.json, not only rich prose or a visual diff. The shared version selector is driven by src/lib/codex-versioning.ts, which derives historical resource state from fieldDiffs; do not add one-off reconstruction logic inside individual library/detail components.
- Supported compendium version targets include cards, relics, potions, powers, enchantments, afflictions, events, monsters, encounters, ancients, and epochs. Steam/game
enemychanges are normalized to compendiummonsterversioning. - For monster reworks, pair
visualDiff: { "type": "monster-pattern" }with resource field diffs for the actual changed data, such asminHp,minHpAscension,damageValues,blockValues,moves,bestiaryMoves, andinitialPowerApplications. - Patch-history rails may suppress raw field-diff prose when a curated visual diff exists, but the field diffs must still exist so old versions render correctly in the Compendium.
- Context-free compendium pages should not bake action-specific amounts into resource descriptions. For example, a power description with
{Amount}should showXunless a monster move, card, relic, or patch visual passes a concrete amount into the shared game hover tip. - If a resource needs patch-specific behavior beyond generic field reconstruction, add a small extension around the common versioning path instead of bypassing it.
- For deprecated or removed resources, follow
.codex/skills/sts2-compendium-patch-sync/SKILL.md: keep historical resource rows, adddeprecatedanddeprecatedInPatchfield diffs, render assets grayscale from the deprecated patch onward, and keep pre-deprecated versions colored and linkable.
Patch Note I18N Contract
Patch notes follow the truth table in docs/I18N.md.
serviceLocale=koreadsdata/sts2-patch-notes/{version}.ko.md;serviceLocale=enreadsdata/sts2-patch-notes/{version}.md.gameLocalecontrols displayed game names, hover cards, and Compendium links. For example,/en/patches/0.106.1should use English service UI and English game text, while/zh/patches/0.106.1should keep the English-authored prose but show Chinese game entity names in linked keywords.- English files need the same entity coverage as Korean files. Do not leave names as plain text just because Steam prose is English.
- In both files, use
[gold:type]Name[/gold]when the target is a Codex resource,[gold]term[/gold]when it is only a game term, and[blue]Ancient[/blue]/[blue]고대의 존재[/blue]for the category. - When a card mention includes an upgrade suffix, put the suffix inside the entity tag, e.g.
[gold:card]Largesse+[/gold]or[gold:card]하사+[/gold], so the hover preview renders the upgraded card. - After adding a new ready patch, smoke test the Korean route and the English game-locale route, e.g.
/patches/{version}and/en/patches/{version}.
Rich Markup
- Cards:
[gold:card]이름[/gold] - Cards in English notes:
[gold:card]Name[/gold] - Relics:
[gold:relic]이름[/gold]when needed, otherwise[gold]이름[/gold] - Relics in English notes:
[gold:relic]Name[/gold] - Potions:
[gold:potion]이름[/gold] - Powers:
[gold:power]이름[/gold] - Enchantments:
[gold:enchantment]이름[/gold] - Events:
[gold:event]이름[/gold] - Monsters/encounters:
[gold:monster]이름[/gold],[gold:encounter]이름[/gold] - Ancients:
[blue]고대의 존재[/blue]for the category;[gold:ancient]니오우[/gold]for a specific Ancient. - Buff label:
([green][sine]버프[/sine][/green]) - Nerf label:
([red][jitter]너프[/jitter][/red])
When a name can be both a card and a power, always use a type hint. Patch notes usually mean cards in card-change sections, so prefer [gold:card] there.
Monster Animation Patch Diff
Use this only for monster reworks, moveset changes, intent/action changes, HP or power changes that are clearer as animated before/after panels. The current supported target is monsters.
Rules:
- Keep Steam patch-note prose outside the diff block. Do not move official bullets like "Adjusted moveset" or "Reworked Wither status..." into service commentary.
- Put service-authored explanation inside the animation diff component, but do not label the UI as
애니메이션 패치 diff/Animation Patch Diff. The collapsible summary should read like the Steam original-view disclosure: compact, text-only, and borderless. - Add a standalone marker line below the relevant monster bullet:
[monster-pattern-diff:MONSTER_ID:v0.106.0:full]
- Also set
visualDiff: { "type": "monster-pattern" }on the correspondingdata/sts2-changes.jsonrecord. Patch-history rails use that structured change record to decide whether to show the compact monster diff. - Use
fullon patch detail pages. Compact rendering is for monster patch-history rails. - The diff block must be collapsible and default-open. When collapsed, only the narrow summary header should remain; do not force the full wide animation row to reserve space.
- The collapsible summary text is only the expand/collapse trigger. Do not make the summary title itself link to the monster page.
- Keywords inside service-authored diff explanation must use the game gold treatment and real hover previews/links. Monster move keywords link to the parent monster page and preview the move animation + intent. Power/card keywords use their game hover tip.
- Build before/after move panels from game data whenever possible. Use current Codex/game data for the after state. For before values, prefer prior extracted data or an existing pre-patch commit over memory.
- Include HP bars when HP changed and starting effects when starting powers changed. If a power/card is mentioned in service commentary, link it as a real Codex keyword.
- For monster move card applications, distinguish adding a card from upgrading/strengthening an existing status/card effect. Tiny-card applications should show the card icon and card name. Upgrade-style applications should render the name as
Name+in the game's green text color without tinting the tiny-card icon and without a quantity badge. - Do not add an animation diff just because a monster is mentioned. Use it when behavior or pattern changed enough that prose alone hides the actual player-facing difference.
- Current implementation lives in
src/components/codex/monster-move-visuals.tsxand is rendered bysrc/components/patch-note-renderer.tsx.
Keyword And Link Validation
Before finalizing .md and .ko.md, audit all [gold...]...[/gold] names against current Codex data:
- If the name exists in current Codex data, the BBCode must match the official display name for that file and use a type hint whenever ambiguous.
- If the patch note mentions a real game term that is not a current Codex page, keep
[gold]term[/gold]; the renderer will show yellow bold text without tooltip/link. - Do not translate entity names by memory when PCK has a Korean title.
- For new entities from the patch, update Codex data first, then use their official names in the rich note.
Useful checks:
pnpm codex:validate
pnpm lint
For tooltip/link changes, inspect the patch detail page in the browser and hover several cards, relics, powers, and unknown keyword-only highlights.
For ready-state patch page changes, run $mobile-viewport-qa after the browser smoke checks on both /patches and /patches/{version}. Use main as the render selector and a non-matching controls selector unless the page has a route-specific QA selector:
node .codex/skills/mobile-viewport-qa/scripts/check-mobile-route.mjs \
--route /patches \
--render-selector main \
--controls-selector "[data-mobile-qa-none]"
node .codex/skills/mobile-viewport-qa/scripts/check-mobile-route.mjs \
--route /patches/0.106.0 \
--render-selector main \
--controls-selector "[data-mobile-qa-none]"
Developer Notes
Only include developer intent/commentary in the Korean rich file:
[devnote]자연스러운 한국어 번역, 엔티티 BBCode 포함[/devnote]
[devnote:en]Original English text[/devnote]
Put section-level notes below the ### heading and item-level notes below the affected bullet.
Legacy Reference
The older Claude workflow lives at .claude/skills/slseoun-patch/SKILL.md. Use it only for historical examples; this Codex skill is the operational source for new Codex runs.