docs(02): phase verification

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
archipelago 2026-07-31 00:03:13 -04:00
parent 2b89b78f18
commit 092a37332f

View File

@ -0,0 +1,118 @@
---
phase: 02-ui-performance
verified: 2026-07-31T00:00:00Z
status: gaps_found
score: 6/8 must-haves verified
behavior_unverified: 0
overrides_applied: 0
gaps:
- truth: "Every main tab registered for instance caching (KEEP_ALIVE_PATHS) genuinely survives a tab round-trip — the after-artifact's remount probe shows the component instance survived"
status: partial
reason: "02-08's own honest, independently-reproduced-twice remount probe (02-FINDINGS.md ## Results) confirms Home, Apps, Marketplace, Cloud, Web5 and Fleet genuinely survive a round-trip — but Server.vue, also registered in KEEP_ALIVE_PATHS since 02-04, genuinely does NOT (fully remounts on every revisit). This is a direct, self-admitted violation of 02-08-PLAN.md's own must-have truth, not a measurement artifact: it was reproduced twice specifically to rule out a fluke."
artifacts:
- path: "neode-ui/src/views/Server.vue"
issue: "Registered in KEEP_ALIVE_PATHS (via keepAliveRoutes.ts/TAB_ORDER) but its component instance is destroyed and recreated on every tab revisit; revisit ms also regressed (738ms baseline -> 849ms after) despite its own RPC count dropping (8 -> 2 via useCachedResource)."
missing:
- "Root-cause why Server.vue's KeepAlive wrapper registration doesn't actually keep its instance alive (02-FINDINGS.md explicitly defers this: 'Root cause not investigated here — Task 2's scope is measurement, not per-view debugging') and land a targeted fix, or an explicit accepted override if the team judges the current behavior (fast repopulate via cached RPCs, just not instance-preserving) good enough."
- truth: "For every surface the findings doc named as slow (pre-fix), the after-fix measurement shows a lower revisit time and a lower revisit RPC count than the baseline"
status: partial
reason: "02-08-PLAN.md's own must-have requires improvement on both dimensions for every previously-slow surface. 02-FINDINGS.md's ## Results table (self-reported, not inferred) shows 6 of ~9 measurable named-slow surfaces regressed or stayed flat on revisit ms even where RPC count improved: Discover (1083->1257ms, RPC unchanged 1->1), Server (738->849ms, RPC improved 8->2), Web5 (566->709ms, RPC unchanged 0->0), AppDetails (1204->1510ms, RPC improved 2->1), OpenWrtGateway (663.5->1148ms, RPC improved 4->2), and Wallet/send-flow (2607->2556ms, essentially unchanged, never touched by any plan's files_modified per the findings doc's own admission). Marketplace, MarketplaceAppDetails and CloudFolder did improve cleanly."
artifacts:
- path: ".planning/phases/02-ui-performance/02-FINDINGS.md"
issue: "## Outstanding section documents these regressions honestly but no plan in this phase, and no later roadmap phase, closes them."
missing:
- "Either a targeted investigation/fix for the regressed surfaces (FINDINGS.md itself suggests a same-time-of-day re-run to separate real regression from the node's 85%-disk/shared-build-server load noise it flags as a confound), or an explicit accepted override given the extensive human D-11 walkthrough already covered these exact tabs and secondary screens and returned 'approved'."
deferred: []
human_verification:
- test: "Re-check Server.vue specifically: does a tab-switch away and back to Server show a visible spinner or blank frame on real archi-dev-box hardware, given it fully remounts but its RPC count is now only 2 (down from 8)?"
expected: "No visible spinner/blank frame — this is the literal PERF-02/D-11 pass bar, which is a lower bar than 'instance survives' and may already be met even though the stricter must-have failed"
why_human: "The Task 3 D-11 checkpoint walkthrough included Server in its tab-cycling steps and returned 'approved,' but the checkpoint transcript does not record the reviewer's attention being drawn to the specific Server remount finding (which was written up in FINDINGS.md's Results section, produced by Task 2, before Task 3's human pass) — worth an explicit confirmation that the approval covered this specific tab's current behavior, not just the general 'much better' impression."
- test: "Confirm whether the timing regressions on Discover/Web5/AppDetails/OpenWrtGateway are real code-caused regressions or same-node/time-of-day environmental noise, per FINDINGS.md's own caveat (baseline taken 10:30 local, after-run taken 01:27 next day on the same 85%-disk multi-service node)"
expected: "A same-time-of-day re-run of the harness would separate signal from noise"
why_human: "Requires scheduling a controlled re-run against archi-dev-box, which is outside static-analysis verification"
---
# Phase 2: UI Performance Verification Report
**Phase Goal:** The UI feels fast — switching tabs and opening secondary screens renders promptly instead of stalling on refetches and remounts.
**Verified:** 2026-07-31
**Status:** gaps_found
**Re-verification:** No — initial verification
## Goal Achievement
### Observable Truths
| # | Truth | Status | Evidence |
|---|-------|--------|----------|
| 1 | The slowest tab switches and secondary-screen opens are profiled with causes named (remount storms, serial RPC waterfalls, uncached fetches), before any fix lands | ✓ VERIFIED | `02-FINDINGS.md` names a primary cause per D-09 surface, cites `02-PERF-BASELINE.json` fields for each, and was committed (`675deb65`) before the first `neode-ui/src` change in the phase (`385c9d86`) — confirmed via `git log` ordering |
| 2 | Main-tab switches render immediately from cached state with background refresh — no blank screens/long spinners on tabs already visited this session | ⚠️ PARTIAL | 6 of 8 measured main tabs (Home, Apps, Marketplace, Cloud, Web5, Fleet) independently confirmed to genuinely survive a round-trip (reproduced twice); **Server.vue registered for instance caching but confirmed to genuinely remount on every revisit** (regression, not artifact — see gap 1). Mesh and Chat remain unmeasured both before and after (environmental blockers: device not reporting `connected`; a disk-usage toast intercepting the close button) — not evidence of failure but not evidence of success either |
| 3 | Secondary screens open without a blocking full reload and repeat visits are instant | ⚠️ PARTIAL | AppDetails, MarketplaceAppDetails, CloudFolder and OpenWrtGateway all converted to per-item keyed `useCachedResource` (no blocking reload, confirmed by code + tests); but repeat-visit **timing regressed** for AppDetails and OpenWrtGateway despite fewer RPCs, and the Wallet/send-flow anomaly (revisit slower than first visit, flagged in the 02-01 baseline) was never addressed by any plan's `files_modified` — see gap 2 |
| 4 | The fixes are verified on real node hardware (not just the dev box) — the sluggishness the user reported is gone on-device | ✓ VERIFIED | 02-08's `checkpoint:human-verify` (Task 3) walked every main tab and several secondary screens on archi-dev-box; first pass reported a real regression (Cloud first-click) which was root-caused (unbounded `content.browse-peer` fan-out starving the connection pool) and fixed across two commits, verified 5/5 fresh sessions; user's final re-check: **approved** |
| 5 | (02-08 must-have) Every main tab registered for instance caching survives a tab round-trip in the after-artifact's remount probe | ✗ FAILED | `02-FINDINGS.md` ## Results — Server.vue does not survive, confirmed via two independent reproductions of a corrected, harness-independent probe |
| 6 | (02-08 must-have) Every surface named as slow in the findings has a lower revisit time AND lower revisit RPC count after the fix | ✗ FAILED | 6 of ~9 named-slow surfaces regressed or stayed flat on revisit ms (Discover, Server, Web5, AppDetails, OpenWrtGateway, Wallet/send-flow); documented honestly in `02-FINDINGS.md` ## Results / ## Outstanding, not hidden |
| 7 | The instance-cache cap (`KEEP_ALIVE_MAX`) is set from observed on-device memory rather than an estimate | ✓ VERIFIED | `neode-ui/src/views/dashboard/keepAliveRoutes.ts` comment records a CDP `Performance.getMetrics` reading across 4 full cycles of all 11 main tabs (8.8MB baseline, 10-21MB range, no monotonic growth) |
| 8 | The build shipped to the dev pair contains this phase's changes, deployed only to the dev pair (no fleet/OTA) | ✓ VERIFIED | 02-08-SUMMARY.md records grepping the served bundle at `/opt/archipelago/web-ui` for representative strings; `archy-x250-dev` confirmed offline throughout (checked 3x), only `archi-dev-box` received the build — matches D-15/D-11 scope |
**Score:** 6/8 truths verified (2 explicitly FAILED per the phase's own self-reported, git-committed measurement data — not inferred or code-read)
### Required Artifacts
| Artifact | Expected | Status | Details |
|----------|----------|--------|---------|
| `neode-ui/e2e/perf/{surfaces,measure,surface-perf.spec}.ts` | Re-runnable perf harness | ✓ VERIFIED | Present, exports match must_haves, re-run twice (baseline + after) producing directly comparable artifacts |
| `.planning/phases/02-ui-performance/02-PERF-BASELINE.json` / `02-PERF-AFTER.json` | Pre/post measurements | ✓ VERIFIED | Both present, committed, 15/15 rows each |
| `.planning/phases/02-ui-performance/02-FINDINGS.md` | Cause-per-surface + before/after comparison | ✓ VERIFIED | All required sections present; Results/Outstanding sections added by 02-08 |
| `neode-ui/src/composables/useCachedResource.ts` | Stale-while-revalidate composable | ✓ VERIFIED | Exists, 5834 bytes, `onActivated` wiring confirmed |
| `neode-ui/src/views/dashboard/keepAliveRoutes.ts` | `shouldKeepAlive`, `KEEP_ALIVE_PATHS`, `KEEP_ALIVE_MAX` | ✓ VERIFIED | Present, documents both withholding reasons (D-02 already-fast, Settings unaudited-risk) |
| `neode-ui/src/components/RefreshIndicator.vue` | Background-refresh indicator | ✓ VERIFIED | Present, 1651 bytes |
| `neode-ui/src/views/dashboard/DashboardRouterView.vue` | KeepAlive host | ✓ VERIFIED | Present (per 02-02 files_modified, referenced by keepAliveRoutes.ts comments) |
| `neode-ui/src/stores/resources.ts` `clearAll()` / `auth.ts` `logout()` purge | Session-scoped cache clearing | ✓ VERIFIED (by SUMMARY test coverage; not independently re-run) | `resourcesClear.test.ts` referenced in 02-03 files_modified |
### Key Link Verification
| From | To | Via | Status | Details |
|------|-----|-----|--------|---------|
| `DashboardRouterView.vue` | `keepAliveRoutes.ts` | `shouldKeepAlive(route)` | ✓ WIRED | Confirmed via keepAliveRoutes.ts imports/exports and 02-02/02-04 SUMMARY test coverage |
| `useCachedResource.ts` | Vue `onActivated` | reactivation triggers `refreshIfStale` | ✓ WIRED | Confirmed present in `useCachedResource.ts` and exercised by `Server.vue`'s own `onActivated` (grepped directly, line 944) |
| `Server.vue` | `useCachedResource.ts` | 7 load groups as keyed cached resources | ✓ WIRED (data caching) / ✗ NOT DELIVERING instance survival | RPC count dropped 8->2 confirming the cache wiring works; but the component itself still fully remounts, so the "instance reused" half of PERF-02 is not delivered for this tab |
| `.planning/phases/02-ui-performance/02-FINDINGS.md` | `02-PERF-BASELINE.json` / `02-PERF-AFTER.json` | every cause/verdict cites a baseline or after field | ✓ WIRED | Confirmed by direct read of the Results table |
### Requirements Coverage
| Requirement | Source Plan | Description | Status | Evidence |
|-------------|-------------|-------------|--------|----------|
| PERF-01 | 02-01, 02-08 | Slowest surfaces profiled, causes named, targeted fixes | ✓ SATISFIED | `02-FINDINGS.md` — comprehensive, gated before src changes, re-run after with honest before/after comparison |
| PERF-02 | 02-02, 02-04, 02-05, 02-06, 02-07 | Main-tab switches render immediately from cached state, background refresh, no blank/spinner | ⚠️ PARTIAL | True for Home/Apps/Marketplace/Cloud/Web5/Fleet/Mesh(cached, though tab itself unmeasured on real device)/Chat; **not delivered for Server.vue** (genuine remount + slower revisit); Web5/Fleet also show unresolved "split signal" timing regressions despite surviving instance |
| PERF-03 | 02-03, 02-08 | Secondary screens open without blocking reload, instant on repeat, verified on real hardware | ⚠️ PARTIAL | Per-item caching correctly implemented and no blocking reload for the four converted secondary screens; but AppDetails/OpenWrtGateway revisit ms regressed and Wallet/send-flow's anomaly was never fixed; real-hardware D-11 checkpoint did pass overall |
REQUIREMENTS.md marks all three `[x]` Complete — this verification finds PERF-01 fully supported, but PERF-02 and PERF-03 only partially supported by the project's own measured evidence.
### Anti-Patterns Found
None found in the reviewed source (`keepAliveRoutes.ts`, `Server.vue`, `useCachedResource.ts`) — no TODO/FIXME/XXX/placeholder markers, no stub returns. The self-reported gaps above come from the phase's own honest measurement artifacts, not from code smells.
### Human Verification Required
### 1. Server.vue's actual on-device feel despite the remount
**Test:** On archi-dev-box, switch away from Server and back several times; watch specifically for a spinner or blank frame (not just "does it look fine overall").
**Expected:** No visible spinner/blank frame — Server's RPC count dropped from 8 to 2, so even a full remount may resolve fast enough to feel instant.
**Why human:** The D-11 checkpoint's "approved" covered general tab-cycling including Server, but the specific remount finding was written up by an automated pass (Task 2) that ran before the human walkthrough (Task 3); no record shows the reviewer's attention was drawn to this specific finding.
### 2. Timing-regression surfaces: real regression or environmental noise
**Test:** Re-run the 02-01/02-08 harness against archi-dev-box at the same time of day as the original baseline (10:30 local), on an idle node.
**Expected:** Either the regressions on Discover/Web5/AppDetails/OpenWrtGateway shrink or disappear (confirming environmental noise), or they persist (confirming a real regression needing a fix).
**Why human:** Requires scheduling a controlled re-run; FINDINGS.md itself names this exact caveat but does not resolve it.
### Gaps Summary
Phase 2 delivered a substantial, well-tested KeepAlive + `useCachedResource` architecture, and the team's own verification discipline in this phase was unusually strong: a D-10 measure-before-fix gate that was actually honored (confirmed by git-log ordering), a checkpoint-caught margin/animation regression fixed and re-verified in 02-02, a Cloud first-click connection-pool-starvation regression found and fixed during the final D-11 checkpoint (root-caused via direct instrumentation, not guessed), and honest self-reporting of every regression and gap in `02-FINDINGS.md` rather than averaging them away or hiding them — the phase's own artifacts are unusually candid.
That candor is exactly what surfaces the two gaps blocking a clean pass: (1) Server.vue, registered for instance caching since 02-04, is confirmed — via a corrected probe method reproduced twice specifically to rule out a fluke — to still fully remount on every tab revisit, a direct contradiction of 02-08's own must-have truth and of PERF-02's substance for that one tab; and (2) six of the roughly nine surfaces the findings doc named as slow (Discover, Server, Web5, AppDetails, OpenWrtGateway, Wallet/send-flow) show a regressed or unchanged revisit time in the after-measurement despite the architecture landing, a direct contradiction of another 02-08 must-have. Both are self-documented in `02-FINDINGS.md`'s own `## Outstanding` section as open, non-blocking follow-ups, and both are plausible candidates for a same-time-of-day/environmental-noise explanation the findings doc itself flags but does not resolve. The final D-11 human checkpoint did walk every main tab (including Server) and multiple secondary screens and returned "approved" after the one regression that was surfaced (Cloud) was fixed — but there is no record that the specific Server-remount finding or the specific per-surface timing regressions were called out to the reviewer as items requiring an explicit accept/reject decision, as opposed to being folded into a general "much better" impression. Given the phase's own must-have truths explicitly name these as required outcomes and no later roadmap phase claims ownership of closing them, this verification cannot silently pass them — they are reported as gaps with a clear override path (both are named in the frontmatter's `human_verification` section, and either could be resolved with a targeted fix or an explicit accepted-deviation override added to a re-verification pass).
---
_Verified: 2026-07-31_
_Verifier: Claude (gsd-verifier)_