docs(sync): document decoupled generation admission

This commit is contained in:
fy59 2026-09-20 19:22:19 +02:00
parent ab3986200e
commit 0262433615
5 changed files with 21 additions and 2 deletions

View file

@ -2,6 +2,13 @@
## Unreleased — 0.1.3 ## Unreleased — 0.1.3
- Decoupled the Android full-generation request from the strict legacy V3
compatibility signal. One explicit intent now publishes the dedicated
`trainlog-sync-full-generation-request-v1.json` channel first; the legacy
request is published with the same identity only after a fresh V3 snapshot
succeeds. The desktop daemon prioritizes this channel and durably
deduplicates a bounded set of request identities across both channels.
Development opened after the stable v0.1.2 release. Development opened after the stable v0.1.2 release.
- Made explicit Android synchronization intent authoritative over automatic - Made explicit Android synchronization intent authoritative over automatic

View file

@ -746,6 +746,7 @@ Android writes:
```text ```text
trainlog-sync-request-v1.json trainlog-sync-request-v1.json
trainlog-sync-full-generation-request-v1.json
``` ```
The request is replaced through the same direct `Documents/Trainlog` directory The request is replaced through the same direct `Documents/Trainlog` directory

View file

@ -47,7 +47,11 @@ Completed history hides the active preparation exclusively through the
delivery's stable execution-session identity and retains all provenance. delivery's stable execution-session identity and retains all provenance.
The opt-in full-generation path is operational on the private daily The opt-in full-generation path is operational on the private daily
installation. The loopback Web control and foreground Android coordinator use installation. Android explicit synchronization uses a dedicated coordination
filename carrying the unchanged request-v1 payload. Legacy V3 signalling is
additive and occurs only after a fresh strict V3 snapshot succeeds; daemon
request identities are deduplicated across both bounded channels. The loopback
Web control and foreground Android coordinator use
the production direct-libmtp adapter, correlated manifest/ACK V1 objects, and the production direct-libmtp adapter, correlated manifest/ACK V1 objects, and
persistent peer identities. Controlled USB and private Drive validation proved persistent peer identities. Controlled USB and private Drive validation proved
the complete Web-initiated request, generation, import, publication, and ACK the complete Web-initiated request, generation, import, publication, and ACK

View file

@ -185,6 +185,7 @@ does not publish to it or let it override an artifact in the new endpoint.
| PC -> Android | `programs-v1.json` | optional staged `trainlog-programs` v1 companion: full nondeleted snapshot plus unacknowledged deletion tombstones | | PC -> Android | `programs-v1.json` | optional staged `trainlog-programs` v1 companion: full nondeleted snapshot plus unacknowledged deletion tombstones |
| Android -> PC | `program-executions-v1.json` | optional `trainlog-program-executions` v1 companion: stable in-progress/completed provenance | | Android -> PC | `program-executions-v1.json` | optional `trainlog-program-executions` v1 companion: stable in-progress/completed provenance |
| Android -> PC agent | `trainlog-sync-request-v1.json` | `trainlog-sync-request` v1 | | Android -> PC agent | `trainlog-sync-request-v1.json` | `trainlog-sync-request` v1 |
| Android -> full-generation daemon | `trainlog-sync-full-generation-request-v1.json` | `trainlog-sync-request` v1 |
| PC agent -> Android | `trainlog-sync-receipt-v1.json` | `trainlog-sync-receipt` v1 | | PC agent -> Android | `trainlog-sync-receipt-v1.json` | `trainlog-sync-receipt` v1 |
No SQLite file is transferred. No SQLite file is transferred.
@ -917,7 +918,8 @@ for its ACK). Objects retained from an interrupted conversation are ignored
until atomically replaced by matching objects. After both peer ACKs, Android until atomically replaced by matching objects. After both peer ACKs, Android
reports completion directly; it does not enter the legacy receipt wait state. reports completion directly; it does not enter the legacy receipt wait state.
The peer publication precedes one fresh `trainlog-sync-request-v1` signal on The peer publication precedes one fresh
`trainlog-sync-full-generation-request-v1` signal on
every explicit Android attempt. This wakes the existing user-session daemon; every explicit Android attempt. This wakes the existing user-session daemon;
it is not an ACK and does not alter generation identity. A retry may resume an it is not an ACK and does not alter generation identity. A retry may resume an
exact `captured`, `published`, or `waiting_acknowledgement` generation. It may exact `captured`, `published`, or `waiting_acknowledgement` generation. It may

View file

@ -1544,6 +1544,11 @@ fixture's sample draft.
## Private full-generation rollout validation ## Private full-generation rollout validation
Routing regressions cover a strict V3 refusal in the presence of causal
deletions, publication of the dedicated full-generation request before legacy
compatibility, same-identity dual-channel deduplication, full-generation
priority over stale legacy requests, and bounded durable seen-request state.
The MTP visibility regression suite uses injected clocks and transport The MTP visibility regression suite uses injected clocks and transport
callbacks, with no multi-second sleeps. It covers delayed Android publication, callbacks, with no multi-second sleeps. It covers delayed Android publication,
multiple throttled polls, stale run references, a never-visible generation, multiple throttled polls, stale run references, a never-visible generation,