Chase the audit's leads: verify, implement, or reject

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>
This commit is contained in:
funman300
2026-07-14 12:36:01 -07:00
parent 96a00d0d0c
commit 8ce5619273
5 changed files with 158 additions and 64 deletions
+53 -42
View File
@@ -51,43 +51,47 @@ local VERDICTS = {
'wants GLASS cards, and no vanilla joker creates them. Same trap as ' ..
'Steel Joker: enhance_gen is too coarse a tag to use here.'},
-- Leads worth chasing. NOT verified against the game source yet.
j_ceremonial = {'candidate',
'positional like Blueprint: it DESTROYS the joker to its right. ' ..
'JCA.copy_source already reads board order -- the same machinery could ' ..
'warn "will destroy your Baron" before it eats something irreplaceable.'},
j_erosion = {'candidate',
'+Mult per card BELOW 52 in the deck, so it is the inverse of card_gen: ' ..
'DNA/Marble/Certificate permanently shrink it. Likely CLASHES, and ' ..
'possibly a synergy with anything that destroys cards (Trading Card).'},
j_ramen = {'candidate',
'xMult decays per card discarded, so Burglar (zero discards all run) ' ..
'stops the decay dead. Likely a famous pair.'},
j_green_joker = {'candidate',
'+Mult per hand, -Mult per discard: Burglar removes discards entirely. ' ..
'Same shape as the existing Burglar + Mystic Summit pair.'},
j_flash = {'candidate',
'+Mult per shop reroll. Chaos the Clown grants a free reroll each shop, ' ..
'which would give both of them a reason to exist (Chaos is inert today).'},
j_chaos = {'candidate', 'free reroll each shop; see j_flash'},
j_square = {'candidate',
'+Chips on exactly-4-card hands; Four Fingers makes 4-card flushes and ' ..
'straights playable. Needs a tag that does not exist yet.'},
j_card_sharp = {'candidate',
'xMult when the hand type was already played this round -- it rewards ' ..
'repeating one hand, which is exactly what Obelisk punishes. Clash?'},
j_supernova = {'candidate', 'Mult scales with times the hand was played; see j_card_sharp'},
j_obelisk = {'candidate',
'resets on your most-played hand, so it fights every hand-type build. ' ..
'Has a CAUTION already; the pairwise clashes may be worth adding.'},
j_baseball = {'candidate',
'xMult per Uncommon joker owned. We have no rarity tag, and adding one ' ..
'for a single payoff may not earn its keep.'},
-- Chased and resolved. These now have pairs, clashes or an advisor line, so
-- they no longer appear as silent -- kept here as the record of the decision.
j_ceremonial = {'settled',
'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_erosion = {'settled',
'RESOLVED: pays per card missing from the deck (starting_deck_size - ' ..
'#G.playing_cards, card.lua:4318) -- the exact inverse of card_gen. Now ' ..
'clashes with DNA/Marble/Certificate, and pairs with Trading Card, which ' ..
'permanently destroys the card it discards.'},
j_ramen = {'settled',
'RESOLVED: paired with Burglar. It decays per discarded card and is ' ..
'DESTROYED at x1 (card.lua:3175); Burglar zeroes discards, so it never ' ..
'decays and never dies.'},
j_green_joker = {'settled', 'RESOLVED: paired with Burglar (no discards, only gains)'},
j_flash = {'settled', 'RESOLVED: paired with Chaos the Clown (free rerolls grow it)'},
j_chaos = {'settled', 'RESOLVED: paired with Flash Card; no longer inert'},
j_square = {'settled',
'Not actually a gap -- it was paired with Four Fingers all along. It has ' ..
'no TAGS, which is what made the old silent-check flag it. That check now ' ..
'excludes jokers with a famous pair.'},
j_mystic_summit = {'settled', 'already paired with Burglar (zero discards, max Mult)'},
j_ring_master = {'candidate',
'Showman allows duplicates in the pool. Enables copy/duplicate strategies, ' ..
'but we have no tag for "shop pool" effects and inventing one for a single ' ..
'joker is probably not worth it.'},
-- Chased and REJECTED. Do not "fix" these; the reasoning is the point.
j_card_sharp = {'settled',
'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_supernova = {'settled', 'REJECTED as an Obelisk clash for the same reason as j_card_sharp'},
j_obelisk = {'settled',
'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_baseball = {'settled',
'xMult per Uncommon joker owned. A rarity tag would have exactly one ' ..
'payoff, and every giver would be "is uncommon" -- noise, not synergy.'},
j_ring_master = {'settled',
'Showman allows duplicates in the shop pool. We have no tag for pool ' ..
'effects, and one joker does not justify inventing one.'},
}
--------------------------------------------------------------------------------
@@ -136,20 +140,27 @@ for key, e in pairs(JCA.db) do
end
end
-- "Silent": nothing but engine roles to give, and nothing wanted. Such a joker
-- can only ever earn the generic +1, so the advisor has nothing to say about it.
local in_pair = {}
for _, p in ipairs(data.pairs) do in_pair[p[1]] = true; in_pair[p[2]] = true end
-- "Silent": nothing but engine roles to give, nothing wanted, AND no famous pair.
-- Such a joker can only ever earn the generic +1, so the advisor has nothing to
-- say about it against any of the 150.
--
-- The pair check matters: without it this list flags jokers the advisor speaks up
-- about perfectly well (Square Joker has no tags but has been paired with Four
-- Fingers all along), and a lead gets "found" that was never lost.
local silent = {}
for key, e in pairs(JCA.db) do
local has_theme, wants = false, 0
for t in pairs(e.gives) do if not ENGINE[t] then has_theme = true end end
for _ in pairs(e.wants) do wants = wants + 1 end
if not has_theme and wants == 0 then silent[#silent + 1] = key end
if not has_theme and wants == 0 and not in_pair[key] then
silent[#silent + 1] = key
end
end
table.sort(silent)
local in_pair = {}
for _, p in ipairs(data.pairs) do in_pair[p[1]] = true; in_pair[p[2]] = true end
--------------------------------------------------------------------------------
-- Report
--------------------------------------------------------------------------------