D980 - A device-addressed capture holds every chunk its dispatch reached

Status: decided Date: 2026-10-25 known_by: measured

Amends D971's known limit. A device-addressed dispatch (D964) that ORBISTOUN_CAPTURE_DISPATCH asks for is captured after it runs, not before. The capture holds every guest chunk its lookups found, as it was before the dispatch, and a replay reaches what the run reached: a hierarchy's lower levels and the nodes its pointers name, not only the pages the user data names.

What is kept. The dispatch is asked whether it is captured before its table is placed. A captured dispatch records what it touches, with D974's touched marks, whether or not this is one of its program's recording dispatches. After it runs, while the mappings' lock is still held, the capture takes the chunks it touched and the chunks its stores marked. It keeps the 64 KiB guest page around each one, as guest-<n>.bin. The pages its user data names are still read before it runs (D971) and laid over the rest. A page's bytes outside every chunk read zero; no lookup reached them.

Before, exactly. A chunk the dispatch only read holds after it what it held before. A chunk it stored into is read from its home pages before the copy-back. A copied chunk's stores land in its copy (D974), so its home pages still hold the bytes from before. A chunk the dispatch stored into that was not copied has lost its bytes from before, unless a named page holds them. Then the capture is not written. Every chunk the dispatch reached is copied for the program's next dispatch, the chunks it stored into among them, and the capture waits for that dispatch. A copied chunk's stores are copied back after the dispatch as any are. At most four dispatches are tried. Past them, or on a thread that does not use the copies, the capture is written with those chunks as the dispatch left them, guest-state after, and a warning says how many.

The test. a_replayed_device_addressed_capture_walks_the_pointers_the_run_did follows the user data's pointer to a pointer, then to a table of counters, and adds one to each lane's counter. Captured as D971 kept it, the replay read zero past the first pointer, escaped, and left another output. Captured as here, the first dispatch stores into a chunk not copied, so the second is captured. Its replay leaves the hash the run's own output has, twice, with no escape.

Rejected: