trainlog/docs/reviews/gate1_closure.md
2026-09-05 19:28:26 +02:00

1.7 KiB

Gate 1 Closure — Trainlog Exchange Format v1

Status

GATE_1_REVIEW_01=PASS
GATE_1_REVIEW_02=PASS
GATE_1=PASS
TRAINLOG_FORMAT_V1=FROZEN

Reviewed commits

Gate 1 review #1:

9d9a9223a0c46df72f5c3ab208107c0ac6698438
Define Trainlog v1 freeze candidate

Gate 1 review #2:

dfd6717cb7978d009670f1a49029c62c9154af55
Define Trainlog v1 catalog identity rules

Both commits were pushed and observed on the GitHub mirror.

Required closure validation

The canonical working tree must pass immediately before this closure commit:

python tools/validate_json.py
python tools/validate_import_contract.py
git diff --check

The closure commit must not be created if any command fails.

Frozen v1 contract

Trainlog v1 now freezes:

  • strict JSON structure;
  • stable exercise identifiers;
  • UUIDv4 generation policy for new official identifiers;
  • exercise tracking_mode;
  • repetition and duration representations;
  • load modes: none, external, assistance;
  • planned and actual set separation;
  • planned rest representation;
  • body weight and named measurements;
  • optional bounded notes;
  • active/incomplete-session representation;
  • catalog completeness rules;
  • normalized display-name duplicate prevention;
  • local catalog reconciliation;
  • atomic import conflict handling;
  • session import idempotency contract.

Compatibility rule

After this closure, an incompatible structural or semantic change requires a new exchange-format version.

Trainlog v1 may receive only changes that preserve the frozen contract.

Next gate

GATE_2=TUI_PERSISTENCE_CORE

Gate 2 may now implement the frozen format in C17 and SQLite.