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:
@@ -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
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user