Skip to content

TrackMD — Format Specification v0.1

Part of the LearnSpec suite. Draft.

Core principle

TrackMD is the learning path format of the LearnSpec suite. It orchestrates LearnMD, QuizMD, and FlashMD files into an ordered pedagogical sequence with path-level metadata, completion criteria, and progress checkpoints.

TrackMD is the only format in the suite that can import all content formats. It gives a corpus its coherence: it transforms a set of independent files into a path with a beginning, an end, and milestones.

A Level 0 TrackMD file is a human-readable table of contents in any standard Markdown reader.

TrackMD inherits its frontmatter, directives, and validation rules from the Architecture Charter.

Format levels

LevelMechanismPurpose
0## headings + !import directivesMinimal sequence, readable everywhere
1YAML frontmatterMetadata, completion criteria, objectives
2Attributes on !importOptional steps, per-quiz passing score

Each level is a strict superset of the previous one.

Level 0 — Minimal sequence

A Level 0 TrackMD file is a table of contents: ## sections grouping !import directives pointing to content files.

markdown
# Learning Python

## The basics

!import ./01-variables.learn.md
!import ./quiz-variables.quiz.md
!import ./flashcards-variables.flash.md

## Control flow

!import ./02-conditions.learn.md
!import ./02-loops.learn.md
!import ./quiz-control.quiz.md

## Final assessment

!import ./quiz-final.quiz.md

In a standard reader, this displays as a Markdown document with headings and plain-text directive lines — perfectly readable as a syllabus.

Conventions

SyntaxMeaning
# TitleTrack title
## Section titleThematic grouping of steps
!import ./file.learn.mdEducational content step
!import ./file.quiz.mdAssessment step
!import ./file.flash.mdFlashcard review step
!ref ./file.media.mdDeclare a MediaMD context
!ref ./file.glossary.mdDeclare a GlossaryMD context
!checkpoint id:slugTrack-level progress checkpoint

Importable file types

ExtensionFormatRole in the track
.learn.mdLearnMDLesson step
.quiz.mdQuizMDAssessment step
.flash.mdFlashMDReview step

TrackMD does not directly import leaf formats (DiagramMD, MediaMD, GlossaryMD) — these are embedded in the content files it orchestrates.

Level 1 — YAML frontmatter

yaml
---
title: "Learning Python"
lang: en                                       # REQUIRED — BCP-47 code
description: "A complete beginner's path to Python: variables, control flow, data structures, functions, and a final project."
                                               # optional — short summary for catalogues and previews
estimated_time: 10h
level: beginner                                # beginner | intermediate | advanced
target_audience: "Beginners with no programming experience"
prerequisites:
  - "No prior experience required"
tags: [python, programming, beginner]
author: Jane Smith
created: 2026-05-10
updated: 2026-05-10
license: CC-BY-4.0
spec_version: "0.1"
completion:
  require_all_mandatory: true
  passing_score: 0.7
on_completion:
  badge: ./badge-python-beginner.badge.md
  certificate: ./cert-python.cert.md
---

Field reference

Universal LearnSpec fields

FieldRequiredDescription
titleNoTrack title — inferred from # H1 if absent
langYesBCP-47 code (en, fr, en-US…)
descriptionNoShort plain-text summary (typically 1–3 sentences) — used for catalogues, link previews, and <meta name="description">. Distinct from title and from target_audience (which describes who the track is for, not what it covers).
tagsNoThematic tags
authorNoTrack author
createdNoCreation date, ISO 8601
updatedNoLast update date, ISO 8601
licenseNoSPDX identifier or custom
spec_versionNoTargeted spec version ("0.1")

TrackMD-specific fields

FieldRequiredTypeDescription
estimated_timeNostringTotal estimated track duration (5h, 2h30…). If absent, the player may aggregate from imported files.
levelNoenumbeginner, intermediate, advanced
target_audienceNostringDescription of the intended audience
prerequisitesNostring[]Informative in v0.1 — not enforced, displayed to the learner
completion.require_all_mandatoryNoboolAll mandatory steps must be completed (default: true)
completion.passing_scoreNofloatGlobal minimum score to pass the track (0.0–1.0)
on_completion.badgeNopathPath to a BadgeMD file awarded on completion
on_completion.certificateNopathPath to a CertMD file awarded on completion

