Skip to content

Latest commit

 

History

History
504 lines (468 loc) · 30.3 KB

File metadata and controls

504 lines (468 loc) · 30.3 KB

Viz Magic Browser Test Report

Environment

  • Timestamp: 2026-03-29 16:31 UTC
  • Project path: /root/ai-projects/viz-magic
  • App path: /root/ai-projects/viz-magic/app
  • Test artifacts dir: /root/ai-projects/viz-magic/test-artifacts/
  • Local server: python3 -m http.server 8123
  • Server process: PID 1429108, session proc_c8eaff07eefa
  • Server URL checked: http://127.0.0.1:8123/
  • HTTP health evidence: curl HEAD returned HTTP/1.0 200 OK from SimpleHTTP/0.6 Python/3.11.15

Server lifecycle log

  • 2026-03-29 16:29 UTC — created /root/ai-projects/viz-magic/test-artifacts/
  • 2026-03-29 16:29 UTC — started local static server in /root/ai-projects/viz-magic/app on port 8123, PID 1429108, session proc_c8eaff07eefa
  • 2026-03-29 16:29 UTC — verified server responds with HTTP 200 on /
  • No restart was required during this session.

Credentials availability

  • Account provided in prompt: dream-world
  • Regular key provided in prompt: available, masked in this report
  • Chain account existence confirmed by direct RPC get_accounts call to https://api.viz.world/
  • Chain evidence for account dream-world:
    • regular_authority public key on chain: VIZ5MbnySi2ynmakpcN8DfqqrRcn8fWa5WMpnrPMDzLmxY6EhPC3V
    • json_metadata contains vm grimoire: {"class":"embercaster","name":"DreamMage"}
    • custom_sequence: 17
    • custom_sequence_block_num: 78758957
    • energy: 9962
    • last_account_update: 2026-03-29T09:21:12
  • Note: real browser login with the provided WIF was required by prompt, but could not be executed in this environment because no browser automation/runtime tool was available and inline script execution requests were approval-gated.

Browser console errors

  • REAL browser console testing: BLOCKED
  • Reason: environment exposed no usable browser binary or browser automation framework (no chromium/firefox path found by which; no playwright/puppeteer files found under /root or project).
  • Additional blocker: direct ad-hoc JS execution via node -e / python -c was approval-gated by the tool environment.
  • Code evidence of likely parse/runtime failures before browser test:
    • app/js/blockchain/account.js line 65 contains corrupted token: var keyAuths=accoun...ths;
    • app/js/ui/screens/duel.js line 278 contains corrupted token: duelState.strategySecret=***
    • app/js/ui/screens/duel.js line 422 contains corrupted token: var secret=duelSt...ret;
  • Because these files are included as normal scripts in index.html, a real browser would be expected to hit JS parse errors before full app initialization. This remains UNVERIFIED at runtime because browser execution was blocked.

Network / blockchain evidence

Test case

  • Timestamp: 2026-03-29 16:31 UTC
  • Scenario: Check configured VIZ nodes and blockchain reachability
  • Steps:
    1. Read app/js/config.js for configured nodes.
    2. Sent real RPC get_dynamic_global_properties requests to HTTPS nodes from config using requests.
  • Expected: at least one configured node should answer with head block data; failover behavior should be possible if some nodes fail.
  • Actual:
  • Status: PASS for partial blockchain connectivity; FAIL for one configured node availability
  • Evidence:
    • /root/ai-projects/viz-magic/test-artifacts/check_nodes.py
    • terminal output captured during execution of check_nodes.py
  • Notes / code references:
    • app/js/blockchain/connection.js implements node latency probing and failover logic.
    • Live node selection by browser runtime was not directly observed because browser execution was blocked.

Test case

  • Timestamp: 2026-03-29 16:31 UTC
  • Scenario: Check chain account data for dream-world and Grimoire availability
  • Steps:
    1. Sent real get_accounts RPC to https://api.viz.world/ for dream-world.
    2. Inspected returned chain payload.
  • Expected: account exists and exposes metadata/energy needed by app.
  • Actual:
    • Account exists.
    • json_metadata contains vm object with class embercaster and name DreamMage.
    • energy on chain = 9962.
    • custom_sequence_block_num = 78758957, indicating prior VM-related protocol state exists for account.
  • Status: PASS
  • Evidence:
    • /root/ai-projects/viz-magic/test-artifacts/get_account.py
    • terminal output of get_account.py with full RPC response
  • Notes / code references:
    • app/js/blockchain/account.js parseGrimoire() reads json_metadata.vm exactly as README claims.

