# STEP20C saved target natural timeout and input probe **EXPERIMENTAL / PARTIALLY_FEASIBLE.** STEP20C remains NEXT; production multi-output Mosaic is NOT YET SUPPORTED. This is a new, single-run laboratory. The prior [target crossing report](STEP20C_SAVED_BUFFER_TARGET_CROSSING_PROBE.md) remains PARTIALLY_FEASIBLE and architecturally UNDECIDED. Its E1 established one actual target saved node crossing `x=0`, clipped render in H1, 182,214 retained target pixels and a real ACK/cleanup. Its E2 timeout stopped through fixture pointer correlation; it did not test Mosaic target timeout cleanup. The old H2 Kitty reference changed one complete 11×23 rectangle from its block-cursor color `#F5E0DC` to background `#303038` across pristine and Mosaic runs. Blink causality is strongly supported but unproven. This probe uses an opaque, static XDG SHM reference with app ID `org.mosaic.StaticReference`, fixed RGB and no text cursor or animation. The reference still handles real configure/ACK and Wayland events. Two full H2 RGB captures separated by more than one historic Kitty blink interval must match exactly before the target episode is reserved. No region is masked, and reference failure stops the run. ## Source identity and geometry Pinned inputs: SwayFX 0.6 `fd71a6bdc061bd633b488ae7b83e8a6981d22f86`, private Mosaic `cd550382b311efdbfe3ed892f4e1d281d852e754`, SceneFX 0.5 `37ccd723bef49e6891156ffafce8f549f01446cc`, wlroots 0.20.2. Preserved clipping, saved-buffer and target-geometry trace patches retain their bytes. Any further passive hit trace has its own patch and hash. No production source, SceneFX algorithm, public ABI, package, UX or active desktop session is changed. The private timeout policy is `-Dtxn-timeout=2500`, parsed into `server.txn_timeout_ms`; no `-Dtxn-wait`, `-Dnoatomic`, direct save call or scheduler change is used. Source audit of the pinned private copies located `transaction_commit`, `should_configure`, `transaction_progress`, `apply_container_state` and `handle_timeout` in `sway/desktop/transaction.c`: an ordinary changed-size instruction calls `view_save_buffer`, and timeout advances the transaction through the normal progress path. `sway/tree/view.c` implements `view_save_buffer_iterator`, `view_save_buffer` and `view_remove_saved_buffer`; its iterator creates the saved scene buffer and passes the current source buffer to `wlr_scene_buffer_set_buffer`. The private SceneFX `types/scene/wlr_scene.c` contains `wlr_scene_buffer_create`, `wlr_scene_buffer_set_buffer`, `wlr_scene_node_for_each_buffer`, `scene_node_intersect_clip`, `scene_node_point_inside_clip`, `wlr_scene_node_at` and `scene_entry_render`. The latter two paths are separately observed by the passive hit and render traces. A saved scene buffer is distinct from its source Wayland buffer, output buffer, and optimized blur cache. Only H1 `(-800,0),800×600` and H2 `(0,0),800×600`, scale 1, normal, are allowed. Map and settle all clients first. Record H2 reference app ID, output, geometry, two PNG hashes and full RGB equality. Then identify the target app ID `org.mosaic.SavedBufferProbe`, workspace, output, tiled owner, view, source scene node/buffer, destination/source dimensions, source box, transform, applied camera, tiled clip and global source box. Compute one signed relative scroll from the **current** camera and measured source node. Remeasure after application. Require nonempty source and `left<0