# Changelog

## v2.0.1 — 2026-05-13
- Remove `from __future__ import annotations` from all source files; use `Optional[X]` from `typing` instead
- Suppress `UP045` ruff rule to honour `Optional[X]` project style

## v2.0.0 — 2026-05-13
- **Multi-machine training**: add top-level `machines` config block of named execution targets (local/SSH/Docker); `mat train` distributes experiments concurrently across all machines via `asyncio.gather`, with each machine running its own sequential batch
- **Per-machine model right-sizing**: each `MachineConfig` accepts an optional `agent_command` override so different hosts can run different-sized models (e.g. Opus on a large GPU, Haiku on a small one)
- **Multi-target fine-tuning**: add `finetuner.targets` config block; `mat finetune start` starts one job per `(model, machine)` target concurrently via `ThreadPoolExecutor`; each target inherits backend defaults and overrides only the fields it declares
- **`MachineConfig`** dataclass: `name`, `execution: ExecutionConfig`, `agent_command`
- **`FineTuneTargetConfig`** dataclass: `name`, `model_id`, `machine`, `backend`, `num_epochs`, `batch_size`, `lora_r`, `customization_type`
- **`MultiTargetFineTuner`**: orchestrates concurrent jobs across targets; each target gets its own `jobs_dir` subdirectory to avoid file collisions
- Add `build_executor_for_machine()` factory and `_remote_ar_dir()` helper; `ExperimentResult` gains a `machine` field
- Extract `_parse_execution_config()` helper to deduplicate YAML parsing across `training.execution` and `machines[*].execution`
- Single-machine and single-target paths are fully backwards-compatible

## v1.2.2 — 2026-05-13
- Restrict SES failure notification to a fixed subject and body; remove all job-specific data (error message, model, run ID, backend, timestamp) from email content

## v1.2.1 — 2026-05-13
- Fix E501 line-length violation in cli.py introduced by notification wiring

## v1.2.0 — 2026-05-13
- Add pluggable failure notification system with abstract `Notifier` base class
- Add `SESNotifier` backend for failure alerts via AWS SES (configurable via `notifications.ses` in YAML config)
- Notifications fire on fine-tuning failure (both `opensource` and `bedrock` backends) and on failed training experiments
- Bedrock polling deduplicates notifications via `failure_notified` flag persisted to job JSON

## v1.1.2 — 2026-05-12
- Add `GitHubRepoListSource` source type for ingesting an explicit list of repositories; accepts `owner/repo` shorthands or full URLs
- Expose `--repo` / `-r` flag on `mat train`, `mat ingest`, and `mat sources` commands
- Deduplicate executor `run()` timeout/decode logic across `LocalExecutor`, `SSHExecutor`, and `DockerExecutor`
- Consolidate staging-dir preparation into `DataSource._prepare_dest()`
- Extract `FineTuneJob._safe_id()` to eliminate duplicated job-ID sanitisation
- Extract `DataSource._branch_suffix()` to deduplicate `describe()` formatting

## v1.1.0 — 2026-05-09
- Fix TRL 0.29+ API compatibility
- Improve training defaults
- Add HF token support and gradient checkpointing toggle

## v1.0.1 — 2026-05-08
- Add README

## v1.0.0 — 2026-05-08
- Initial release
