Co-watch merged by meaning onto the integrated live room (#428):
- joule-moq-room: one config reader, `Config::settings()`, now fallible, carries
`age`, `audience_input`, `latency_budget_ms`, `lead`, `ai` and the watch room's
`watch` (from `watch_source`/`watch_duration_ms`), `watch_control` and
`watch_window_ms`; one `public_prefix`. A watch room is refused together with
`e2ee`, `[age]` or `[co]`.
- One path for the clock's records: co-performance's `Item` (`Life`/`Meta`) and
`emit_items`, with the clock's rate kept; co-watch's skew statements go out as
`emit_meta`, its leaves through `emit_after` (a least `t`), and every record of
the clock's chain reaches the watch log through `watch_record`. The separate
`Lifecycle::Meta` is dropped.
- Roles and grants: `meta` for participants in a room with co-performance or a
watch room, `WATCHER_KINDS` for a watch room's viewers, `watch_control` the last
attribute in key order.
- Page: the co-watch mode beside co-performance and the binding; the e2e suite
gains `cowatch` and keeps every scenario; run.sh runs all five node test files.
- Workflows: each step whole, `paths:` unioned. CHANGELOG and REGISTRY rows
kept from both; capabilities.json and v2.ttl regenerated by `registry export`.
Co-Authored-By: Claude Opus 5.5 <[email protected]>