46 lines
3.1 KiB
Markdown
46 lines
3.1 KiB
Markdown
# 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 | **FIXED** — `loadedPath` (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 0–1/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.
|