release: v0.1.2
This commit is contained in:
parent
799054ee2c
commit
fdf4301502
8 changed files with 120 additions and 49 deletions
|
|
@ -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
|
||||
|
|
|
|||
65
README.md
65
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<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
|
||||
|
||||
|
|
|
|||
|
|
@ -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` |
|
||||
|
|
|
|||
|
|
@ -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
45
docs/releases/v0.1.2.md
Normal 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.
|
||||
|
|
@ -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
|
||||
```
|
||||
|
|
|
|||
|
|
@ -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__":
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
Loading…
Reference in a new issue