feat(app): add seeded live visual-QA sweep#14818
Conversation
b601b34 to
a5f62fc
Compare
|
Reviewed, rebased onto Fixes made while reviewing:
Verification run locally: I also ran the real live harness against a Vite dev server. Port Visual spot-checks covered the mobile composer-focused screenshot and the desktop backend-unreachable screenshot. The expected no-backend Vite/API warnings appeared during the run. |
|
Update: after my first push, the PR branch moved to I preserved the newer branch choice to write default output under the already-ignored
Final local verification on Strict live rerun against this final branch: |
62940ba to
32ee205
Compare
|
Rebased onto current Review/fix notes:
Verification on the rebased head:
|
|
Adversarial review — not merging as-is (fabricated default inside the strict gate + vacuous seeded captures).
Positives worth keeping: fail-closed navigation on load errors/non-OK HTTP, the test file does run in CI, output dir already gitignored. Fix 1-3 and this is mergeable. |
|
Blocking merge as-is. The harness needs the maintainer-blocking issues resolved before this can land: missing |
…g-legs runbook (#14840) * docs(mvp): 2026-07-06 verification-status snapshot + turnkey remaining-legs runbook Records the headless UI/testing verification pass over board 15: what landed (20 PRs), the device-verified findings (iOS blue-dialog fix #14826, Android 4GB boot-timeout root-cause #14390, destructive≡accent flag #14415), and — the point of the doc — the exact command for each remaining leg that needs an owner-held resource (live model key, cloud creds, Railway services, paired device, connector tokens), so the human-verify work is turnkey. Per the doc-driven-development workstream: a dated snapshot alongside status/STATUS.md. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * docs(mvp): correct snapshot against live board state #14505 closed unmerged in review consolidation, #14818 still in review, destructive-token finding lives on the #14415 thread; PR count 20 -> 18. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Shaw <shawgotbags@gmail.com> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
|
Review hold: the mobile composer capture does not actually target the chat composer.
Please seed/navigate to the chat route, select the actual composer, and attach/verify live artifacts if this is meant to satisfy app visual proof. |
Add audit:live for fast visual QA against an already-running dashboard dev server. The sweep captures onboarding, seeded post-onboarding shell/chat, and the mobile composer-focused state, then runs each screenshot through scripts/lib/visual-qa.mjs. Seeded contexts use the same Steward localStorage keys and decodable unsigned JWT shape as the UI smoke auth helper, so the tool reaches the backend-unreachable shell without touching server state or requiring real credentials. Hardening in this amend: write output under the existing ignored test/ui-smoke/output tree, use the analyzer's blue_fraction field, and close browser contexts/browsers in finally blocks. Validation: - bun run --cwd packages/app test -- scripts/visual-qa-live.test.mjs (8 tests) - bunx @biomejs/biome check packages/app/scripts/visual-qa-live.mjs packages/app/scripts/visual-qa-live.test.mjs packages/app/package.json - git diff --check Prior live run evidence from the PR body: 7 states against :2138, blue_fraction=0.000 on all states, PASS.
- aggregateVerdict treats a capture without a measured blue_fraction as an offender (never reads 'unmeasured' as 0) per the error-policy doctrine. - New seedDriftOffenders gate: the seeded shell must differ materially from the onboarding gate per viewport (changeMetric), so a drifted seed contract hard-fails instead of silently re-capturing the gate. - Composer capture prefers the canonical chat-composer-textarea testid. - Annotated the networkidle settle catch (error-policy:J6). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
32ee205 to
3a0b376
Compare
|
Deep architectural review + fix-forward (3a0b376). Merged. Why it's the right shape: this is not a second audit mechanism — Fixes applied before merge (the earlier adversarial-review blockers):
Live proof (against the running dev server on :2138, isolated contexts): 7/7 states captured, strict PASS, blue=0.000 everywhere; seed deltas desktop 0.0557 / mobile 0.0974 (> 0.02 floor — the seed demonstrably left the gate: seeded states render the designed |
|
Verification update from this pass:
|
|
Claude encountered an error —— View job I'll analyze this and get back to you. |
Relates to
Definition of Done: full standard in
PR_EVIDENCE.md.developand is rebased ontoorigin/developwith zero conflicts.bun installandbun run verifywere not run; focused verification is listed below.Sync with develop
origin/develop; PR is mergeable after the rebase.bun run verifynot run because this is a narrow app-script change; focused checks and a live run are listed below.Risks
Low. This adds a local operator/audit script and package script only. It does not change shipped runtime UI behavior. Main risks are false positives/false negatives in the visual harness, addressed by unit coverage and a strict live run.
Background
What does this PR do?
Adds
bun run --cwd packages/app audit:live, a lightweight visual-QA sweep that points Playwright at an already-running app dev server and captures the states that matter for the MVP:The sweep writes screenshots plus
report.json, runs each capture through the repo'svisual-qa.mjsanalyzer, and lets--strictfail on the no-blue brand invariant.Review fixes included in this update:
test/ui-smoke/output/visual-qa-live-output/tree, so no.gitignorechange is needed.color_fractions.blue_fraction, which is the field emitted byvisual-qa.mjs.What kind of change is this?
Improvements: local visual-audit tooling for the app package.
Documentation changes needed?
No project documentation change required. The script has usage notes in its file header and is exposed through
packages/app/package.json.Testing
Where should a reviewer start?
Start with
packages/app/scripts/visual-qa-live.mjs, thenpackages/app/scripts/visual-qa-live.test.mjsfor the pure decision logic.Detailed testing steps
Result:
Live run:
Result:
Evidence Gate
Any change testable on the frontend is not mergeable without a video walkthrough, before/after screenshots, and logs. If you did not attach them, say why.
Evidence Details
Real LLM-call trajectory
N/A - no agent/action/provider/prompt/model behavior changed.
Backend + frontend logs
Backend logs: N/A - no backend was started for this lane. That is intentional because the seeded post-onboarding states should surface the designed
Backend UnreachableUI.Frontend/dev-server log summary from the live run:
These warnings match the expected no-backend verification mode and the screenshot report still passed the strict no-blue invariant.
Screenshots (before / after) + video walkthrough
Before
N/A - no product UI surface changed.
After
Generated locally by the live run:
Walkthrough video
N/A - CLI audit harness, no interactive product flow changed.
Audio / voice walkthrough
N/A - no voice, transcript, TTS, or STT changes.
Known gaps / failures
bun run verifywas not run; focused checks and one strict live run were run instead.2138was already in use locally, so the live run usedELIZA_UI_PORT=42138and passed--base http://127.0.0.1:42138.@elizaos/shared,@elizaos/cloud-routing, and runtime artifacts for@elizaos/coreto start Vite. The worktree remained clean afterward; generateddist/outputs are ignored.