A MoonBit experiment tracking library for reproducible machine learning and scientific research.
moon add AlexenderSokolov/moontrackimport {
"AlexenderSokolov/moontrack",
}let store = @moontrack.TrackingStore::new()
ignore(store.create_experiment("exp1", "My Experiment"))
ignore(store.start_run("run1", "exp1", "2026-01-01T00:00:00Z"))
ignore(store.log_param("run1", @moontrack.Param::new_float("lr", 0.01)))
ignore(store.log_metric("run1", @moontrack.Metric::new("accuracy", 0.95, 1, "t1")))
ignore(store.complete_run("run1", "2026-01-01T01:00:00Z"))
println(store.to_markdown())
println(store.to_json())moon run cmd/demo # Full demo: experiments, runs, comparison, query, CSV
moon run cmd/track # Tracking CLI: create experiment, record runs
moon run cmd/query # Query CLI: filter, sort, export
moon run cmd/bench # Benchmark: 20 experiments × 50 runsmoontrack/
|-- experiment.mbt # Experiment data model
|-- run.mbt # Run data model and lifecycle
|-- param.mbt # Parameter model and type parsing
|-- metric.mbt # Metric model, direction, threshold
|-- artifact.mbt # Artifact model, checksum, metadata
|-- reproducibility.mbt # Reproducibility info model
|-- tracking.mbt # TrackingStore: core storage and state transitions
|-- query.mbt # RunFilter and SortKey: query and sort
|-- compare.mbt # RunComparison: metric delta and improvement
|-- export.mbt # Markdown/JSON/CSV export
|-- search.mbt # Experiment search and store statistics
|-- lineage.mbt # Run lineage tracking with cycle detection
|-- enhanced_export.mbt # Detailed CSV, comparison report, lineage trees
|-- statistics.mbt # Metric statistics: median, percentile, correlation
|-- validation.mbt # Store data integrity validation
|-- tracking_test.mbt # Core behavior tests
|-- query_test.mbt # Query and filter tests
|-- compare_test.mbt # Comparison framework tests
|-- export_test.mbt # Export format tests
|-- search_test.mbt # Search and statistics tests
|-- lineage_test.mbt # Lineage tracking tests
|-- enhanced_export_test.mbt # Enhanced export tests
|-- statistics_test.mbt # Statistics tests
|-- validation_test.mbt # Validation tests
|-- cmd/demo/ # Full demo CLI
|-- cmd/track/ # Tracking CLI
|-- cmd/query/ # Query CLI
|-- cmd/bench/ # Benchmark CLI
|-- docs/ # API, design, roadmap, acceptance
|-- CHANGELOG.md # Versioned changes
|-- README.zh.md # Chinese documentation
`-- PROJECT.md # Project memoryfn ExperimentSearchFilter::with_description_contains(self : ExperimentSearchFilter, substring : String) -> ExperimentSearchFilterfn ExperimentSearchFilter::with_name_contains(self : ExperimentSearchFilter, substring : String) -> ExperimentSearchFilterfn ExperimentSearchFilter::with_tags_any(self : ExperimentSearchFilter, tags : Array[String]) -> ExperimentSearchFilterpub(all) enum JsonImportError {
InvalidJsonSyntax(String)
UnsupportedSchemaVersion(String)
MissingRequiredField(String)
InvalidFieldType(String)
UnknownField(String)
DuplicateExperimentId(String)
DuplicateRunId(String)
UnknownExperimentForRun(String)
InvalidRunStatus(String)
InvalidParamType(String)
InvalidMetricDirection(String)
} derive(Eq, Debug)fn LineageTracker::remove_parent(self : LineageTracker, child : String) -> Result[Unit, LineageError]fn LineageTracker::reparent(self : LineageTracker, child : String, new_parent : String) -> Result[Unit, LineageError]fn LineageTracker::set_parent(self : LineageTracker, child : String, parent : String) -> Result[Unit, LineageError]fn ReproducibilityInfo::with_dependencies(self : ReproducibilityInfo, deps : Array[String]) -> ReproducibilityInfofn ReproducibilityInfo::with_environment(self : ReproducibilityInfo, env : Map[String, String]) -> ReproducibilityInfofn ReproducibilityInfo::with_random_seed(self : ReproducibilityInfo, seed : Int) -> ReproducibilityInfofn TrackingStore::add_experiment_tag(self : TrackingStore, experiment_id : String, tag : String) -> Result[Unit, TrackingError]fn TrackingStore::add_note(self : TrackingStore, run_id : String, note : String) -> Result[Unit, TrackingError]fn TrackingStore::add_run_tag(self : TrackingStore, run_id : String, tag : String) -> Result[Unit, TrackingError]fn TrackingStore::aggregate_all_metrics(self : TrackingStore, experiment_id : String) -> Result[Array[MetricStats], TrackingError]fn TrackingStore::aggregate_metric(self : TrackingStore, experiment_id : String, metric_key : String) -> Result[MetricStats, TrackingError]fn TrackingStore::all_metric_summaries(self : TrackingStore, experiment_id : String) -> Result[Array[MetricSummary], TrackingError]fn TrackingStore::best_run(self : TrackingStore, experiment_id : String, metric_key : String) -> Result[Run, TrackingError]fn TrackingStore::compare_runs(self : TrackingStore, baseline_id : String, comparison_id : String) -> Result[RunComparison, TrackingError]fn TrackingStore::complete_run(self : TrackingStore, run_id : String, end_time : String) -> Result[Run, TrackingError]fn TrackingStore::create_experiment(self : TrackingStore, id : String, name : String) -> Result[Experiment, TrackingError]fn TrackingStore::detailed_csv(self : TrackingStore, experiment_id : String) -> Result[String, TrackingError]fn TrackingStore::experiments_by_name(self : TrackingStore, substring : String) -> Array[Experiment]fn TrackingStore::fail_run(self : TrackingStore, run_id : String, end_time : String, error_message : String) -> Result[Run, TrackingError]fn TrackingStore::get_experiment(self : TrackingStore, id : String) -> Result[Experiment, TrackingError]fn TrackingStore::kill_run(self : TrackingStore, run_id : String, end_time : String) -> Result[Run, TrackingError]fn TrackingStore::lineage_json(self : TrackingStore, lineage : LineageTracker, experiment_id : String) -> Result[String, TrackingError]fn TrackingStore::lineage_tree_markdown(self : TrackingStore, lineage : LineageTracker, experiment_id : String) -> Result[String, TrackingError]fn TrackingStore::log_artifact(self : TrackingStore, run_id : String, artifact : Artifact) -> Result[Unit, TrackingError]fn TrackingStore::log_metric(self : TrackingStore, run_id : String, metric : Metric) -> Result[Unit, TrackingError]fn TrackingStore::log_param(self : TrackingStore, run_id : String, param : Param) -> Result[Unit, TrackingError]fn TrackingStore::metric_correlation(self : TrackingStore, experiment_id : String, key_a : String, key_b : String) -> Result[Double, TrackingError]fn TrackingStore::metric_summary(self : TrackingStore, experiment_id : String, metric_key : String) -> Result[MetricSummary, TrackingError]fn TrackingStore::metrics_csv(self : TrackingStore, experiment_id : String) -> Result[String, TrackingError]fn TrackingStore::run_markdown(self : TrackingStore, run_id : String) -> Result[String, TrackingError]fn TrackingStore::search_experiments(self : TrackingStore, filter : ExperimentSearchFilter) -> Array[Experiment]fn TrackingStore::search_runs(self : TrackingStore, filter : RunFilter, sort : SortKey?) -> Array[Run]fn TrackingStore::set_reproducibility(self : TrackingStore, run_id : String, info : ReproducibilityInfo) -> Result[Unit, TrackingError]fn TrackingStore::start_run(self : TrackingStore, run_id : String, experiment_id : String, start_time : String) -> Result[Run, TrackingError]fn TrackingStore::statistics_report(self : TrackingStore, experiment_id : String) -> Result[String, TrackingError]fn ValidationIssue::new(severity : ValidationSeverity, code : String, message : String) -> ValidationIssuefn ValidationIssue::with_experiment_id(self : ValidationIssue, experiment_id : String) -> ValidationIssuefn ValidationResult::count_by_severity(self : ValidationResult, severity : ValidationSeverity) -> IntA MoonBit experiment tracking library for reproducible machine learning and scientific research.