Outcome
Give the Wave 4 shared capture/presentation debt a named owner and an explicit boundary, so it stops
being the one unassigned block on #1739's parallel-safe track.
#1739 already states the case and the urgency:
Wave 4 shared capture debt remains and is still unassigned: the 10 production files under
src/daemon/snapshot-presentation/ios/, android-snapshot-freshness.ts,
android-snapshot-timeout-evidence.ts, screenshot-overlay-android.ts, and their
observation/interaction call sites. […] This is the one remaining block of work that is
file-disjoint from the descriptor units, so it is the natural parallel track; it must be assigned
before Wave 5 migrates the freshness call sites in selector-capture-runtime.ts /
deferred-interaction-outcome.ts.
This issue exists to carry that assignment and its scope. It is not a new wave unit and does not
change #1739's denominator.
Why now — churn evidence
From a co-change analysis of the last 200 commits on main (2026-08-10 → 2026-08-23, HEAD
d1fc80f):
- 37 of 200 commits (18%) are snapshot or presentation work.
- 19 of those edit presentation logic in two or more zones.
- 7 of the 21 Swift-presentation commits (33%) also edit TypeScript presentation in the same
commit.
- The heaviest file co-change pairs in the whole repository sit inside this cluster.
Presentation behavior currently lives in four places, with types-only sharing beneath them:
| Location |
Lines |
Contents |
packages/kernel/src/snapshot.ts |
304 |
types only |
apple/runner/… (Swift) |
~10 files |
in-runner presentation |
src/daemon/snapshot-presentation/ios/ |
2,013 |
iOS presentation rules |
src/platforms/android/snapshot-presentation.ts |
277 |
Android fold |
src/platforms/web/agent-browser-snapshot.ts |
223 |
web fold |
CONTEXT.md already specifies the intended end state — the clip fold as "the regular projection's
single visibility interpreter, run inside presentation for every backend […] Platform differences
enter as a fold policy, never as a backend exception." That interpreter does not exist yet. #1973
added cross-runtime presentation conformance tests, which detect divergence between the
implementations rather than removing the reason they diverge; that is the right interim instrument
and the wrong end state.
Structurally, src/daemon/snapshot-presentation/ios/ is iOS platform behavior inside the daemon —
the edge class #1739's terminal gate exists to reject.
Scope
Explicitly not in scope yet
Do not commit to a single implementation across Swift, Android and web. Swift and TypeScript sit
either side of a process and language boundary, and nothing measured here shows that shipping raw AX
trees across it preserves latency, payload size, fallback behavior, or backend-quality reporting.
The accepted outcome is:
One canonical presentation contract and policy model, with the fewest implementations the runtime
boundary permits.
Suggested sequence: consolidate the TypeScript folds and extract shared policy/vocabulary first, then
decide Swift-versus-host with payload and timing evidence in hand.
One measurement this issue does not yet have: the 277/223 line counts above are file sizes, not a
claim about how much of each is genuinely fold logic versus acquisition. The consolidation step
should measure that properly before choosing a target shape.
Blocked by / blocks
Outcome
Give the Wave 4 shared capture/presentation debt a named owner and an explicit boundary, so it stops
being the one unassigned block on #1739's parallel-safe track.
#1739 already states the case and the urgency:
This issue exists to carry that assignment and its scope. It is not a new wave unit and does not
change #1739's denominator.
Why now — churn evidence
From a co-change analysis of the last 200 commits on
main(2026-08-10 → 2026-08-23, HEADd1fc80f):commit.
Presentation behavior currently lives in four places, with types-only sharing beneath them:
packages/kernel/src/snapshot.tsapple/runner/…(Swift)src/daemon/snapshot-presentation/ios/src/platforms/android/snapshot-presentation.tssrc/platforms/web/agent-browser-snapshot.tsCONTEXT.mdalready specifies the intended end state — the clip fold as "the regular projection'ssingle visibility interpreter, run inside presentation for every backend […] Platform differences
enter as a fold policy, never as a backend exception." That interpreter does not exist yet. #1973
added cross-runtime presentation conformance tests, which detect divergence between the
implementations rather than removing the reason they diverge; that is the right interim instrument
and the wrong end state.
Structurally,
src/daemon/snapshot-presentation/ios/is iOS platform behavior inside the daemon —the edge class #1739's terminal gate exists to reject.
Scope
src/daemon/;contracts/fixtures/as the shared proof;Explicitly not in scope yet
Do not commit to a single implementation across Swift, Android and web. Swift and TypeScript sit
either side of a process and language boundary, and nothing measured here shows that shipping raw AX
trees across it preserves latency, payload size, fallback behavior, or backend-quality reporting.
The accepted outcome is:
Suggested sequence: consolidate the TypeScript folds and extract shared policy/vocabulary first, then
decide Swift-versus-host with payload and timing evidence in hand.
One measurement this issue does not yet have: the 277/223 line counts above are file sizes, not a
claim about how much of each is genuinely fold logic versus acquisition. The consolidation step
should measure that properly before choosing a target shape.
Blocked by / blocks
(cross-runtime conformance tests).