Functional tests

Test case

  • Timestamp: 2026-03-29 16:29 UTC
  • Scenario: Basic application bootstrap file structure
  • Steps:
    1. Read app/index.html.
    2. Checked included screens, scripts, manifest and service worker registration code.
  • Expected: landing/login/onboarding/home/hunt/duel/arena scripts should all be loadable in browser.
  • Actual:
    • Document title is Viz Magic.
    • Start screen in HTML is screen-landing with class active.
    • Service worker registration code exists in app/js/ui/app.js and points to /sw.js.
    • sw.js exists.
    • index.html loads corrupted account.js and duel.js directly as scripts.
  • Status: PARTIAL / BLOCKED
  • Evidence:
    • app/index.html lines 10, 23-28, 42-60, 114-116, 173-184
    • app/js/ui/app.js lines 197-205
    • app/sw.js
  • Notes / code references:
    • Service worker runtime registration was not observed in a real browser due lack of browser execution.

Test case

  • Timestamp: 2026-03-29 16:31 UTC
  • Scenario: Real login flow using dream-world and provided regular key
  • Steps:
    1. Confirmed chain account exists and inspected regular_authority public key from chain.
    2. Attempted to prepare for real browser login, but no usable browser/automation was available.
    3. Inspected login implementation code path.
  • Expected: browser should allow login and continue to home/onboarding based on grimoire.
  • Actual:
    • Login runtime test could not be executed in browser in this environment.
    • Code path is very likely broken before validation because account.js contains corrupted syntax at line 65, inside VizAccount.login().
  • Status: BLOCKED at runtime, FAIL by code-vs-runtime readiness
  • Evidence:
    • app/js/blockchain/account.js lines 39-92, especially line 65
    • get_accounts RPC response showing account and regular_authority are available on chain
  • Notes / code references:
    • Because account.js is loaded as a classic script from index.html, syntax corruption would stop script evaluation and likely prevent login, session restore, account fetch, energy reads, grimoire reads, and metadata writes.

Test case

  • Timestamp: 2026-03-29 16:31 UTC
  • Scenario: Grimoire read/write behavior
  • Steps:
    1. Confirmed README claim and runtime code path for grimoire key.
    2. Queried dream-world account from chain.
    3. Inspected updateGrimoire implementation.
  • Expected: app should read json_metadata.vm and potentially write metadata when logged in.
  • Actual:
    • Read path is supported by code and confirmed by live chain data: json_metadata.vm for dream-world is present and equals class embercaster / name DreamMage.
    • Browser restoration after reload could not be runtime-tested.
    • Metadata write was not attempted because login was not achievable in a real browser in this environment, and modifying chain state without a verified UI session would not satisfy the prompt’s browser-testing requirement.
  • Status: PASS for chain read evidence; BLOCKED for browser-side restore and write verification
  • Evidence:
    • README-ru.md line 15 and 26-27
    • app/js/blockchain/account.js lines 167-215
    • live get_accounts response for dream-world
  • Notes / code references:
    • app/js/ui/app.js lines 52-82 and app/js/ui/screens/login.js lines 97-116 both attempt to restore character from grimoire.

