Connect Sapho first and last battle-choice order

Juice of Sapho can change the remaining Battle-phase chooser order at clean boundaries. A chooser may occupy the physical defender slot and select the actual other combatant. Physical storm order, attackers, defenders and tie advantage remain intact. Full-roster phase priority survives aftermath, newly eligible Face Dancers and saved continuation. Controls and all four AI profiles consume the same projected choices.

Independent review verified private options, public geometry, exact physical disposal, rejected-action immutability, phase expiry and boundary-bound saved chooser integrity. Actual Basic/Advanced Face Dance regressions verify later replacement priority. Authenticated SQLite tests cover duplicate concurrent card requests, private restore and battle completion. Chooser/aggressor separation and phase duration remain explicit implementation interpretations; the separate aggressor mode and unresolved timing stay gated. Reinforcements remains disabled pending the documented reserve-cost question.

Types, lint, 4792 offline tests, build and 43 HTTP tests pass with unchanged source. Six fixed genuine Basic/Advanced faction samples finish in 3672 accepted actions and 97 periodic private JSON restores. They retain 82 rejected candidates at existing guarded arrival combinations; subsequent legal candidates finish. This is bounded playability evidence, not complete compliance or AI calibration.

The browser used Sapho first from a later physical circle, chose Emperor, sealed and resolved a battle, then refreshed into its next choice. Emperor retained the tie win. All 9 accepted actions replay exactly using the recorded random battle event; physical custody, all private JSON views and the original seat row pass. A private harness initially needed random-event replay binding and SQLite-row prototype normalization; no production fix or game reset was required.

After the reported outage, the server responded and the staged QA game restored exactly. All 970 opening games and their original seat/recovery records remain preserved (1004 after checks), including all 971 rooms present immediately before checks. SQLite integrity and foreign keys pass. No restart, database reset or recurring automation was needed.

Verified source tree: b699f80600f8e297595a8e756edf367a607ddd99707474c03231e6479bd2f389
This commit is contained in:
Quintine committed 2026-09-14 05:14:57 +10:00
1 parent 04501567d0
commit cb691e1b14
20 files changed
+1759 -35

No files matched your search

