chore: open 0.1.6 development

This commit is contained in:
fy59 2026-09-23 21:19:33 +02:00
parent f2747b357b
commit f20e5c4d39
9 changed files with 21 additions and 14 deletions

View file

@ -1,5 +1,10 @@
# Changelog # Changelog
## Unreleased — 0.1.6
Development opened after the stable v0.1.5 release. No 0.1.6 feature tranche
is selected by this version-opening commit.
## 0.1.5 — 2026-09-23 ## 0.1.5 — 2026-09-23
- Completed the Sleep Tonight readiness delta and its non-destructive private - Completed the Sleep Tonight readiness delta and its non-destructive private

View file

@ -24,7 +24,7 @@ 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.5) | Display Dashboard, Programmes, Sessions, Exercises and factual Analyse workspaces. Analyse includes the Sleep Diary editor, multi-night 18:00-to-18:00 agenda, factual heart-rate timelines and local vector PDF export. | | Local Web (0.1.6 development) | Display Dashboard, Programmes, Sessions, Exercises and factual Analyse workspaces. Analyse includes the Sleep Diary editor, multi-night 18:00-to-18:00 agenda, factual heart-rate timelines and local vector PDF export. |
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
@ -41,6 +41,8 @@ training exercise timestamps, structured Android Sleep capture, dedicated
synchronized `cardio` sessions, versioned measured Cardio calibration, synchronized `cardio` sessions, versioned measured Cardio calibration,
fresh-signal BPM-guided phases and factual Web heart-rate timelines in fresh-signal BPM-guided phases and factual Web heart-rate timelines in
History/Sleep. History/Sleep.
Version 0.1.6 development is open without selecting a new feature tranche or
reopening the frozen 0.1.5 release contracts.
## Releases ## Releases

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")
} ?: 6 } ?: 7
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.5" versionName = "0.1.6"
testInstrumentationRunner = testInstrumentationRunner =
"androidx.test.runner.AndroidJUnitRunner" "androidx.test.runner.AndroidJUnitRunner"
} }

View file

@ -116,7 +116,7 @@ parallel implementation of its rules.
| Android SQLite | schema v32; v32 additively gives every Sleep medication intake a structured `quantity` (1..99), defaults historical rows to 1, and records a distinct quick-publication tip | | Android SQLite | schema v32; v32 additively gives every Sleep medication intake a structured `quantity` (1..99), defaults historical rows to 1, and records a distinct quick-publication tip |
| 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.5` stable, synchronized across Android and desktop; latest stable release: `v0.1.5` | | Trainlog product version | `0.1.6` development, synchronized across Android and desktop; latest stable release: `v0.1.5` |
| 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` |
@ -159,7 +159,7 @@ parallel implementation of its rules.
| Sleep tonight readiness delta | `TRAINLOG_SLEEP_TONIGHT_CLOSEOUT_V1=PASS`: Meson 111/111, import checks 6/6, Android `testDebugUnitTest` plus `assembleDebug`, Web 191/191 plus typecheck/build, exact V2 quantity replay, private vc47 schema-v32 migration, fresh CYCPLUS BPM and non-mutating Android/Web visual review. | | Sleep tonight readiness delta | `TRAINLOG_SLEEP_TONIGHT_CLOSEOUT_V1=PASS`: Meson 111/111, import checks 6/6, Android `testDebugUnitTest` plus `assembleDebug`, Web 191/191 plus typecheck/build, exact V2 quantity replay, private vc47 schema-v32 migration, fresh CYCPLUS BPM and non-mutating Android/Web visual review. |
| 0.1.5 validation | `TRAINLOG_0_1_5_VALIDATION_V1=PASS`: native 111/111; Android unit-test task and APK build; Web 191/191 plus typecheck/build; JSON/import, C-format and diff checks pass. Private vc47 preserves real data through schema v32, renders pre-bed medication quantity controls, reconnects the CYCPLUS and presents the multi-night Web Sleep agenda. | | 0.1.5 validation | `TRAINLOG_0_1_5_VALIDATION_V1=PASS`: native 111/111; Android unit-test task and APK build; Web 191/191 plus typecheck/build; JSON/import, C-format and diff checks pass. Private vc47 preserves real data through schema v32, renders pre-bed medication quantity controls, reconnects the CYCPLUS and presents the multi-night Web Sleep agenda. |
| Tomorrow session readiness | `TRAINLOG_TOMORROW_SESSION_CARDIO_READINESS_V1=PASS`: the private vc46 is clean on schema v31 with fresh CYCPLUS BPM and the next Program session is unambiguous; one combined regression proves two ordered occurrences loaded from the synchronized Program, Program provenance, factual timeline/HR ownership, finalization, full generation, desktop import, replay and correlated ACK | | Tomorrow session readiness | `TRAINLOG_TOMORROW_SESSION_CARDIO_READINESS_V1=PASS`: the private vc46 is clean on schema v31 with fresh CYCPLUS BPM and the next Program session is unambiguous; one combined regression proves two ordered occurrences loaded from the synchronized Program, Program provenance, factual timeline/HR ownership, finalization, full generation, desktop import, replay and correlated ACK |
| Current operational cursor | Stable v0.1.5 closes the cardio and Sleep Tonight cycle; subsequent development opens as 0.1.6 after the immutable release tag. | | Current operational cursor | 0.1.6 development is open after immutable stable v0.1.5; no new feature tranche is selected by the version-opening commit. |
| Complete synchronization gap contract | Frozen dependency contract; operational USB/Drive slices required by v0.1.2 are delivered | | Complete synchronization gap contract | Frozen dependency contract; operational USB/Drive slices required by v0.1.2 are delivered |
| Isolated synchronization test environment | `TRAINLOG_SYNC_TEST_ENV_V1=PASS/FROZEN` | | Isolated synchronization test environment | `TRAINLOG_SYNC_TEST_ENV_V1=PASS/FROZEN` |
| Synchronization characterization | `TRAINLOG_SYNC_CHARACTERIZATION_V1=PASS/FROZEN` | | Synchronization characterization | `TRAINLOG_SYNC_CHARACTERIZATION_V1=PASS/FROZEN` |
@ -425,8 +425,8 @@ The full Android lint comparison against an isolated clean `main` worktree is
unchanged at ten pre-existing errors: one `NewApi`, one unchanged at ten pre-existing errors: one `NewApi`, one
`LocalContextConfigurationRead`, and eight bilingual `StringFormatMatches` `LocalContextConfigurationRead`, and eight bilingual `StringFormatMatches`
diagnostics. This UI tranche adds no lint error and changes no lint policy. diagnostics. This UI tranche adds no lint error and changes no lint policy.
The stable Android v0.1.4 tag uses `versionName=0.1.4` and public versionCode 5. The stable Android v0.1.5 tag uses `versionName=0.1.5` and public versionCode 6.
The v0.1.5 development source starts at `versionName=0.1.5` and versionCode 6. The v0.1.6 development source starts at `versionName=0.1.6` and versionCode 7.
Private validation builds may still supply only a strictly increasing Private validation builds may still supply only a strictly increasing
`versionCode` as a build-time override; that does not create a public release `versionCode` as a build-time override; that does not create a public release
or change schemas and protocols. or change schemas and protocols.