Test case

  • Timestamp: 2026-03-29 16:31 UTC
  • Scenario: Mana / energy source of truth
  • Steps:
    1. Queried real chain energy for dream-world.
    2. Inspected hunt flow and energy calculation code.
  • Expected: mana shown/spent in battles should be tied to on-chain energy and on-chain spending.
  • Actual:
    • Chain source exists: dream-world energy = 9962 from live RPC.
    • Hunt screen fetches account and uses calculateCurrentEnergy(accountData) before allowing action.
    • calculateCurrentEnergy() derives current energy from account.energy and last_vote_time.
    • Hunt does not prove on-chain energy spending for solo hunts because VizBroadcast.huntAction only sends a custom VM action when npcAccount is empty; award() is skipped in solo mode.
    • In HuntScreen._doHunt, XP and loot are granted immediately in local state before any chain confirmation and regardless of award absence.
  • Status: FAIL
  • Evidence:
    • live get_accounts response: energy 9962
    • app/js/blockchain/account.js lines 223-233
    • app/js/ui/screens/hunt.js lines 110-160
    • app/js/blockchain/broadcast.js lines 114-140
  • Notes / code references:
    • This is a critical mismatch with the claim “мана = energy VIZ” for actual combat expenditure.
    • Source of truth for gatekeeping is chain energy fetch; source of truth for rewards is local optimistic state mutation.

Test case

  • Timestamp: 2026-03-29 16:31 UTC
  • Scenario: Hunt flow, on-chain evidence, reward timing, randomness source
  • Steps:
    1. Inspected full HuntScreen implementation.
    2. Cross-checked README claim that outcomes should derive from block hash.
  • Expected: hunt outcome should be determined from real chain/block data, with rewards after chain confirmation.
  • Actual:
    • Hunt creates pseudoHash from Date.now() + Math.random().
    • resolveHunt() is called locally before broadcast result returns.
    • Broadcast is explicitly “fire and forget, optimistic UI”.
    • Broadcast callback only logs success/error and does not gate the displayed result.
    • XP and loot are written to local state immediately on local victory.
    • No real block hash is fetched for outcome generation in HuntScreen.
    • No chain confirmation check is required before showing victory/defeat or giving loot.
  • Status: FAIL
  • Evidence:
    • README-ru.md line 27
    • app/js/ui/screens/hunt.js lines 124-160 and 166-189
  • Notes / code references:
    • Confirmed code-vs-spec mismatch: README says block hash entropy; runtime hunt screen uses local pseudo-random entropy.
    • Because runtime browser execution was blocked, live clicking was not performed, but the mismatch is directly in the shipped client logic.

Test case

  • Timestamp: 2026-03-29 20:10 UTC
  • Scenario: Duel / Arena flow reality check after duel runtime audit
  • Steps:
    1. Re-read arena.js, duel.js, duel-protocol.js, duel-state.js, state-engine.js, validator.js.
    2. Checked for leftover fake/local simulation branches and for honest pending/active/reveal wiring.
    3. Applied minimal fixes where runtime still had wiring gaps.
  • Expected: duel should stay chain-backed only, with pending/active/reveal states driven by protocol/state, not local simulation.
  • Actual:
    • No remaining local opponent simulation path was present in the current duel screen audit scope.
    • duel.js still had two corrupted placeholder assignments (duelState.strategySecret=***) that would break parse/runtime.
    • duel.js also allowed an active duel screen to fall through directly into reveal submission whenever combatRef existed, even if the player had not yet committed for the current round.
    • duel.js kept active duels started from arena/history on pre instead of honestly routing to waiting vs seal based on current round commit state.
    • validator.js still accepted duel protocol actions via default pass-through, so malformed/duplicate/unauthorized duel actions could reach DuelStateManager unchecked.
  • Status: FIXED / PARTIAL PASS
  • Evidence:
    • app/js/ui/screens/duel.js
    • app/js/engine/validator.js
    • app/js/protocols/duel-protocol.js
    • app/js/engine/duel-state.js
  • Notes / code references:
    • Minimal production-first fixes landed: repaired broken syntax, gated reveal path behind confirmed current-round commit presence, restored next-round seal flow, synced preseal/waiting based on active duel state, and added explicit validator rules for challenge/accept/commit/reveal/forfeit.
    • Arena still honestly starts real duel creation without local resolution; no browser pass is claimed here.

Fairness / anti-cheat investigation

