feat(p2): keep serving older Sessions, Catalog and SessionTree versions

Pages and TUIs loaded before a deploy hold the contracts they were built
with; without accepts they wait unbound (contract_mismatch) until they
reload. The histories are now written with evolve from the released
versions, and the providers accept them:

- Sessions 3 (rows without main and branches) and 4 (a null branch label
  reads as the session title); v4's treeSelf arguments pass as they are
- Catalog 2 and 3, the same row mappings
- SessionTree 1: the tree without labels (no branches, no node
  conversation); rename is new and needs nothing

test/p2/contract-versions.test.ts binds the released declarations
against the current server.
This commit is contained in:
Mario Zechner 2026-11-04 15:32:51 +01:00
parent 7670c8be43
commit 0a180b049a
9 changed files with 848 additions and 337 deletions

View file

@ -359,6 +359,12 @@ p2 runs on Chord v2 (`packages/chord`, `docs/design.md` there); the port's notes
- **Plugins:** see **Plugin layout** and **Plugin reloads**; the server loads its facets with `createPlugins`, workers
get theirs from the workers component, the TUI and web bundles load theirs with `host.load`.
- **Protocol versions:** a page or TUI reloads when the server speaks a newer link protocol (`newerPeerProtocol`).
- **Contract versions:** pages and TUIs keep the contracts they were built with until they reload, so a deploy that
bumps a contract a client holds must keep serving the old version: write the history with `evolve` (the released
version as the base, verbatim, so old bundles' fingerprints match) and give the provider an `accepts` table mapping
current state and results back (`Sessions` v3/v4, `Catalog` v2/v3, `SessionTree` v1;
`test/p2/contract-versions.test.ts` binds the released declarations). Without it, old clients wait unbound
(`contract_mismatch`) until they reload.
## Radius and port forwards