Play-route indexer offline degraded-mode banner (#354) #522

Merged
PlasticDigits merged 1 commit from issue-354-play-indexer-offline-banner into main 2026-06-26 03:37:22 +00:00
PlasticDigits commented 2026-06-25 22:29:35 +00:00 (Migrated from gitlab.com)

Summary

Play route / now mounts the shared IndexerStatusBar at the top of ArenaSimplePage, matching the AUDIT footer degraded-mode pattern. During indexer outages, users see INDEXER · offline · retrying instead of stale cached podium/timer data with no connectivity signal. The global footer remains hidden on play routes per RootLayout; the banner clears on recovery without blocking read-only play.

Related: #354 (parent gap #342 P2 #14, bundles #96).

Acceptance checklist

Criterion Verification Result
Play route shows indexer offline indicator when connectivity hook reports offline cd frontend && npm test -- ArenaSimplePage.test.tsx — offline path asserts INDEXER · offline · retrying in arena-simple-indexer-status PASS
Banner matches protocol page behavior (retrying copy) Same IndexerStatusBar component as AgentFooterCard; shared useIndexerConnectivity hook PASS
ArenaSimplePage.test.tsx covers offline path describe("ArenaSimplePage indexer offline banner (GitLab #354)") — mount + offline copy tests PASS
npm test PASS cd frontend && npm run typecheck && npm run lint && npm test PASS

Verification checklist (third parties)

  1. cd frontend && npm run typecheck && npm run lint && npm test — all PASS.
  2. Start local stack with indexer: bash scripts/start-qa-local-full-stack.sh --no-swarm --no-frontend (or existing Anvil + indexer on :3100).
  3. cd frontend && npm run dev with frontend/.env.local pointing at indexer.
  4. Load http://127.0.0.1:5173/ — confirm data-testid="arena-simple-indexer-status" shows live/connecting pill when indexer is up.
  5. Stop indexer (or block port 3100), wait ~3–5 s — pill shows INDEXER · offline · retrying; podiums may show stale cache but must not be labeled live.
  6. Restart indexer — pill returns to live; play surface remains usable throughout.

Blockers

None.

## Summary Play route `/` now mounts the shared `IndexerStatusBar` at the top of `ArenaSimplePage`, matching the AUDIT footer degraded-mode pattern. During indexer outages, users see `INDEXER · offline · retrying` instead of stale cached podium/timer data with no connectivity signal. The global footer remains hidden on play routes per `RootLayout`; the banner clears on recovery without blocking read-only play. Related: #354 (parent gap #342 P2 #14, bundles #96). ## Acceptance checklist | Criterion | Verification | Result | |-----------|--------------|--------| | Play route shows indexer offline indicator when connectivity hook reports offline | `cd frontend && npm test -- ArenaSimplePage.test.tsx` — offline path asserts `INDEXER · offline · retrying` in `arena-simple-indexer-status` | PASS | | Banner matches protocol page behavior (retrying copy) | Same `IndexerStatusBar` component as `AgentFooterCard`; shared `useIndexerConnectivity` hook | PASS | | `ArenaSimplePage.test.tsx` covers offline path | `describe("ArenaSimplePage indexer offline banner (GitLab #354)")` — mount + offline copy tests | PASS | | `npm test` PASS | `cd frontend && npm run typecheck && npm run lint && npm test` | PASS | ## Verification checklist (third parties) 1. `cd frontend && npm run typecheck && npm run lint && npm test` — all PASS. 2. Start local stack with indexer: `bash scripts/start-qa-local-full-stack.sh --no-swarm --no-frontend` (or existing Anvil + indexer on `:3100`). 3. `cd frontend && npm run dev` with `frontend/.env.local` pointing at indexer. 4. Load `http://127.0.0.1:5173/` — confirm `data-testid="arena-simple-indexer-status"` shows live/connecting pill when indexer is up. 5. Stop indexer (or block port 3100), wait ~3–5 s — pill shows `INDEXER · offline · retrying`; podiums may show stale cache but must not be labeled live. 6. Restart indexer — pill returns to live; play surface remains usable throughout. ## Blockers None.
PlasticDigits commented 2026-06-25 22:31:18 +00:00 (Migrated from gitlab.com)

Security review — MR !522

Commit reviewed: 648936c026058da115a87150bde7b561a8d6a923
Scope: Play-route indexer offline degraded-mode banner (#354) — ArenaSimplePage.tsx mounts shared IndexerStatusBar; CSS margin; tests; docs/invariants.

Method

  • Diff and surrounding paths: IndexerStatusBar, useIndexerConnectivity, IndexerConnectivityProvider, indexerConnectivity.ts, indexerApi.ts (fetchIndexerStatus), RootLayout footer gating.
  • Traced attacker-controlled inputs to sinks: no new HTTP endpoints, env parsing, shell/SQL, or onchain code in this diff.
  • Reused component already rendered on AUDIT footer (AgentFooterCard); play route previously hid the global footer without an inline substitute.

Findings

FINDINGS: 0 (no medium, high, or critical)

Area Result
XSS IndexerStatusBar renders status copy via React text nodes (<span>{line}</span>); no dangerouslySetInnerHTML. Dynamic schema_version / block fields come from the configured indexer GET /v1/status and were already shown on footer routes — unchanged trust model.
SSRF / injection No new fetch paths; indexerBaseUrl() remains build-time VITE_INDEXER_URL (+ devnet default).
Authn/authz Display-only banner; no write gates or session handling changed.
EVM / contracts No Solidity or deploy changes.
Secrets / logging Static offline copy only; no new logging.
Supply chain No dependency changes.

Outcome

Security review: no medium+ findings on this diff.

No inline threads (nothing to block on).

## Security review — MR !522 **Commit reviewed:** `648936c026058da115a87150bde7b561a8d6a923` **Scope:** Play-route indexer offline degraded-mode banner (#354) — `ArenaSimplePage.tsx` mounts shared `IndexerStatusBar`; CSS margin; tests; docs/invariants. ### Method - Diff and surrounding paths: `IndexerStatusBar`, `useIndexerConnectivity`, `IndexerConnectivityProvider`, `indexerConnectivity.ts`, `indexerApi.ts` (`fetchIndexerStatus`), `RootLayout` footer gating. - Traced attacker-controlled inputs to sinks: no new HTTP endpoints, env parsing, shell/SQL, or onchain code in this diff. - Reused component already rendered on AUDIT footer (`AgentFooterCard`); play route previously hid the global footer without an inline substitute. ### Findings **FINDINGS: 0** (no medium, high, or critical) | Area | Result | |------|--------| | XSS | `IndexerStatusBar` renders status copy via React text nodes (`<span>{line}</span>`); no `dangerouslySetInnerHTML`. Dynamic `schema_version` / block fields come from the configured indexer `GET /v1/status` and were already shown on footer routes — unchanged trust model. | | SSRF / injection | No new fetch paths; `indexerBaseUrl()` remains build-time `VITE_INDEXER_URL` (+ devnet default). | | Authn/authz | Display-only banner; no write gates or session handling changed. | | EVM / contracts | No Solidity or deploy changes. | | Secrets / logging | Static offline copy only; no new logging. | | Supply chain | No dependency changes. | ### Outcome **Security review: no medium+ findings on this diff.** No inline threads (nothing to block on).
PlasticDigits commented 2026-06-26 03:37:22 +00:00 (Migrated from gitlab.com)

mentioned in commit 6f41cbf80a

mentioned in commit 6f41cbf80ab2afe1e5022784ea1804c9abce110d
PlasticDigits (Migrated from gitlab.com) merged commit 6f41cbf80a into main 2026-06-26 03:37:22 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
code/yieldomega!522
No description provided.