Level 2 — Attributes on !import

Optional attributes may be added on the !import line to modify the behaviour of a specific step.

optional:true

Marks a step as optional. The learner can see the content, but it is not required to complete the track.

markdown
!import ./deep-dive-decorators.learn.md optional:true
!import ./bonus-flashcards.flash.md optional:true

All steps are mandatory by default (optional:false).

passing_score

Overrides the passing_score defined in the imported QuizMD frontmatter. Applicable only to .quiz.md files.

markdown
!import ./quiz-module-1.quiz.md passing_score:0.6
!import ./quiz-final.quiz.md passing_score:0.85

If neither TrackMD nor QuizMD defines a passing_score, no score threshold is applied to that step.

Combining attributes

markdown
!import ./advanced-quiz.quiz.md passing_score:0.75 optional:true

!checkpoint at track level

The !checkpoint directive works the same way in TrackMD as in LearnMD, but at the section or track level rather than within a single module.

markdown
!checkpoint id:section-1-done label:"Section 1 complete" type:milestone
!checkpoint id:track-complete label:"Track complete" type:exercise-complete

Track-level checkpoints are distinct from lesson-level checkpoints — a player may use them to display overall progress.

Complete example

markdown
---
title: "Learning Python — Beginner Track"
lang: en
estimated_time: 8h
level: beginner
target_audience: "Anyone who wants to learn programming with no prior experience"
prerequisites:
  - "No technical prerequisites"
  - "A computer with a web browser"
tags: [python, programming, beginner]
author: Jane Smith
created: 2026-05-10
license: CC-BY-4.0
spec_version: "0.1"
completion:
  require_all_mandatory: true
  passing_score: 0.65
on_completion:
  badge: ./badge-python-beginner.badge.md
---

# Learning Python — Beginner Track

> [!objectives]
> By the end of this track, you will be able to: write simple Python scripts, use control
> structures, manipulate lists and dictionaries, and read and write files.

!ref ./glossary-python.glossary.md

## Section 1 — First steps

!import ./00-introduction.learn.md
!import ./01-variables.learn.md
!import ./quiz-variables.quiz.md passing_score:0.6
!import ./flashcards-variables.flash.md optional:true

!checkpoint id:section-1-done label:"Section 1 — First steps complete"

## Section 2 — Control flow

!import ./02-conditions.learn.md
!import ./02-loops.learn.md
!import ./quiz-control.quiz.md passing_score:0.65
!import ./flashcards-control.flash.md optional:true

!checkpoint id:section-2-done label:"Section 2 — Control flow complete"

## Final assessment

!import ./quiz-final.quiz.md passing_score:0.7

!checkpoint id:track-complete label:"Track complete" type:exercise-complete

Interoperability

MechanismSupport
!import ./file.learn.md
!import ./file.quiz.md
!import ./file.flash.md
!import ./file.diagram.md❌ — DiagramMD is a leaf format consumed via !ref in content files, not in tracks
!ref ./file.media.md
!ref ./file.glossary.md
Imported by another format❌ — TrackMD is a root format

Validation

Lenient mode (default)

ConditionLevel
lang absent from frontmatterWarning
Title absent (no H1 and no title)Warning
No !import steps in the fileWarning
!import pointing to a missing fileWarning
!ref pointing to a missing fileWarning
passing_score on a non-QuizMD !importWarning
completion.passing_score outside [0.0, 1.0]Error
!checkpoint missing required id attributeError
Duplicate !checkpoint id within the documentError

Strict mode (--strict)

All warnings are promoted to errors.

Deferred to v0.2

FeatureReason
Conditional prerequisites between sectionsRequires branching logic — out of scope for v0.1
Adaptive branchingSignificant player complexity — needs real-world feedback
Per-step estimated time as !import attributeAvailable in imported files' frontmatter — player can aggregate

Released under the MIT License.