trainlog/docs/current_state.md

6.7 KiB

Current implementation state

Canonical snapshot: 2026-09-07.

This document is the compact source of truth for the implemented Trainlog baseline. Detailed behavior belongs in the topic-specific documents.

Status

GATE_0_PROJECT_CONTRACT=PASS
GATE_1_TRAINLOG_FORMAT_V1=PASS/FROZEN
GATE_2_PERSISTENCE_AND_USABLE_TUI=PASS

TRAINLOG_FORMAT_V1=FROZEN

DESKTOP_SCHEMA_V7=PASS
ANDROID_LOCAL_DATABASE_V7=PASS
ANDROID_SESSION_DRAFT_V1=PASS
ANDROID_DRAFT_DURABLE=PASS
ANDROID_DRAFT_BACKGROUND_SURVIVAL=PASS
ANDROID_DRAFT_PROCESS_DEATH_SURVIVAL=PASS
ANDROID_DRAFT_FORCE_STOP_SURVIVAL=PASS
ANDROID_SESSION_RESUME=PASS
ANDROID_DRAFT_FORM_RESTORE=PASS
ANDROID_DRAFT_EXERCISE_REMOVE=PASS
ANDROID_DRAFT_DISCARD=PASS
ANDROID_DRAFT_FINALIZE_ATOMIC=PASS
ANDROID_DRAFT_NOT_EXPORTED_AS_SESSION=PASS
EXERCISE_EDIT_V1=PASS
EXERCISE_RENAME_STABLE_ID=PASS
ANDROID_BANNER_PARITY_V1=PASS
ANDROID_INSTALL_ADB=PASS
ANDROID_USER_DATA_PRESERVED=PASS

PROFILE_AWARE_EXERCISES=PASS
CONTINUOUS_ACTIVITY=PASS
VARIABLE_REPETITION_SETS=PASS

DIRECT_MTP_TRANSPORT=PASS
ANDROID_TO_PC_IMPORT=PASS
PC_TO_ANDROID_CATALOG=PASS
COMMON_SYNC_ENGINE=PASS
TRAINLOG_SYNCD=PASS
ANDROID_TRIGGERED_SYNC=PASS
ANDROID_SYNC_RECEIPT=PASS
TUI_SYNC_LOG_SHOW=PASS
BIDIRECTIONAL_SYNC_V1=PASS
MULTI_OCCURRENCE_SESSION_V2=PASS
EQUIPMENT_ASSOCIATIONS_V2=PASS

DESKTOP_TESTS=25/25 PASS
ANDROID_BUILD=PASS
HARDWARE_SYNC_VALIDATION=PASS

Desktop

Implemented:

  • C17/Notcurses true-color TUI (72x20 minimum, UTF-8 prompts, resize fallback);
  • SQLite schema v7, with stable ordered session_exercises.entry_id and occurrence-level equipment identity;
  • direct session entry;
  • persisted session detail and editing;
  • exercise removal from a session through transactional child replacement;
  • exercise catalog;
  • profile-aware set and continuous activities;
  • heterogeneous repetition sets;
  • multiple occurrences of one catalogue exercise in a session;
  • per-set actual loads with distinct external/assistance semantics;
  • body-observation creation/history/editing;
  • body graphs and normalized overlays;
  • exercise performance history;
  • direct USB/MTP device access;
  • manual bidirectional synchronization;
  • structured synchronization history and detail.

Primary navigation:

0 Accueil
1 Séance
2 Historique
3 Exercices
4 Corps
5 Sync

Android

Implemented:

  • native Kotlin/Compose application;
  • local SQLite database v7, with non-destructive v3 -> v7 migration;
  • one durable active-session draft, Home resume and raw-form restoration;
  • explicit confirmed discard and atomic completed-save/draft-clear;
  • exercise creation;
  • stable-ID exercise rename/editing with referenced-profile protection;
  • inline exercise creation during session entry;
  • profile-aware session recording;
  • heterogeneous repetition-set entry;
  • exercise removal from the current session draft;
  • continuous activity recording;
  • shared equipment selection, local custom equipment creation and occurrence equipment persistence;
  • local session history/detail;
  • body measurements;
  • automatic mobile snapshot maintenance;
  • PC catalog application through a persistent SAF folder grant;
  • Android-triggered synchronization request;
  • synchronization receipt handling.

