Context
validate_app's "live render clean" gate only captures JS runtime errors + CSP violations, so a render that is visually broken but throws nothing passes as clean. PR #6271 closed one instance of this class (a hidden element left painted by app CSS) with a CSS reset + a render-check diagnostic channel.
render-check handles objective contract violations (a documented invariant is provably broken). It does not — and shouldn't — cover the general "does this look broken" case (invisible text, a fixed element covering the viewport, an empty root, off-screen content), which is heuristic and would false-positive as a hard gate.
Proposal
The general detector already has its input: get_app_diagnostics captures a render screenshot, but validate_app doesn't look at it. Add an advisory vision pass over that screenshot (with the app's stated intent) that surfaces a "this render may be broken: " note to the authoring model — never gate-blocking, since it's non-deterministic.
Only build this if the silent-render category recurs (right now n is small); logging it so the trajectory is captured rather than building a framework prematurely.
Not in scope
- New per-footgun
render-check entries (add those to the existing channel; only refactor to a check registry once there's a second objective check).
- Making the vision signal block publish.
Context
validate_app's "live render clean" gate only captures JS runtime errors + CSP violations, so a render that is visually broken but throws nothing passes as clean. PR #6271 closed one instance of this class (ahiddenelement left painted by app CSS) with a CSS reset + arender-checkdiagnostic channel.render-checkhandles objective contract violations (a documented invariant is provably broken). It does not — and shouldn't — cover the general "does this look broken" case (invisible text, a fixed element covering the viewport, an empty root, off-screen content), which is heuristic and would false-positive as a hard gate.Proposal
The general detector already has its input:
get_app_diagnosticscaptures a render screenshot, butvalidate_appdoesn't look at it. Add an advisory vision pass over that screenshot (with the app's stated intent) that surfaces a "this render may be broken: " note to the authoring model — never gate-blocking, since it's non-deterministic.Only build this if the silent-render category recurs (right now n is small); logging it so the trajectory is captured rather than building a framework prematurely.
Not in scope
render-checkentries (add those to the existing channel; only refactor to a check registry once there's a second objective check).