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
## 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

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. |
| 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<version>`. 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<version>
./trainlog-tui-linux-x86_64-v<version>
mkdir trainlog-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
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

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
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` |

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
to the corresponding source file.
- [Trainlog v0.1.2](v0.1.2.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
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
```

View file

@ -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__":

View file

@ -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",