The Android catalog exposes Modifier for every existing exercise. A rename updates name and normalized_name in the original row, never creates an ID, and remains valid for completed session and active-draft references. A profile change is only accepted while the row has neither completed-session nor draft references. Same-ID catalog reconciliation updates display metadata in place in both Android and desktop import directions.

All Android screens use the shared compact ◆ TRAINLOG ◆ header: the Notcurses accent, muted context line, and flat touch layout reproduce the TUI plaque without literal terminal box drawing.

Synchronization

Canonical exchange directory:

Download/Trainlog

Artifacts:

Android -> PC
    trainlog-mobile-export-v2.json
    trainlog-equipment-associations-v2.json

PC -> Android
    trainlog-pc-catalog-v1.json
    trainlog-pc-mobile-export-v2.json
    trainlog-equipment-associations-v2.json

Android -> PC agent
    trainlog-sync-request-v1.json

PC agent -> Android
    trainlog-sync-receipt-v1.json

The desktop TUI and trainlog-syncd share trainlog_sync_run().

V2 resolves equipment by (session_id, entry_id), never by display name or catalogue identity alone. V1 files remain legacy-compatible and do not gain multi-occurrence semantics retroactively.

No SQLite file is copied.

No mounted Android filesystem is required.

Validation checkpoint

Desktop:

25/25 Meson tests PASS
frozen JSON validator PASS
import-contract validator PASS
git diff --check PASS

Android:

assembleDebug and Android unit tests are run for every Android delivery.
The prior device baseline below is hardware evidence, not a claim that every
new implementation detail was re-exercised on the device in this document.
device instrumentation 5/5 PASS
real Samsung background/process-death/force-stop/resume matrix PASS
real migration and original user-data preservation PASS
real Samsung request -> daemon -> bidirectional sync -> receipt PASS
multiple distinct request IDs consumed once each PASS

Current implementation cursor

The Android draft correction is implemented, device-validated and reviewed. No product-roadmap ordering changes were made.

MEASURED_MAX_V1=PASS
WORKING_LOAD_PERCENTAGES=PASS
ANDROID_MAX_TEST_SESSION=PASS
NEXT_FEATURE=UNFROZEN

Future work must start from this validated baseline rather than from obsolete historical NEXT notes.

Measured max v1

MEASURED_MAX_V1=PASS
MEASURED_MAX_ONLY_FROM_MAX_TEST=PASS
WORKING_LOAD_PERCENTAGES=PASS
ASSISTANCE_DIRECTION_AWARE=PASS
ANDROID_MAX_TEST_SESSION=PASS
DESKTOP_TESTS=25/25 PASS

A measured maximum is derived only from explicit max_test sessions. Ordinary training is never promoted implicitly.

The current measured result is the newest successful max test. The historical record compares max tests using the same load mode.

External-load working percentages are pure calculations from the current measured load; they are not persisted and no estimated 1RM is introduced.

Body analytics v1

BODY_ANALYTICS_V1=PASS
BODY_ANALYTICS_TUI_ONLY=PASS
BODY_COMPOSITION_ESTIMATE=PASS
BODY_PROPORTION_RATIOS=PASS
BODY_SYMMETRY_ANALYTICS=PASS
NO_ESTIMATE_PERSISTENCE=PASS
DESKTOP_TESTS=25/25 PASS

Android remains capture-only for this feature.

The TUI derives analytics from canonical body observations. A local desktop-only profile provides height and the circumference-formula branch needed for the optional body-fat estimate.

No estimated body-fat, fat-mass, lean-mass, ratio, or asymmetry value is stored as if it were a real measurement.