Add verified Truthtrance hand inventory questions
Players can ask total-hand and primary-role card-count comparisons using the existing count controls and compound facts. Component presentation shares the same default-role classification, including canonical Richese cards, Ix alternate uses, and Ecaz slot-only specials. Only the respondent receives the verified aggregate answer; current facts do not impose future custody promises. Eight new tests cover all 60 catalog cards, real engine actions, malformed input, private worlds, all four bots, JSON continuation, and a legal custody transfer. Expanded production-room SQLite cases cover restored total/category/compound facts, suspended auction state, and one winning concurrent answer/discard. Independent review's two copy issues were fixed before broad verification. Validation: types, lint and 4,200 offline tests passed; production build passed; 40 HTTP tests passed. One stable broad run (check 123036 ms, build 6505 ms, integration 23467 ms). Browser room LC3E55GY verified combined role counts, total hand size, invalid-input feedback and refresh at 390px phone width. All 33 pre-integration rooms preserved unchanged; HTTP checks added 30 rooms. No complete-mode, full-game or publication gate opened. Private report: 20260913-hand-inventory-final/report.json Source fingerprint: c6a69a9e69941cdd1e5734d92afedbf10d31fda36c91d26ca7e15f4fb7c59b18 Efficiency pilot milestone 3: aggregate counter 58,695,053 to 59,144,653 at completed verification = 449,600 tokens, including context/coordination overhead. Two bounded workhorse-model helpers, reused UI and SQLite fixtures, one browser room. Counter is not monetary cost and this differently sized batch does not establish a savings percentage. Final Git/push overhead follows this sample.
This commit is contained in:
1 parent
32791ed5e2
commit
7454456755
14 files changed
+980
-151
No files matched your search
@@ -3,6 +3,7 @@ import { BATTLE_CARD_HELP, battleCardLabel } from './battle-cards';
|
||||
import { RULE_TOPICS, type RuleTopic } from './reference';
|
||||
import { ecazTreacheryDefinition } from './ecaz-cards';
|
||||
import { richeseCardDefinition } from './richese-cards';
|
||||
import { printedCardCategory } from './card-category';
|
||||
|
||||
/** Presentation uses only a card the caller has already been authorized to see. */
|
||||
export type VisibleCard = Readonly<
|
||||
@@ -130,15 +131,13 @@ export function cardPresentation(card: VisibleCard): CardPresentation {
|
||||
const topics = topicIds
|
||||
.map((id) => RULE_TOPICS.find((topic) => topic.id === id))
|
||||
.filter((topic): topic is RuleTopic => !!topic);
|
||||
const role = ['shield', 'snooper', 'shieldSnooper', 'chemistry'].includes(
|
||||
card.kind,
|
||||
)
|
||||
? 'defense'
|
||||
: card.kind === 'hero'
|
||||
const category = printedCardCategory(card);
|
||||
const role =
|
||||
category === 'hero'
|
||||
? 'leader'
|
||||
: card.kind === 'special' || card.kind === 'worthless'
|
||||
: category === 'special' || category === 'worthless'
|
||||
? 'utility'
|
||||
: 'weapon';
|
||||
: category;
|
||||
return {
|
||||
category:
|
||||
card.kind === 'special'
|
||||
|
||||
Reference in new issue
Block a user