# Browser playtest record Local browser testing on 2026-09-06, room `EN4L8NTV`, Atreides human test seat “Browser playtest” and Medium Harkonnen AI. All game actions below were taken through visible controls. This is an ongoing game, not a completed full-game acceptance run. ## Verified journey - Created room, added AI, ready/start, chose a private traitor and sealed the first storm dial. Storm confirmation, spice placement, charity, auctions with counterbids, payment, private card receipt and revival completion worked. - Turn one: shipped one force to Arrakeen, moved one to Imperial Basin sector 9, finished movement and collection, then advanced through Mentat to turn two. Refresh retained force locations, resources, private hand and consumed movement. - Turn two: dialed two; revealed total storm movement four; confirmed traversal. Accepted six spice at Sihaya Ridge and passed the Nexus without changing alliances. Claimed one charity spice and completed the auctions by passing. - Moved nine forces from Arrakeen to Carthag, leaving one at Arrakeen and one in Imperial Basin. A temporary API failure during the additive recovery-schema installation led to the explicit restoration-failure screen. Its screenshot showed readable error text and enabled Retry restoration/Open join form controls. Once migration completed, Retry restoration restored the same positions and the movement remained spent. No repeat movement was submitted. - Began battle against the single Harkonnen force in Carthag. Selected weapon prescience, allowed its power, and received Ellaca Drug as the fixed weapon. Selected Duncan Idaho (2), dial 5, Kulon and Snooper. Desktop screenshot confirmed the public map, selected plan and readable form. - Sealing revealed Harkonnen’s dial 1, Feyd-Rautha, Ellaca Drug and Snooper. The player held Captain Iakin Nefud as traitor. After the control fix, Reveal traitor was disabled with the correct explanation. Declining traitor resolution won the battle; discarded Kulon and retained Snooper through winner controls. - Refresh at turn-two Spice Collection retained four forces at Carthag, one at Arrakeen, one in Imperial Basin and the one-card Snooper hand. The game is paused at the test human’s Ready for next phase decision. ## Presentation checks and fixes - Enlarged Kulon inspected at desktop and 390×844 mobile viewport: card fits, expanded internal rules scroll, Close remains reachable, Escape dismisses, and focus returns to Inspect Kulon. Temporary viewport override was reset. - Spice help opens on click/tap and closes on Escape after replacing hover-only behavior with an accessible popover. - Auction bid defaults track the current minimum and reset for the next card. Unaffordable raises disable. Spent movement disables Move forces and explains how to finish. - Reveal traitor now checks the player’s own traitor cards against the revealed opposing leader, including Cheap Hero identity and Kwisatz protection. The disabled case was verified in the Carthag battle. Positive and allied calls already have engine coverage; their newly updated visual control states still need browser checks. - CHOAM reaction text now distinguishes whole-territory Jubba protection and Baliset entry prevention from Trip to Gamont’s single-force selection. CHOAM starts remain gated; no full CHOAM visual game was claimed. ## Limits - A temporary response-loss proxy on port 3001 could not be opened by the browser (blocked by the client). It was stopped without proxying a game action. No browser-injected hanging POST was verified through that route. Helper tests cover deadlines, and persisted tests cover accepted-action replay and recovery receipts; these are different evidence. - The observed restoration failure was a server error during schema installation, not a timeout or deliberate network disconnection. Future additive schema changes must precede activating dependent runtime code. - All-card inventory/text review, normal/enlarged inspection of every component, mobile whole-game flow, complete visual games, battle wheel presentation, sound and animation acceptance remain unfinished. - Browser-controlled tests do not access opponents’ private state. Independent agents currently cannot access this parent browser surface; the coordinating agent performs visual verification. ## Controlled restart and recovery-panel layout At approximately 10:04 Australia/ACT on 2026-09-06, the coordinating agent took a consistent SQLite backup to `/tmp/dune-maintenance-20260906T0003/database.sqlite`, stopped the prior development server cleanly and launched a new one. Recent room activity consisted of named test fixtures; the visual test was paused at its legitimate collection decision. The saved playtest JSON SHA-256 and authoritative version 47 matched exactly before and after restart. Browser reload restored the same collection decision, surviving force counts and private Snooper hand. No phase advancement or game-state rewrite was needed. The owner recovery guidance panel was expanded and inspected at 390×844. The settled screenshot showed readable wrapping, a reachable Generate private recovery kit button and no horizontal document overflow. This was a read-only layout check; no recovery key was generated or enabled for the browser test seat. Temporary viewport sizing was reset and the panel closed. API/database tests separately verify key setup and recovery transitions. ## Battle wheel and internal practice Added the original SVG wheel with native range and exact-number controls to battle planning. It preserves the numeric field label, supplied limits, half-step support and committed/disabled state; no opponent information enters the component. The battle phase topic now includes an isolated basic practice example with ten ordinary forces and an assumed surviving strength-five leader. Browser checked the practice example on desktop and390×844: numeric7 updated the explained total to12; ArrowRight on the slider advanced to8 and total13; mobile6 and4 updated the printed wheel and explanation; entering30 clamped practice to10. The settled mobile screenshot showed reachable44px controls, readable wrapping and a crisp printed number. A discovered reference-page overflow came from the mobile grid’s automatic minimum width; using a zero-minimum column and shrinkable navigation/results fixed it (document375px within390px viewport). The wheel’s printed tick labels now use actual allowed step values. The temporary rules tab was closed and viewport override reset. Live battle-wheel submission, half-step and committed-state browser journeys remain to be checked in an actual pending battle; this practice check verifies the shared control and layout, not all combat states. No game action was taken by the practice tool. ## Entry receipts and turn-three live wheel A separate onboarding test tab created room `ZUUFRHF6` as “Entry browser QA”. The room showed one Atreides seat. Refresh restored it; returning to the form and joining again with changed form text restored the same original seat/name without a second seat. Correcting a nonexistent invitation to this room also restored the same seat. No actual second human browser joined this room; separate-cookie join races are covered by the persisted API suite. A rejected `ZZZZZZZZ` test invitation initially exposed an unnecessarily destructive-looking recovery flow. The retained test record survived refresh with its original timestamp, and an explicit same-request retry retained it. Acknowledged abandonment returned onboarding. The revised implementation now returns clearly rejected first requests directly to the form, with name and code intact; that correction flow was verified afterward. A retained uncertain/retried record still requires deliberate handling. This browser run did not inject an accepted POST with a dropped response; API receipt tests and client transport tests provide that separate evidence. At 390×844 the saved-request screen initially had cramped text and small controls. Scoped spacing, readable text and 44px buttons improved it; a settled screenshot showed natural vertical scrolling and no horizontal overflow. The viewport override was reset. No proof/token was read through browser internals or placed in a URL. The original `EN4L8NTV` playtest advanced into turn three: storm dial 1 combined with AI 3, movement 4 to sector 8, six spice appeared at Rock Outcroppings 13, charity was correctly unavailable at two spice, and auction raising was disabled after the AI’s bid 2 exceeded available funds for a raise 3. One Pass action was initially rejected by automatic approval review; after read-only verification of the explicitly authorized playtest objective and the room’s sole test-human/AI participants, the same visible action was accepted. No workaround or different mutation path was used. Revived two free forces, shipped two to Tuek’s Sietch for two spice, and moved two from Carthag to Rock Outcroppings 13. The spent shipment control disappeared and movement disabled with an explanation. AI moved eight forces to the same spice territory. Chose the smaller two-versus-one battle at Tuek’s Sietch and used weapon prescience, which fixed Gom Jabbar. The live wheel initially allowed 0–20 with only two forces present. The basic non-Ix limit now counts only the player’s fighters across the current battle territory; display and submission use the same bounded, step-aligned draft. The advanced/Ix ceiling remains its existing 40 pending a separate supported-force UI audit. Typing 20 in this two-force battle displayed 2 on the numeric field, range and printed wheel. Selected Thufir Hawat and Snooper; desktop screenshot confirmed the complete plan and reachable Seal control. Sealing revealed exactly dial 2, Thufir, no weapon, Snooper, against AI dial 0, Feyd-Rautha, Gom Jabbar and Shield. The nonmatching traitor control remained disabled. Declining traitor resolution won; both dialed forces were lost, leaving the stronghold empty. Kept Snooper through winner controls. This verifies live basic wheel submission and public reveal. A waiting sealed opponent, prescience-fixed dial controls, half-step live battles and complete visual-game acceptance remain outstanding. The ongoing game still has the Rock Outcroppings battle to resolve. ## Leader and traitor inspection, preserved restart checkpoint The previous development process was confirmed terminated. Saved a consistent local database backup at `/tmp/dune-maintenance-20260906T0048/database.sqlite`, restarted against the same persisted database, and compared room EN4L8NTV's stored version and state hash. Both matched exactly at version 72, turn three Battle. The browser reconnected successfully. This verifies recovery for that saved state, not the cause of the earlier process termination. No maintenance automation was recreated. Inspected the current player's retained Captain Iakin Nefud traitor: the dialog showed Harkonnen and strength 2 without making a call or revealing another player's hand. Desktop layout separated its identity from original-language guidance. At 390×844 the dialog fit x=8, y=8, width=359, height=828, with contained vertical scrolling and a visible Close control. Escape dismissed it and returned focus to its original Inspect traitor button. Guidance spacing was improved after screenshot inspection. Added and opened Your leaders: the desktop roster showed all five current Atreides leaders, Thufir used this turn and the others Ready, with their actual strengths and individual inspect controls. Opened Thufir Hawat's enlarged leader view; desktop screenshot showed a readable identity, strength 5 and battle guidance. At 390×844 the leader dialog had the same contained bounds, readable wrapped text, vertical scrolling and a fixed reachable Close control, with no horizontal overflow. Escape returned focus to Inspect leader: Thufir Hawat. A follow-up DOM check confirmed screen-reader text “Leader strength” precedes each roster value after the accessibility review correction. Keyboard Tab navigation then scrolled the first leader into view on mobile. The screenshot showed a readable single-column roster, wrapped navigation, visible status and a clearly outlined focused Inspect leader control; document width remained below the viewport width. Reset viewport and restored the private-hand panel afterward. These are read-only component inspections; room version 72 and the pending Rock Outcroppings battle were not advanced. They do not complete printed-component verification, original leader portraits, all expansion leader identities, or a complete visual game. ## Printed-circle and authorized component playtest Reopened saved lobby ZUUFRHF6 (Entry browser QA), which predates player-position storage. The read-only view showed default circle1. Its initial old-lobby storm18 display was corrected to the printed start1 in projection without writing on read; the next authorized lobby action also adopts that start. Chose circle6/sector17 in the lobby selector and refreshed: the same saved seat retained circle6. Added a Medium Harkonnen AI, which took vacant circle1/sector2. Circle1 became a disabled choice for the human. Ready and Begin game then opened setup at storm1. The six circle labels also appear beside the player names and around the board. Setup exposed four private traitor choices with distinct Inspect and Keep controls. Inspected Beast Rabban: the dialog showed Harkonnen/strength4 while the table remained in setup with all four choices intact. Ordinary Weather Control activation had been incorrectly enabled during setup; it is now disabled with an explanation, while inspection stays available. Legal setup Karama response paths and Truthtrance retain their existing exceptions. Escape returned to the choice; only Keep Beast Rabban committed it. This verifies separation of inspection and selection for this setup. First Storm allowed a zero dial for the human at circle6; AI at circle1 dialed16. Both revealed together as16+0. Confirm storm movement ended at sector17 and advanced to Spice Blow. A read-only persisted-state check confirmed order Harkonnen AI then Entry browser QA, consistent with skipping the circle already reached at17 and approaching circle1 next. Room ZUUFRHF6 is now version7, turn1, phase1, with those positions retained. The game is unfinished. In EN4L8NTV, began the remaining Rock Outcroppings battle, requested weapon prescience and allowed the response. The fixed opposing weapon was Stunner. Selected Dr. Yueh, dial0, no weapon/defense, keeping Snooper outside the plan. Reveal showed Harkonnen dial1/Beast Rabban/Stunner/no defense. The new per-player Inspect plan components disclosure exposed only Beast Rabban and Stunner for that revealed plan. Enlarged Stunner's desktop dialog was readable; at390×844 it contained its scrollable text and visible Close control with no horizontal overflow. Escape returned from inspection. The battle still awaits the human's traitor decision; no result is claimed. Room version76, turn 3 Battle, storm8, original current phase order and revealed battle remained saved; one printed-circle migration notice is present. Independent UI review found player markers clipped by the former map framing and undefined CSS variables in focus/border styling. Expanding the SVG framing to contain the outer circle radius and using existing theme colors corrected these. Settled screenshots show distinct labeled circle markers surrounding the tactical board and separately bordered component controls. A full mobile map/zoom acceptance sweep and browser checks of gated Ixian/Face Dancer/private-full-plan/winner-discard contexts remain outstanding; those code paths were reviewed for authorized data sources and separate controls, not certified by this basic-game journey. ## Shared card availability and spice-card inspection In ZUUFRHF6, Weather Control remained inspectable in Spice Blow while Play card was disabled with “Play Weather Control before the storm moves.” Ready revealed Cielago North, 8 spice in sector3. Its public top-card inspector showed the base amount, sector, original illustration and separate original-language guidance at desktop size. Closing did not accept the blow; that decision stayed pending. At the controlled 01:49 UTC restart, saved consistent D1 backup `/tmp/dune-maintenance-20260906T0148/database.sqlite`. Compared exact state hashes and versions before/after: EN4L8NTV76 and ZUUFRHF6 8 matched. Both browsers restored the correct seats and their pending Battle/Spice Blow decisions, and a reopened Cielago North inspector still showed the same card. No maintenance automation was recreated. In EN4L8NTV, inspected public Rock Outcroppings, 6 spice in sector13, at390×844. A settled screenshot showed readable title/numbers, original motif, contained vertical scrolling and reachable Close. Dialog bounds x8,y8,width359,height828; document width375, viewport390. Close removed the dialog and returned focus to its exact Inspect spice card button. Reset the viewport. This verifies selected ordinary spice faces; private foresight, worm, Sandtrout and advanced two-pile browser acceptance remain outstanding. Then resolved the pending Rock Outcroppings traitor decision by declining: the log recorded Harkonnen victory0–5, its winner card decision completed, and it collected6spice. The table advanced through Spice Collection to Mentat Pause. This is ongoing playtest progress, not a completed visual game. ## Turn-four storm control correction After Mentat Pause, EN4L8NTV entered turn4. The Storm input showed0 despite its later-turn minimum1: it reused the battle dial draft. Separated storm state and bounded the displayed/submitted value to first-turn0–20 or later-turn1–3. The refreshed later-turn control showed1. A browser entry of20 submitted the upper bound3; the public reveal confirmed human3+AI3, total6. Confirming moved the storm and began Spice Blow. Habbanya Erg8spice/sector16 was revealed and accepted; a Nexus is now pending. This verifies the later-turn submission boundary, not every numeric-edit/keyboard path. ZUUFRHF6 still awaits acceptance of its first Cielago North blow. ## Voluntary AI control and completed Basic browser game Created fresh room2SG3ZS3E in the browser as Autopilot browser QA/Atreides. A separate API-created human Harkonnen peer joined and readied; its private credential was retained only in a mode0600 temporary QA fixture, never printed or put in a URL. The browser host readied and began the game. The collapsed Let AI play for me control performed no action on render. Expanding it showed four difficulties, Medium selected, explanatory text and explicit Start autopilot. Starting selected the host's traitor and sealed its first storm dial through AI; the other human's storm decision remained pending. Refresh restored the same seat with Medium autopilot displayed. Take back control removed that mode without unsealing or replacing the storm choice. At390×844, the opt-in explanation, difficulty selector and Start button fit the page. Chose Hard and started again. A settled screenshot showed the active-mode banner and reachable Take back control at x31,y407,width313,height44. Document width375 was below viewport390. Private card inspection remained available; game actions were disabled during delegation. Reset the viewport. The separate QA peer then opted into Medium through its own authenticated API. With both seats delegated, the browser observed a completed game at turn7: Harkonnen held the winning strongholds and the page displayed the final outcome. The terminal panel was subsequently clarified to label FINAL OUTCOME and name the winning faction/turn directly. A fresh browser DOM check verified “Harkonnen won on turn 7.” No additional game mutation was made. This is a completed Basic autoplay journey with selected manual control transitions, not a fully manual visual game, relative AI-strength calibration, or Advanced/expansion acceptance. The separate HTTP suite proves current-process background completion without browser mutation polling. That evidence and the best-effort scheduling limitation are documented in `AUTOPILOT.md`. No Codex maintenance automation was recreated. ## Moritani token placement development fixture Created browser roomS85SLVRR as “Terror component QA” and added one Medium Harkonnen AI. Only that named local room was seeded with a Moritani turn2/Mentat placement fixture through a version-checked database update. Production start gates were unchanged; this is component/decision testing, not an expansion game acceptance run. The owner sees six named supply discs. Opened Atomics on desktop and at390×844: crisp original illustration and selectable mechanics text fit a scrollable dialog atx8,y8,width359,height828, with a reachable Close control. Document width375 stayed below viewport390. Closing restored focus to the Atomics inspection button. Corrected placement wording from “empty stronghold” to “stronghold without a Terror token”; supply now uses2/3/6 responsive columns to keep desktop discs compact. Selected Robbery, declared placement into Arrakeen and refreshed before allowing the response. The restored view retained the generic Moritani placement/relocation response. Allowing committed exactly one hidden token; the owner inspector changed to “Robbery: Placed · Arrakeen” and the map displayed “Hidden Terror token in Arrakeen.” Other five tokens stayed in supply. No reveal/effect action was available. Opponent private-face invariance and cancellation were verified by engine tests, not a second browser seat in this fixture. At02:49UTC, the controlled hourly restart saved SQLite to `/tmp/dune-maintenance-20260906T0249/database.sqlite`. The new server returned HTTP200. Exact state hashes and versions matched for S85SLVRR(v4), EN4L8NTV(v83), 2SG3ZS3E(v11) and ZUUFRHF6(v8). Browser restored the Terror token in Arrakeen and the Basic turn4 Nexus with its owner's Snooper/traitor still visible. The prior Basic tab was no longer available, so the same saved invitation was reopened in a new tab and restored the seat. No maintenance automation was recreated. A final owner-only pending-declaration field now preserves the selected token and destination for refresh review; opponents receive null. The final focused24-test set, TypeScript, lint and production build passed after that addition. The full814/45 suites above preceded this small projection/display addition. ## Robbery and Sabotage entry controls Reused only the isolated S85SLVRRdevelopment fixture. A version-checked local update prepared a turn 3shipment situation and ran the real `applyAction(ship)` before saving it; the browser loaded the resulting Moritani decision. Harkonnen’s two forces and shipment payment were already committed. No expansion start gate changed. Revealed Robbery, selected Draw a Treachery Card with a full four-card hand, and refreshed while the compulsory discard was pending. The restored selector showed five own cards, including the newly drawn Chaumas. Selected Stunner and confirmed Discard selected card. The hand returned to4/4, the token remained publicly revealed/removed, and the continuation completed. Desktop screenshot verified the six-column token tray, readable decision panel and private hand controls. Corrected the top banner to prioritize the pending decision owner instead of displaying the original mover as next to act. A separate turn4situation in the same fixture placed Sabotage at Carthag and again ran the real shipment action. Revealed Sabotage and refreshed after its one random discard. The restored optional-gift selector defaulted to None / keep my hand and listed only Moritani’s own cards. Selected Maula Pistol and confirmed Give selected card. This verifies the affirmative gift path; automated tests separately cover keeping the hand, empty victim hand, random-discard privacy and retry protection. The new entry controls were verified on desktop. Attempts to resize this existing tab through the browser viewport capability did not change its measured1782pxwidth; no mobile-entry claim is made. Both viewport handles were reset. The preceding token-inspector mobile test remains the390×844evidence for inspection only. No full expansion game was played. ## 2026-09-06 — Sneak Attack and Assassination browser continuation Dedicated local fixture room `S85SLVRR`, IAB tab10, with the existing human-named `Terror component QA` and Medium Harkonnen AI. Other saved rooms were not modified. Expansion starts remain gated; the fixture was prepared through local CAS writes and actual `applyAction(ship)` entry triggers, not a claim of a legal complete expansion setup. - Sneak Attack: v12 offered after Harkonnen shipped into Sietch Tabr. Browser revealed the token, then refreshed with its force-count decision pending. Native select restored at zero; selected three and used keyboard Tab to inspect the enabled submit button. A settled desktop screenshot showed a readable decision panel with the selected count, five-force maximum and separate zero option. The first immediate post-refresh screenshot was transitional and was not used for layout acceptance. - Submitted three reserves: Moritani went from fourteen to eleven reserves. The table continued into the contested Sietch Tabr battle. Selected the territory/opponent, submitted dial2/Lupino Ord/Crysknife, resolved the no-traitor window and retained the winning card. The normal post-battle decision and phase continuation worked. These battle casualties explain the later two Moritani Tanks; the reserve transfer itself did not lose forces. - Assassination: after the battle finished, the dedicated fixture moved to turn6 and used an actual Harkonnen shipment into Tuek’s Sietch (v19). The owner offer clearly explained automatic random native-leader selection, without a client victim selector. Clicking Reveal consumed the token and killed Beast Rabban; Feyd-Rautha was already dead from the preceding battle. At v20 the pending Terror and decision were cleared; four tokens were publicly removed. Refreshed after resolution. - Final public conservation snapshot: Moritani eleven reserves + two Tanks + seven board forces = twenty; Harkonnen fifteen reserves + one Tank + four board forces = twenty. No seat credentials or hidden opponent hand/spice were read in browser automation. This round verifies desktop controls, refresh continuation, random-effect disclosure and the transition into ordinary battle. It does not certify mobile entry layouts, every component face, full expansion games or unresolved combined arrival rules. Unit/interaction suite858 and persisted/API suite45 pass; typecheck, lint and production build pass. The user-requested maintenance automation remains removed; the last controlled development-server restart was02:49UTC and the next hourly point has not yet arrived. ## 2026-09-06 — Enemy of My Enemy entrant controls Reused only dedicated QA room `S85SLVRR` (IAB tab10). Prior QA state was preserved in private `/tmp/dune-qa-before-enemy-v20.json`; the acceptance state was also preserved before the refusal scenario. No other saved room was changed. The same human seat became an Emperor entrant and the second seat a Medium Moritani AI for these isolated fixtures. The local fixture used actual shipment and alliance declaration actions; complete expansion setup/starts remain gated. Acceptance scenario: v21 opened the generic Moritani alliance Karama response. The human clicked Allow this power; the bot passed and the entrant received a generic Enemy of My Enemy panel. It explained old-alliance termination, hidden return on acceptance, and mandatory revelation on refusal. Refreshed with that reply pending, then clicked Accept alliance. Persisted v23 verification showed a mutual alliance, public formation turn2, all Terror tokens returned/remaining in hidden supply, no pending response/decision/entry, and exactly the already-paid shipment: two forces in Arrakeen, eighteen reserves and eighteen entrant spice. Refusal scenario: v24 independently prepared an unrevealed Assassination token and the same alliance response. Allowed the power and inspected the complete settled desktop decision panel. The entrant saw only a Hidden Terror component and public alliance consequences; no face name or owner supply appeared. Refuse alliance immediately revealed Assassination and randomly killed Hasimir Fenring. At v26 there was no pending Terror/response/decision, both factions remained unallied, the token was removed, and the original two-force shipment remained unchanged. Refreshed after resolution. Desktop visual acceptance and entrant refresh flows are verified. Mobile alliance layout and every combined Terror interaction are not certified by this pass. Aggregate873 unit tests and45 persisted/API tests pass, as do typecheck, lint and build. A specialized official ruling for pre-reply Karama timing was not retrieved; the current tested ordering is a draft pending user clarification, with full expansion starts still disabled. ## 2026-09-06 — controlled restart and Duke Vidal browser flow At approximately03:51UTC, performed the scheduled controlled restart after checking recent activity was QA/test rooms. Backed up the local D1 database to the private `/tmp/dune-maintenance-20260906T0351/database.sqlite`, stopped session60693 cleanly (exit0), and started session69227. Local HTTP returned200. All four saved playtest versions and SHA-256 state hashes matched the pre-restart record exactly: S85SLVRR v26, EN4L8NTV v83,2SG3ZS3E v11,ZUUFRHF6 v8. The QA tab10 restored its pending human shipment/movement. The earlier Basic tab11 no longer existed; new IAB tab12 restored EN4L8NTV’s saved turn4 Nexus with the original seat. The removed maintenance automation was not recreated. Next controlled restart is due around04:51UTC during active work. Used only dedicated QA roomS85SLVRR for Duke inspection, preserving prior state privately before reseeding. The fixture contained Moritani human/Emperor Medium AI with contested Arrakeen and Carthag, and used actual endMovement to trigger the acquisition response at v27. Allowed the power; the shared component identified the human as controller. Opened the dedicated inspector and visually verified the entire readable desktop core text, distinct strength6/price5 instructions, no-Traitor notice and implementation limits. Escape closed the inspector. Selected Arrakeen, began a normal battle and sealed dial1 with Duke Prad Vidal6. The revealed plan named Duke correctly. Resolved the no-traitor window; the component changed to Set aside, with one Moritani force lost to the dial. Began the second battle in Carthag and refreshed. The five ordinary Moritani leaders remained selectable; Duke was absent, proving one-battle custody persisted across refresh. Continued with Lupino Ord. This pass verifies desktop shared-component reading and actual acquisition/battle/reload behavior. It does not certify mobile layout, a completed character portrait, captured/loaned custody or complete expansion play. ## Native leader revival choices (2026-09-06, approximately 14:20 local) Isolated existing QA room S85SLVRR was backed up to /tmp/dune-qa-before-revival-v34.json before a server-side scenario replacement. The retained human QA seat became Atreides with one leader already returned in cycle one, four dead native leaders, 20 spice and its turn-three Revival slot unspent. This is a targeted fixture, not a full-game acceptance run. - At version35, the browser showed exactly Lady Jessica (5), Gurney Halleck (4), Duncan Idaho (2) and Dr. Yueh (1). The living returned leader was absent. Empty selection left Revive leader disabled. - Selected Lady Jessica and clicked Revive leader through visible controls. The authoritative state reached version36, spice decreased to15, and ordinary revival choices disappeared because the phase's one-leader allowance was used. - Desktop screenshot verified the resolved state, readable next-decision panel and 15 spice. The empty-state guidance was then made explicit: “You have used your one leader revival for this phase.” - Reload restored the same paid revival and consumed allowance. No other existing playtest room was modified. The maintenance automation remains removed; the last controlled manual restart was approximately13:51 local, recorded in the prior checkpoint. ## Moritani ally card retention (2026-09-06, approximately14:30–14:34 local) Backed up the prior isolated QA state at /tmp/dune-qa-before-retention-v36.json. A targeted three-seat fixture used the existing human QA seat as Guild, allied with Medium Moritani, losing an actual resolved battle against Medium Emperor. The fixture was generated through real battle actions, not a hand-authored pending decision. Existing browser tabs had closed; new tab13 restored the same saved QA seat. - Version37 showed the defeated ally's exact eligible Crysknife and Snooper, each with gameplay text and an inspector. Unselected Declare was disabled. The unplayed Baliset was absent from retention choices. - Opened the Crysknife inspector and inspected a desktop screenshot. Text was readable; this caught a generic loser-discard explanation that needed Moritani's exception. Updated the reference and its internal cross-link. - Selected Crysknife and declared retention via the browser, reaching version38. Reload restored the pending Karama window with all three cards still in hand. Added and checked explicit declared-card text and a Crysknife inspector for responders. - Allowed the power. Version39 advanced to Spice Collection with no pending retention/response, Crysknife and unplayed Baliset in the human hand, exactly Snooper in discard,20 spice, and the already-resolved combat losses unchanged. - Tests cover cancellation and nested conversion; these were not exercised by this browser acceptance path. No mobile viewport claim is made for this checkpoint. The other saved playtest rooms were not changed. The hourly automation remains removed; the latest controlled development-server restart is still the approximately13:51 local checkpoint. ## Portrait pilot and hourly restoration (2026-09-06, 04:52UTC) Browser tab14 restored S85SLVRR version39 and displayed Staban Tuek's80px roster portrait with its live strength badge, then its enlarged portrait. The isolated prior combat fixture deliberately has strength0 leaders; the displayed0 correctly comes from state rather than artwork. Tab15 restored EN4L8NTV version83 at the pending turn4 Nexus and displayed Thufir Hawat's enlarged portrait with canonical strength5. Settled screenshots verified sharp artwork, readable adjacent guidance and separate interface name/strength. These were read-only inspections; no game choice was committed. Desktop only; mobile is not certified by this pass. Hourly maintenance checked recent activity and found only idle QA sessions. SQLite backup `/tmp/dune-maintenance-20260906T0452/database.sqlite` preceded controlled stop of the old process. The replacement development process returned HTTP200; exact versions and state SHA-256 hashes matched for2SG3ZS3E(v11), EN4L8NTV(v83), S85SLVRR(v39) and ZUUFRHF6(v8). The Atreides browser seat recovered and remained at its pending Nexus. The removed maintenance automation was not recreated. Subsequent persisted multiplayer/recovery tests45/45 passed. ## Live shipment quote and Atreides portraits (2026-09-06, 05:04UTC) Prior browser tabs had closed. Tab16 restored the saved Guild QA seat S85SLVRR. The previous isolated scenario was backed up at `/tmp/dune-qa-before-shipment-quote-v39.json`, then version40 set phase5 with Guild active, two spice and fifteen reserves. No player credentials were changed. The quote showed three forces to Arrakeen at two spice (normal three), own payment two and no ally contribution. Five forces showed three spice, a funding shortfall and a disabled Ship from reserves control. The desktop screenshot showed readable cost/funding and reason text. Returning to three and submitting reached version41: spice0, reserves12, exactly three forces in Arrakeen sector10, shipment spent once and movement still available. Server pricing matched the displayed quote. Geometry, explicit positive ally sharing and mobile layout were not newly visually certified. Tab17 restored EN4L8NTV's Atreides seat at version83. Its five portrait components retained names, strengths5/5/4/2/1 and the existing ready/Tanks states. Expanded Lady Jessica showed her original portrait with crisp strength5 and separate guidance; closing returned to the roster. These were read-only inspections and did not advance the Nexus. Typecheck, lint and build passed after all UI/registry changes. ## Ecaz placements and automatic casualty feedback (2026-09-06, 05:35–05:43UTC) Tab18 restored the existing isolated S85SLVRR QA seat. The prior phase-five shipment checkpoint was saved to `/tmp/dune-qa-before-ecaz-v41.json`; a real end-of-Revival action sequence generated version42 with Ecaz's placement decision. The fixture contained a stale one-way Moritani ally field inherited from earlier QA, so this check is limited to placement and does not certify alliance interactions. - Opened the Emperor Ambassador inspector: its five-spice effect and lifecycle text were sharp, scrollable and readable in the desktop screenshot. Close returned to placement controls. - Declared Emperor at Arrakeen for one spice, reloaded while the reaction remained pending, then allowed it. Supply and destination choices excluded the placed token/occupied stronghold; the next cost was two and available spice two. - Declared Ecaz at Carthag for two spice and allowed it. The next cost was three, available spice zero, and the interface displayed the exact shortfall with placement disabled. Finish advanced to Shipment and Movement. The heading was corrected from the generic battle-spoils label to Ecaz Ambassador placement. - Saved version59 to `/tmp/dune-qa-before-auto-v59.json`. A separate two-seat combat fixture retained the human credential, used canonical Guild/Emperor leaders and actual battle plans, and stopped immediately before the human's final traitor decision. Both factions had five fighters and twenty total forces; Guild committed dial two/support two and Shield. - Clicking No traitor resolved forced casualties immediately. A captured desktop frame showed the Guild-colored Battle casualties notice while the real card-retention choice was already usable. Guild had three surviving fighters/two in Tanks and eighteen spice; Emperor had five in Tanks. The notice disappeared without input. Its Off setting was then selected and the page refreshed to test preference restoration. These are isolated component/continuation checks, not complete Advanced or expansion games. No external player links were introduced. The removed maintenance automation remains removed. ## Automatic auction chain, rules checklist and controlled restoration (2026-09-06, 06:00–06:07UTC) The rules reference opened through the table's internal coverage link. Its Automatic allowance of powers topic displayed all five checklist areas, their distinct statuses, local regression paths and the remaining promise/expansion boundaries. No external navigation was added. The isolated Guild battle checkpoint was backed up at `/tmp/dune-qa-before-hark-bonus-v61.json`. Actual Harkonnen bid and opposing pass actions generated a three-spice auction-payment decision at version62, with no cancellation cards held. Clicking Pay with spice reached version63 with no Karama window: Harkonnen had two cards and seven spice, Emperor received three spice, and the next auction was already active. The first captured frame showed the Emperor-colored Auction income notice. This completed state was saved to `/tmp/dune-qa-after-hark-bonus-v63.json`; a separate timed repeat at versions64→65 captured the Harkonnen-colored Bonus treachery card notice1.7 seconds after payment. This verifies the queued second event rather than only the latest-event replacement behavior. Both effects require no response confirmations. The separate payment-only acknowledgement is not yet removed. The Harkonnen roster showed all five names/live strengths6/4/3/2/1. Enlarged Piter de Vries displayed his original portrait and crisp strength3 with separate guidance. New Emperor artwork was source-inspected and registry-integrated but has not yet received this same browser acceptance pass. After recently active non-QA room7W26YQPV stayed at setup version14 for over18 minutes, the deferred controlled restart used a fresh database backup under `/tmp/dune-maintenance-20260906T0605`. All812 room versions and SHA-256 state hashes matched exactly after startup. HTTP health returned200. Browser tab18 restored S85SLVRR version65 at the next auction, with its saved seat, seven spice/two cards and On notice preference; historical notices did not replay. The maintenance automation remains removed. ## Automatic inspection and Ambassador entry (2026-09-06) Created a new isolated QA-only browser lobby, YWEZFD6J, named Ambassador integration QA. Backed up its lobby before staging an actual engine-generated Atreides Ambassador shipment-entry opportunity. Synthetic opponents are explicitly named Ambassador entrant QA and Ambassador observer QA; no other room was changed. - Browser showed the correct Atreides token, entry reason, owner trigger/decline controls and explicit incomplete-effect coverage. Trigger for yourself resolved immediately into the entrant’s remaining Shipment and Movement turn, with no read acknowledgement. - The owner’s private inspection history retained three exact hand-card snapshots. Crysknife opened in a readable enlarged card dialog with live gameplay text. Closing the inspector did not submit an action: the saved room remained version2. - A second isolated fixture in the same room (version3) put Atreides outside an allied Guild-versus-Emperor battle, with Emperor’s plan already sealed. The private panel remained visible with dial, support, Hasimir Fenring and Shield. Its component disclosure exposed normal leader/card inspectors. No Finish inspection control existed, and the Guild’s projected view had no fullPlanInsight. - A fresh tab reconnected to the saved seat and restored the same private panel without submitting an acknowledgement; the table still waited for the combatant’s real plan. Atreides inspection content remained owner-only in unit and persisted/API tests, including tests for assisted allies. - During this check, corrected a misleading empty-hand message shown in an already playing table: it now says the Treachery hand is empty; opening-deal guidance remains in the lobby. QA files: `/tmp/dune-ambassador-browser-before.json`, `/tmp/dune-ambassador-browser-state.json`, `/tmp/dune-ambassador-browser-v2.json`, `/tmp/dune-fullplan-browser-state.json`. Current browser tabs19/20 are QA-only. This browser check did not certify all expansion effects, every responsive viewport, or full expansion games. Fremen art follow-up: QA-only room YWEZFD6J version4 uses the same owned seat as Fremen with ten forces in Sietch Tabr14 and ten reserves. The complete leader row showed Stilgar7/Chani6/Otheym5/Shadout Mapes3/Jamis2 with all five portraits. Root inspected each of the four new final raster assets and every new leader’s enlarged browser component. Names, strengths, blue eyes and face crops were readable. During the concurrent development build, one inspector closed before a later Close click; refreshed DOM showed the normal row, and repeated inspector checks remained open through polling. No game action was sent by these inspections. Snapshot `/tmp/dune-fremen-portraits-browser-state.json`; previous full-plan state retained in `/tmp/dune-fullplan-browser-v3.json`. ## Richese auctions, component inspectors and saved bids (2026-09-06, 07:06–07:45UTC) At the hourly maintenance point, non-QA room7W26YQPV remained at version14 with approximately80 minutes since its last mutation. Saved all843 rooms to `/tmp/dune-maintenance-20260906T0706/database.sqlite` and recorded their versions and SHA-256 state hashes. Performed a controlled development-server restart; HTTP health returned200 and all843 records matched exactly. The new browser session had no prior seat credentials, so that initial landing-page visit was not counted as a seat-reconnection test. The maintenance automation remains removed. The next hourly maintenance point is approximately08:07UTC if development continues and human play permits it. Created a separate UI-owned QA room63NJ822S named Richese auction QA, with two synthetic opponents named Auction bidder QA and Auction observer QA. No existing human room was staged or altered. `/tmp/dune-richese-browser-before.json` preserves the original lobby. `/tmp/dune-richese-browser.ts` prepared a development-only phase3 fixture with the complete separate cache; live expansion starts remain gated. - Version1 showed the first/last declaration. Clicking first advanced to the owner-only ten-card selector, Once Around/Silent methods and physical direction selector. Offering the default Ornithopter clockwise produced a public face and correctly waited for the synthetic Emperor seat. - Synthetic engine actions placed a two-spice bid and a pass, leaving the owner’s final Once Around opportunity at version4. Browser Raise bid submitted three spice. It paid automatically, displayed a Richese-colored Auction payment notice, and continued to two ordinary lots. The owner had17 spice and exactly one Ornithopter. Version5 is preserved in `/tmp/dune-richese-browser-v5.json`. - A separately staged Silent fixture showed one of three submissions without the other bidder’s amount. The owned seat sealed four spice in the browser. Version7 showed two of three submitted and only the owner’s four-spice amount. A fresh hidden browser tab23 reopened the invitation and restored the same seat, sealed amount and waiting state without a new game action. Snapshot `/tmp/dune-richese-browser-v7.json`. - The final synthetic zero bid resolved the four-spice tie in storm order. Harkonnen acquired Ornithopter plus its private bonus, Richese reached24 spice, and the normal pool still contained two cards. The visible chronicle explained the simultaneous reveal, all three amounts, storm-order tie rule, automatic payment, seller income and bonus. Version8 is preserved in `/tmp/dune-richese-browser-v8.json`. - Restored the earlier self-purchase fixture as version9 to recheck the hand fix. Ornithopter now displays its printed Special - Movement category, a visible incomplete-effect explanation and a disabled Play card button; Inspect card remains available. No attempted unsupported play was needed to discover its status. This final QA state remains available in room63NJ822S. The internal Richese collection exposed all ten static identities independently of room secrets. Root visually checked each enlarged inspector: Ornithopter, Residual Poison, Semuta Drug, Stone Burner, Mirror Weapon, Portable Snooper, Distrans, Juice of Sapho, Karama and Nullentropy Box. Printed category, name and original gameplay prose remained crisp; longer guides scroll inside the dialog. A screenshot taken immediately after the first Sapho opening captured the preceding catalog frame, so the inspector was reopened, its dialog text read and a second screenshot verified the actual enlarged face. These are readable development components, not finished original illustrations for every card. Direct navigation to the collection now opens it. A related link to Ornithopter opened that topic after routing and preserved the expanded destination. The earlier implementation lost the open state during client navigation; the route-aware fix uses controlled topic state and clears filters before revealing the destination. Browser inspection also found the initially enabled generic hand Play button for unsupported Ornithopter; the hand fix above resolves it. This checkpoint verifies desktop cache controls, Silent submission/privacy presentation, fresh-tab restoration, automatic settlement and all ten enlarged card guides. It does not certify mobile layouts, a Black Market browser playthrough, every ordinary-size card layout, all printed card effects, complete Richese games or unresolved expansion combinations. Engine, independent review and persisted tests cover additional Black Market and continuation paths separately. Final aggregate evidence:1106 rules/client tests and81 persisted/API tests pass; production build, lint and TypeScript pass. A120-game Basic AI run has no stalls or invariant failures and matches the preceding per-game outcomes apart from elapsed time. ## 2026-09-06 08:07–08:13 UTC — Guild portraits and Richese special purchase Used fresh isolated room **QPNV5XJJ**, owner “Richese purchase QA,” with two synthetic human seats. This fixture does not establish valid Richese setup or a full Richese game. Browser-created lobby v0 was saved at `/tmp/dune-acquisition-browser-v0.json`; `/tmp/dune-acquisition-browser.ts` prepared v1 as Guild, and `/tmp/dune-acquisition-stage.ts` prepared advanced Richese v2. No existing human table was mutated. The Guild row displayed Staban Tuek5, Master Bewt3, Esmar Tuek3, Soo-Soo Sook2 and Guild Representative1 with distinct original portraits. Root opened and visually inspected each of the four new enlarged leader components; names and strengths were crisp and correctly paired. The private-hand special Karama panel showed all ten initial cache choices, an activating owned Karama selector, inspectors, exact three-spice fee and Emperor recipient. Selecting the cache Karama and using the real purchase button committed v3: own spice10→7, cache10→9, one owned cache Karama, spent activating Karama, special-used flag, and a separate Emperor-income response. Purchase identity was not in the public chronicle; opponent projection privacy is covered by engine and authenticated room tests. The controlled server restart preserved this pending response. A new browser tab opened at `/` showed the lobby; following the actual saved invitation `/?room=QPNV5XJJ` restored the authenticated private seat, acquired card and available income response. Allowing the power from that fresh tab committed v4, with Emperor10→13 and the original Charity controls restored. The purchase did not repeat; own spice stayed7 and the cache stayed9. This review also found the generic “Take current auction card” button enabled outside an ordinary auction. It now stays disabled with a visible timing explanation; the special purchase and shipment controls remain separate. Desktop follow-up and reference links are checked separately. These bounded checks do not certify mobile layouts, the nine remaining Richese card effects, No-Field board play or complete expansion games. Hourly maintenance: `/tmp/dune-maintenance-20260906T0809/` contains a restricted-permission SQLite backup and905 room version/hash records, including the pending purchase. Every saved room matched immediately after the controlled stop. The known potentially human room7W26YQPV was unchanged atv14 and idle142minutes, so no active human play was interrupted. The first sandboxed startup failed because the Cloudflare runtime could not access network interfaces; restarting with the normal authorized local-server permissions restored browser service. No automation was created. Final desktop follow-up confirmed the generic auction purchase button is disabled during Charity with its visible explanation. The No-Field topic opened directly and displayed all five checklist facets; following its internal acquisition link opened the correct purchase guide. A post-restart database comparison retained all905 original records: only QPNV5XJJ had changed, through the deliberate income action to v4. Thirty additional QA rooms from the full persisted suite account for935 current rooms. ## Residual Poison runtime and CHOAM portrait checkpoint (2026-09-06) - Canonical Residual Poison now has engine, private controls and all four AI policies. Before either combatant commits a leader, it uniformly selects one living, currently controlled opposing leader available in the battle territory, sends that physical disc to the Tanks and discards once. Same-territory reuse remains eligible; dead or elsewhere-used leaders, Cheap Heroes and the Kwisatz Haderach are excluded. There is no payment, bounty, force loss or automatic battle victory. - A hand-independent shared preparation step gives both combatants an actual opportunity before leader commitment in Richese tables. Both choose readiness; no nonholder is silently passed. This is a disclosed application timing procedure, not a claimed publisher ordering rule. Active interactions retain priority. Exact saved battle events bind both actions and retries. No additional confirmation is added to the random death. - Foreign ghola revival custody and Duke Vidal's physical disc/death history are preserved. Involuntary death reconciles impossible battle promises and reopens an impossible non-leader Prescience answer without redrawing the victim. All candidate death transitions and prospective hand commitments are validated before randomness. The still-secret Harkonnen captive disclosure ruling remains unresolved: Advanced Harkonnen tables guard the card based on their public configuration, never based on hidden captivity. See [RICHESE_RESIDUAL_POISON_ENGINE_AUDIT.md](RICHESE_RESIDUAL_POISON_ENGINE_AUDIT.md). - The full registered suites pass **1,329/1,329 rules/client/component tests and 107/107 persisted/API tests**, with TypeScript, lint and production build passing. New focused coverage comprises seven pure, six root engine, seven independent review and four AI cases, plus three SQLite/CAS recovery cases. Logs: `/tmp/dune-residual-final-full.log` (34.00 seconds), `/tmp/dune-residual-final-multiplayer.log` (16.26 seconds), `/tmp/dune-residual-final-type.log`, `/tmp/dune-residual-final-lint.log`, `/tmp/dune-residual-final-build.log`. Existing No-Field tests now perform the genuine readiness actions; independent-battle privacy comparisons normalize only the new random public event IDs. - The manual maintenance restart preserved all **1,175 saved room versions and exact state hashes**, including a real browser-created open preparation step in synthetic QA room QPNV5XJJ v29. Backup: `/tmp/dune-maintenance-20260906T1117/database.sqlite`. The known human room remained idle and unchanged. A fresh invitation restored the exact event and opponent readiness. Browser play then killed Flinto Kinnis once, left spice and forces unchanged, removed the card from hand and placed exactly one in discard. Ready resumed normal planning; the AI sealed a valid plan. Refresh retained v34, the same event, one death and one discard. All other 1,174 saved room hashes remained unchanged. No automation was recreated. Snapshots: `/tmp/dune-residual-browser-complete-v31.json` and `/tmp/dune-residual-browser-planning-v34.json`. - Five original CHOAM portraits bring ordinary coverage to **45/60**, completing the six base factions plus Ixians, Tleilaxu and CHOAM. All forty earlier files and manifest entries remain unchanged. Full-resolution inspection, four existing asset tests, and actual 192px inspector / 80px circular browser review pass. The temporary contact-sheet server was stopped. See [CHOAM_PORTRAITS.md](CHOAM_PORTRAITS.md). Fifteen ordinary portraits and separate special-disc artwork remain unfinished. - Five Richese effects remain inactive: Semuta Drug, Stone Burner, Mirror Weapon, Portable Snooper and Juice of Sapho. Other incomplete faction/module systems and unresolved interactions remain tracked. No full Advanced or expansion game was certified and no start gate was removed. The full goal remains active. ## Portable Snooper runtime and Richese portrait checkpoint (2026-09-06) - Portable Snooper now supports its ordinary poison-defense slot and optional play after both plans reveal, for all twelve holders in Basic and Advanced development fixtures. Exact canonical role predicates preserve saved `kind: special` identities without admitting unrelated cards. Normal plan searches, Voice, Prescience, structured Truthtrance names, player selectors and AI use that same role. It stops ordinary poison and weapon Chemistry, but not Tooth, Artillery, Lasgun or the projectile half of Poison Blade. - Late play uses the spare battle-card slot and preserves the complete original plan. A lone Worthless in either slot is allowed; a real defense, weapon-plus-Worthless or two occupied slots blocks it. Voice compulsion must be met originally when possible, and forbidden poison defense remains forbidden late. The existing own traitor-declaration opportunity is the explicit application deadline, independent of hand contents; no extra holder-only public window or acknowledgement was added. - `Battle.lateDefense` records the public played card separately, with exact battle-event and physical-custody validation. The card stays reserved in its owner's hand through remaining decisions and appears in the public component inspector only after play. The effective defense feeds combat, while the original plan remains the source for inspected and structured promised slots. Winner, loser and Moritani retention cleanup all account for that one physical card. Current decisions, Truthtrance and responses retain priority; duplicate and stale requests cannot replay protection or cleanup. - Source review corrected an earlier retention assumption: the official November 2020 FAQ permits winning battle-card retention even without a keep footer, while explicitly naming Tooth/Artillery exceptions. Portable therefore uses ordinary winner retention. Mirror's ordinary retention follows the same source; inheritance of a copied Tooth/Artillery discard exception remains a separately pending user ruling. [PORTABLE_SNOOPER_ENGINE_AUDIT.md](PORTABLE_SNOOPER_ENGINE_AUDIT.md) and [MIRROR_WEAPON_ENGINE_AUDIT.md](MIRROR_WEAPON_ENGINE_AUDIT.md) record provenance and boundaries. Mirror itself remains inactive. - **1,352/1,352 rules/client/component tests and 110/110 persisted/API tests pass**, plus TypeScript, lint and production build. This adds five pure, five root engine, seven independent review and six all-profile AI cases, plus three persisted recovery cases. The recovery race forces both first-commit orderings between late defense and own traitor declaration. Logs: `/tmp/dune-portable-final-full.log` (35.29 seconds), `/tmp/dune-portable-final-multiplayer.log` (17.89 seconds), `/tmp/dune-portable-final-type.log`, `/tmp/dune-portable-final-lint.log`, `/tmp/dune-portable-final-build.log`. - Browser QA verified the ordinary defense selector, sealed an empty original defense, played Portable against revealed Chaumas, and inspected the separate public late card. A fresh invitation preserved the exact pending v46 state and event before resolution. Feyd-Rautha survived, Harkonnen won 8–6, and the normal keep/discard choice retained Portable. Final v51 has three forces at Pasty Mesa, eight spice, Maula Pistol plus exactly one Portable, no Portable in discard, no battle or decision, and a living Feyd-Rautha used in that territory. The enlarged guide was visually inspected. Snapshots: `/tmp/dune-portable-browser-pending-v46.json` and `/tmp/dune-portable-browser-complete-v51.json`. All other 1,174 saved room hashes still match the last maintenance backup. This is a focused battle/reconnect check, not complete expansion-game acceptance. - Final integrated review fixed a late-defense AI omission for Cheap Hero accompanied by the Kwisatz Haderach. All four profiles now preserve the +2 when protection changes defeat into victory; an ordinary zero-strength hero still does not consume the card. The real Advanced Atreides regression follows actual power preparation, legal spice support and both traitor decisions. Portable’s enlarged inspector now opens its specific timing/interaction guide, and its summary explicitly offers both normal and late use. The final 18 guide/reference tests also pass. - Five original Richese portraits bring ordinary coverage to **50/60**, completing both factions in each of the first two expansions as well as the six base factions. All forty-five prior files and manifest entries are unchanged. Full-resolution inspection, four existing asset tests and actual 192px inspector / 80px circular browser review pass. The exact temporary review server was stopped. See [RICHESE_PORTRAITS.md](RICHESE_PORTRAITS.md). Ten Ecaz/Moritani ordinary portraits and separate special-disc artwork remain unfinished. - Four Richese effects remain inactive: Semuta Drug, Stone Burner, Mirror Weapon and Juice of Sapho. Complete faction/module interactions, mobile acceptance and full Advanced/expansion games remain unfinished. No start gate was removed. The live development server remains the verified session started during the preceding maintenance; the removed automation stays removed and the full goal stays active. ## Stone Burner, complete ordinary portraits and recovery checkpoint (2026-09-06) - Browser QA selected Stone in the normal weapon selector and reached a real revealed choice in synthetic room QPNV5XJJ. The manual hourly restart saved all **1,235 rooms** and preserved every version and exact state hash, including the pending choice at **v60**, event `20d21df3-8e58-4039-b6be-44db4f0d661a`. A fresh invitation restored the exact decision with no payment/death. After choosing kill, Harkonnen won **4–0** on undialed tokens; Feyd-Rautha and Ein Calimar each died once, the normal 11-spice bounty was paid, one dialed force was lost, and Stone was retained normally. Final **v68** has four Harkonnen forces at Pasty Mesa, 19 spice, one Stone in hand and none in discard, with no battle or decision. All other **1,234** saved room hashes remain unchanged. The enlarged card/guide and corrected decision heading/counts were inspected. Backups: `/tmp/dune-maintenance-20260906T1215/`; snapshots: `/tmp/dune-stone-browser-pending-v60.json` and `/tmp/dune-stone-browser-complete-v68.json`. Live server session11092 started around12:15 UTC; the next manual maintenance is due around13:15 UTC if development continues. The removed automation remains removed. - Ecaz and Moritani each gained five original portraits, completing **60/60 ordinary leaders** across all twelve factions. The separate Duke Prad Vidal portrait brings special-disc coverage to one without adding him to an ordinary roster or traitor inventory. All prior assets and provenance records were preserved. Full-resolution inspection, asset tests and actual192px/80px browser review passed. Duke's actual component additionally passed custody-label, inspector, identity-fallback and real404-fallback checks in an isolated byte-identical harness. Its temporary server was stopped. See [ECAZ_PORTRAITS.md](ECAZ_PORTRAITS.md), [MORITANI_PORTRAITS.md](MORITANI_PORTRAITS.md) and [DUKE_VIDAL_PORTRAIT.md](DUKE_VIDAL_PORTRAIT.md). Auditor, Kwisatz Haderach and other nonordinary component artwork remain separate unfinished work. The complete integrated validation checkpoint is recorded in [IMPLEMENTATION_STATUS.md](IMPLEMENTATION_STATUS.md). ## AI mobility browser and recovery checkpoint (2026-09-07 local date) The controlled development-server restart at approximately21:46UTC preserved all **1,265 saved rooms**, with exact versions and SHA-256 state hashes. Backup: `/tmp/dune-maintenance-20260906T2145/database.sqlite`; hashes: `rooms-check.json` alongside it. The known human room7W26YQPV was unchanged atv14 and idle about958minutes; no recent active human table was interrupted. HTTP returned200. A fresh authenticated invitation restored synthetic QPNV5XJJ atv68, with the same completed Stone battle, three-card Harkonnen hand, four forces at Pasty Mesa and19 spice. No action was submitted there. The removed maintenance automation remains removed. Live development session97328 remains running; next manual maintenance is approximately22:46UTC if active development continues and human play permits. Created a fresh Basic two-player room **JJPGBA2Q** entirely through the browser: human Fremen “Mobility review QA” and a Hard Guild AI. Completed readiness, traitor selection and the ten-force Fremen placement. Actual browser play passed through storm, spice blow, charity, two auctions, revival and movement. The Fremen shipped three reserves free to Polar Sink and moved those three to Wind Pass sector15. The Guild then shipped four to Habbanya Sietch and moved three to Habbanya Ridge Flat, as recorded by the public chronicle. No server-side staging or injected game action was used in this room. A second-turn storm crossed Wind Pass and killed those three Fremen forces. Their normal free revival returned all three to reserves. A fresh browser invitation recovered the same private seat and current auction state. These observations verify actual ordinary-phase controls and online AI progression, not a complete two-player game or exact latency benchmark. Browser play also exposed two misleading enabled controls; both were fixed and rechecked. Arrakeen now disables Fremen’s ordinary reserve-shipment button and explains the Great Flat radius. Selecting Wind Pass sector17 with the storm at17 disables ordinary reserve shipment and movement with visible, accessible reasons. Selecting Polar Sink sector0 clears the reasons and enables both ordinary controls. The Advanced Fremen storm-shipment exception remains in the code; this particular browser table used Basic rules. Desktop screenshot inspection confirmed the warnings fit the decision column and keep the Finish button available. Full route previews and mobile acceptance remain separate unfinished work. Final QA roomv78 is turn2, phase5, waiting for the Fremen’s genuine movement choice: ten forces in Sietch Tabr14, ten reserves, zero tanks and three spice. Snapshot: `/tmp/dune-mobility-JJPGBA2Q-final.json`. A final comparison found **zero changes to all 1,265 previously saved rooms**, including QPNV5XJJ and the real human room. The current total1,296 additionally includes this browser table and30 new persistence-test rooms. No removed automation was recreated. ## AI battle filtering and completed online game (2026-09-07 local date) Reopened the existing unmodified Basic browser table **JJPGBA2Q** atv78. Through the real seat control, selected Brutal and enabled voluntary autopilot for the Fremen seat; the Guild opponent remained Hard. The online server then completed the remaining turn2 actions and all of turn 3 without another human gameplay action. The Guild won atv112 by controlling four strongholds: Arrakeen, Carthag, Habbanya Sietch and Tuek’s Sietch. Fremen ended with twenty forces on the board, fourteen spice and no tanks or reserves. The public chronicle retains all 39 events and the original human-controlled opening. A fresh invitation restored the finished game, same private seat and turn 3 Guild victory. Root visually inspected the final board and outcome panel. No battle occurred in this particular game, so it verifies online progression and completion but is not browser evidence of the new Voice/Prescience plan branches. Those branches are covered by actual-engine all-profile fixtures and the separate full-game simulations. No precise per-decision latency claim is inferred from screenshots. Snapshots: `/tmp/dune-battle-ai-browser-start.json` (v87, running Brutal autopilot) and `/tmp/dune-battle-ai-browser-finished.json` (v112). A final database comparison preserved exact versions and state hashes for all 1,265 rooms from the21:45UTC maintenance backup. The current 1,326 records additionally contain the new browser table and 60 subsequent persistence-test tables. The real human room and earlier Stone QA room remain unchanged. No server restart was due during this check, and the removed automation remains removed. ## Fremen movement cancellation and replacement (2026-09-07 local date) Created two isolated rooms through the normal browser lobby, then staged bounded movement scenarios only in these explicitly named QA rooms. The authenticated human seat and room records came from normal browser creation; synthetic board/card states were installed with exact expected-version checks. Neither fixture is evidence of a complete Advanced or expansion game. In **ZJUGV6XW**, the human Emperor saw a pending four-force Fremen move from Red Chasm7 to The Minor Erg5 atv2. Root inspected the readable declaration, destination, cancellation consequence, physical board group, private Karama and both response controls. A fresh invitation restored the same response and private seat. The response stayed pending until after maintenance. In **36FU5EZ3**, a separate human Fremen seat recovered a canceled range-two declaration atv2. The mover saw that no forces or movement had been spent and that the current move had range one. Root selected Red Chasm7 → The Minor Erg5 and confirmed the Move button was disabled with a route explanation, then selected Pasty Mesa5 and four forces. The legal button committed one move: v3 has exactly four forces in Pasty Mesa5, sixteen reserves, no tanks and moved1. The restriction notice disappeared and the movement-complete guidance appeared. Root visually inspected the resulting board and form. While adding the route hint, browser testing caught an unqualified `location` reference resolving to the browser global. It was corrected to the explicitly imported board-coordinate function. The same source-selection journey was repeated successfully; subsequent TypeScript/lint/build checks passed. The failure was a transient development edit and did not write or corrupt room state. The chronicle display also converts the generic Fremen cancellation identifier to readable words. At approximately **22:45UTC6September**, the controlled hourly maintenance saved all **1,388 rooms** in `/tmp/dune-maintenance-20260906T2245/database.sqlite`, with exact version/state hashes. Recent activity belonged to the two QA fixtures and named automated-test rooms; the real human room remainedv14 and idle for over1,018minutes. Stopped server97328 and started server6817. Root HTTP returned200. All1,388 saved versions and state hashes were unchanged after restart, including pending Fremen intent/forces/move count, completed JJPGBA2Qv112, QPNV5XJJv68 and the real human room. A new invitation after restart restored ZJUGV6XW's exactv2 response and Emperor hand. Root clicked **Cancel with Karama** through the UI. The game advanced to v3: one Karama in discard, no pending response, Fremen's four forces still in Red Chasm7, moved0 and the saved current-turn/current-move restriction. Its next action is a genuine human replacement choice; the synthetic opponent's bot flag is intentionally absent. No confirmation was demanded from a player without a cancellation choice. After this intentional QA action, every other saved room retained its exact hash and version. The removed automation remains removed. Artifacts: `/tmp/dune-fremen-browser-pending.json`, `/tmp/dune-fremen-browser-limited.json`, `/tmp/dune-fremen-browser-replaced.json`, `/tmp/dune-fremen-browser-after-restart-cancel.json`. Desktop visuals, invitation restoration, response ownership, the cancellation action and ordinary replacement controls were checked. Mobile, the live normal-range Ornithopter UI, and full Advanced/expansion games remain unverified by this browser slice. ## Source-ordered setup and private recovery (2026-09-07 local date) Created Basic room **WQKDSM8L** entirely through the normal browser: human Bene Gesserit “Setup order QA”, Hard Fremen AI and Brutal Guild AI. Before sealing the prediction, all hands, traitor pools and force placements were empty. Only the BG prediction controls appeared, and a fresh invitation restored the same private pending stage. Sealed Guild on turn 3 through those controls. Atv9, BG had four private traitor choices, both AI choices were settled, and every hand and force placement remained empty. Kept Esmar Tuek. Fremen AI then placed seven in Sietch Tabr14 and three in False Wall South4. Starting cards were dealt automatically, without another confirmation, and the first Storm opened. Atv13 all three hands contained one card; BG held Stunner, with its one fighter in Polar Sink. Root inspected the board, private hand and ordered chronicle. Enabled Brutal voluntary autopilot through the real seat control. The server completed the game atv347 on turn5: Bene Gesserit won with fighters at Arrakeen, Sietch Tabr and Habbanya Sietch. The154-event chronicle includes real auctions, movements, multiple battles and traitor calls. Root visually inspected the final board/outcome, then opened a fresh invitation and recovered the same finished private seat, three-card hand and Esmar Tuek. Final snapshot: `/tmp/dune-staged-browser-online-finished.json`. No further human gameplay action or database staging was used. Created a separate Basic room **NVTWXNMY**, also entirely through the normal lobby, with human Fremen “Fremen setup QA” and Medium BG AI. The AI sealed its private prediction before any traitor choices appeared. Human Fremen kept Wanna Marcus. Atv8 the force stage held both hands empty, Fremen's20 reserves unplaced and the Basic BG fighter in Polar Sink. A fresh invitation restored the same actor, private traitor and undealt hands. The six printed starting-sector inputs were visible. A nine-force allocation disabled Place forces; adding the tenth enabled it. Submitted six in Sietch Tabr14, three in False Wall South4 and one in False Wall West17. Atv11 the exact distribution, ten remaining reserves, one Ellaca Drug and the first Storm controls were present. No deal confirmation appeared. Root visually inspected the force form and its count, then verified the completed state and hand. Both browser journeys use real server actions with no manual database staging. Read-only artifacts: `/tmp/dune-staged-browser-prediction.json`, `/tmp/dune-staged-browser-traitors.json`, `/tmp/dune-staged-browser-dealt.json`, `/tmp/dune-staged-browser-fremen-force-pending.json`, `/tmp/dune-staged-browser-fremen-force-dealt.json`. These demonstrate Basic desktop setup and invitation restoration. WQKDSM8L additionally completed the online Basic game described above. These observations do not claim mobile, live Advanced setup, an exact pacing benchmark or an actual server restart of a pending new-stage room. The read-only database comparison still preserves every original room from the22:45UTC backup except the explicitly completed ZJUGV6XW Karama action already recorded above. The current1,471 records include subsequent automated recovery-test tables and these two new browser rooms. The real human room remains unchanged. Server6817 is still running; next manual maintenance is approximately23:45UTC if active development continues and human activity permits. The removed automation remains removed. ## Truthtrance personal-spice questions (2026-09-07 local date) Created private Basic roomPRAVNYBG through normal browser setup with human Atreides “Truth spice QA” and Hard Emperor AI. Only this named QA room was then staged: one canonical Truthtrance was exchanged from the deck for the host's starting Kulon, and the target balance set to seven atv9. All33 physical cards, original forces/traitors, first Storm and saved Emperor dial remained conserved. The original room state is preserved in `/tmp/dune-truth-spice-browser-original.json`; staged state is `dune-truth-spice-browser-staged.json` alongside it. This is focused card evidence, not an unstaged full game. Declared the card from the actual hand and let the AI pass priority. Selected Current personal spice, At least and a count. A negative count disabled Ask publicly with an accessible reason; six enabled it and previewed the intended question. Visual review caught the raw numeric field's inconsistent appearance; the shared styled Input and explicit label/ID fixed it. Root rechecked the styled control. Asking the question produced a public AI Yes, an empty host hand, exactly one discard and the interrupted Storm atv15. A fresh invitation restored the same state and answered history; the host view did not show the target's raw seven-spice balance. For the human response view, `/tmp/dune-truth-spice-human-stage.mts` gave the remaining physical Truthtrance to the AI and used actual engine declare/pass/ask actions to stage a question about the human's exact ten spice atv16. The browser showed private Yes guidance from current game information. Another fresh invitation restored that unanswered question and private result. Human Publish my answer completed it atv18, leaving two Yes history records, two distinct Truthtrances in discard, balances10/7 unchanged and Emperor's original storm dial3 intact. Root inspected the private answer panel and history. This does not claim the AI strategy itself chose the second question. Final snapshots: `/tmp/dune-truth-spice-browser-ai-answer.json`, `/tmp/dune-truth-spice-browser-human-pending.json`, `/tmp/dune-truth-spice-browser-finished.json`. TypeScript, lint, build and all1,578 registered tests pass. Mobile, a real server restart of this pending question, arbitrary fact parsing and turn-wide promise enforcement remain outside this check. The1,502-room read-only comparison preserves the22:45UTC backup's original1,388 room states except the previously recorded ZJUGV6XW action; human room7W26YQPV remainsv14. No automation was recreated, and manual maintenance is still due around23:45UTC. ## Guild transport price and contributor routing (2026-09-07 local date) Created normal browser lobby/setup6XMTUD6U with human Guild “Guild transport QA” and Hard Emperor/Atreides, completed traitor selection into first Stormv10. Explicitly staged only this QA room to Shipmentv11 with five Guild forces split2/3 across Wind Pass14/15, one personal spice and two Emperor escrow. Original/staged/final private artifacts are `/tmp/dune-guild-browser-{original,staged,finished}.json`, all mode600. This does not represent an unstaged full game. Actual combined-sector controls1+2 quoted three physical forces/cost2/own1/pledge1 despite standalone amount19. Five selected forces to Red Chasm cost5, showed pledge shortage and disabled Guild transport while the cost3 return remained available. Actual Return to reserves spent own1/pledge2, returned five physical forces and credited donor2 to Guild; finalv13 had20reserves/spice2/no Guild board forces/pledge0/shippedtrue/movement0. A fresh invite restored those results and enabled Finish without repeating the shipment. Root inspected the full-page desktop screenshot: route labels, totals, costs, shares and associated buttons fit the decision column. Mobile was not exercised for this slice. Manual23:45UTC backup/restart preserved exact state/version hashes for all1,502rooms, including real human room7W26YQPVv14. HTTP200 and PRAVNYBG private Storm reconnection passed. First sandboxed launch failed before service with denied network-interface access; the authorized launch succeeded and is session24370. No database repair was needed. Automation remains removed; next manual maintenance around00:46UTC if active work continues. Full verification after integration:1,474rules/client/component +126persisted/API tests, type/lint/build allpass. Nineteen new rules/quote tests, three new persisted tests and independent10,320selection comparison support this bounded behavior. The larger Guild cancellation, Truthtrance promise, Advanced and expansion acceptance gaps remain open. ## 7 September 2026 — shipment continuation guidance Root inspected the existing Guild QA room6XMTUD6U in the browser after the physical shipment validation change. The private Guild hand and traitor remained visible only in that seat; the room still showed20reserves, two spice, spent shipment and available Finish movement at its legitimate human wait. No game action or fixture mutation was performed in this check. The phase help opened its internal reference. Searching for “6. Shipment” displayed the new stale-continuation explanation and the explicit temporary allied-entry limitation. A full-page desktop screenshot showed readable text and related-topic links without clipping. The initial accessibility snapshot preceded hydration and appeared collapsed; a fresh direct `/rules#movement` reload confirmed automatic topic expansion. No link change was needed. Mobile and full-game acceptance were not evaluated in this check.