By meaning:
- joule-moq GrantHead: one attribute reader (CO4b's grant_attrs, checked
arithmetic, UTF-8 keys and values) in place of AGE's byte-slice reader;
`minor` and `age` are read from the same attrs CO4b keeps, with AGE's rules.
- joule-moq-room: roles(co, audience_input) is CO4b's role set, fed to PP's
descriptor(); grant(age) and grant_with(age, ai) keep both callers (the
age-admitted grant and the AI participant's); PP's refuses_publisher check;
attributes in key order age, ai, audience_input / latency_budget_ms, order.
The HTTP proof challenge (live-rooms §10.5.3) is proof_challenge(), beside
PP's Privacy Pass challenge(); both route tables and doc tables kept.
- Page: both imports; the grant request carries `ai` and, on a 401, the
Privacy Pass token; snapshot keeps age and co. startRoomService takes both
`co` and `extra`. room.e2e.mjs carries scenarioAge and scenarioCo whole,
`age,co` in the default list.
- SPEC: CO4b's revised close of the co-performance paragraph, then AGE's
and exploration's paragraphs as they were.
Co-Authored-By: Claude Opus 5.5 <[email protected]>