Review of b01681570, the page's side.
- A page taken for gone again right after it entered again (a second stall, or a service that
signed a queued `leave` after its `join`) stopped for good: one re-entry was allowed between
carried posts. It now enters again up to three times with nothing of it carried between, then
stops. A join that throws (the service answers 503 when its clock cannot sign) no longer
leaves the page marked as entered with a stale outbox, which stopped it at the next post: the
page logs it and the next post tries again, as after any other failed post. Each post refused
`not_present` is counted (`stats.gone`), apart from `rejoins`.
- `resign()` moved a control signed while the page was gone to the earliest instant the lead
allows even past another viewer's control carried meanwhile; controls apply in the order of
their instants (co-watch §5.4), so the earlier press overrode the later one. Such a control is
now dropped (logged, counted in `dropped`) when another viewer's control the page holds lies
at or after its instant as pressed and at or before the instant it would move to; otherwise it
is signed again as before.
- Signing again a position whose event the room refused is not equivocation: the room holds no
event it refuses. Co-watch §10 now says so, and `resign()`'s doc.
- A presentation statement whose signing straddled a re-entry was carried with an `at` from
before the new join; it is dropped and the page states anew at once.
- `run()` starts at the join (b01681570); if `begin()` then fails, the page now stops its
co-watch log instead of stating a presentation it does not keep as a viewer that applies no
control.
- The snapshot gives the page's principal, its outbox, and `followed_at`, the room clock when it
began to follow the log; `roomTest.watchLog()` reads the room's log with each record verified,
and `watchHoldUntilGone` says when the hold began.
cowatch.test.mjs adds, against its watch.rs-like service: a page taken for gone again right
after it entered again enters once more and its pause is carried; a join that fails once is
tried again and the page goes on; a page taken for gone at every entry stops after three, its
refusal counted; and a control pressed while gone is dropped where it would move past another
viewer's, signed again where it keeps its place.
Verified on the build host (load 60-75): cowatch.test.mjs, 12 tests, passed 5 of 5.
Falsified: allowing one re-entry, rethrowing a failed join, and removing the drop each fail the
test written for it.
Co-Authored-By: Claude Opus 5.5 <[email protected]>