Files
waggle-os/docs/ux-refactor/p7-track-b-review-record.md
Oleg Maslov 0c3e2ead3b
Some checks failed
Installer Smoke / installer-smoke (push) Has been cancelled
moving
2026-09-02 10:10:29 +02:00

3.1 KiB
Raw Permalink Blame History

P7/D15 Track B — Adversarial Review Record

Multi-agent review of the Track B error-state diff (e797926..cce3ef0): 5 per-screen reviewers → 3-lens adversarial verification (correctness / state-machine-races / reproduction; confirmed if ≥2 of 3 vote real). 38 agents, ~2.3M subagent tokens. Fixes in 9f3cf2a.

Tally

11 findings → 2 confirmed / 9 refuted. Both confirmed were in B4 (Files), one root cause.

# Sev Votes Screen Finding Disposition
1 MED 2/2 files Cross-directory nav failure: stale entries from the prior dir keep files.length>0, so the offline && files.length===0 error gate is skipped → a failed /sub load renders "Empty directory" + a contradictory "showing cached files" banner FIXEDloadedPath (set only on success); cold-error gate = offline && !haveCurrentData where haveCurrentData = loadedPath===currentPath. Regression test: nav into a failing subdir → error, not empty.
2 LOW 2/2 files A known-empty dir ([] loaded OK) then a failed refresh → files.length===0 → false "Couldn't load files" for a dir we proved empty FIXED — same loadedPath signal: a failed refresh keeps haveCurrentData true → falls through to "Empty directory", not the cold error. Regression test: context-menu Refresh → reject → stays empty.

Both fixed together by replacing files.length inference with an explicit loadedPath load-outcome signal, making error / empty / cached-banner mutually exclusive regardless of stale cross-directory data. loading initial state flipped to true so the first paint isn't a false empty.

Refuted (9, all 01/3)

The panel correctly dismissed every other finding, several with detailed traces:

  • Room "error UI dead in production" (HIGH, 1/3) — claimed real SSE failures (401/drop) never set error. Refuted: the adapter's reconnecting EventSource handles onerror internally (close→backoff→token-refresh→reopen) and surfaces nothing to the hook by design (D3 SSE-revival contract). error correctly fires only on a synchronous subscribe throw; the async path is the adapter's job, not a Track B regression.
  • Approvals partial-success / poll-flash (HIGH+MED, 0/3) — the single error does not defeat partial success: allSettled still renders the fulfilled source; a transient poll failure resolving to error-then-heal is the intended 5s-cadence behavior.
  • Room connecting sync-flip, error∧tiles coexistence (MED+LOW, 0/3) — when error is truthy the event callback never ran, so workspaceMap is empty and the ungated tile blocks are unreachable; no state combo renders tiles beside the error.
  • Command Center boundary/portal, searchDegraded race (0/3), B5 filter-masking / gate-coverage (0/3) — traced and dismissed.

Gate (post-fix)

FE 897/897 · tsc 0 (apps/web) · lint 0. 9f3cf2a.

Note: several verifier agents hit a weekly model limit mid-run; both confirmed findings reached a clean 2/2 and the load-bearing refutals completed, so the verdict is sound.