8ce5619273
Every lead in AUDIT.md, traced to the running source and then settled. Ceremonial Dagger DESTROYS the joker to its right at blind select (card.lua:2945) and skips Eternals. The card says so; what it cannot say is WHICH of your jokers is about to die. JCA.dagger_victim names it in the tooltip -- "WILL DESTROY Baron at the next blind" -- while there is still time to reorder, and stays quiet when the neighbour is Eternal. Four jokers that scored 0 against all 150 now have partners, all verified in card.lua rather than recalled: * Burglar + Ramen: Ramen decays per discarded card and is DESTROYED at x1 (SMODS.destroy_cards). Burglar zeroes discards, so it never decays and never dies. Same for Burglar + Green Joker, which is only punished by discarding. * Trading Card + Erosion: Erosion pays per card MISSING from the deck, and Trading Card permanently destroys the card it discards. * Chaos the Clown + Flash Card: a free reroll every shop, and a joker that grows per reroll. Both were inert. Erosion is the mirror of card_gen, so it now clashes with every joker that permanently adds a card: DNA, Marble, Certificate. Rejected, with the reasoning recorded so nobody "fixes" it later: Card Sharp and Supernova reward replaying a hand and Obelisk punishes it, but neither destroys the other's precondition -- the player's hand choice does. That is an opposed incentive, not an opposed effect. The clash list only earns trust while every entry is mechanical. The audit's own silent-check was wrong: it flagged Square Joker, which has been paired with Four Fingers all along, and I duplicated that pair before the suite caught it. Silence now means no tags AND no famous pair. 711 pass locally, 10 in-game. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
125 lines
5.4 KiB
Markdown
125 lines
5.4 KiB
Markdown
# Synergy database audit
|
|
|
|
Generated by `lua audit.lua --write`. Do not edit by hand.
|
|
|
|
`test.lua` is the gate (it fails on what is broken). This is the map: it reports
|
|
what is merely *suspicious*, and records what we already decided so the analysis
|
|
does not get redone from scratch every session.
|
|
|
|
## Totals
|
|
|
|
| | |
|
|
|---|---|
|
|
| Jokers in the database | 150 |
|
|
| Famous pairs | 36 |
|
|
| Clashes | 25 |
|
|
| Cautions | 15 |
|
|
| Themes | 29 |
|
|
| Jokers in no famous pair | 102 |
|
|
|
|
## Jokers the advisor is silent about
|
|
|
|
These give nothing but engine roles (Mult/Chips/xMult) and want nothing, so they
|
|
score at most the generic +1 against any joker in the game. That is a legitimate
|
|
answer for some of them -- but it should be a decision, not an accident.
|
|
|
|
| | count |
|
|
|---|---|
|
|
| Silent, reviewed, staying that way | 25 |
|
|
| Silent, but a lead worth chasing | 0 |
|
|
| **Silent and never looked at** | **0** |
|
|
|
|
### Leads worth chasing
|
|
|
|
Unverified. Check each against the Lovely dump before acting on it -- a wrong
|
|
synergy is worse than a missing one.
|
|
|
|
|
|
### Reviewed, and deliberately silent
|
|
|
|
- **`j_baseball`** — xMult per Uncommon joker owned. A rarity tag would have exactly one payoff, and every giver would be "is uncommon" -- noise, not synergy.
|
|
- **`j_card_sharp`** — REJECTED as a clash with Obelisk. Card Sharp rewards replaying a hand and Obelisk punishes replaying your MOST played hand -- but neither destroys the other precondition; the player's hand choice does. That is an opposed incentive, not an opposed effect. Flagging it would dilute the clash signal, which only earns trust while every entry is mechanical.
|
|
- **`j_cavendish`** — the reward for Gros Michel dying, not a partner
|
|
- **`j_ceremonial`** — RESOLVED: it destroys the joker to its right at blind select (card.lua:2945), skipping Eternals. JCA.dagger_victim now names the joker about to die, in the tooltip, while there is still time to reorder.
|
|
- **`j_chicot`** — disables the boss blind; no joker interaction
|
|
- **`j_credit_card`** — lets you go negative; a money buffer, not a combo
|
|
- **`j_diet_cola`** — sell for a Double Tag; tags are outside our model
|
|
- **`j_glass`** — wants GLASS cards, and no vanilla joker creates them. Same trap as Steel Joker: enhance_gen is too coarse a tag to use here.
|
|
- **`j_gros_michel`** — self-destructs; the trap is a CAUTION
|
|
- **`j_half`** — +Mult on small hands; no joker cares
|
|
- **`j_ice_cream`** — decays; the trap is a CAUTION
|
|
- **`j_joker`** — plain +Mult; interacts with nothing
|
|
- **`j_loyalty_card`** — xMult every 6 hands; no joker interaction
|
|
- **`j_luchador`** — sell to disable a boss; no joker interaction
|
|
- **`j_misprint`** — random +Mult; interacts with nothing
|
|
- **`j_mr_bones`** — death insurance; no joker interaction
|
|
- **`j_obelisk`** — The trap is real but it is a CAUTION ("resets on your most played hand"), not a set of pairwise clashes. See j_card_sharp.
|
|
- **`j_popcorn`** — decays; the trap is a CAUTION
|
|
- **`j_red_card`** — +Mult per skipped booster; no joker interaction
|
|
- **`j_ride_the_bus`** — scales on face-free hands; the traps are CLASHES
|
|
- **`j_ring_master`** — Showman allows duplicates in the shop pool. We have no tag for pool effects, and one joker does not justify inventing one.
|
|
- **`j_steel_joker`** — wants STEEL cards. The only enhance_gen givers make Gold (Midas) and Stone (Marble), so tagging it enhance_gen would invent a synergy that does not exist. No vanilla joker creates Steel cards. Leave it alone.
|
|
- **`j_stuntman`** — big chips, -2 hand size; the trap is a CAUTION
|
|
- **`j_supernova`** — REJECTED as an Obelisk clash for the same reason as j_card_sharp
|
|
- **`j_throwback`** — xMult per skipped blind; no joker interaction
|
|
|
|
## Tag health
|
|
|
|
A tag with one member can never fire (it takes two jokers to make a synergy).
|
|
A tag with two is fragile: drop either joker and the theme dies.
|
|
|
|
| tag | givers | wanters | jokers | theme? |
|
|
|---|---|---|---|---|
|
|
| `card_gen` | 3 | 2 | 5 | yes |
|
|
| `clubs` | 3 | 4 | 4 | yes |
|
|
| `copy_target` | 10 | 3 | 13 | yes |
|
|
| `diamonds` | 2 | 2 | **2** | yes |
|
|
| `discards_up` | 2 | 8 | 10 | yes |
|
|
| `enhance_gen` | 2 | 2 | 4 | yes |
|
|
| `faces` | 1 | 9 | 10 | yes |
|
|
| `flush` | 5 | 4 | 6 | yes |
|
|
| `four_kind` | 2 | 1 | **2** | yes |
|
|
| `gold_gen` | 1 | 1 | **2** | yes |
|
|
| `hand_size` | 3 | 4 | 7 | yes |
|
|
| `hands_up` | 1 | 1 | **2** | yes |
|
|
| `hearts` | 2 | 2 | **2** | yes |
|
|
| `joker_gen` | 1 | 3 | 4 | yes |
|
|
| `money` | 15 | 3 | 17 | yes |
|
|
| `pair` | 4 | 3 | 4 | yes |
|
|
| `planet` | 3 | 3 | 3 | yes |
|
|
| `probability` | 1 | 7 | 8 | yes |
|
|
| `retrig_held` | 1 | 4 | 5 | yes |
|
|
| `retrig_scoring` | 6 | 16 | 22 | yes |
|
|
| `sell_value` | 2 | 2 | 4 | yes |
|
|
| `spades` | 2 | 3 | 3 | yes |
|
|
| `spectral_gen` | 2 | 2 | **2** | yes |
|
|
| `stone_gen` | 1 | 1 | **2** | yes |
|
|
| `straight` | 7 | 6 | 8 | yes |
|
|
| `suit_flex` | 1 | 11 | 12 | yes |
|
|
| `tarot_gen` | 6 | 2 | 7 | yes |
|
|
| `three_kind` | 4 | 3 | 4 | yes |
|
|
| `two_pair` | 3 | 3 | 3 | yes |
|
|
|
|
## Load-bearing jokers
|
|
|
|
The jokers that appear in the most scoring relationships. If one of these is
|
|
mis-tagged, the error is spread across the whole database.
|
|
|
|
| joker | partners scoring >= 2 |
|
|
|---|---|
|
|
| `j_sock_and_buskin` | 18 |
|
|
| `j_dusk` | 16 |
|
|
| `j_hack` | 16 |
|
|
| `j_hanging_chad` | 16 |
|
|
| `j_selzer` | 16 |
|
|
| `j_smeared` | 16 |
|
|
| `j_splash` | 16 |
|
|
| `j_to_the_moon` | 16 |
|
|
| `j_bootstraps` | 15 |
|
|
| `j_bull` | 15 |
|
|
| `j_four_fingers` | 12 |
|
|
| `j_seance` | 12 |
|
|
|
|
Jokers with **no** partner scoring >= 2 anywhere in the game: 25
|
|
|