Bare-id OAuth state for shared playgrounds + reconciliation tests
Members log in from the bare-id join cookie, which the callback gate rejected outright (members could never finish login on a canonical-hosted playground). Accepting it naively would let the canonical flow treat a foreign object as the caller's pre-login device (export + clear), so bare-id states on non-shared objects are still refused before any adoption runs.
New tests/sharing-canonical.test.ts (8 tests) pins the sharing x canonical reconciliation: invite id shape, join routing, member-token git ops, member/non-member callback, migration skip, bare-id anonymity, bare-id callback rejection.
Summary by cubic
Members logging in from a shared playground's bare-id join cookie can now finish GitHub OAuth โ the callback previously rejected bare-id states outright. Bare-id states on non-shared objects are still refused before any adoption runs, so the canonical flow never treats a foreign object as the caller's pre-login device.
Tests
- Adds
tests/sharing-canonical.test.tspinning sharing x canonical reconciliation: invite id shape, join routing, member-token git ops, member/non-member callbacks, migration skip, and bare-id anonymity and rejection.