Add Sapho first and last for cyclic auction lots

Provisionally apply first/last to the current ordinary or native Advanced normal Black Market lot. Preserve bids, funding and passes; skip passed seats until a real raise. Use a local full cycle and actual post-discard hand capacity. Keep the original Black Market opener in both settlement consumers and clear ordinary overrides for the next lot. Connect persistent controls, native disposal and existing minimal AI options.

Validation:10-file134/134, types/lint/build and eight original-action/rendered-table continuations. Public setup/cache1, real lobby circle choice, native Black Market and paid full hand preserve prior1,2/3/4 raises, one payment4 and original next opener or final-lot Revival. Eight minimal policies are legal. Corrected fixture opener/completion assumptions and external default-history/final-lot assertions; only runtime was rerun against identical source. Bounded consumer review found no concrete defect. Other timing scopes, direct combined Semuta claim/capture, full modes, final assurance and browser/deployed acceptance remain open. No saved-room/reset/restart/deployment operation.
This commit is contained in:
Quintine committed 2026-10-18 13:28:34 +11:00
1 parent 561152d58e
commit cb13a4d674
15 files changed
+920 -30

No files matched your search

+96 -2
View File
@@ -1,6 +1,10 @@
# Juice of Sapho: finite ordering implementation
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.
Updated 18 October 2026. **Partial card implementation; full modes and
publication acceptance remain gated.** The earlier source audit remains the
printed-evidence baseline. The current-lot prototype below selects an explicit
provisional cyclic convention under the 14 October choose-recommended direction;
it is not a newly located publisher answer. Other timing questions remain open.
The [Battle-phase ordering prototype](SAPHO_BATTLE_ORDER.md) adds first/last
remaining battle choices. Its separate chooser, phase priority and saved-boundary
@@ -8,6 +12,96 @@ contract supersede the earlier absence of that mode below. The
[early aggressor prototype](SAPHO_AGGRESSOR.md) now uses the existing shared
pre-plan opportunity; later aggressor intervention remains unfinished.
## Cyclic ordinary and Black Market bidding — 18 October 2026
The physical face offers first/last in an ordered action; the publisher's Once
Around FAQ does not determine duration in cyclic bidding. The
[source review](JUICE_OF_SAPHO_SOURCE_UPDATE.md#ordinary-cyclic-and-normal-black-market-bidding)
identifies one upcoming circuit, the current lot and the whole phase as different
possible readings. Provisionally choose **the current lot**, anchored at the
actual next bidder when Sapho is played. This supersedes the old software
exclusion within ordinary normal auctions and native Advanced normal Black
Market. It does not alter Silent bidding, native Black Market eligibility or
extend a choice across the phase.
A holder with a pending eligible bid can move first/last in the full local cycle.
Keep other seats' relative cyclic order, including high-bid, passed and currently
full placeholders that could become relevant later. The next actor is the first
eligible unpassed seat other than the high bidder. A passed holder waits for a
real raise; a high bidder has no current pending bid to reorder. These are
explicit next-opportunity prototype boundaries, not extra printed restrictions.
Compare full effective cycles for no-op rejection: a last pending bidder may
still move behind a skipped seat that can reenter after a raise. A mere rotation
with the same next actor and effective cycle cannot consume the card.
Discarding the real card frees a hand slot before determining holder capacity.
A native full-hand Black Market seller retains its existing paid-retention
eligibility through the shared quote. Sapho does not change the physical lot,
standing bid, bidder, allied funding or passed list. Both native advancement
loops skip passes until a genuine raise clears them. Every new bid must still
strictly exceed the standing amount; Sapho supplies no standing-price purchase.
The ordinary auction retains a per-lot `saphoOrder`; the physical `g.order` and
original `opener` stay unchanged, and the next lot removes the override. A normal
Black Market retains `saphoOriginalOpener` before changing its local cycle, so
both settlement consumers resume the following normal pool from the original
physical source. Existing same-lot unfunded-payment recovery retains the new
cycle without revising its separate provisional payment policy.
Owner controls expose `scope:'cyclicAuction'` with the server event and first/
last mode, explain this provisional duration and keep blocked reasons readable.
The existing minimal bot adapter consumes the same options without new strategy
or hidden hand inspection. The optional cyclic tag on the existing Sapho discard
continuation binds its native lot and does not run a bid during disposal. Legacy
Once Around signatures and their normal resume suffix stay unchanged.
The frozen batch passes **10 files134/134**, types/lint/build and eight finite
original-action/rendered-table continuations from four public setup sources.
Actual cache1 purchase uses33 Basic/38 Advanced source actions; native next-turn
Black Market uses81, including the accepted original Emperor circle5 choice;
a full hand built through two further normal1 purchases uses44. First/last
continuations use10–18 actions: prior1 stays funded, the actual holder raises2,
rival raises3, holder wraps to4, and native purchase pays4 once. Black Market
pays its seller4 and resumes the original next opener; ordinary lots rotate
normally, while the full-hand final lot correctly enters Revival. Eight minimal
policy proposals remain legal. Another original-action case keeps prior passes
through Sapho, rejects the standing-price bid and reopens passes only on a real
raise. Nine controlled pure tests cover full cycles, no-ops, strict funding/
termination and post-sale opener/override quotes.
The first batch exposed an original fixture assumption: turn2's native Storm
made the holder already first after its initial raiser. A real pre-start circle
choice supplies the intended independent pending opportunity. Its completion
predicate also had to follow the actual intervening cache-first lot before
asserting the following normal pool. No live order/card/fund/clock injection or
engine repair followed this feedback. Original unopened Spice positions/scalar
lotteries and the explicit lobby circle choice are selected source conditions.
The external rendered smoke initially assumed default history showed the full
new log and that every completed lot had a next lot. It now checks the actual
accepted event separately, renders offered/busy/passed controls, and permits the
full-hand final lot's native phase close. Only that smoke was rerun after those
external-only repairs; all application source stayed identical to the passing
134/134/types/lint/build checkpoint. The aggregate report records exact child
report provenance rather than claiming those checks were repeated. A bounded
read-only source/consumer review found no concrete implementation defect.
Actual GameTable and isolated offered controls render with enabled and busy
states. No browser click, visual or deployed acceptance is claimed. Direct
combined Semuta claim/capture, other ordered phases, first-versus-Guild, partly
completed movement, later aggressor intervention, full modes and final assurance
remain open. No saved-room/database/reset/restart/deployment operation.
Private artifacts: `/home/quintine/.local/share/dune/checkpoints/20261018-sapho-cyclic/`.
`frozen-integrated-final/report.json` combines passing tests/types/lint/build
from `frozen-integrated-2` with `runtime-repaired-2`, all at base `561152d` and tree
`506a6b698ff5c791a1f05a0700450dc6d13837516ecdef6a8f9d3d5eee752bd3`.
`runtime-smoke.json` and private rendered HTML retain actual source/continuation
counts and controls. Final checkpoint prose/reference evidence is a documented
post-proof overlay; `documentation-overlay.json` and `git-result.json` bind that
reviewed overlay and pushed revision. Relevant helpers, engine, controls and
tests stay identical to the frozen proof.
## Implemented contract
`{type:'card',card:'richese-juice-of-sapho',scope,event,mode}` accepts one of these current opportunities and discards the actual held card once:
@@ -27,7 +121,7 @@ The [battle-order follow-up](SAPHO_BATTLE_ORDER.md) connects first/last at a cle
boundary between actual battles. It does not implement the separate aggressor
mode discussed below.
Later battle aggressor intervention, normal/Black Market cyclic bidding, other ordered actions and partly completed movement remain unfinished. First/Guild competing priority is 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.
Later battle aggressor intervention, other ordered actions and partly completed movement remain unfinished. The current-lot cyclic prototype above supersedes the earlier normal/Black Market absence claim. First/Guild competing priority is 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.