Summary
Extend the bot's before/after visual-capture pipeline (review.visual.*, currently static screenshots + an optional scroll-through GIF) with a new review.visual.interactions config: specific CSS selectors the bot hovers, clicks, or drags on a live page (self-host only, via the existing browserless/puppeteer-core sidecar) to capture before/after animated GIF evidence for behavior a static screenshot can't show — a hover-triggered popover, a click-triggered state change, or a drag-and-drop reorder.
This mirrors the animated-evidence contract already documented for contributors in metagraphed's SKILL.md (Phase C2), but automates it on the bot side instead of requiring a contributor to manually record and host a GIF.
Scope
review.visual.interactions[]: selector, action (hover | click | drag), drag_to (required for drag), path, label
- Real browser automation:
captureInteractionFrames (hover/click) + performDrag (mouse down → interpolated move → up, using each element's bounding-box center)
- Reuses the existing self-host GIF encode pipeline (frame-source-agnostic)
- New "Interaction preview" PR-comment section, alongside (never replacing) the static before/after table and scroll preview
- Global + per-repo configurable via
.loopover.yml, off by default (byte-identical to today when unset)
Non-goals
Drag interactions that need multi-touch or keyboard-modifier gestures are out of scope for this pass.
Summary
Extend the bot's before/after visual-capture pipeline (
review.visual.*, currently static screenshots + an optional scroll-through GIF) with a newreview.visual.interactionsconfig: specific CSS selectors the bot hovers, clicks, or drags on a live page (self-host only, via the existingbrowserless/puppeteer-coresidecar) to capture before/after animated GIF evidence for behavior a static screenshot can't show — a hover-triggered popover, a click-triggered state change, or a drag-and-drop reorder.This mirrors the animated-evidence contract already documented for contributors in
metagraphed'sSKILL.md(Phase C2), but automates it on the bot side instead of requiring a contributor to manually record and host a GIF.Scope
review.visual.interactions[]:selector,action(hover|click|drag),drag_to(required fordrag),path,labelcaptureInteractionFrames(hover/click) +performDrag(mouse down → interpolated move → up, using each element's bounding-box center).loopover.yml, off by default (byte-identical to today when unset)Non-goals
Drag interactions that need multi-touch or keyboard-modifier gestures are out of scope for this pass.