Independent layer-3 QA completed against the read-only perf stage on :8090.
Found and fixed two migration regressions:
- S2: Dense native legends collapsed the 390px IP plot to almost zero height and crowded ports/protocol charts. Capped the legend height, retained scrollable 44px native buttons, and update contract targets when scrolling.
- S3: Rotated temporal ticks pushed the Time axis title below the clipped card. Added enough bottom margin for the displayed label.
Fix: 43c35e1. Additional coverage: 10bf5ab.
Six new fixture-backed Playwright tests cover dense legend/axis behavior at 390/768/1280/1920px, actual scrolled legend targets and pointer/keyboard restoration, cumulative stacking proportions after legend changes, and obsolete traffic-request cancellation. They use the chart contract and real DOM bounds rather than pixels or private data.
The browser audit covered every listed flow, all eight dashboard cards and 12 file charts, all granularities and seven-chart drilldown, brush and URL/history, every metric/family/side/source control, light/dark themes, all requested widths, single/empty/error recovery, rapid filter changes, accessibility-tree and keyboard basics, and repeated-filter heap/listener probes. Compared all baseline card captures with SVG results and matched count/min/max/total for 40 rendered series against captured API data. No incorrect metric or stale-render overwrite was confirmed. Expected injected 503 and invalid-route errors were separated from application errors; there were no unexpected page exceptions.
All required checks passed: bun run format, bun run lint, bun run typecheck, bun run test:web with 215 tests, and bun run test:e2e with 68 tests.
Human review guide: Open the populated single-day, five-minute dashboard on perf at 390px. Scroll to IP counts and ports, scroll through the legend, toggle the last series with mouse and Space, then inspect the visible Time title. Compare 768/1280/1920px and both themes. Check traffic stack order before/after hiding TCP, hover its original bucket and exercise brush/reset. These real-stage checks have passed; Firefox/WebKit, real touch devices and a full screen-reader session remain unverified.
Layer 4 remains responsible for the already documented default-dashboard render/heap regression and duplicate initial file-summary requests. Thirty repeated direction changes showed stable listener counts and two stable DOM sizes, with GC heap around 28–31MiB, rather than confirmed unbounded growth. No new controlled perf/bundle benchmark was run. The inherited selection-persistence, narrow-file layout, calendar/date-order validation, file-title and keyboard card-layout findings remain documented for their existing later-layer scope.
Redeployed only perf using its isolated environment. Final image atlantis-perf-web:50283d58b7cabdc5f1d02ed457eb0625 is healthy with /data read-only; the source DB stat is unchanged. No actions targeted :8080/test or Cloudflare.
The full private QA report is /tmp/atlantis-frontend-overhaul/e2e/layer3-qa.md; 297 before/fixed screenshots are in e2e/layer3-qa-screens/. No private data or screenshots were uploaded or committed. LOG.md has a QA handoff entry.