View file

@ -30,7 +30,7 @@ estimates.
## Current baseline ## Current baseline
Stable v0.1.5 is the release baseline for the next development cycle. Stable v0.1.5 is the release baseline for the v0.1.6 development cycle.
Desktop schema v35, Android schema v32, Notcurses, direct `Documents/Trainlog` Desktop schema v35, Android schema v32, Notcurses, direct `Documents/Trainlog`
storage, mobile export V3, Training Knowledge V1, Body Zones V1, Training storage, mobile export V3, Training Knowledge V1, Body Zones V1, Training
Feedback V1/V2, STATS V1, and Session Generator V1 are implemented. Session Feedback V1/V2, STATS V1, and Session Generator V1 are implemented. Session
@ -64,7 +64,7 @@ The heart-rate path remains independent from the frozen Bluetooth Trainlog
synchronization transport. synchronization transport.
```text ```text
CURRENT_OPERATIONAL_CURSOR=Stable v0.1.5 published; open 0.1.6 development without reopening frozen 0.1.5 contracts. CURRENT_OPERATIONAL_CURSOR=0.1.6 development open; next feature tranche not selected.
``` ```
Sleep Diary V1 stays frozen/readable while active capable peers require Sleep Diary V1 stays frozen/readable while active capable peers require

View file

@ -1,7 +1,7 @@
project( project(
'trainlog', 'trainlog',
'c', 'c',
version: '0.1.5', version: '0.1.6',
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.5") self.assertEqual(inventory["product_version"], "0.1.6")
self.assertEqual(inventory["desktop_schema"], 35) self.assertEqual(inventory["desktop_schema"], 35)
self.assertEqual(inventory["android_schema"], 32) self.assertEqual(inventory["android_schema"], 32)
self.assertIn("session-preparations-v2", inventory["protocols"]) self.assertIn("session-preparations-v2", inventory["protocols"])
@ -102,7 +102,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.5", linked.stdout) self.assertIn("trainlog 0.1.6", linked.stdout)
imported = subprocess.run( imported = subprocess.run(
[ [
"python3", "python3",

View file

@ -118,7 +118,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.5", "product_version": "0.1.6",
"desktop_schema": 35, "desktop_schema": 35,
"android_schema": 32, "android_schema": 32,
"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.5\"}") != NULL); "\"version\":\"0.1.6\"}") != NULL);
{ {
char token[80]; char token[80];
CHECK(exchange(port, CHECK(exchange(port,