chore: open 0.1.6 development
This commit is contained in:
parent
f2747b357b
commit
f20e5c4d39
9 changed files with 21 additions and 14 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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',
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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": [
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue