chore: start 0.1.3 development

This commit is contained in:
fy59 2026-09-20 08:26:43 +02:00
parent fdf4301502
commit 5701e2a541
9 changed files with 24 additions and 19 deletions

View file

@ -1,5 +1,9 @@
# Changelog # Changelog
## Unreleased — 0.1.3
Development opened after the stable v0.1.2 release.
## 0.1.2 — 2026-09-20 ## 0.1.2 — 2026-09-20
- Added USB-priority full-generation synchronization with a separately - Added USB-priority full-generation synchronization with a separately

View file

@ -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. | | 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) | 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.3 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. |
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
@ -50,9 +50,9 @@ Each published stable release provides:
- 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
latest stable version is **0.1.2** on Android and desktop; this is one shared current development version is **0.1.3** on Android and desktop; this is one
Trainlog version, not separate interface versions. Version 0.1.1 is the shared Trainlog version, not separate interface versions. Version 0.1.2 is the
previous stable release. latest stable release.
Trainlog presents 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

View file

@ -43,7 +43,7 @@ val trainlogVersionCode =
providers.environmentVariable("TRAINLOG_ANDROID_VERSION_CODE").orNull?.let { raw -> providers.environmentVariable("TRAINLOG_ANDROID_VERSION_CODE").orNull?.let { raw ->
raw.toIntOrNull()?.takeIf { it in 1..Int.MAX_VALUE } raw.toIntOrNull()?.takeIf { it in 1..Int.MAX_VALUE }
?: throw GradleException("TRAINLOG_ANDROID_VERSION_CODE must be a positive integer") ?: throw GradleException("TRAINLOG_ANDROID_VERSION_CODE must be a positive integer")
} ?: 3 } ?: 4
android { android {
namespace = "com.labfytools.trainlog" namespace = "com.labfytools.trainlog"
@ -55,7 +55,7 @@ android {
targetSdk = 36 targetSdk = 36
versionCode = trainlogVersionCode versionCode = trainlogVersionCode
versionName = "0.1.2" versionName = "0.1.3"
testInstrumentationRunner = testInstrumentationRunner =
"androidx.test.runner.AndroidJUnitRunner" "androidx.test.runner.AndroidJUnitRunner"
} }

View file

@ -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`, synchronized across Android and desktop; latest stable release: `v0.1.2` (`v0.1.1` is the previous stable release) | | Trainlog product version | `0.1.3` development, synchronized across Android and desktop; latest stable release: `v0.1.2` |
| 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

@ -28,10 +28,11 @@ distinction between measured values and estimates.
## Current baseline ## Current baseline
Stable v0.1.2 is the release baseline. Desktop schema v28, Android schema v25, Notcurses, direct Stable v0.1.2 is the release baseline for the v0.1.3 development cycle.
`Documents/Trainlog` storage, mobile export V3, Training Knowledge V1, Body Desktop schema v28, Android schema v25, Notcurses, direct `Documents/Trainlog`
Zones V1, Training Feedback V1/V2, STATS V1, and Session Generator V1 are storage, mobile export V3, Training Knowledge V1, Body Zones V1, Training
implemented. Session Generator V1 is hidden pending V2. AI session-draft Feedback V1/V2, STATS V1, and Session Generator V1 are implemented. Session
Generator V1 is hidden pending V2. AI session-draft
exchange and APP_SHELL_V1 retain their explicit manual validation/review gates. exchange and APP_SHELL_V1 retain their explicit manual validation/review gates.
`TRAINLOG_WEB_V1=CONTRACT_FROZEN / IMPLEMENTATION_STARTED`; its local-only `TRAINLOG_WEB_V1=CONTRACT_FROZEN / IMPLEMENTATION_STARTED`; its local-only
CLI/HTTP infrastructure, embedded frontend shell and the frozen Dashboard data CLI/HTTP infrastructure, embedded frontend shell and the frozen Dashboard data
@ -50,9 +51,9 @@ 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 The v0.1.3 development cursor proceeds from the closed stable v0.1.2 baseline
Web, Program execution, USB/Drive generation, ACK, and causal-deletion and its validated Web, Program execution, USB/Drive generation, ACK, and
contracts without reopening those completed gates. 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

@ -1,7 +1,7 @@
project( project(
'trainlog', 'trainlog',
'c', 'c',
version: '0.1.2', version: '0.1.3',
meson_version: '>=1.3.0', meson_version: '>=1.3.0',
default_options: [ default_options: [
'c_std=c17', 'c_std=c17',

View file

@ -65,7 +65,7 @@ class DeploymentToolsTest(unittest.TestCase):
) )
self.assertEqual(result.returncode, 0, result.stderr) self.assertEqual(result.returncode, 0, result.stderr)
inventory = json.loads((output / "candidate-inventory.json").read_text()) inventory = json.loads((output / "candidate-inventory.json").read_text())
self.assertEqual(inventory["product_version"], "0.1.2") self.assertEqual(inventory["product_version"], "0.1.3")
self.assertEqual(inventory["desktop_schema"], 28) self.assertEqual(inventory["desktop_schema"], 28)
self.assertEqual(inventory["android_schema"], 25) self.assertEqual(inventory["android_schema"], 25)
self.assertIn("session-preparations-v2", inventory["protocols"]) self.assertIn("session-preparations-v2", inventory["protocols"])
@ -84,7 +84,7 @@ class DeploymentToolsTest(unittest.TestCase):
text=True, text=True,
) )
self.assertEqual(linked.returncode, 0, linked.stderr) self.assertEqual(linked.returncode, 0, linked.stderr)
self.assertIn("trainlog 0.1.2", linked.stdout) self.assertIn("trainlog 0.1.3", linked.stdout)
imported = subprocess.run( imported = subprocess.run(
[ [
"python3", "python3",

View file

@ -103,7 +103,7 @@ def main() -> int:
"source_commit": subprocess.check_output( "source_commit": subprocess.check_output(
["git", "rev-parse", "HEAD"], cwd=ROOT, text=True ["git", "rev-parse", "HEAD"], cwd=ROOT, text=True
).strip(), ).strip(),
"product_version": "0.1.2", "product_version": "0.1.3",
"desktop_schema": 28, "desktop_schema": 28,
"android_schema": 25, "android_schema": 25,
"protocols": [ "protocols": [

View file

@ -308,7 +308,7 @@ static bool test_http_contract(TrainlogDatabase *database) {
CHECK(strstr(response, "Access-Control-Allow-Origin") == NULL); CHECK(strstr(response, "Access-Control-Allow-Origin") == NULL);
CHECK(strstr(response, CHECK(strstr(response,
"{\"api_version\":1,\"status\":\"ok\",\"product\":\"trainlog\"," "{\"api_version\":1,\"status\":\"ok\",\"product\":\"trainlog\","
"\"version\":\"0.1.2\"}") != NULL); "\"version\":\"0.1.3\"}") != NULL);
{ {
char token[80]; char token[80];
CHECK(exchange(port, CHECK(exchange(port,