Widget JS can photograph itself at the exact moment of its logic:
jsr.capture({name: 'city'}).then(function (shot) {
console.log('SELFIE ' + shot.path);
});
Core bridge channel (__jsr_capture) with an optional
JsRuntimeConfig.captureHandler; hosts without one reject the promise
(voxel.attach-style graceful degradation). The channel is
fire-and-forget ON PURPOSE: an awaited capture would starve
__jsr_event_done and wedge every subsequent callEvent, and resolving
from the tester zone re-enters the QuickJS runtime from a
native-callback context (isolate-wide deadlock). The CLI therefore
resolves immediately with the future path (voxel.mesh sync pattern)
and rasterizes the tree snapshot in its testWidgets phase — PNGs land
under --capture-dir, listed in the --json report captures[].
This closes the loop for agent widget-authors whose only tool is
jsr_widget test: it now produces both logic evidence and visual
evidence. Also: parseJsrToolArgs/defaultQuickjsLibEnv/loadWidgetSource
and JsVoxelChunk.fromDynamic decomposed under the CRAP-12 ratchet, with
tests for the cache walk, usage errors and manifest fallbacks.
Documented in the authoring skill (jsr API + §8.3) and AGENTS.md.