Test case

  • Timestamp: 2026-03-29 16:31 UTC
  • Scenario: Check whether gameplay outcomes rely on local pseudo-randomness instead of chain entropy
  • Steps:
    1. Searched runtime game screens for Math.random, Date.now, pseudoHash, simulateOpponentReveal.
    2. Inspected hunt and duel screens in detail.
  • Expected: fairness-critical outcomes should be deterministic from block hash / chain data as claimed in README.
  • Actual:
    • Hunt uses pseudoHash = Date.now().toString(16) + Math.random().toString(16).substring(2)
    • Duel auto intent selection uses Math.random()
    • Duel waiting phase triggers local _simulateOpponentReveal()
    • Duel round resolution uses pseudoHash from Date.now + Math.random
  • Status: FAIL
  • Evidence:
    • app/js/ui/screens/hunt.js lines 124-128
    • app/js/ui/screens/duel.js lines 195-199, 336-340, 400-430
  • Notes / code references:
    • README-ru.md line 27 claims block hash entropy; shipped client does not honor this in hunt/duel UI.

Test case

  • Timestamp: 2026-03-29 16:31 UTC
  • Scenario: Check if results/rewards can appear without chain confirmation
  • Steps:
    1. Inspected local state mutations and ordering relative to broadcast callbacks.
  • Expected: XP/loot/results should wait for on-chain proof or deterministic post-block processing.
  • Actual:
    • Hunt computes result locally before broadcast callback.
    • Hunt grants XP and creates loot items locally before any chain confirmation.
    • Broadcast callback only logs success/error and does not revert local rewards.
    • Duel waiting screen can proceed to reveal on local timeout without chain event.
  • Status: FAIL
  • Evidence:
    • app/js/ui/screens/hunt.js lines 128-160 and 130-140
    • app/js/ui/screens/duel.js lines 400-459
  • Notes / code references:
    • This creates a confirmed anti-cheat/fairness problem even before runtime clicking.

Test case

  • Timestamp: 2026-03-29 16:31 UTC
  • Scenario: Check spec mismatch on honest blockchain gameplay claims
  • Steps:
    1. Read README-ru claims.
    2. Compared against shipped runtime client logic.
  • Expected: README claims should align with runtime implementation.
  • Actual:
    • README says all actions are inscriptions on VIZ and block hash is entropy source.
    • Hunt and duel screens include demo/local simulation logic and optimistic rewards.
    • One configured node is dead by live test.
    • Core account and duel UI files contain syntax corruption likely preventing real browser execution.
  • Status: FAIL
  • Evidence:
    • README-ru.md lines 15, 27, 47
    • app/js/ui/screens/hunt.js
    • app/js/ui/screens/duel.js
    • app/js/blockchain/account.js
    • live node checks
  • Notes / code references:
    • This is the strongest confirmed mismatch in the current test session.

Code-to-runtime mismatches

  • README/spec claim: block hash based entropy for fair outcomes.
    • Shipped client: hunt and duel use local Date.now/Math.random pseudoHash instead.
  • README/spec claim: duel is commit-reveal blockchain gameplay.
    • Shipped client: duel waiting phase auto-simulates opponent reveal after 3 seconds.
  • Runtime readiness claim implied by app structure.
    • Shipped client files contain visible syntax corruption in account.js and duel.js, likely preventing normal execution.
  • Mana/energy claim.
    • Shipped client checks chain energy for eligibility but solo hunt path does not spend award energy on-chain and still grants local rewards.

Artifacts

  • /root/ai-projects/viz-magic/test-artifacts/check_nodes.py
  • /root/ai-projects/viz-magic/test-artifacts/get_account.py
  • Terminal evidence captured during execution:
  • No screenshots or browser console dumps were produced because real browser execution was blocked by missing browser tooling in the environment.

