From 90bc9a0dad3ee11c29209a4893b6ac2650a25732 Mon Sep 17 00:00:00 2001 From: wtclaude Date: Sun, 19 Jul 2026 18:36:17 -0500 Subject: [PATCH] docs(android): record M2 (public shard + SSE) landed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mark M2 done in the build-progress section: the public shard widgets over /public/shard/* (hub + champ/guild/governor/house boards) and the live SSE feed with self-driven reconnect/backoff (Android-app#7). Update the status line to "M0–M2 landed; M3 next". No API change — the app consumes the existing public shard surface. Co-Authored-By: Claude --- android/PLAN.md | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/android/PLAN.md b/android/PLAN.md index b4bca89..d745ca7 100644 --- a/android/PLAN.md +++ b/android/PLAN.md @@ -1,6 +1,6 @@ # Android App — Plan -Status: **M0 + M1 landed; M2 (public shard + SSE) next.** This document is the +Status: **M0–M2 landed; M3 (auth) next.** This document is the design contract for the `RunicGateway/Android-app` repo. It was written before implementation so the API changes it depends on could be landed in `website/` and `docs/` first. The authoritative API reference is the committed OpenAPI spec at `website/server/swagger/swagger-output.json` (regenerated @@ -33,7 +33,21 @@ normalization, host rewriting, `ApiResult`/`UiState` mapping, and brand-color pa > safe). True codegen would first require authoring the spec's component schemas as real OpenAPI > models. -**M2–M4 (functional pass) and M5 (design pass) remain.** +✅ **M2 — public shard** (2026-07-19, `RunicGateway/Android-app#7`, functional Kotlin pass): the public +shard widgets (§6.2) over `/public/shard/*` — a shard hub (connection status, online count, latest +economy, presence, staff online) plus live boards for champion spawns, guilds, governors (with +on-demand term history) and falling houses (IDOC) — and the live **SSE** feed. `ShardStreamClient` +consumes `/public/shard/stream` over OkHttp SSE and, unlike the browser `EventSource`, drives its own +reconnect/backoff (reset on open, no read timeout for the idle keepalive), so a dropped feed degrades +to "offline" rather than crashing (§7). Boards seed from a snapshot then merge `*.update` / `*.remove` +SSE deltas in place via a reusable `LiveBoard`, mirroring the website's merge semantics; DTOs are +hand-authored + spec-aligned (as recorded for M1) and the live frames decode into the same board +DTOs. Wired into the shared drawer (§5), all strings externalized (§2). JVM unit tests (28) cover DTO +/ live-frame decode, the board merge, event-text formatting (parity with `lib/shardEvents.js`), and +SSE frame parsing. No backend/API change — the app is a pure consumer of the existing public shard +surface. + +**M3–M4 (functional pass) and M5 (design pass) remain.** **Prerequisite progress (§8):** all v1 prerequisites are **done** (2026-07-19) — ✅ password reset (item 2; website#75 + docs#8), ✅ role-agnostic `/auth/me/*` self surface (item 1; website#76 + docs#10), -- 2.49.1