From fdf4301502b1db15d71044d4bfb053d6de37702d Mon Sep 17 00:00:00 2001 From: fy59 Date: Sun, 20 Sep 2026 08:23:30 +0200 Subject: [PATCH] release: v0.1.2 --- CHANGELOG.md | 2 +- README.md | 65 ++++++++++++++++------------- docs/current_state.md | 28 ++++++------- docs/releases/README.md | 1 + docs/releases/v0.1.2.md | 45 ++++++++++++++++++++ docs/roadmap.md | 13 ++++-- tests/test_sync_deployment_tools.py | 9 ++++ tools/package_sync_candidate.py | 6 +++ 8 files changed, 120 insertions(+), 49 deletions(-) create mode 100644 docs/releases/v0.1.2.md diff --git a/CHANGELOG.md b/CHANGELOG.md index b3b19f0..6b5503b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## Unreleased — 0.1.2 +## 0.1.2 — 2026-09-20 - Added USB-priority full-generation synchronization with a separately configured private Drive mirror/fallback transport, verified manifest-last diff --git a/README.md b/README.md index af9ffbc..40f5ee9 100644 --- a/README.md +++ b/README.md @@ -24,13 +24,13 @@ 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.2 development) | Display the Dashboard, the operational top-level Programmes daily active-program calendar, and the implemented Sessions inventory, deletion, manual preparation, Android-delivery, and Programs administration workflow through typed Trainlog Core/API boundaries. Programs has responsive detail, terminal logical deletion, and a privately deployed read-only Android projection. Analyse and Exercises remain placeholders. | +| Local Web (0.1.2) | Display the Dashboard, the operational top-level Programmes daily active-program calendar, and the implemented Sessions inventory, deletion, manual preparation, Android-delivery, and Programs administration workflow through typed Trainlog Core/API boundaries. Programs has responsive detail, terminal logical deletion, and a privately deployed read-only Android projection. Analyse and Exercises remain placeholders. | 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 CLI/HTTP adapter, embedded frontend, read-only Dashboard API, factual tiles, visualizations, and private layout persistence are implemented. This does not -make the remaining placeholder routes functional or publish version 0.1.2. +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. @@ -46,15 +46,15 @@ both official mirrors: Each published stable release provides: - a signed Android APK; -- a Linux x86-64 TUI executable; +- a Linux x86-64 desktop runtime bundle; - SHA-256 checksums. Both mirrors publish the same Trainlog product version and release assets. The -current development version is **0.1.2** on Android and desktop; this is one -shared Trainlog version, not separate interface versions. Version 0.1.1 is the -latest stable release. +latest stable version is **0.1.2** on Android and desktop; this is one shared +Trainlog version, not separate interface versions. Version 0.1.1 is the +previous stable release. -Version 0.1.1 presents Trainlog in French by default, with English selectable +Trainlog presents French by default, with English selectable from **Settings → Language** on Android and the desktop TUI. The selection is local to that installation and updates the visible interface immediately; it does not translate user exercise/catalogue names or change training data, @@ -75,21 +75,25 @@ For a published release, download Trainlog from either official mirror: - [GitHub](https://github.com/labfytools/trainlog/releases) - [Forgejo](https://git.labfytools.com/fy59/trainlog/releases) -Both mirrors contain the same Android APK, Linux x86-64 TUI binary, and SHA-256 +Both mirrors contain the same Android APK, Linux x86-64 runtime bundle, and SHA-256 checksums for each stable Trainlog release. Verify the downloaded binaries against `SHA256SUMS` before installing them. -The Linux TUI artifact is architecture-specific and dynamically linked. It is -not a universally portable Linux binary: the host must provide compatible -runtime libraries listed under [Dependencies](#dependencies). +The Linux artifact is an architecture-specific tar archive whose published +filename intentionally remains `trainlog-tui-linux-x86_64-v`. It +contains the TUI/Web executable, synchronization daemon and helpers, catalogs, +and a hashed inventory from the same release commit. Its native executables are +dynamically linked, so the host must provide compatible runtime libraries +listed under [Dependencies](#dependencies). ```bash -chmod +x trainlog-tui-linux-x86_64-v -./trainlog-tui-linux-x86_64-v +mkdir trainlog-v +tar -xf trainlog-tui-linux-x86_64-v -C trainlog-v +./trainlog-v/bin/trainlog ``` -The executable can remain in the download directory. Moving it into a directory -on `PATH`, such as a user-managed `~/.local/bin`, is optional. +The extracted bundle can remain in a user-managed installation directory. +Linking its launchers from `bin/` into `~/.local/bin` is optional. For Android, download the release APK, allow installation from the browser or file manager when Android requests it, and install the package. Android 8.0 @@ -103,13 +107,14 @@ independent. ### Daily synchronization on an opted-in installation -Connect and unlock the paired phone, keep Trainlog's Synchronization screen in -the foreground, then select **Synchronize** in the local Web Dashboard and -**Synchronize now** on Android. Wait until Web reports completion and Android -shows that synchronization completed on both Android and PC. A failure remains -durable and should be diagnosed before retrying; do not delete generation, -ACK, database, or backup files. Full-generation mode is a trusted local opt-in; -other installations continue to use the established V3 request/receipt path. +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. ### Build from source @@ -150,8 +155,8 @@ updates; generating a replacement key is not a normal release procedure. ### Linux runtime dependencies -The published v0.1.1 x86-64 TUI is dynamically linked. Its tagged source -directly requires compatible versions of: +The published v0.1.2 x86-64 desktop runtime is dynamically linked. Its tagged +source directly requires compatible versions of: - glibc and the GCC support runtime; - SQLite 3; @@ -162,9 +167,9 @@ directly requires compatible versions of: - Notcurses Core; - the standard math library. -The current 0.1.2 development source 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. +Version 0.1.2 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. Distribution packages may pull additional transitive libraries, including libusb, ncursesw, unistring, gpm, libgcrypt, libgpg-error, and libdeflate. @@ -179,9 +184,9 @@ assuming one universal package command. device. - `trainlog-syncd` installation expects a systemd user session. Manual TUI synchronization does not require the user service. -- `rclone` is required only for automatic AI history upload and Drive - inbox/archive workflows. Core capture, local history, analytics, and direct - MTP synchronization work without `rclone`. +- `rclone` is required for desktop Google Drive synchronization and automatic + AI Drive workflows. Core capture, local history, analytics, and direct MTP + synchronization continue to work without `rclone`. ### Build dependencies diff --git a/docs/current_state.md b/docs/current_state.md index 7a9c615..1b1a99b 100644 --- a/docs/current_state.md +++ b/docs/current_state.md @@ -18,18 +18,18 @@ delivery's stable execution-session identity and retains all provenance. The opt-in full-generation path is operational on the private daily installation. The loopback Web control and foreground Android coordinator use the production direct-libmtp adapter, correlated manifest/ACK V1 objects, and -persistent peer identities. The latest controlled rollout verified real -desktop and Android backups, desktop schema v26 to v28, and an in-place private -Android update from versionCode 16 to 17 with schema v24 to v25. The -installed APK remains `com.labfytools.trainlog` 0.1.2, is -non-debuggable, and retains certificate SHA-256 -`aa56c97f2781a0d01f007f4444c3970deb58ad8327ca3da7b0b90f37dbe2ad25`. -One preparation created explicitly as disposable was withdrawn through the Web -confirmation flow. Two complete generation conversations around a Trainlog-only -restart proved one durable Android `no_matching_delivery` result, no delivery -or performed session, no resurrection, and no duplication. Drive was not -configured and remains outside this local MTP result. This is a private 0.1.2 -development deployment, not a public release; v0.1.1 is unchanged. +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 public Android release chain advances from v0.1.1 versionCode 2 to v0.1.2 +versionCode 3 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. `TRAINLOG_NATIVE_BUILD_AND_CANDIDATE_V1` closes the native warning gate. Strict GCC 16.2.1 and Clang 22.1.8 builds now pass the same 81-test inventory, and the @@ -41,7 +41,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-18**. +Snapshot date: **2026-09-20**. `TRAINLOG_CODE_READABILITY_V1` normalizes the recent generation-MTP, generation/ACK, Android-backup, Web Dashboard serialization, tests, doubles and @@ -76,7 +76,7 @@ parallel implementation of its rules. | Android SQLite | schema v25 | | 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.2` development, synchronized across Android and desktop; latest stable release: `v0.1.1` | +| Trainlog product version | `0.1.2`, synchronized across Android and desktop; latest stable release: `v0.1.2` (`v0.1.1` is the previous stable release) | | 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` | diff --git a/docs/releases/README.md b/docs/releases/README.md index 654c806..6309160 100644 --- a/docs/releases/README.md +++ b/docs/releases/README.md @@ -6,4 +6,5 @@ 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.2](v0.1.2.md) - [Trainlog v0.1.1](v0.1.1.md) diff --git a/docs/releases/v0.1.2.md b/docs/releases/v0.1.2.md new file mode 100644 index 0000000..ebb8a37 --- /dev/null +++ b/docs/releases/v0.1.2.md @@ -0,0 +1,45 @@ +Trainlog v0.1.2 extends the local-first desktop and Android workflow while +keeping each SQLite database private to its device. + +## Web and Programs + +- The loopback-only Web application now provides the Dashboard, Sessions, and + Programs administration surfaces. +- The top-level Programmes calendar presents active Program sessions by real + planned date and uses the Core-provided `todo`, `prepared`, `in_progress`, + `completed`, and `deleted` execution states. +- Manual and Program-derived preparations preserve their stable provenance, + ordered exercises, targets, loads, and revision history. + +## Android execution and history + +- A prepared Program session can be delivered to Android, started explicitly, + resumed from the durable local draft, and completed without inventing a + performed session at delivery time. +- Completed Android sessions return to desktop History exactly once and advance + their Program calendar entry through the stable execution-session identity. +- Causal deletion, withdrawals, retained generations, and replay protection + prevent removed data from being resurrected. + +## Synchronization + +- The complete generation protocol transports versioned artifacts, manifests, + correlated acknowledgements, and causal operations through one idempotent + business engine. +- USB/MTP remains the preferred local transport. A separately configured + private Google Drive namespace is maintained as a mirror and serves as a + fallback when USB is unavailable. +- Android can process desktop USB requests through an explicitly enabled + foreground service, and bounded WorkManager checks handle the private Drive + folder selected by the user. +- After initial background activation, the Web Synchronize action can complete + a USB conversation without opening Android's SyncScreen for each run. +- Trainlog remains local-first: desktop and Android SQLite databases stay local + and are never synchronized through USB or Google Drive. + +## Assets + +- `trainlog-android-v0.1.2.apk`: signed Android APK. +- `trainlog-tui-linux-x86_64-v0.1.2`: Linux x86-64 runtime bundle containing + the TUI, local Web adapter, synchronization helpers, and required catalogs. +- `SHA256SUMS`: SHA-256 checksums for both artifacts. diff --git a/docs/roadmap.md b/docs/roadmap.md index 957400d..4d391b0 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -4,9 +4,10 @@ The controlled private rollout is complete for the paired daily installation: 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 fake-transport validated; -private live Drive and post-reboot/manual device validation remain explicit -deployment gates. +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. This document owns future work. The implemented baseline is summarized in [current_state.md](current_state.md); completed narratives and evidence belong @@ -27,7 +28,7 @@ distinction between measured values and estimates. ## Current baseline -Desktop schema v28, Android schema v25, Notcurses, direct +Stable v0.1.2 is the release baseline. Desktop schema v28, Android schema v25, 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 @@ -49,6 +50,10 @@ mobile snapshot or `TRAINLOG_FORMAT_V1` contracts. ## Current cursor +The stable v0.1.2 baseline is closed; future work proceeds from its validated +Web, Program execution, USB/Drive generation, ACK, and causal-deletion +contracts without reopening those completed gates. + ```text CURRENT_OPERATIONAL_CURSOR=TRAINLOG_WEB_V1_NEXT_CONTRACT ``` diff --git a/tests/test_sync_deployment_tools.py b/tests/test_sync_deployment_tools.py index f8491ab..b8a8fd4 100644 --- a/tests/test_sync_deployment_tools.py +++ b/tests/test_sync_deployment_tools.py @@ -121,6 +121,15 @@ class DeploymentToolsTest(unittest.TestCase): for row in inventory["files"] ) ) + for required in ( + "tools/sync_drive_transport.py", + "tools/sync_ai_session_draft_drive.py", + "tools/post_sync_ai_drive.py", + ): + self.assertTrue( + any(row["path"] == required for row in inventory["files"]), + required, + ) if __name__ == "__main__": diff --git a/tools/package_sync_candidate.py b/tools/package_sync_candidate.py index fac555b..a5ca840 100644 --- a/tools/package_sync_candidate.py +++ b/tools/package_sync_candidate.py @@ -14,6 +14,7 @@ RUNTIME_TOOLS = [ "trainlog_syncd.py", "sync_orchestrator.py", "sync_peer_worker.py", + "sync_drive_transport.py", "sync_generation_exchange.py", "trainlog_sqlite.py", "validate_json.py", @@ -37,6 +38,11 @@ RUNTIME_TOOLS = [ "export_exercise_body_zones.py", "export_training_feedback.py", "export_ai_session_drafts.py", + "import_ai_session_draft.py", + "mark_ai_session_drafts_published.py", + "sync_ai_session_draft_drive.py", + "export_ai_history.py", + "post_sync_ai_drive.py", "export_session_preparations.py", "export_programs.py", "program_execution_exchange.py",