docs(adr): shared spaces, decided further, in six steps

ADR 0044 records the answers to its open questions: a shared studyset
passes on when its owner leaves or deletes their account (D11); an
agent's token lapses after 90 days unused (D12); an invitation by handle
waits for someone who never used the app (D13); and sharing copies the
studyset under new IDs into the shared space (D14), since the sync
engine's delete is soft and a row's ID can't be inserted into another
space. Its Steps section orders the work, starting with the community's
confirmation (D8, D9).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-11-11 01:54:16 +01:00
commit f745516f36
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -2,8 +2,9 @@
- **Status:** decided 10 Nov 2026 by the developer: D8 is their own request, D9 and D10
their choices over the agent's recommendations (all ticked at first; agents editing
directly), D1 to D7 the agent's recommendations, which they chose. Not built yet; the
open questions below come first.
directly), D1 to D7 the agent's recommendations, which they chose; D11 to D13 the
agent's recommendations, which they chose on 11 Nov 2026, D14 too. Not built yet;
the steps below.
- **Builds on:** ADR 0005 (publishing, reports and suggestions), ADR 0014 (the module),
ADR 0016 (one account across an instance), ADR 0017 (key pairs), ADR 0019 (private
studysets), ADR 0021 (operators and assistants).
@ -63,20 +64,44 @@ member reads everything in the space.
decisions, accepted suggestions applied by their item) are the start: they become
suggestions within a shared space too, not only on published releases.
- **D11.** **A shared studyset passes on.** Leaving, the Owner picks the next Owner
first. Deleting their account, ownership passes by itself to the Editor who joined
first, else to the Viewer who joined first; only with no other member does the
studyset go with them.
- **D12.** **An agent's token lapses after 90 days unused;** while used it has no fixed
end, the owner revokes it any time, and their Profile shows when it was last used.
- **D13.** **An invitation by @handle waits** for someone who has an account on the
instance's register but has never used the app: they find it in their Inbox the first
time they sign in to it, and the inviter sees them as invited until then.
- **D14.** **Sharing copies the studyset under new IDs** into the shared space, rewrites
what names its rows (reviews, tags, the learning path, files) and deletes the old ones,
as ADR 0019's rewrites do; the fork stays as it is. Found 11 Nov 2026: the engine's
delete is soft (`insteadOfDelete`: the domain row stays, hidden by a tombstone in its
space's `crdt_data_rows`), and a synced table's primary key is the row's ID alone, so
the same ID can't be inserted into another space; teaching the engine to move a row
was the other way, set aside as a deeper change to its merge, kept on every rebase.
## Steps
1. **Share with the community's confirmation** (D8, D9), needing nothing else here.
2. **Shared spaces in halkyon_base** (D1, D2, D11, D13): the module's tables (a shared
space, its members and roles, its Owner), its endpoints with their denial tests,
the engine's grants kept in step, the hand-on as an account is deleted.
3. **Keys** (D3): a private studyset's key wrapped to each member's key pair.
4. **Learn shares a studyset** (D14): the copy, *Manage collaborators* (invite by
@handle, the members, their roles, leaving), each member's own reviews.
5. **Invitations by email and by link** (D4, D5), the Inbox.
6. **Agents** (D6, D7, D10, D12).
## Open questions, before building
- **Moving rows between spaces.** A studyset's rows are in its owner's personal space;
sharing moves them into a new shared space. Row IDs are unique across a table and the
engine keeps a deleted row's tombstone until its space goes, so a row can't simply be
deleted in one space and inserted in another under the same ID. Either the engine
learns to move a row between spaces (a change to our fork), or sharing copies the tree
under new IDs and rewrites what names them (cards' reviews, tags, the learning path),
as ADR 0019's rewrites do with keys. To try against the fork first.
- **Moving rows between spaces.** Decided: D14.
- **Whose reviews.** A Viewer's or Editor's schedule for a shared card stays in their own
space, keyed by the card's ID; the card's own review rows today assume one learner.
- **Handing on and leaving.** An Owner leaving must hand the studyset on first, or it
goes with them, as their account's deletion deletes their spaces.
- **Members across services.** On an instance with a register (ADR 0016), handles are
the register's; a member of a Learn studyset needs no Todo account and the reverse.
- **Handing on and leaving.** Decided: D11. To build: the account's deletion hands the
shared spaces it owns on before it deletes the person's own.
- **Members across services.** Decided: D13. A member of a Learn studyset needs no Todo
account, and the reverse.
- **The agent's token:** made and revoked in the owner's Profile, scoped to the agent's
account, never shown again after making; whether it expires.
account, never shown again after making; its lapse decided: D12.