release: v0.1.2

This commit is contained in:
fy59 2026-09-20 08:23:30 +02:00
parent 799054ee2c
commit fdf4301502
8 changed files with 120 additions and 49 deletions

View file

@ -1,6 +1,6 @@
# Changelog # Changelog
## Unreleased — 0.1.2 ## 0.1.2 — 2026-09-20
- Added USB-priority full-generation synchronization with a separately - Added USB-priority full-generation synchronization with a separately
configured private Drive mirror/fallback transport, verified manifest-last configured private Drive mirror/fallback transport, verified manifest-last

View file

@ -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. | | 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. | | 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 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 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, CLI/HTTP adapter, embedded frontend, read-only Dashboard API, factual tiles,
visualizations, and private layout persistence are implemented. This does not 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 The top-level `/programmes` route is an operational daily calendar for active
Programs. Sessions → Programmes remains the technical administration/import, Programs. Sessions → Programmes remains the technical administration/import,
list, detail, archive, and delete surface. list, detail, archive, and delete surface.
@ -46,15 +46,15 @@ both official mirrors:
Each published stable release provides: Each published stable release provides:
- a signed Android APK; - a signed Android APK;
- a Linux x86-64 TUI executable; - a Linux x86-64 desktop runtime bundle;
- SHA-256 checksums. - SHA-256 checksums.
Both mirrors publish the same Trainlog product version and release assets. The 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 latest stable version is **0.1.2** on Android and desktop; this is one shared
shared Trainlog version, not separate interface versions. Version 0.1.1 is the Trainlog version, not separate interface versions. Version 0.1.1 is the
latest stable release. 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 from **Settings → Language** on Android and the desktop TUI. The selection is
local to that installation and updates the visible interface immediately; it local to that installation and updates the visible interface immediately; it
does not translate user exercise/catalogue names or change training data, 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) - [GitHub](https://github.com/labfytools/trainlog/releases)
- [Forgejo](https://git.labfytools.com/fy59/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 checksums for each stable Trainlog release. Verify the downloaded binaries
against `SHA256SUMS` before installing them. against `SHA256SUMS` before installing them.
The Linux TUI artifact is architecture-specific and dynamically linked. It is The Linux artifact is an architecture-specific tar archive whose published
not a universally portable Linux binary: the host must provide compatible filename intentionally remains `trainlog-tui-linux-x86_64-v<version>`. It
runtime libraries listed under [Dependencies](#dependencies). 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 ```bash
chmod +x trainlog-tui-linux-x86_64-v<version> mkdir trainlog-v<version>
./trainlog-tui-linux-x86_64-v<version> tar -xf trainlog-tui-linux-x86_64-v<version> -C trainlog-v<version>
./trainlog-v<version>/bin/trainlog
``` ```
The executable can remain in the download directory. Moving it into a directory The extracted bundle can remain in a user-managed installation directory.
on `PATH`, such as a user-managed `~/.local/bin`, is optional. Linking its launchers from `bin/` into `~/.local/bin` is optional.
For Android, download the release APK, allow installation from the browser or 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 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 ### Daily synchronization on an opted-in installation
Connect and unlock the paired phone, keep Trainlog's Synchronization screen in After explicitly enabling Android background synchronization once, connect and
the foreground, then select **Synchronize** in the local Web Dashboard and unlock the paired phone and select **Synchronize** in the local Web Dashboard.
**Synchronize now** on Android. Wait until Web reports completion and Android USB/MTP is preferred when the Trainlog peer is usable; the separately selected
shows that synchronization completed on both Android and PC. A failure remains private Drive folder is updated as a mirror and is the fallback transport. Wait
durable and should be diagnosed before retrying; do not delete generation, until Web reports the correlated generation and acknowledgements. A failure
ACK, database, or backup files. Full-generation mode is a trusted local opt-in; remains durable and should be diagnosed before retrying; do not delete
other installations continue to use the established V3 request/receipt path. generation, ACK, database, or backup files. Full-generation mode and Drive
remain trusted per-installation configuration.
### Build from source ### Build from source
@ -150,8 +155,8 @@ updates; generating a replacement key is not a normal release procedure.
### Linux runtime dependencies ### Linux runtime dependencies
The published v0.1.1 x86-64 TUI is dynamically linked. Its tagged source The published v0.1.2 x86-64 desktop runtime is dynamically linked. Its tagged
directly requires compatible versions of: source directly requires compatible versions of:
- glibc and the GCC support runtime; - glibc and the GCC support runtime;
- SQLite 3; - SQLite 3;
@ -162,9 +167,9 @@ directly requires compatible versions of:
- Notcurses Core; - Notcurses Core;
- the standard math library. - the standard math library.
The current 0.1.2 development source additionally links GNU libmicrohttpd and Version 0.1.2 additionally links GNU libmicrohttpd and yyjson for the local Web
yyjson for the local Web adapter and Dashboard layout configuration. Those are adapter and Dashboard layout configuration. Those are not retroactive
not retroactive requirements of the pre-Web v0.1.1 tagged source. requirements of the pre-Web v0.1.1 tagged source.
Distribution packages may pull additional transitive libraries, including Distribution packages may pull additional transitive libraries, including
libusb, ncursesw, unistring, gpm, libgcrypt, libgpg-error, and libdeflate. libusb, ncursesw, unistring, gpm, libgcrypt, libgpg-error, and libdeflate.
@ -179,9 +184,9 @@ assuming one universal package command.
device. device.
- `trainlog-syncd` installation expects a systemd user session. Manual TUI - `trainlog-syncd` installation expects a systemd user session. Manual TUI
synchronization does not require the user service. synchronization does not require the user service.
- `rclone` is required only for automatic AI history upload and Drive - `rclone` is required for desktop Google Drive synchronization and automatic
inbox/archive workflows. Core capture, local history, analytics, and direct AI Drive workflows. Core capture, local history, analytics, and direct MTP
MTP synchronization work without `rclone`. synchronization continue to work without `rclone`.
### Build dependencies ### Build dependencies

View file

@ -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 The opt-in full-generation path is operational on the private daily
installation. The loopback Web control and foreground Android coordinator use installation. 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. The latest controlled rollout verified real persistent peer identities. Controlled USB and private Drive validation proved
desktop and Android backups, desktop schema v26 to v28, and an in-place private the complete Web-initiated request, generation, import, publication, and ACK
Android update from versionCode 16 to 17 with schema v24 to v25. The conversation without opening SyncScreen for each run. USB remains preferred;
installed APK remains `com.labfytools.trainlog` 0.1.2, is the private `Trainlog/Sync/v1` namespace is configured as a verified mirror and
non-debuggable, and retains certificate SHA-256 fallback, independently from `Trainlog/AI`. Cross-transport replay is
`aa56c97f2781a0d01f007f4444c3970deb58ad8327ca3da7b0b90f37dbe2ad25`. idempotent and neither transport carries SQLite.
One preparation created explicitly as disposable was withdrawn through the Web
confirmation flow. Two complete generation conversations around a Trainlog-only The public Android release chain advances from v0.1.1 versionCode 2 to v0.1.2
restart proved one durable Android `no_matching_delivery` result, no delivery versionCode 3 under certificate SHA-256
or performed session, no resurrection, and no duplication. Drive was not `5ef41117da107c9805ae3215c5ec823cff06216610e6e4f7542a754161c71bd2`.
configured and remains outside this local MTP result. This is a private 0.1.2 Higher-numbered private validation builds used a separate Android Debug
development deployment, not a public release; v0.1.1 is unchanged. certificate and are not members of the public update-signature chain.
`TRAINLOG_NATIVE_BUILD_AND_CANDIDATE_V1` closes the native warning gate. Strict `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 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 the same relocatable, hashed bundle as the Web generation coordinator, avoiding
mixed-checkout user-service execution during the controlled rollout. 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, `TRAINLOG_CODE_READABILITY_V1` normalizes the recent generation-MTP,
generation/ACK, Android-backup, Web Dashboard serialization, tests, doubles and generation/ACK, Android-backup, Web Dashboard serialization, tests, doubles and
@ -76,7 +76,7 @@ parallel implementation of its rules.
| Android SQLite | schema v25 | | Android SQLite | schema v25 |
| Mobile snapshot | V3 active; V1/V2 readable legacy inputs; explicit V4 codec staged, not selected by transport | | Mobile snapshot | V3 active; V1/V2 readable legacy inputs; explicit V4 codec staged, not selected by transport |
| Desktop terminal backend | Notcurses only | | 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 | | 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 history export | `TRAINLOG_AI_EXPORT_V1` active |
| AI session proposals | `TRAINLOG_AI_SESSION_DRAFT_V1=VALIDATION_PENDING` | | AI session proposals | `TRAINLOG_AI_SESSION_DRAFT_V1=VALIDATION_PENDING` |

View file

@ -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 existing release, tag, status, and assets while keeping their note bodies equal
to the corresponding source file. to the corresponding source file.
- [Trainlog v0.1.2](v0.1.2.md)
- [Trainlog v0.1.1](v0.1.1.md) - [Trainlog v0.1.1](v0.1.1.md)

45
docs/releases/v0.1.2.md Normal file
View file

@ -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.

View file

@ -4,9 +4,10 @@ The controlled private rollout is complete for the paired daily installation:
physical libmtp, verified backups, signing continuity, migrations, correlated physical libmtp, verified backups, signing continuity, migrations, correlated
ACKs, restart, and idempotent replay passed. Generation mode remains an ACKs, restart, and idempotent replay passed. Generation mode remains an
explicit per-installation opt-in. The additive private Drive transport and explicit per-installation opt-in. The additive private Drive transport and
Android background software are implemented and fake-transport validated; Android background software are implemented and validated with fake transport
private live Drive and post-reboot/manual device validation remain explicit and the private production namespace. USB remains preferred, Drive is the
deployment gates. 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 This document owns future work. The implemented baseline is summarized in
[current_state.md](current_state.md); completed narratives and evidence belong [current_state.md](current_state.md); completed narratives and evidence belong
@ -27,7 +28,7 @@ distinction between measured values and estimates.
## Current baseline ## 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 `Documents/Trainlog` storage, mobile export V3, Training Knowledge V1, Body
Zones V1, Training Feedback V1/V2, STATS V1, and Session Generator V1 are Zones V1, Training Feedback V1/V2, STATS V1, and Session Generator V1 are
implemented. Session Generator V1 is hidden pending V2. AI session-draft implemented. Session Generator V1 is hidden pending V2. AI session-draft
@ -49,6 +50,10 @@ mobile snapshot or `TRAINLOG_FORMAT_V1` contracts.
## Current cursor ## 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 ```text
CURRENT_OPERATIONAL_CURSOR=TRAINLOG_WEB_V1_NEXT_CONTRACT CURRENT_OPERATIONAL_CURSOR=TRAINLOG_WEB_V1_NEXT_CONTRACT
``` ```

View file

@ -121,6 +121,15 @@ class DeploymentToolsTest(unittest.TestCase):
for row in inventory["files"] 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__": if __name__ == "__main__":

View file

@ -14,6 +14,7 @@ RUNTIME_TOOLS = [
"trainlog_syncd.py", "trainlog_syncd.py",
"sync_orchestrator.py", "sync_orchestrator.py",
"sync_peer_worker.py", "sync_peer_worker.py",
"sync_drive_transport.py",
"sync_generation_exchange.py", "sync_generation_exchange.py",
"trainlog_sqlite.py", "trainlog_sqlite.py",
"validate_json.py", "validate_json.py",
@ -37,6 +38,11 @@ RUNTIME_TOOLS = [
"export_exercise_body_zones.py", "export_exercise_body_zones.py",
"export_training_feedback.py", "export_training_feedback.py",
"export_ai_session_drafts.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_session_preparations.py",
"export_programs.py", "export_programs.py",
"program_execution_exchange.py", "program_execution_exchange.py",