Files
Dune/docs/HARKONNEN_EXCHANGE.md
Quintine 0f79f28ccb 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.
2026-09-21 16:45:20 +10:00

75 lines
4.3 KiB
Markdown

# Harkonnen special-Karama inspection and forced returns
The existing Advanced development power draws one through four random, unseen
cards from another player during Bidding. Harkonnen spends its Karama and
once-per-game use, inspects the combined hand, and returns the same number of
cards. Newly drawn cards may be returned. Larger hands keep their real choice.
When the combined hand contains exactly the number owed, every held card must
return. The engine completes that return automatically and emits a house-colored
notice explaining the lack of a choice. A manual return also announces the
completed exchange. The table's existing cosmetic toggle,
reduced-motion behavior and short notice queue apply.
## Private saved observation
**Your Harkonnen inspection** below the board retains the actual randomly drawn
cards, including their readable rules and enlarged inspectors. It identifies the
target and turn and describes historical knowledge: the cards may have changed
hands since. Only Harkonnen's owning seat receives this record. Allies, the target
and other seats receive no inspection record or suspended private auction data.
The copied card descriptions are observations, outside physical card custody.
They persist through ordinary returns, later card movement and JSON recovery.
An internal integrity receipt binds the original card faces and provenance;
changed history is rejected before disclosure. The receipt is not projected.
Existing forced-return saves without a recorded draw retain a truthful snapshot
of the cards held before returning them; the interface does not claim these were
all originally drawn from the target. Legacy exchanges with a real choice keep
their selector without inventing prior knowledge.
Both manual and automatic returns use the same settlement, restore the suspended
decision/response and keep the existing auction funding recovery. Higher-priority
interruptions finish first. Restoring a completed exchange must never redraw,
repeat the return, spend a second Karama or consume the power twice.
## Authority and limits
This composes the existing contract recorded under **Emperor and Harkonnen
special Karama checkpoint** in [implementation history](IMPLEMENTATION_STATUS.md):
GF9 base rules page 14; November 2020 FAQ page 3 (phase and once-per-game limit)
and page 6 (blind draw, inspection, equal return and temporary hand limits).
Automatic resolution of a uniquely determined action follows the user's explicit
interface requirement. Persisting information already inspected does not reveal
the target's current hand.
The existing recovery when an exchange removes the only Karama backing an
unfunded auction bid remains provisional. This checkpoint does not resolve that
ruling or certify all timing and expansion combinations. Advanced and publication
gates remain closed.
## Verification scope
Focused engine tests cover forced and real choices, saved interruption priority,
legacy observations, private projection, rejected-action immutability, physical
custody and minimal legal AI continuation. An authenticated in-memory SQL test
races two real special-card actions, accepts one, reloads every seat and rejects
stale replay without changing the inspection or cards. It also races two restored
legacy continuations through the production recovery scheduler: one return is
saved with no new random draw. Genuine choices remain waiting without writes.
Component tests distinguish
drawn cards from legacy held-card history and exclude non-owner output.
Required checks and browser evidence are recorded in the private source-bound
checkpoint report. These checks establish bounded behavior, not full Advanced
acceptance or AI difficulty calibration.
Browser QA used genuine Advanced setup in a new isolated development room,
then conserved Bidding positions. Playing the real special-Karama control drew
and returned four cards with no return prompt; bidding stayed available. The
private history and enlarged Shield inspector survived refresh, which retained
the exact saved row hash. At a 390-pixel viewport, the 339-pixel history panel
fit within the 375-pixel document without horizontal overflow; each inspector
button was 44 pixels high. The viewport was reset. Screenshot capture timed out,
so these interaction and DOM checks do not establish full visual acceptance.