diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ddf0e6..7e67bfe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,16 @@ # Changelog -## Unreleased — 0.1.4 +## 0.1.4 — 2026-09-22 +- Added the frozen Bluetooth Classic RFCOMM synchronization transport without + changing full-generation business semantics. The paired deployment selects + Bluetooth before MTP, authenticates the configured bonded Android peer with + the persisted Trainlog peer identity, rate-limits reconnect noise, and keeps + MTP as the wired recovery transport. This transport is for Trainlog data + synchronization only; heart-rate sensor ingestion remains future 0.1.5 work. +- Refreshed the Web next-session projection after synchronization and added + factual body-measurement trend charts through the existing bounded analysis + read model without introducing health interpretation or estimated metrics. - Fixed Program progress for sessions started from a delivered manual preparation. The preparation companion now carries its stable Program and Program-session provenance through Android start, finalization, restart and diff --git a/README.md b/README.md index 657fa27..632f6a6 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,22 @@ # Trainlog -Synchronization uses one generation/ACK engine over USB/MTP first and an -optional private Google Drive mirror/fallback. Drive contains only versioned -Trainlog artifacts under its separate Sync namespace; desktop and Android -SQLite databases always remain local. Android can process PC USB requests from -an explicitly enabled, visibly notified background service, while Drive checks -follow Android's bounded background scheduling. +Synchronization uses one generation/ACK business engine across versioned +local transports. The paired 0.1.4 deployment prefers Bluetooth Classic RFCOMM +and falls back to direct USB/MTP; the separately configured private Drive path +remains available to the legacy mirror/fallback workflow. No transport copies +SQLite databases between devices. Trainlog is a local-first workout and body-data system. Trainlog Core owns business truth and canonical desktop persistence. Its native Android app is the field companion, its C17/Notcurses desktop TUI is the administration and technical surface, and its local browser Web sibling provides the implemented -Dashboard, Sessions, Programmes, and Exercises surfaces while reserving Analyse -for separately contracted work. +Dashboard, Sessions, Programmes, Exercises, and factual Analyse/Sleep Diary +surfaces. Android and desktop each own a local SQLite database. The desktop database is the canonical long-term history. Trainlog synchronizes versioned JSON artifacts -over direct MTP; it never copies SQLite database files between devices. +over its authenticated local transports and optional configured Drive workflow; +it never copies SQLite database files between devices. ## Product split @@ -24,7 +24,7 @@ over direct MTP; it never copies SQLite database files between devices. |---|---| | Android | Capture and quickly correct sets, repetitions, loads, durations, and continuous activities; reorder active and completed-session occurrences; capture feedback, J+1 follow-ups, body measurements, and AI proposals; trigger sync; show quick summaries. | | Desktop TUI | Administer, inspect, maintain, import/export, correct canonical history, and provide technical tools. | -| Local Web (0.1.4 development) | Display Dashboard, Programmes, Sessions, Exercises and factual Analyse workspaces. Analyse includes the Sleep Diary editor, 18:00-to-18:00 agenda and local vector PDF export. | +| Local Web (0.1.4) | Display Dashboard, Programmes, Sessions, Exercises and factual Analyse workspaces. Analyse includes the Sleep Diary editor, 18:00-to-18:00 agenda and local vector PDF export. | No interface reconstructs business truth from SQLite tables. The local Web is a sibling adapter, not an extension of the TUI. On `main`, its loopback-only @@ -34,8 +34,8 @@ make the remaining placeholder routes functional. The top-level `/programmes` route is an operational daily calendar for active Programs. Sessions → Programmes remains the technical administration/import, list, detail, archive, and delete surface. -Web Exercises administration is implemented. The 0.1.4 development cursor is -the Web Dashboard and Analyse V1 read-model workspace. +Web Exercises administration is implemented. Version 0.1.4 also includes the +factual Dashboard/Analyse read model and the synchronized Sleep Diary workspace. ## Releases @@ -52,8 +52,8 @@ Each published stable release provides: - SHA-256 checksums. Both mirrors publish the same Trainlog product version and release assets. The -latest stable version is **0.1.3** on Android and desktop; this is one shared -Trainlog version, not separate interface versions. Version 0.1.2 is the +latest stable version is **0.1.4** on Android and desktop; this is one shared +Trainlog version, not separate interface versions. Version 0.1.3 is the previous stable release. Trainlog presents French by default, with English selectable @@ -109,14 +109,14 @@ independent. ### Daily synchronization on an opted-in installation -After explicitly enabling Android background synchronization once, connect and -unlock the paired phone and select **Synchronize** in the local Web Dashboard. -USB/MTP is preferred when the Trainlog peer is usable; the separately selected -private Drive folder is updated as a mirror and is the fallback transport. Wait -until Web reports the correlated generation and acknowledgements. A failure -remains durable and should be diagnosed before retrying; do not delete -generation, ACK, database, or backup files. Full-generation mode and Drive -remain trusted per-installation configuration. +After explicitly enabling the paired local synchronization path, keep Bluetooth +enabled on Android and the desktop and select **Synchronize** in Trainlog when +an explicit run is wanted. The current paired deployment prefers authenticated +Bluetooth Classic RFCOMM and uses direct USB/MTP as the wired recovery path. +The existing private Drive workflow remains separately configured. Wait until +the correlated generation and acknowledgements complete; a failure remains +durable and should be diagnosed before retrying rather than deleting protocol, +database, or backup files. ### Build from source @@ -157,7 +157,7 @@ updates; generating a replacement key is not a normal release procedure. ### Linux runtime dependencies -The published v0.1.3 x86-64 desktop runtime is dynamically linked. Its tagged +The published v0.1.4 x86-64 desktop runtime is dynamically linked. Its tagged source directly requires compatible versions of: - glibc and the GCC support runtime; @@ -169,7 +169,7 @@ source directly requires compatible versions of: - Notcurses Core; - the standard math library. -Version 0.1.3 additionally links GNU libmicrohttpd and yyjson for the local Web +Version 0.1.4 additionally links GNU libmicrohttpd and yyjson for the local Web adapter and Dashboard layout configuration. Those are not retroactive requirements of the pre-Web v0.1.1 tagged source. @@ -184,6 +184,9 @@ assuming one universal package command. - Android is optional when using the desktop TUI alone. USB/MTP synchronization requires the Android companion, libudev, libmtp, and an unlocked connected device. +- Bluetooth synchronization requires BlueZ on Linux plus Python 3.11 or newer + with D-Bus and GObject bindings. It is a Trainlog synchronization transport, + not a heart-rate sensor implementation. - `trainlog-syncd` installation expects a systemd user session. Manual TUI synchronization does not require the user service. - `rclone` is required for desktop Google Drive synchronization and automatic diff --git a/docs/current_state.md b/docs/current_state.md index afbf50b..729c13f 100644 --- a/docs/current_state.md +++ b/docs/current_state.md @@ -1,20 +1,21 @@ # Current implementation state -Full-generation Web synchronization now selects an actually usable MTP peer -before USB, falls back to a separately configured private Drive generation -namespace, and mirrors successful USB conversations to Drive on a best-effort -basis without rolling back USB. Both transports move the same generation/ACK -bytes; neither transports SQLite. Android has an explicitly enabled foreground -USB listener with mandatory notification and a private-folder Drive grant with -bounded WorkManager checks. Both use the same concurrency-guarded generation +Full-generation synchronization uses one generation/ACK business engine across +versioned transports. On the paired 0.1.4 deployment, automatic local selection +is Bluetooth Classic RFCOMM first and direct USB/MTP second. The desktop BlueZ +service accepts only the configured bonded Android address, Android proves the +persisted Trainlog peer identity in the first bounded frame, and reconnect noise +is rate-limited so proximity does not create repeated generations. MTP remains +the wired recovery path. The separately configured private Drive transport +remains available to its legacy mirror/fallback workflow. No transport copies +SQLite. + +Android synchronization paths share the same concurrency-guarded generation coordinator as SyncScreen. That coordinator has one process-wide ownership arbiter: explicit foreground intent has priority over automatic background -resumption, while the foreground service may remain alive without owning the +resumption, while a foreground service may remain alive without owning the conversation. An automatic run yields cooperatively at safe boundaries; its durable generation is retained for a correlated handoff rather than deleted. -Background actionability distinguishes a new request or new correlated remote -evidence from a merely stale resumable generation, preventing five-second -terminal retry loops. Direct-MTP publication now has an explicit Android visibility boundary. Durable immutable generation files are submitted to MediaProvider and all scan @@ -55,22 +56,17 @@ keeps the independent target intact on save, and leaves sibling occurrences unchanged on save or cancellation. A set-based target-only occurrence can add or change equipment without fabricating a performed set. -The opt-in full-generation path is operational on the private daily -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 -persistent peer identities. Controlled USB and private Drive validation proved -the complete Web-initiated request, generation, import, publication, and ACK -conversation without opening SyncScreen for each run. USB remains preferred; -the private `Trainlog/Sync/v1` namespace is configured as a verified mirror and -fallback, independently from `Trainlog/AI`. Cross-transport replay is -idempotent and neither transport carries SQLite. +The full-generation path is operational on the paired daily installation. +Bluetooth Classic is the primary local byte transport, MTP remains the wired +recovery transport, and the existing private Drive namespace remains separately +configured for its supported mirror/fallback path. All carry the same bounded +generation/ACK artifacts and persistent peer identities; cross-transport replay +is idempotent and no transport carries SQLite. The Bluetooth transport does not +yet ingest heart-rate sensor data. The public Android release chain advances from v0.1.1 versionCode 2 through -v0.1.2 versionCode 3 to v0.1.3 versionCode 4 under certificate SHA-256 +v0.1.2 versionCode 3 and v0.1.3 versionCode 4 to v0.1.4 versionCode 5 under +certificate SHA-256 `5ef41117da107c9805ae3215c5ec823cff06216610e6e4f7542a754161c71bd2`. Higher-numbered private validation builds used a separate Android Debug certificate and are not members of the public update-signature chain. @@ -85,7 +81,7 @@ The rollout packager now keeps the legacy request daemon and one-shot helper in the same relocatable, hashed bundle as the Web generation coordinator, avoiding mixed-checkout user-service execution during the controlled rollout. -Snapshot date: **2026-09-20**. +Snapshot date: **2026-09-22**. `TRAINLOG_CODE_READABILITY_V1` normalizes the recent generation-MTP, generation/ACK, Android-backup, Web Dashboard serialization, tests, doubles and @@ -103,9 +99,9 @@ Android is the field companion: it captures training and body data, preserves the active draft, receives AI proposals, triggers synchronization, and shows quick summaries. The C17/Notcurses TUI is the administration, inspection, maintenance, import/export, and technical-tooling surface. The local Web -sibling now provides its embedded application shell and implemented Dashboard; -its future business surfaces will own broader analysis, program/session -preparation, and exercise workflows through Trainlog Core. +sibling provides its embedded application shell, Dashboard, Sessions, +Programmes, Exercises, factual Analyse views, and Sleep Diary +workflow through Trainlog Core. Trainlog Core owns business truth. The desktop SQLite database remains the canonical local source of truth and long-term history; no interface owns a @@ -120,7 +116,7 @@ parallel implementation of its rules. | Android SQLite | schema v26; Sleep Diary V1 is additive in v26 | | Mobile snapshot | V3 active; V1/V2 readable legacy inputs; explicit V4 codec staged, not selected by transport | | Desktop terminal backend | Notcurses only | -| Trainlog product version | `0.1.4` development, synchronized across Android and desktop; latest stable release: `v0.1.3` | +| Trainlog product version | `0.1.4` stable, synchronized across Android and desktop; latest stable release: `v0.1.4` | | Interface language | `TRAINLOG_I18N_V0_1_1=PASS`: French default; English selectable in Settings → Language on both surfaces | | AI history export | `TRAINLOG_AI_EXPORT_V1` active | | AI session proposals | `TRAINLOG_AI_SESSION_DRAFT_V1=VALIDATION_PENDING` | @@ -138,7 +134,7 @@ parallel implementation of its rules. | Web Dashboard tiles | `WEB_DASHBOARD_TILES_V1=PASS/FROZEN` | | Web Dashboard visualizations | `WEB_DASHBOARD_VISUALIZATIONS_V1=PASS/FROZEN` | | Web Dashboard V1 | `WEB_DASHBOARD_V1=PASS/FROZEN` | -| Sleep Diary V1 | Implemented on the 0.1.4 review branch: timestamped causal diary, stable Web/Android capture, full-generation companion and fully localized FR/EN local vector PDF; the Web Agenda, Chronology and factual summary adopt the latest persisted revision without reload, use one exact 18:00-to-18:00 projection and isolate all visible data to the active night despite out-of-order reads; medication choices expose dose/unit, while real-Firefox mutation/date-switch/reload coverage plus a section-local error boundary protect capture | +| Sleep Diary V1 | `SLEEP_DIARY_V1=PASS`: timestamped causal capture, Android/Web editing, full-generation synchronization, exact 18:00-to-18:00 agenda projection, medication snapshots, and localized FR/EN vector PDF export | | Web Sessions V1 | `TRAINLOG_WEB_SESSIONS_V1=PASS/FROZEN` (controlled desktop/Android deployment validated) | | Web Sessions deletion and Programs V1 | `TRAINLOG_WEB_SESSIONS_DELETE_AND_PROGRAMS_V1=PASS` (private grouped rollout validated) | | Programs presentation, Android projection, and deletion | `TRAINLOG_PROGRAMS_PRESENTATION_ANDROID_DELETE_V1=PASS` (private coordinated deployment and restart/replay validated) | @@ -148,17 +144,18 @@ parallel implementation of its rules. | Web sync API V1 | `TRAINLOG_WEB_SYNC_API_V1=PASS/FROZEN` | | Web sync button V1 | `TRAINLOG_WEB_SYNC_BUTTON_V1=PASS/FROZEN` | | Sync Web end-to-end wrapper | `TRAINLOG_SYNC_WEB_END_TO_END_V1=PASS/FROZEN` (isolated) | -| Private full-generation rollout | `TRAINLOG_SYNC_FINALIZATION_AND_ROLLOUT_V1=PASS` (direct MTP, one authorized phone) | +| Private full-generation rollout | `TRAINLOG_SYNC_FINALIZATION_AND_ROLLOUT_V1=PASS` (authenticated Bluetooth primary transport with direct MTP recovery on one authorized phone) | | Local Web | `TRAINLOG_WEB_V1=CONTRACT_FROZEN / IMPLEMENTATION_STARTED` | | Web Exercises V1 | `TRAINLOG_WEB_EXERCISES_V1=PASS` | -| Current operational cursor | `TRAINLOG_WEB_ANALYSIS_V1` (implemented and visually refined, user review pending) | +| Current operational cursor | `TRAINLOG_CARDIO_V1_NEXT_CONTRACT`: heart-rate sensor ingestion starts in 0.1.5 and remains distinct from the frozen Bluetooth synchronization transport | | Complete synchronization gap contract | Frozen dependency contract; operational USB/Drive slices required by v0.1.2 are delivered | | Isolated synchronization test environment | `TRAINLOG_SYNC_TEST_ENV_V1=PASS/FROZEN` | | Synchronization characterization | `TRAINLOG_SYNC_CHARACTERIZATION_V1=PASS/FROZEN` | | Synchronization data/lifecycle slice | `TRAINLOG_SYNC_DATA_LIFECYCLE_V1=PASS/FROZEN` | | Synchronization causal deletion slice | `TRAINLOG_SYNC_CAUSAL_DELETE_V1=PASS/FROZEN` | | Synchronization generation/ACK slice | `TRAINLOG_SYNC_GENERATION_ACK_V1=PASS/FROZEN` (explicit staged entry points; active transport remains V3) | -| Generation MTP and Android backup | Software complete and validated in the authorized private physical-device rollout | +| Bluetooth synchronization transport | `TRAINLOG_SYNC_BLUETOOTH_TRANSPORT_V1=PASS/FROZEN`; independent from future heart-rate sensor ingestion | +| Generation MTP and Android backup | Software complete and retained as the authorized wired recovery path | Desktop and Android schema numbers are independent. Neither changes the frozen Trainlog JSON V1 contract. @@ -408,10 +405,10 @@ The full Android lint comparison against an isolated clean `main` worktree is unchanged at ten pre-existing errors: one `NewApi`, one `LocalContextConfigurationRead`, and eight bilingual `StringFormatMatches` diagnostics. This UI tranche adds no lint error and changes no lint policy. -The next private daily Android candidate remains on development -`versionName=0.1.4`; only its strictly increasing `versionCode` may be supplied -as a build-time override. No public tag or release is created by that private -candidate process. +The stable Android 0.1.4 source uses `versionName=0.1.4` and public +versionCode 5. Private validation builds may still supply only a strictly +increasing `versionCode` as a build-time override; that does not create a +public release or change schemas and protocols. The private Program execution rollout installed desktop schema v27 and the signed nondebuggable Android versionCode 17/schema v25 update without diff --git a/docs/releases/README.md b/docs/releases/README.md index 70976a7..45d4a04 100644 --- a/docs/releases/README.md +++ b/docs/releases/README.md @@ -6,6 +6,7 @@ than later development. GitHub and Forgejo publication must preserve the existing release, tag, status, and assets while keeping their note bodies equal to the corresponding source file. +- [Trainlog v0.1.4](v0.1.4.md) - [Trainlog v0.1.3](v0.1.3.md) - [Trainlog v0.1.2](v0.1.2.md) - [Trainlog v0.1.1](v0.1.1.md) diff --git a/docs/releases/v0.1.4.md b/docs/releases/v0.1.4.md new file mode 100644 index 0000000..567c5f0 --- /dev/null +++ b/docs/releases/v0.1.4.md @@ -0,0 +1,57 @@ +Trainlog v0.1.4 extends the local-first training workflow with factual +analysis, a synchronized Sleep Diary, improved prepared-session execution, and +an authenticated Bluetooth synchronization transport. + +## Analyse and Dashboard + +- The local Web Analyse workspace exposes factual 7/30/90-day and all-history + views through Trainlog Core. +- Activity, active-Program progress, compatible exercise metrics, persisted MAX + results, BODY ZONE exposure, and body measurements share the bounded Core + read model used by Dashboard summaries. +- Body-measurement trends are charted from persisted observations, and the next + session projection refreshes after synchronization. +- Analyse deliberately does not invent readiness, fatigue, recovery, body-fat, + or estimated performance values. + +## Sleep Diary + +- Sleep Diary V1 is available across desktop schema v29 and Android schema v26. +- Entries use absolute timestamped events, causal revisions, appreciations, + notes, medication catalog entries, and timestamped intake snapshots. +- The Web agenda uses one exact 18:00-to-18:00 projection and follows the latest + locally persisted revision without leaking another selected night. +- Local vector PDF reports are available in French and English. +- Sleep Diary participates in the full-generation synchronization and + acknowledgement flow. + +## Android session execution + +- Prepared continuous-duration exercises remain planning-only until actual work + is explicitly recorded. +- Target-only continuous and set-based occurrences can be edited without + fabricating performed activity or duplicate occurrences. +- Equipment can be created and selected from the active-session editor while + preserving the current durable draft. +- Program provenance is preserved through preparation, Android execution, + completion, synchronization, and progress display, including safe recovery + of compatible historical deliveries. + +## Bluetooth synchronization + +- The paired deployment adds Bluetooth Classic RFCOMM as the primary local + Trainlog synchronization transport and retains direct MTP as wired recovery. +- The desktop accepts only the configured bonded Android device, and Android + proves the persisted Trainlog peer identity before exchanging bounded frames. +- Reconnect noise is rate-limited and does not create repeated generations. +- This Bluetooth feature transports Trainlog synchronization data only. + Heart-rate sensor ingestion is intentionally deferred to the 0.1.5 cardio + cycle. + +## Assets + +- `trainlog-android-v0.1.4.apk`: signed public Android APK. +- `trainlog-tui-linux-x86_64-v0.1.4`: Linux x86-64 runtime bundle containing + the TUI, local Web adapter, synchronization helpers, Bluetooth transport + helper, and required catalogs. +- `SHA256SUMS`: SHA-256 checksums for both artifacts. diff --git a/docs/roadmap.md b/docs/roadmap.md index 5171c60..8388aab 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -5,9 +5,10 @@ physical libmtp, verified backups, signing continuity, migrations, correlated ACKs, restart, and idempotent replay passed. Generation mode remains an explicit per-installation opt-in. The additive private Drive transport and Android background software are implemented and validated with fake transport -and the private production namespace. USB remains preferred, Drive is the -configured mirror/fallback, and Android background operation retains its -documented post-reboot platform limits. +and the private production namespace. Stable v0.1.4 adds authenticated +Bluetooth Classic RFCOMM as the primary paired local transport and retains direct MTP as wired recovery; Drive +remains a separately configured supported path. Android background operation +retains its documented post-reboot platform limits. This document owns future work. The implemented baseline is summarized in [current_state.md](current_state.md); completed narratives and evidence belong @@ -23,19 +24,20 @@ Android executes in the field, captures actual work/feedback, and returns data. ``` Future work must preserve the frozen Trainlog JSON V1 contract, stable -identities, actual-versus-planned separation, direct MTP transport, and the -distinction between measured values and estimates. +identities, actual-versus-planned separation, the frozen synchronization +transport boundaries, and the distinction between measured values and +estimates. ## Current baseline -Stable v0.1.2 is the release baseline for the v0.1.3 development cycle. +Stable v0.1.4 is the release baseline for subsequent development. Desktop schema v29, Android schema v26, Notcurses, direct `Documents/Trainlog` storage, mobile export V3, Training Knowledge V1, Body Zones V1, Training Feedback V1/V2, STATS V1, and Session Generator V1 are implemented. Session Generator V1 is hidden pending V2. AI session-draft exchange retains its explicit manual validation gate. APP_SHELL_V1 remains useful historical design evidence, but its September 2026 observations must be revalidated against the -v0.1.3 baseline rather than treated as a current implementation plan. +v0.1.4 baseline rather than treated as a current implementation plan. `TRAINLOG_WEB_V1=CONTRACT_FROZEN / IMPLEMENTATION_STARTED`; its local-only CLI/HTTP infrastructure, embedded frontend shell and the frozen Dashboard data contract, frozen interactive grid, versioned layout persistence and factual @@ -43,9 +45,9 @@ tile rendering exist. The Dashboard's bounded progression and BODY ZONES visualizations and Sessions V1 are implemented. The top-level `/programmes` route is an operational daily active-Program calendar, while Sessions → Programmes remains the technical administration/import, list, -detail, archive, and delete surface. Web Exercises V1 is implemented. The -0.1.4 `TRAINLOG_WEB_ANALYSIS_V1` branch now owns the factual Dashboard/Analyse -read-model foundation and stops before merge for visual inspection. +detail, archive, and delete surface. Web Exercises V1, the factual +Dashboard/Analyse read-model foundation, and Sleep Diary V1 are included in +stable v0.1.4. The corrective prepared-item projection, bounded phase-owned MTP outbox, Sessions presentation correction, local date preference and durable preparation withdrawal are implemented. The withdrawal uses the separate versioned @@ -54,16 +56,17 @@ mobile snapshot or `TRAINLOG_FORMAT_V1` contracts. ## Current cursor -The v0.1.4 cursor proceeds from stable v0.1.3 and its validated Web, Program -execution, USB/Drive generation, ACK, and causal-deletion contracts without -reopening those completed gates. +Stable v0.1.4 closes the Analyse/Sleep Diary cycle and freezes the Bluetooth +Classic synchronization transport independently from future sensor work. -Sleep Diary V1 is implemented on `trainlog-0.1.4-sleep-diary-v1` and remains -under grouped review before integration. Heart-rate sensor ingestion remains -future scope; absolute diary timestamps are its prepared extension boundary. +The next development cycle is 0.1.5 cardio. Android will own heart-rate sensor +discovery/acquisition and timestamped local capture; synchronized desktop/Web +surfaces will consume recorded measurements and will not connect directly to +the sensor. Heart-rate ingestion must not reuse or overload the frozen Trainlog +Bluetooth synchronization transport contract. ```text -CURRENT_OPERATIONAL_CURSOR=TRAINLOG_WEB_ANALYSIS_V1 +CURRENT_OPERATIONAL_CURSOR=TRAINLOG_CARDIO_V1_NEXT_CONTRACT ``` The focused `TRAINLOG_SYNC_CAUSAL_DELETE_V1_CLOSEOUT` is complete before this diff --git a/docs/sync_exchange.md b/docs/sync_exchange.md index 6d9faa9..f25b0da 100644 --- a/docs/sync_exchange.md +++ b/docs/sync_exchange.md @@ -2,8 +2,8 @@ ## Sleep Diary companion -`trainlog-sleep-diary` version 1 is finalized on the unreleased 0.1.4 review -branch with both the medication catalog and the entry-owned intake snapshots. +`trainlog-sleep-diary` version 1 is finalized in stable v0.1.4 with both the +medication catalog and the entry-owned intake snapshots. The artifact preserves catalog and diary causal parents, rejects concurrent siblings and resurrection, and treats an exact revision replay as idempotent. This completion happened before publication or freezing of the companion; @@ -19,9 +19,9 @@ revalidated and acknowledged by a later generation. Imported tips are already validated and acknowledged because their containing generation was durably consumed. Draft and synchronized state are not inferred from wall-clock time. -`trainlog-sleep-diary`, version 1, is emitted by full generations on the 0.1.4 -Sleep Diary branch. It is optional when consuming an older generation so a -pre-domain artifact remains replayable. It carries bounded complete entry snapshots with +`trainlog-sleep-diary`, version 1, is emitted by full generations in stable +v0.1.4. It is optional when consuming an older generation so a pre-domain +artifact remains replayable. It carries bounded complete entry snapshots with stable identities, the current immutable revision and causal parent, offset-bearing timestamps, appreciations, notes and logical deletion. Exact revision replay is unchanged; sibling revisions and resurrection after deletion diff --git a/docs/tests.md b/docs/tests.md index 59e3aff..609a468 100644 --- a/docs/tests.md +++ b/docs/tests.md @@ -714,10 +714,10 @@ tagged source state, and the tag, Android `versionName`, Meson project version, TUI product version, asset names, and release title must agree. Private update rollout may set `TRAINLOG_ANDROID_VERSION_CODE` to a positive -integer above the installed package while retaining the current development -`versionName=0.1.4`. The version-code override is build-only and does not change -any schema or exchange-format version. Private daily candidates must not -downgrade the logical product version to the earlier 0.1.2 stable line. +integer above the installed package while retaining the tagged product +`versionName`. The version-code override is build-only and does not change any +schema or exchange-format version. Private daily candidates must never +downgrade the logical product version. For `TRAINLOG_UI_ANDROID_WEB_UNIFICATION_V1`, `lintDebug` was also run from a detached clean worktree at the exact `main` baseline and from the mission