diff --git a/docs/superpowers/evidence/kcd2-balatro-joker-face-confirmed-2026-07-25.json b/docs/superpowers/evidence/kcd2-balatro-joker-face-confirmed-2026-07-25.json new file mode 100644 index 00000000..2840962c --- /dev/null +++ b/docs/superpowers/evidence/kcd2-balatro-joker-face-confirmed-2026-07-25.json @@ -0,0 +1,32 @@ +{ + "intent": "Record that Balatro's die replaces its ONE pip with the joker as a settled fact rather than an open assumption. The player owns the game and confirmed the mapping, so the data and the docs should stop hedging on it.", + "scope": [ + "kcd2_dice_solver/src/data/dice.ts - the comment on the Balatro entry", + "kcd2_dice_solver/README.md - the 'what the numbers are not' bullet", + "Non-goal: any behaviour change. wildcardFaces was already [1]; only the wording around it moves." + ], + "changes": [ + "The UNVERIFIED caveat on the joker's face is replaced with the confirmation and its consequence: the joker sits where the 1 used to be, so the die has no plain single pip, which is also why holding it alone counts as a 1.", + "The README no longer calls the mapping unverified. Uniform side weights remain flagged as the one real assumption, since no source publishes them." + ], + "verification": [ + { + "command": "node_modules/.bin/vitest run", + "result": "pass", + "evidence": "222 tests pass, unchanged - this commit touches a comment and a paragraph, not code paths." + }, + { + "command": "node_modules/.bin/tsc --noEmit && node_modules/.bin/eslint src", + "result": "pass", + "evidence": "No type errors, no lint findings." + } + ], + "risks": [ + "The claim now rests on the player's confirmation rather than a citable source; no wiki page states which pip the joker replaces. If it is ever contradicted in-game, dice.ts's wildcardFaces and this wording move together.", + "The die's side weights are still assumed uniform. That assumption is unchanged and still marked in both the data and the README." + ], + "rollback": [ + "git revert the commit; the wording returns to UNVERIFIED and no behaviour changes either way.", + "After rollback, confirm dice.ts still has wildcardFaces: [1] for balatro - the mapping itself was never in doubt in the code, only in the prose." + ] +} diff --git a/kcd2_dice_solver/README.md b/kcd2_dice_solver/README.md index c808231c..92a98130 100644 --- a/kcd2_dice_solver/README.md +++ b/kcd2_dice_solver/README.md @@ -67,10 +67,9 @@ every number here is reproducible. - **Balatro's die** publishes no face probabilities: the wiki's dice-effect row for it is six unfilled `d` placeholders, and Inara does not list the die at all. Exactly **one** of its faces is the joker (Jimbo's grinning face), so it - is modelled as a fair die whose 1 is replaced by that joker. Which pip the - joker replaces is unverified — the 1 is assumed, matching the Devil's head die - the game compares it to, and matching "picking it alone will count as if you - threw 1". + is modelled as a fair die whose 1 is replaced by that joker — the same face the + Devil's head die replaces, which is why holding it alone counts as a 1. Only + the uniform weights are an assumption; the joker's face is not. - **The two joker faces score differently**, and the scorer keeps them apart. A Devil's head "matches any combination but never scores on its own", so it can never be the lone 1 or 5 that lets you hold a die; Balatro's joker can. Both diff --git a/kcd2_dice_solver/src/data/dice.ts b/kcd2_dice_solver/src/data/dice.ts index c93740a7..4337d138 100644 --- a/kcd2_dice_solver/src/data/dice.ts +++ b/kcd2_dice_solver/src/data/dice.ts @@ -97,10 +97,10 @@ const RAW_DICE: readonly RawDie[] = [ // as [1,1,1,1,1,1] rather than a fake "16.7" so it cannot be mistaken for a // transcribed figure. // - // The joker is modelled as replacing the one, like the Devil's head it is - // explicitly compared to, which is also why holding it alone counts as a 1. - // UNVERIFIED: if the die turns out to show a plain single pip in-game, the - // joker replaces some other face and this should move. + // The joker replaces the one — confirmed by the player, who owns the game — + // like the Devil's head die it is explicitly compared to. That is also why + // holding it alone counts as a 1: the joker sits where the 1 used to be, so + // the die has no plain single pip at all. weights: [1, 1, 1, 1, 1, 1], wildcardFaces: [1], // "When it lands, you get to choose how it's counted!" — and, unlike the