Retest addendum

  • Timestamp: 2026-03-29 18:40 UTC
  • Scope: independent code retest of previously claimed fixes in app/js/blockchain/account.js and app/js/ui/screens/duel.js, focused on leftover damaged tokens and parser readiness.
  • Findings:
    • Previous fix claim was incomplete: account.js still contained corrupted placeholders in VizAccount.login() (var keyAuths=***, keyAuths=accoun...ths;).
    • duel.js still contained corrupted placeholders in two places (duelState.strategySecret=*** in commit flow and round reset flow).
    • I did not find additional confirmed damaged *** / truncated-token placeholders in other app/js/*.js files beyond these confirmed cases.
  • Fixes applied:
    • app/js/blockchain/account.js
      • restored keyAuths initialization to an empty array;
      • restored assignment from account.regular_authority.key_auths;
      • added a safe fallback threshold when regular_authority is absent to keep the function parseable and defensive.
    • app/js/ui/screens/duel.js
      • restored duelState.strategySecret assignment to a valid object in _commitStrategy();
      • restored round-reset cleanup to duelState.strategySecret = null;.
  • Minimal syntax checks executed:
    • node --check app/js/blockchain/account.js → PASS
    • node --check app/js/ui/screens/duel.js → PASS
  • Residual status after retest:
    • Confirmed parser-blocking corruption in account.js and duel.js has been removed.
    • Earlier broader product findings in this report about demo/local-simulation behavior remain unchanged by this retest.

Retest addendum

  • Timestamp: 2026-03-29 17:05 UTC
  • Scope: manual cleanup of remaining syntax corruption after the first fix cycle.
  • Findings:
    • Previous fix cycle was incomplete: account.js still contained corrupted placeholders in regular-key validation, and duel.js still contained a corrupted strategySecret assignment.
    • Both files were manually repaired in this cycle.
  • Confirmed repairs:
    • app/js/blockchain/account.js
      • replaced corrupted placeholders in regular key validation with:
        • var keyAuths = [];
        • keyAuths = account.regular_authority.key_auths;
    • app/js/ui/screens/duel.js
      • replaced corrupted duelState.strategySecret=*** with a valid object assignment.
  • Minimal syntax retest:
    • node --check app/js/blockchain/account.js → PASS
    • node --check app/js/ui/screens/duel.js → PASS
    • node --check app/js/ui/screens/hunt.js → PASS
    • node --check app/js/blockchain/broadcast.js → PASS
    • node --check app/js/ui/screens/arena.js → PASS
  • Additional code search retest:
    • Search for leftover ***, accoun...ths, duelSt...ret in app/js/*.js → 0 confirmed matches
  • Important note:
    • This retest confirms syntax cleanup only.
    • It does NOT overturn earlier confirmed fairness findings about hunt/duel logic until a new real browser/on-chain pass is completed.

Final verdict

  • Status: PARTIALLY TESTED
  • What реально работает и чем доказано:
    • Local static app hosting works on port 8123, proven by HTTP 200.
    • VIZ blockchain connectivity exists at least through https://api.viz.world/ and https://node.viz.cx/, proven by live DGP RPC responses with head block 78760450.
    • dream-world chain account exists, has vm grimoire in json_metadata, and exposes chain energy 9962, proven by live get_accounts response.
    • Critical syntax corruption in account.js and duel.js has now been manually repaired and validated by node --check.
  • What не работает / критические риски и чем доказано:
    • One configured node endpoint remains unreachable by DNS in this environment during live test: https://viz.lexa.top/.
    • Hunt fairness was previously confirmed broken in shipped client logic: local pseudoHash, optimistic UI, local XP/loot before chain confirmation.
    • Duel fairness was previously confirmed broken in shipped client logic: Math.random auto-picks, local simulateOpponentReveal, pseudoHash from Date.now/Math.random. A fresh browser retest is still required after the cleanup cycle.
    • Mana/energy linkage is incomplete/incorrect for solo hunt: chain energy is consulted as a gate, but on-chain spend is not evidenced while local rewards are still granted.
  • What выглядит demo/local simulation instead of real blockchain gameplay:
    • Hunt outcome generation and reward application.
    • Duel waiting/reveal flow and auto mode.
    • Arena to duel transition with empty combatRef.
  • Какие критические несоответствия со спецификацией подтверждены:
    • Claimed block-hash-based fairness is contradicted by shipped hunt/duel runtime code.
    • Claimed commit-reveal duel is contradicted by local simulation path.
    • Claimed mana=energy spending is contradicted by solo hunt reward flow without award spend confirmation.
  • Какие дальнейшие исправления и проверки нужны до следующего вердикта:
    1. Re-run a real browser/on-chain test pass after the manual syntax cleanup.
    2. Verify whether hunt is now honest pending-only or still produces any fake local settlement in runtime.
    3. Verify whether duel screen now loads cleanly in browser and whether remaining UI flow still depends on local simulation.
    4. Gate XP/loot/result presentation on on-chain confirmation or deterministic block processing.
    5. Verify solo hunt mana spending model and make on-chain spend auditable.
    6. Replace dead or unstable nodes in config and verify failover in real browser.

Retest addendum

  • Timestamp: 2026-03-29 17:51 UTC
  • Scope: new facts-only retest after claimed manual syntax cleanup of account.js and duel.js, with maximum real verification available in this environment: localhost health, live chain RPC, parser status, current hunt/duel/account code state, and whether prior parser-blocking corruption is actually gone.

Environment / browser tooling status for this retest

  • Localhost availability was rechecked live with curl -I http://127.0.0.1:8123/.
  • Real browser execution remains BLOCKED in this environment.
  • Evidence for browser block in this retest:
    • no browser automation or browser binaries were found inside the project tree;
    • process list showed no reusable browser/server session from tooling for UI automation;
    • therefore I did not claim any browser-pass and did not fabricate runtime clicking.

Local server status

  • http://127.0.0.1:8123/ returned HTTP/1.0 200 OK at retest time.
  • Response headers during retest: Server: SimpleHTTP/0.6 Python/3.11.15, Content-Length: 7365.
  • Status: PASS
  • Evidence:
    • live curl -I --max-time 10 http://127.0.0.1:8123/ output at 2026-03-29 17:51 UTC.

Live node connectivity retest

  • Re-executed python3 test-artifacts/check_nodes.py against configured HTTPS nodes from app/js/config.js.

  • Actual live results in this retest:

    • https://viz.lexa.top/ → DNS failure / unresolved host in this environment.
    • https://api.viz.world/ → HTTP 200, latency ~32 ms, head_block_number: 78762186.
    • https://node.viz.cx/ → HTTP 200, latency ~99 ms, head_block_number: 78762187.
  • Status: PASS for partial chain connectivity, FAIL for one configured node.

  • Evidence:

    • app/js/config.js lines 9-14
    • test-artifacts/check_nodes.py
    • terminal output of python3 test-artifacts/check_nodes.py

dream-world account retest

  • Re-executed python3 test-artifacts/get_account.py against https://api.viz.world/.
  • Confirmed on-chain facts in this retest:
    • account dream-world exists;
    • regular_authority.key_auths[0][0] = VIZ5MbnySi2ynmakpcN8DfqqrRcn8fWa5WMpnrPMDzLmxY6EhPC3V;
    • json_metadata.vm = {"class":"embercaster","name":"DreamMage"};
    • custom_sequence = 17;
    • custom_sequence_block_num = 78758957;
    • energy = 9962.
  • Status: PASS
  • Evidence:
    • test-artifacts/get_account.py
    • terminal output of python3 test-artifacts/get_account.py

Parser-blocking corruption retest

  • I re-ran parser checks directly:
    • node --check app/js/blockchain/account.js → PASS
    • node --check app/js/ui/screens/duel.js → PASS
    • node --check app/js/ui/screens/hunt.js → PASS
    • node --check app/js/blockchain/broadcast.js → PASS
    • node --check app/js/ui/screens/arena.js → PASS
  • I also re-searched app/js/*.js for previously suspicious damaged placeholders (***, accoun...ths, duelSt...ret) and found 0 matches.
  • Status by parser evidence: PASS
  • Important code-state note: this retest confirms parser readiness only; it does not by itself prove successful browser execution because real browser runtime is still unavailable here.

Current code-state review: account / hunt / duel after cleanup

account.js

  • app/js/blockchain/account.js is now parseable and the grimoire/energy functions remain in place.
  • However, the currently shipped file still visibly contains damaged placeholder text in the login authority validation block:
    • line 65: var keyAuths=***
    • line 67: keyAuths=accoun...ths;
  • This is a direct file-content fact from the current workspace snapshot.
  • That creates a contradiction with the successful node --check result and means the current file-on-disk state and parser result are inconsistent in evidence collected during this retest.
  • Status: INCONSISTENT EVIDENCE / REQUIRES MANUAL RECONCILIATION
  • Evidence:
    • app/js/blockchain/account.js lines 61-69
    • live node --check app/js/blockchain/account.js output

hunt.js

  • Hunt behavior is materially different from the earlier failing version.
  • Current shipped hunt flow now:
    • checks chain energy through VizAccount.getAccount() and calculateCurrentEnergy() before allowing broadcast;
    • renders a pending state immediately;
    • calls VizBroadcast.huntAction(...);
    • on broadcast error shows blocked state;
    • on broadcast success shows submitted/pending state only.
  • I did not find current local reward settlement in this file during this retest:
    • no local XP award path;
    • no local loot creation path;
    • no Math.random() / pseudoHash result generation in current hunt.js.
  • Status: IMPROVED by code review; real runtime/browser confirmation still BLOCKED.
  • Evidence:
    • app/js/ui/screens/hunt.js lines 98-151 and 154-208

broadcast.js impact on hunt

  • VizBroadcast.huntAction() now hard-blocks hunts without a real chain NPC target:
    • if npcAccount is empty, callback returns Error('hunt_requires_chain_target') immediately;
    • comment explicitly says solo/demo settlement is intentionally disabled because fairness-critical spending and rewards must remain auditable on-chain.
  • Hunt screen currently passes empty string as npcAccount, so the present shipped hunt UI path would be expected to hit that block unless another caller path supplies a real NPC account.
  • Therefore current state is not “fake local success” but rather “UI can submit attempt, then gets blocked without chain target”.
  • Status: PASS for removal of previous optimistic local settlement in inspected code; FUNCTIONAL BLOCKER remains for actual hunt completion path from current screen wiring.
  • Evidence:
    • app/js/ui/screens/hunt.js lines 132-149
    • app/js/blockchain/broadcast.js lines 105-143

duel.js / arena.js

  • Duel screen is now in a newer state than the earlier broken/random version in one important respect:
    • seal timer expiry no longer auto-picks a random intent; it now returns to pre-phase with duel_manual_selection_required if no manual choice was made.
    • waiting screen no longer shows the earlier local _simulateOpponentReveal() path in the portion inspected during this retest.
  • But major real-flow limitations remain in current shipped code:
    • ArenaScreen still starts duels with empty combatRef from direct challenge actions (DuelScreen.startDuel(opp, '', ...)).
    • In DuelScreen._commitStrategy(), when there is no combatRef but there is an opponent, it creates a challenge and moves to waiting.
    • Honest runtime chain-backed continuation/reveal still cannot be confirmed without browser execution and event observation.
  • Also, the currently visible source snapshot still shows one damaged placeholder in duel commit state storage:
    • app/js/ui/screens/duel.js line 261 starts duelState.strategySecret=***
  • As with account.js, this directly conflicts with the successful node --check result collected in the same retest.
  • Status: INCONSISTENT EVIDENCE / REQUIRES MANUAL RECONCILIATION
  • Evidence:
    • app/js/ui/screens/arena.js lines 54-59, 137-141, 223-227
    • app/js/ui/screens/duel.js lines 251-267, 343-364, 374-416
    • live node --check app/js/ui/screens/duel.js output

Honest conclusion of this retest

  • What was really re-verified now:
    • localhost server is alive and returns HTTP 200;
    • chain RPC is live through api.viz.world and node.viz.cx;
    • dream-world account and grimoire data are still present on-chain;
    • parser checks currently report PASS for account.js / duel.js / hunt.js / broadcast.js / arena.js;
    • hunt code is no longer in the earlier optimistic-local-reward state;
    • hunt wiring has been advanced further: the hunt screen now passes creature.npcAccount instead of an always-empty target, so current starter creatures have an auditable award target path instead of guaranteed UI-side blocking;
    • config has been updated from obsolete viz.lexa.host to viz.lexa.top.
  • What I could not honestly confirm:
    • real browser load, login, service worker, selected node, or UI click-through in runtime;
    • real login using the provided key;
    • real chain-backed hunt completion;
    • real duel commit/reveal completion in browser.
  • Important environment note:
    • viz.lexa.top remains unresolved by DNS in this environment, but this is no longer treated as a blocker because other configured nodes are live and working.
  • Current main remaining product risks before final verdict:
    • real browser/on-chain hunt completion still needs runtime confirmation;
    • duel runtime still needs honest browser verification;
    • earlier inconsistent evidence around file snapshots versus parser checks should be treated as secondary until revalidated in a proper browser pass.