Complete forced Harkonnen returns with private saved inspection

Automatically return the full combined hand when it is the only legal
special-Karama return. Preserve real choices and restore the suspended
response or auction payment through the same settlement. Record the actual
blind draw as owner-only historical card faces, with a bound integrity
receipt; legacy forced saves describe held-card history truthfully.

Add readable private history and enlarged inspectors. Both manual and
forced returns publish only a faction/action completion tag. Wake idle
legacy exchanges through production recovery without writes for real
choices. Keep provisional auction funding rules and release gates.

Validation: types, lint, 5150 offline tests, build and 49 HTTP tests
passed. Independent review resolved history substitution and root review
completed idle recovery wiring. New tests cover 1-4 forced draws, real
choices, overlays, exact saved history, immutable rejection, all four legal
AI paths, production competing actions/recovery, private views and custody.
One genuine Advanced four-player sample completed 158 actions with
4 JSON restores and no rejected action; no difficulty tuning.

Browser QA QUTHVPTT used genuine Advanced setup and conserved Bidding
positions. The actual power returned four cards without a prompt; private
history/enlargement and exact refresh worked. Phone panel fit without
horizontal overflow with 44px inspector controls. Screenshot capture timed
out; complete visual acceptance and transient notice capture remain open.
Preserved every prior row across all ten tables, including 1586
rooms and 3354 seats. New QA/integration records bring totals to
1626 rooms and 3442 seats. No reset, restart or automation.
This commit is contained in:
Quintine committed 2026-09-21 16:45:20 +10:00
1 parent a3bc0ac837
commit 0f79f28ccb
21 files changed
+847 -52

No files matched your search

+5
View File
@@ -194,6 +194,8 @@ void test('real Harkonnen extraction reserves future recipient slots and enough
hold(g, 'r', 'Distrans');
const give = hold(g, 'r', 'Shield');
const k = hold(g, 'e', 'Karama');
// Keep a real return choice after the blind draw; a Karama-only hand now returns automatically.
const retained = hold(g, 'e', 'Truthtrance');
for (const name of ['Maula Pistol', 'Lasgun', 'Baliset', 'Snooper'].slice(
0,
initialSize,
@@ -208,6 +210,8 @@ void test('real Harkonnen extraction reserves future recipient slots and enough
target: 'a',
amount: 2,
});
assert.equal(g.decision?.kind, 'handExchange');
assert.equal(g.players[2].hand.length, 3);
if (initialSize === 4) {
const snapshot = structuredClone(g);
assert.throws(() => transfer(g, 'r', 'a', give), /room|exchange/);
@@ -220,6 +224,7 @@ void test('real Harkonnen extraction reserves future recipient slots and enough
.map((c) => c.id),
});
assert.equal(g.players[1].hand.length, 4);
assert.deepEqual(g.players[2].hand.map(card => card.id), [retained]);
assert.deepEqual(inventory(g), before);
}
let g = fixture();