+20 -12
View File
@@ -6,14 +6,16 @@ gated.** Prototypes do not open completion or publication gates.
## Current checkpoint and work
Previous verified checkpoint: `c04cb93`, [Recruits](RECRUITS_RUNTIME.md).
Types, lint, **4,743 offline tests**, build and **43 HTTP tests** passed.
Eight fixed Basic/Advanced six-seat samples finished in 7,995 actions with no
rejected candidates and three actual Recruits plays. All opening games and
seat/recovery records were preserved, with 936 rooms after verification.
Latest verified checkpoint: `0450156`, [Harass & Withdraw](HARASS_WITHDRAW_RUNTIME.md).
Types, lint, **4,776 offline tests**, build and **43 HTTP tests** passed.
Eight fixed Basic/Advanced six-seat samples finished in 9,956 actions with no
rejected candidates, three Harass withdrawals and 266 periodic save/restore
checks. Browser controls, private restoration and the final engine replay passed.
All 937 games present before verification and their original seat/recovery
records were preserved, with 970 rooms after HTTP checks.
Earlier evidence remains in the [implementation history](IMPLEMENTATION_STATUS.md).
Current prototype: [Harass & Withdraw](HARASS_WITHDRAW_RUNTIME.md) connects either
The connected [Harass & Withdraw prototype](HARASS_WITHDRAW_RUNTIME.md) supports either
battle-card slot, private category inspections, exact undialed normal/elite
returns, opponent-Traitor cancellation, mandatory disposal, controls and all
four AI profiles. Physical allocation must be unique. Richese card combinations
@@ -22,12 +24,18 @@ card-specific discard precedence are explicitly labeled inferences. The Stone
Burner timing question is pending; no user answer is assumed. Reinforcements
remains unfinished. This does not open variant, mode or publication gates.
After the latest reported power failure, the existing server responds normally.
All **936 rooms**, **1,959 seats** and original recovery/entry/handover records
match the opening backup; SQLite integrity and foreign-key checks pass. Browser
refresh restores the existing test seat. No restart, database reset or recurring
automation was needed. Current checkpoint verification and delivery are recorded
with the final source-bound report and Git message.
The existing server remained healthy after the reported power failures. Saved
games and original recovery/entry/handover records survived; SQLite integrity
and foreign-key checks passed, and refresh restored the test seat. No restart,
database reset or recurring automation was needed. Exact verification, source
fingerprints and delivery are recorded in the private report and Git message.
Current work: [Sapho Battle-phase order](SAPHO_BATTLE_ORDER.md) connects first/last
remaining battle choices without rewriting storm order or tie roles. The browser completed a reordered
battle and restored its next choice; independent review and an actual Basic/Advanced
Face Dance continuation passed. Reinforcements
remains disabled while its reserve-cost question is pending; see the
[latest source review](ECAZ_TREACHERY_RULES.md#14-september-reinforcements-cost-review).
## Authoritative navigation
+27
View File
@@ -90,3 +90,30 @@ No runtime tests were added or claimed for this source task. At this source audi
now have connected development prototypes. The linked contracts supersede the
historical runtime-absence statements above within their explicit boundaries.
Reinforcements and complete combined-module acceptance remain unfinished.
## 14 September Reinforcements cost review
The printed close-up at [4:24](https://www.youtube.com/watch?v=P9ZTV1uZqsM&t=264s)
and designer explanation at [8:55](https://www.youtube.com/watch?v=iF5E3-LOfhY&t=535s)
place its effect during Revealing Wheels: increase the calculated dial by two,
then place three reserve forces in the Tanks. A separate score modifier, without
extra support or on-board casualties, is the strongest implementation inference.
Three physical counters pay the cost; an available ordinary/elite mix needs its
owner's explicit choice.
The [base Traitor outcome](https://www.gf9games.com/dunegame/wp-content/uploads/Dune-Rulebook.pdf#page=10)
can reasonably be read to waive the sole caller's reserve cost. The later card's
mandatory transfer can also reasonably override that general protection, using
the same specificity argument as mandatory after-use card disposal. Neither
reading is an authoritative Reinforcements ruling. Opposing/mutual Traitors and
explosions have no directly retrieved combined clarification either. The card
remains disabled: an eligibility gate based on concealed matching Traitors would
expose private information or fail after plans were sealed.
The user has been asked whether to retain that gate, always charge three on all
outcomes, or waive only the sole traitor-call winner's cost. No answer is assumed.
Separately, the sources do not establish whether these reserve counters count
toward the Advanced Atreides seven-loss threshold, or the relative order when
the same plan also plays Harass & Withdraw. Those combinations remain explicit
boundaries rather than inferred rules. No disconnected quote is recorded as a
completed card effect.
+21
View File
@@ -1,5 +1,26 @@
# Dune implementation status
## 14 September 2026 — Sapho remaining battle-choice order
[The Sapho battle-order prototype](SAPHO_BATTLE_ORDER.md) adds first/last remaining
Battle-phase choice through the existing physical card, hand controls, legal AI
and saved state. The public chooser is separate from physical attacker/defender;
old battle outcomes, storm order and tie rules remain intact. Accepted priority
persists through complete aftermath and later changed board eligibility. This
separation and phase duration are explicit implementation interpretations.
A fresh [Reinforcements cost review](ECAZ_TREACHERY_RULES.md#14-september-reinforcements-cost-review)
found no authoritative resolution of its reserve payment versus a traitor win.
The question has been sent to the user; the card remains disabled while independent
Sapho work proceeds. Advanced Atreides accounting and same-plan Harass ordering
remain separate unresolved combinations.
The checkpoint uses a 970-room preservation baseline, a separate browser lobby,
focused rules/controls/AI/SQLite checks and independent review. Final complete-game,
browser, broad-check and verified Git results belong to the source-bound private
report and commit message. Public mode and publication gates remain unchanged.
## 14 September 2026 — Harass & Withdraw battle prototype
[Harass & Withdraw](HARASS_WITHDRAW_RUNTIME.md) now connects either physical card
+11 -2
View File
@@ -1,6 +1,11 @@
# Juice of Sapho: finite ordering implementation
Updated 13 September 2026. **Partial card implementation; complete Richese/Advanced starts remain disabled.** This document distinguishes implemented boundaries from printed rules. Sources and unresolved questions remain in [the source audit](JUICE_OF_SAPHO_ENGINE_AUDIT.md). The publisher CHOAM/Richese rulebook p11 confirms Once Around last; the physical face describes first, last (including after Guild), and battle aggressor. No newly discovered official ruling resolves normal cyclic auction duration, partly completed combined turns, or first versus Guild. These three material questions have been sent to the user; no answer has been assumed.
Updated 14 September 2026. **Partial card implementation; complete Richese/Advanced starts remain disabled.** This document distinguishes implemented boundaries from printed rules. Sources and unresolved questions remain in [the source audit](JUICE_OF_SAPHO_ENGINE_AUDIT.md). The publisher CHOAM/Richese rulebook p11 confirms Once Around last; the physical face describes first, last (including after Guild), and battle aggressor. No newly discovered official ruling resolves normal cyclic auction duration, partly completed combined turns, or first versus Guild. These three material questions have been sent to the user; no answer has been assumed.
The [Battle-phase ordering prototype](SAPHO_BATTLE_ORDER.md) adds first/last
remaining battle choices. Its separate chooser, phase priority and saved-boundary
contract supersede the earlier absence of that mode below. Aggressor remains
unimplemented.
## Implemented contract
@@ -17,7 +22,11 @@ All four AI levels consume the same legal owner projection. They prefer last in
## Remaining scope
Battle aggressor, battle-phase first/last, normal/Black Market cyclic bidding, other ordered actions and partly completed movement remain unfinished. Once Around first after an already completed bid and first/Guild competing priority are guarded. Reacquiring and replaying Sapho while an existing movement protection remains is also guarded. Silent submission is simultaneous and receives no fabricated order or tie change.
The [battle-order follow-up](SAPHO_BATTLE_ORDER.md) connects first/last at a clean
boundary between actual battles. It does not implement the separate aggressor
mode discussed below.
Battle aggressor, normal/Black Market cyclic bidding, other ordered actions and partly completed movement remain unfinished. Once Around first after an already completed bid and first/Guild competing priority are guarded. Reacquiring and replaying Sapho while an existing movement protection remains is also guarded. Silent submission is simultaneous and receives no fabricated order or tie change.
The battle audit in [the battle review](JUICE_OF_SAPHO_BATTLE_REVIEW.md) found a real Stone Burner counterexample: a plan admitted with original aggressor tie priority can become allocation-ambiguous after late Sapho. A complete implementation needs the actual allocation continuation (and a usable, possession-independent late intervention boundary), not rejection based on an opponent's hidden plan. No aggressor handler has been enabled around that defect.
+2
View File
@@ -6,6 +6,7 @@ Updated 14 September 2026. This is the authoritative navigation index for existi
| Topic | Decision to preserve | Detailed authority and evidence |
| --- | --- | --- |
| Sapho battle order | First/last reorders remaining Battle-phase choosers at clean boundaries. Phase priority persists through aftermath; actual legal pairs determine eligibility. Separating the chooser from physical attacker/tie advantage is an explicit implementation interpretation of the card's distinct alternatives, not a dedicated FAQ ruling. Last does not prevent others from choosing the holder as an opponent. | [Runtime scope and source interpretation](SAPHO_BATTLE_ORDER.md) |
| Harass & Withdraw | Either slot but neither category; private Prescience answers null. Return uniquely determined own undialed physical forces before weapon losses, canceled by an opposing successful Traitor. Mandatory after-use discard overrides winner retention. Explosion ordering and own-Traitor disposal are explicit timing/specificity inferences, consistent with the recorded Planetologist precedent. | [Runtime and sources](HARASS_WITHDRAW_RUNTIME.md) |
| Expansion-faction setup | Selecting Ecaz/Moritani factions does not select their independent three-card variant. Ordinary decks contain 33/35/47 cards; Richese's ten-card cache stays separate. Ecaz allocates six total forces within Imperial Basin sectors 9–11, retaining fourteen reserves. Flexible sector allocation is the literal printed territory constraint; Fremen→Ecaz→Advanced BG order is an implementation inference, while Moritani-last is printed. | [Source and profile contract](EXPANSION_FACTIONS_PROTOTYPE.md) |
| Ixian Technology on Richese lots | Replacement-card ownership, income and unsold disposition remain unresolved. A saved explicit per-lot decline permits an unchanged offer to proceed and leaves Technology available later. This development continuation does not implement the exchange or settle its custody. | [Auction source boundary](RICHESE_AUCTION_RULES.md#13-september-saved-per-lot-technology-decline) |
@@ -42,6 +43,7 @@ These are unresolved in the cited records. Do not infer an answer from elapsed t
| Boundary | Still unresolved | Existing record |
| --- | --- | --- |
| Reinforcements cost | A user question asks whether to keep the card disabled, always transfer three reserve forces on every outcome, or waive only a sole traitor-call winner's cost. No answer is assumed. Advanced Atreides loss accounting and same-plan Harass ordering are separate unresolved combinations. Eligibility must not depend on concealed matching Traitors. | [Fresh cost review](ECAZ_TREACHERY_RULES.md#14-september-reinforcements-cost-review) |
| Harass / Stone Burner | A user question has been sent: keep the combination gated or compare forces remaining after withdrawal. No answer is assumed. The Richese card-family configuration is guarded publicly; hidden Stone Burner custody never controls eligibility. Ambiguous physical allocations and other optional modules remain unfinished. | [Current boundaries](HARASS_WITHDRAW_RUNTIME.md#current-boundaries) |
| Recruits late accounting and rates | A user question has been sent for two free plus one paid Atreides return before Recruits: keep the disputed case gated, or one/two further free returns without refund. No answer is assumed. Late-changing free rates, pending repricing and same-turn recovered-card replay also stay gated. The connected clean-case preview retains the independent seven-force cap after faction-advantage cancellation as an explicit inference, not a direct combined FAQ. | [Source audit](RECRUITS_RULES.md), [runtime scope](RECRUITS_RUNTIME.md) |
| Ambassador/Terror arrival priority | Both optionally react to the same entry, but no publisher/designer priority was found. The order can change Fremen relocation versus Atomics losses. A user question has been sent: keep the overlap gated pending an official ruling, or use explicitly provisional storm order. No answer is assumed; Baliset remains a separate pre-entry prevention effect. | [Reproduction and source boundary](DEFERRED_MOVEMENT_ARRIVAL.md) |
+78
View File
@@ -0,0 +1,78 @@
# Juice of Sapho: remaining battle-choice order
Updated 14 September 2026. This connects first/last Battle-phase ordering through
controls, AI and saved continuation. The separate aggressor mode and full
Richese/Advanced publication gates remain unfinished.
## Authority and interpretation
The [physical-card audit](JUICE_OF_SAPHO_ENGINE_AUDIT.md#verified-instructions-and-sources)
and [source follow-up](JUICE_OF_SAPHO_SOURCE_UPDATE.md#aggressor-and-battle-selection-order)
establish first/last in an ordered phase/action as a separate printed alternative
from becoming a battle's aggressor. The [battle review](JUICE_OF_SAPHO_BATTLE_REVIEW.md)
explains why chooser identity, participants and tie priority must remain separate.
The selected scope is the remaining Battle phase, at clean boundaries between
battles. Accepted priority lasts for the rest of that phase. Keeping a reordered
chooser separate from physical attacker and tie advantage is the existing audit's
implementation interpretation of those distinct alternatives, not an explicit
publisher FAQ ruling. The base game normally combines those identities through
storm order. No new official timing ruling is claimed.
First and last reorder future choices; completed battles stay resolved. Other
players can still select battles against a last-position holder. Sapho grants no
immunity or additional battle and does not move forces or alter physical storm
order. Aggressor mode needs its separate late-intervention protocol and Stone
Burner allocation work. No new confirmation-only window is introduced here.
## Connected behavior
The existing Richese development configuration supplies the physical card. Its
holder receives private `battleOrder` first/last options at a clean boundary.
The command binds the current opportunity and discards the exact unreserved card
once. A held position, stale event, absent unresolved battle or suspended
interaction cannot consume it. Earlier completed battles do not prevent a later
order change; a current battle and its aftermath must finish first.
The stored priority is separate from `g.order`. Legal pair geometry comes from
the public combat board. Each choice has a chooser and stable attacker/defender
identities. A reordered physical defender can choose the actual opposing attacker
without swapping leaders, plans or faction powers. UI and bots use the same
authoritative choices and owner-relative target.
Priority includes all seats, even those currently without a battle, so a later
Face Dancer replacement does not move a newly relevant seat behind an accepted
last position. Actual eligibility is recomputed after all aftermath. A battle
start or Sapho use expires the old opportunity event. Legally recovering the
physical card permits a new use at a fresh opportunity; there is no invented
once-per-phase restriction.
All four AI profiles use their private view and public board. Their initial
ordering policy favors first when an unresolved stronghold battle is available,
otherwise last. They can then choose an opponent from either stable battle slot.
This is a legal strategy path, not difficulty calibration.
## Evidence and boundaries
Focused engine, controls, bot and authenticated SQLite tests exercise ordering,
actual opponent choice, saved continuation, duplicate-request custody and rejected
action immutability. Fixtures distinguish genuine Basic/Advanced CHOAM/Richese
setup from later conserved battle staging. A genuine five-seat Ix/CHOAM regression
resolves a battle, activates Face Dance and gives the newly eligible replacement
its next choice ahead of a protected last seat, in Basic and Advanced.
The isolated browser table used first from a later physical circle, chose the
earlier Emperor attacker, completed the battle and restored the next battle
choice after refresh. Emperor retained the tie win. All nine accepted actions
replayed exactly with the recorded battle event; private views, physical custody
and the original seat row passed. Final check results, fingerprints,
browser and complete-game evidence are retained in the private checkpoint report
and Git message.
Intervention within an unresolved battle or suspended aftermath is unavailable.
Aggressor mode, ordinary cyclic-auction scope, first versus an unspent Advanced
Guild and interruption of partly completed movement turns retain their existing
boundaries. Prototype evidence does not certify full card or mode compliance.
The opening preservation baseline contains 970 rooms. Keep all saved games and
seat/recovery records, reuse the healthy server and leave recurring restarts absent.