One write a query wants included - see [TaskQuery::covering].
The workspace rides with it: the query's scope is workspaces, and a document the projector has never seen (the first native task's own task-list document) has no projection row to place it by. Scope is answered against the workspace, and an unprojected document is simply uncovered. A scoped receipt: the one operation the caller is waiting for.
This used to be the document's whole version vector, and that was a bug with a delay fuse on it. A version vector holds one entry per writer the document has ever had, and Loro mints a fresh writer id per session - so the requirement grew by ~21 hex characters every time any process opened the document, and once it crossed [MAX_COVERING]'s sibling length limit the store refused every task query naming a write. Measured: 100 writers encode to 2 126 hex characters, 200 to 4 220. The surfaces then had no way to wait, so every optimistic row snapped back - the tick that un-ticks itself.
What a surface actually needs to know is has the projection seen my write, and that is one operation, not a census of everybody who ever touched the document. peer is the writing session and counter is the exclusive end of its own operations at the moment the mutation committed, which is exactly VersionVector::get(peer).
Bounded by construction: two integers, whatever the document's history. That is the property the old shape could not have at any limit.
Multi-operation writes need nothing extra. A command that writes five operations still ends at one counter, and one peer's operations are contiguous - so covering the end covers all of them. A command that wrote nothing produces no receipt at all; see [TaskQuery::covering].
