File size: 28,168 Bytes
dfb775d
 
 
 
 
 
 
 
730c5bb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
74da4f7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
96126d5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c4e0c8c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f575b80
dfb775d
 
 
 
f575b80
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
dfb775d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f575b80
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
dfb775d
 
 
 
 
 
 
f575b80
 
 
 
 
 
 
 
 
 
 
 
 
 
dfb775d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
# Changelog

All notable changes to **mindxtrain** are documented in this file. The format
follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this
project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

### Added

- **bankml 0.3.6 penalties.** `serve --to bankml` takes `repeat_penalty`, `repeat_last_n`,
  `presence_penalty` and `frequency_penalty` in the Modelfile when `bankml version` is 0.3.6 or
  later (bankml's O2), and refuses them with the reason before; `--bankml-system`,
  `--bankml-param KEY=VALUE` and `--bankml-stop` layer a persona and its sampling over the pin.
  The backend sends sampling fields from `options=` / `MINDXTRAIN_BANKML_OPTIONS`, only when set.
- **Byte-identical conversion.** The merged directory is converted through a link named after the
  tag, so llama.cpp's `general.name` is the tag's and gen39 converts to `6b64c748…`, the GGUF mindX
  pins (through `merged/` it was "Merged" and a different sha256).
- **`MINDXTRAIN_CHAT_MODEL`, `MINDXTRAIN_JUDGE_MODEL`, `MINDXTRAIN_CHAT_OPTIONS`.** The panel and
  the judges named `llama3.2` when given no model; a bankml node serves none. Read at call time.
  `classroom(use_judge=True)` without a model now uses the default judge instead of skipping it.
- **`docs/install.md`**: deploying bankml 0.3.6 and mindXtrain's bankml lane to the mindX VPS.

- **bankml, the verified CPU engine** ([github.com/cryptoAGI/bankml](https://github.com/cryptoAGI/bankml),
  [`docs/bankml.md`](bankml.md)), reached over HTTP and its CLI only β€” nothing vendored.
  - `operator/backends/bankml.py`: `@register_backend("bankml")`, `MINDXTRAIN_BANKML_BASE_URL`
    (default `http://127.0.0.1:18093/v1`). Keeps bankml's receipt (`ChatResponse.receipt`, new
    optional field; `last_receipt` for streams, parsed from the final SSE receipt event). HTTP 400
    β†’ `BankmlRefusal(reason)`, never retried with altered parameters.
  - Operator wiring: `backend_kwargs(name)` replaces the duplicated per-backend branches in
    `operator/app.py` and `coach/api.py`; health probes `GET /bankml` and `/v1/models`;
    auto-detect tries bankml after ollama and vllm, so existing hosts resolve as before; the
    governance panel's env chain gains `MINDXTRAIN_BANKML_BASE_URL` last, only when set.
  - `deploy/bankml_push.py` and `mindxtrain serve --to bankml [--bankml-bin] [--bankml-convert]`:
    merge β†’ Modelfile through `bankml_sanitize` (refuses `ADAPTER`, a foreign `TEMPLATE`,
    penalties, mirostat, `typical_p`, resource options, rather than dropping them) β†’
    `bankml create`; records the model sha256; refuses quantized configs and non-Llama
    architectures; detects a bankml without `create`/`convert` (pre-0.3.5) as `bankml_too_old`.
  - `eval/imprint_bankml.py` and `mindxtrain imprint-bankml`: seeded, unpenalised greedy probes with
    a receipt per utterance, scored by `score_imprint`, tagged `<scorer>/bankml-greedy` and marked
    **not comparable** with the canonical 1.3-penalty gate.
  - MEI `InferenceEngineIdent.name` accepts `"bankml"`; the Gradio Serve room offers `bankml`.

- **`serve --to vllm|sglang` are real deploy targets** ([`docs/serve.md`](serve.md)), no longer
  print-only. `deploy/openai_server_push.py`: `launch_openai_server` serves a LoRA natively over
  the base (vLLM `--enable-lora --lora-modules`, SGLang `--enable-lora --lora-paths`) or merged
  (`--merge`, `merge_lora_adapter`), launches detached (own session; `server.log`, `server.pid`,
  `launch.json` under `out/runs/<run>/serve/<to>/`), waits for `/v1/models` (+ vLLM `/health`),
  and optionally swaps mindX's fallback (`provider="vllm"|"sglang"`); `stop_openai_server` SIGTERMs
  the process group and verifies it is gone. CPU hosts get bfloat16, `VLLM_CPU_KVCACHE_SPACE`,
  SGLang `--device cpu`; quantized checkpoints and `tensor_parallel > 1` are refused without a
  GPU; a missing server is reported with its install hint. Every outcome is a
  `ServerLaunchResult` / `ServerStopResult`. New CLI options: `--dry-run`, `--stop`, `--merge`,
  `--host`, `--port`, `--dtype`, `--server-bin`, `--server-arg`, `--ready-timeout`,
  `--cpu-kvcache-gib`. The Gradio Serve room offers `sglang`. vLLM / SGLang are reached as a
  subprocess and over HTTP only.

### Changed

- `ui/console.py` omits penalty / mirostat options left at the engine's own default, so bankml
  accepts default console requests. For Ollama a Modelfile's `repeat_penalty` now applies where
  the console used to override it with 1.1.
- `hf.extension.publish_generation(repeat_penalty=…)`: `None` publishes a Modelfile without the
  penalty line (default unchanged, 1.3); the Modelfile text is `published_modelfile()`.
- `cli imprint`: the script-probe extraction is `_script_probes`, shared with `imprint-bankml`.

## [1.0.4] β€” 2026-09-16

### Added

- **The Gradio surface is tested.** `mindxtrain ui` had no coverage at all β€” gradio is an
  optional extra, so a base install cannot import the module, and every release note listed the
  UI as untested. `tests/test_ui_app_builds.py` constructs the whole Blocks tree (which
  exercises every component definition in `ui/app.py`), checks the rooms the docs promise,
  asserts the surface version matches the package, and confirms the PEP 562 lazy export
  resolves. It skips cleanly where the extra is absent. The UI was also launched for real
  under gradio 6.27.0 and served its page and config.

### Fixed

- **The Hub tests asserted the missing-dependency path by trusting the environment.** They
  passed on a bare install and inverted silently the moment the `ui` extra arrived, because
  gradio depends on huggingface-hub β€” three tests failed the first time they met an
  environment that had it. Absence is now *forced* (`sys.modules[name] = None` makes the
  import raise), so the contract holds whatever is installed, and it is verified both ways.
  Introduced in 1.0.2, where the note "tested for real rather than mocked" was true only of a
  bare install.

### Changed

- **`httpx2` added to the dev group.** starlette 1.6 deprecates driving its `TestClient` with
  `httpx`; 24 test modules use `TestClient`, so the dependency moves rather than the tests.
  The deprecation is gone; the two warnings that remain are upstream typer β†’ click 9.0.

### Notes β€” a correction to v1.0.3, and what is now verified

**v1.0.3 overstated its own limitations.** It listed "every write endpoint" and "SSE under a
real producer" as untested. That was true of the dependency-refresh *probes* run for that
release; it was **not** true of the project. The suite already covers the coach's write
endpoints β€” bench, compile, cost, eval/prompt, modelfile build and create, ollama start and
stop, boardroom, dojo, datasets, mei promote, classroom, autotune feedback, dcoach, chat
stream β€” and SSE under a real producer, in `tests/test_runs_sse.py` and a dozen
`test_coach_*_api.py` modules, including buffer replay on late subscribe, log-kind filtering,
ingest and cancel. All of it passed on the refreshed lock. A new test module was written for
those endpoints before that was checked; every endpoint turned out to be covered already and
the in-stream error contract already asserted, so it was deleted rather than added as
duplicate coverage.

**The training path is now verified under the refreshed lock** (torch 2.11.0, transformers
5.8.0, trl 1.3.0, peft 0.19.1, alongside starlette 1.6.0 and the pydantic downgrade). The
dream-corpus loop was run end to end on CPU β€” corpus read, tokenized, SFT executed
(loss 3.938, mean_token_accuracy 0.370, 512 tokens), and a real 22 MB LoRA checkpoint written
with `adapter_model.safetensors`, `adapter_config.json`, tokenizer and chat template. With the
ml extra installed the suite is **767 passed** (the two tokenizer tests stop skipping).

**Still not tested, and not claimed:**

- **MI300X / ROCm, multi-GPU, and vLLM serving.** No such hardware here; the CPU lane is what
  was exercised.
- **A full-length run.** The shipped 32-sample smoke recipe projects ~70 minutes on this
  shared box (8.7 min/step at 50% CPU), so the loop was closed with a reduced variant β€” 4
  samples at seq 128, the same code path, fewer tokens. Multi-hour and multi-day behaviour is
  unchanged and unverified here.
- **The `imprint` β†’ `serve --to ollama` tail**, which needs a running daemon.

## [1.0.3] β€” 2026-09-15

### Changed

- **`uv.lock` refreshed against the current `pyproject.toml`.** The lock had drifted, so every
  `uv run` on a node re-resolved before doing anything β€” about 2.5 minutes per invocation,
  paid by each bridge probe. 296 β†’ 306 packages; 23 changed. The notable moves are
  **starlette 0.52.1 β†’ 1.6.0** (a major version, under FastAPI 0.136.1, which accepts it),
  **huggingface-hub 1.14.0 β†’ 1.31.0**, and **gradio 6.27.0** entering the lock for the first
  time because `all` now includes the `ui` extra.
- Three packages move **backwards** β€” **pydantic 2.13.3 β†’ 2.12.5**, pydantic-core 2.46.3 β†’
  2.41.5, inspect-ai 0.3.219 β†’ 0.3.145. Nothing in the project requires the older versions;
  only `pydantic>=2.9` is declared, so these are the resolver's choice of a consistent set,
  not a constraint. They are called out because a downgrade arriving inside a routine refresh
  is worth seeing rather than discovering later.

### Notes β€” what was tested, and what was not

The refreshed lock was installed into a **separate environment**, leaving the working one
intact, and the same probes were run against both stacks so the comparison is like-for-like.

**Tested, identical on both stacks:** the full suite (**765 passed, 2 skipped**); the coach
booted under real uvicorn exactly as production runs it (`mindxtrain.operator.app:app`), and
**37 read-only probes returned identical status codes and identical response sizes** β€” every
page, the JSON API, the static mount, the OpenAPI schema (64 paths), the diagnostics surface,
the path-traversal guard still answering 400, and **SSE** (`text/event-stream`, bytes flowing,
and the 404 path returning without hanging). **Zero server errors** in either run.

**Not tested β€” do not read this release as clearing them:**

- **Every write endpoint.** Nothing that launches a run, builds or creates a Modelfile,
  starts or stops Ollama, convenes the boardroom, settles the dojo, promotes an MEI score, or
  pushes to GitHub / a droplet was exercised; they need a model, a daemon, or they do real
  work. `/v1/chat/completions` and `/v1/agentic` are likewise untested.
- **SSE under a real producer.** The stream was checked for content type and first bytes on an
  empty run, not for a long live stream with a training job writing into it.
- **The training path.** The `ml` extra (torch, transformers) is not installed on the machine
  this was verified on, so `train` / `imprint` / `serve` were not run against the new lock β€”
  and huggingface-hub, which moved two minor versions, sits under transformers' download path.
- **The Gradio UI.** gradio 6.27.0 enters the lock here for the first time; `mindxtrain ui`
  was not started.

**One new warning, test-only.** starlette 1.6 deprecates using `httpx` with its `TestClient`
and asks for `httpx2`; the suite emits it three times and passes regardless. Nothing in the
serving path is affected β€” production does not import `TestClient` β€” but the test dependency
will need moving before a starlette release removes the shim.

**Operational caveat.** `uv run` syncs the project environment, so moving a node's checkout to
this commit means the next invocation rewrites that node's venv β€” a starlette major bump, a
huggingface-hub bump and a pydantic downgrade β€” **underneath whatever is running there**. On a
node with a training run in flight, take it in a maintenance window, not by surprise.

## [1.0.2] β€” 2026-09-15

### Added

- **mindXtrain can use Hugging Face from the command line.** The `mindxtrain/hf/` extension
  existed and was complete β€” `account`, `pull_base`, `warm`, `publish_generation`,
  `push_dataset`, `lineage`, `push_space` β€” but nothing outside a Python import could reach
  it: there was no CLI verb, so on a node the Hub was effectively unavailable. New
  `mindxtrain hf` group: `whoami Β· pull Β· warm Β· publish Β· lineage Β· dataset Β· space`.
  Each prints the extension's own result dict and **exits nonzero when it reports
  `ok: false`**, so the ascent loop can warm a base, check `$?`, and refuse to start a
  three-hour run that would otherwise discover the missing base at the end of it.
- **Tests for the Hub extension**, which had none: token precedence across the three
  accepted environment variables, the missing-dependency path (genuinely missing here, not
  mocked), the `RepoFolder` trap that makes a scan report an empty repo, the guards that
  must not need a network, and the CLI wiring including the nonzero exit.

### Changed

- **`huggingface-hub` moved out of the `chain` extra into its own `hf` extra.** Reaching the
  Hub used to mean installing `web3` and the Algorand SDK, because the Hub was filed under
  "chain". It is not a chain. `chain` now pulls `mindxtrain[hf]` so existing installs keep
  working, `all` includes it, and every "not installed" message names `--extra hf` β€” the
  extra that actually installs it β€” instead of sending the reader to the blockchain one.
- The `hf` module is ruff clean under the house config.

### Fixed

- **`push_space` captured the upload's commit receipt and discarded it**, while its two
  sibling publishers both return it. A Space push now reports its commit like everything
  else, so what was pushed is identifiable afterwards.

## [1.0.1] β€” 2026-09-15


### Added

- **autoresearch β€” the keep/reset search, shipped whole.** The `research` command had
  been in the CLI since the Hugging Face fork, but `mindxtrain/research/` was never
  committed, so `mindxtrain research` raised `ModuleNotFoundError` on every checkout but
  the author's. The package now ships: the declarative `AttemptContract`, the git fence
  (commit-before-measure Β· editable allowlist Β· dedup-by-commit), the bounded attempt
  runner with process-group teardown, the durable append-only ledger, the keep/reset
  search loop, the Base anchor + `mindx_autoresearch_registry.sol`, the coach's read-only
  observer page (`/coach/research`), the k8s researcher job, and the `attempt_diff` hash
  in the provenance manifest β€” so the *edit* that earned a promotion is hashed into the
  receipt, not just the resulting weights.
- **The Console and Science rooms' own modules.** `ui/console.py` (Ollama chat, token
  accounting, error explanations that say what to run) and `ui/reasoning.py` (the claims
  / Socratic-questions / contradictions pass, aGLM when importable and an in-house
  fallback otherwise), both previously uncommitted, both now covered by tests that need
  no daemon, GPU or optional dependency.

- **dcoach page + prompt-tools + decentralized panel.** New `/coach/dcoach` workflow
  page: one-click **Imprint & Prove** (persona/skills + advanced toggles) streams the
  proof loop live (`POST /coach/api/dcoach/run`, SSE) and shows the classroom before/after
  recall, boardroom verdict, and autotune-feedback next-params. A read-only
  **decentralized-network panel** (`GET /coach/api/decentralized`) maps Prime Intellect /
  Templar SN3 / Nous Psyche / Gensyn / Pluralis to how mindXtrain fits (AOT-only β‡’ Verde-
  compatible; BLAKE3 receipt; x402; AgenticPlace). New `/coach/prompts` **prompt-tools**
  page: craft a system prompt + few-shot demos β†’ test against a base model (no training) β†’
  evaluate (`POST /coach/api/eval/prompt`) β†’ **make permanent** via Modelfile. Docs:
  [dcoach.md](dcoach.md).
- **dcoach proof loop + clean-room eval tools.** Prove a CPU-trained model recalls
  its training: `governance.proof_loop.run_proof_loop` chains compose-script β†’ imprint-
  train β†’ probe before/after β†’ **classroom** (`governance.classroom.evaluate_classroom`)
  β†’ **boardroom** decides β†’ **autotune feedback** (`autotune.feedback`, nudges the next
  run's params). New clean-room LlamaIndex-style evaluators (`eval.llama_evals`:
  Semantic-Similarity / Correctness / Pairwise / Guideline β€” reuse existing embeddings +
  the governance chat-judge). Endpoints `POST /coach/api/classroom/evaluate` and
  `POST /coach/api/autotune/feedback`.

- **Streaming chat + ollama controls** (Coach "Try the model" card). Responses now
  **stream token-by-token** (the AI-SDK text-stream pattern over SSE) via
  `POST /coach/api/chat/stream`, with a **model picker** (local models first, no more
  silently-broken `:cloud` default) and **start/stop/status** for the local ollama
  server (`/coach/api/ollama/{status,start,stop}`). Fixes the chat that returned no
  visible response. Reference: `docs/Vercel AI SDK 6_ … .md`.

- **Ollama Modelfile builder** (`mindxtrain.deploy.modelfile`) β€” render a valid
  `Modelfile` from a typed `ModelfileSpec` (every instruction: FROM/SYSTEM/TEMPLATE/
  ADAPTER/LICENSE/MESSAGE/REQUIRES + the full PARAMETER catalogue). A standalone Coach
  window at `/coach/modelfile` exposes a toggle + input for every instruction and
  parameter; `POST /coach/api/modelfile/{build,create}` render it and run `ollama create`.
- **Default personas + skills** (`mindxtrain.data.personas`) β€” built-in personas
  (codephreak / assistant / mentor) and toggleable **skills** (software engineer, platform
  architect, bash, solidity) that mix in-domain exchanges into a script. The Create-script
  card gains a persona picker + skill toggles; `derive_training_params` auto-tunes CPU
  imprint epochs/grad_accum from the dataset size.

- **Governance layer** (`mindxtrain.governance`) β€” classroom / boardroom / dojo,
  a clean-room reimplementation of openmindx/openmind's Boardroom-consensus +
  Dojo-evaluation behaviour. The **classroom** graduates an actor on its imprint;
  the **boardroom** (any N role-based members) convenes on the promotion motion β†’
  approved / rejected / disputed; the **dojo** settles a dispute with a panel of a
  **prime number** of judges (odd prime β‰₯ 3 β†’ no tie, always resolves). See
  [`docs/governance.md`](governance.md).
- **Model-backed boardroom/dojo** (`governance.panel`) β€” members + judges
  deliberate with real models over any OpenAI-compatible backend
  (`deliberate`, `model_ballot`, `model_judge_ballot`). Coach **Boardroom** card +
  `GET /coach/api/boardroom/presets`, `POST /coach/api/boardroom/convene`,
  `POST /coach/api/dojo/settle` (model deliberation runs off the event loop).

### Fixed

- **The default editor corrupted any editable that was not a flat TOML.** Its docstring
  promised a no-op; the code stringified a `[table]` into `trainer = "{'lr': 0.001}"`,
  then committed and measured that. It now checks flatness and declines, and
  `_write_flat_toml` refuses non-scalars instead of repr-ing them. Strings escape through
  `json.dumps`, so a value holding a quote or a backslash can no longer emit broken TOML.
- **A failed attempt stranded HEAD on a loser.** When an attempt raised after its edit was
  committed, the loop propagated the error and left the branch on a commit it had never
  scored β€” so the next run's baseline read the loser. The champion is restored on the way
  out. The restore is `reset --hard`, so it is taken only while the fence still passes: if
  the tree is dirty outside the allowlist that work belongs to someone else, and it is left
  exactly where it is.
- **`mindxtrain.ui` demanded gradio for stdlib-only code.** The package eagerly imported
  `.app`, so the optional `ui` extra was needed to reach `console`, `reasoning` or
  `parse_log` β€” none of which import anything beyond the standard library. The
  Gradio-backed exports (`build`, `main`, `VERSION`) resolve lazily via PEP 562; a box that
  cannot spare the dependency can still parse a training log and talk to the daemon.
- **The contradiction check was asymmetric**, though documented as a truth-table check:
  it only fired when the negative claim happened to be written first.

- **Imprint recall now measured under the trained conditioning.** `probe_recall` accepts an
  optional `system` prompt and the proof loop passes the persona's system prompt to both the
  before and after probes β€” matching the system turn the script rows train under. Without it
  the adapter was probed out of its learned distribution, understating (even inverting) the
  imprint; the CPU proof loop now reports a strong positive Ξ” (e.g. 0.066β†’0.247) and an
  APPROVED verdict.

### Changed

- New and touched modules are ruff clean under the house config (unused imports, `typing`
  modernisation). Pre-existing debt elsewhere is left alone rather than folded into this
  release.

- **Removed hackathon framing from the public surfaces.** README, `pyproject.toml`
  description, the package docstring, `CLAUDE.md`, and the active docs (autotune /
  architecture / development / coach / yaml_schema / HANDOFF / NAV) no longer frame
  mindXtrain as a hackathon submission; deleted `docs/HACKATHON.md` and
  `docs/hackathon_submission.md`. The frozen `docs/blueprints/` and dated dev-blog
  posts are preserved unchanged as the historical record. README now leads with the
  dcoach proof loop.

## [1.0.0] β€” 2026-06-11

First production release. **CPU training is active end-to-end**; the GPU
(MI300X / consumer) path is code-complete and validated on CPU dry-run + unit
tests, pending real ROCm hardware to execute. Honest per-module status is in
[`docs/actualization_status.md`](actualization_status.md).

### Added (1.0.0)

- **Device-aware local-GPU lane** (`trl_local`,
  `mindxtrain.train.backend_trl_cpu.run_trl_local`). Auto-detects a consumer GPU
  (CUDA or ROCm Radeon, bf16/fp16) and falls back to CPU; `trl_cpu` is the
  force-CPU wrapper. Recipe `mindx_fallback_qwen3_1_5b_local`. Honest limit:
  integrated Vega/`gfx90c` APUs are unsupported and fall back to CPU.
- **Verifiable training receipt.** Every operator/CPU run emits `manifest.json`
  binding the frozen `AutotunePlan` hash to the checkpoint + config hashes
  (`provenance.manifest.emit_receipt_for_run`); re-verified via `mindxtrain
  receipt`, the `GET /coach/api/receipt/{run_id}` endpoint, and a Coach
  "Verifiable receipt" card. Optional x402 metering gate on `/v1/training/jobs`.
- **Actor / persona / script + imprint.** Author a training *script* for an
  *actor* (`mindxtrain.data.scripts`), ingest as `source: local`, and measure the
  persona **imprint** by recall before/after training
  (`mindxtrain.eval.imprint`, `mindxtrain imprint`,
  `POST /coach/api/imprint/score`). Coach **Create script** card +
  `POST/GET /coach/api/datasets`. Recipe `mindx_persona_imprint_local`.
- **mindX dream-cycle trigger** (`deploy.api_client.trigger_dream_ingestion`) β€”
  hands an imprinted actor to mindX's `machine.dream` 8hr cycle via HTTP or an
  inbox drop (clean-room: a pointer, never mindX code). `mindxtrain imprint
  --trigger-dream`.
- **Coach live-training diagnostics** β€” accurate depiction with accordion
  compression: rolling loss-chart window, per-step metrics + log accordions with
  honest "showing last N" counts, system-metric sparklines, chat re-probe.
- **Autotune on real hardware** β€” runtime GPU-count autodetect (`rccl_probe`),
  GEMM microbenchmark with timings (`gemm_probe`), `serve --to sglang`.
- **Clean-room policy** codified in `CLAUDE.md` + `AGENTS.md`: reimplement/adapt
  locally, never copy mindX/external source bytes.

### Added (pre-1.0 foundation)

- **mindX self-training loop.** `mindx_dreams` dataset source adapter walks
  `<mindx>/data/memory/ltm/*/*_training.jsonl`, deduplicates by content hash,
  and yields OpenAI-chat rows. Pure stdlib; no GPU/heavy deps to load
  (`mindxtrain.data.sources.mindx_dreams`).
- **CPU training lane** (`mindxtrain.train.backend_trl_cpu.run_trl_cpu`).
  Real TRL SFT/LoRA on CPU, produces a real HF-format checkpoint compatible
  with `quantize`/`receipt`/`publish`. Wired via `TrainingBackend = "trl_cpu"`.
- **Public training-jobs API** at `/v1/training/jobs` with bearer auth
  (`MINDXTRAIN_API_KEY`). Versioned facade over the same `RunRegistry` Coach
  uses, so mindX agents and external clients become peer dispatchers
  (`mindxtrain.operator.training_api`).
- **mindX fallback-swap caller** (`mindxtrain.deploy.api_client.swap_mindx_fallback_model`).
  PATCHes mindX's `/v1/config/fallback-model` so a freshly published HF Hub
  checkpoint becomes mindX's active default without a source edit. Pairs with
  the mindX-side endpoint shipped in AgenticPlace/mindX@ad8193ea3.
- Two new YAML recipes: `mindx_fallback_qwen3_1_5b_sft_lora` (Qwen3-1.5B
  LoRA on MI300X, the production target) and `mindx_fallback_qwen3_1_5b_cpu_smoke`
  (SmolLM2-135M CPU smoke).
- `.env.example`: `MINDXTRAIN_API_KEY` and `MINDXTRAIN_MINDX_HOME`.

### Changed

- Schema: `DataSource` extends to include `"mindx_dreams"`; `DataCfg.hf_id`
  is now defaultable with a `model_validator` requiring it only for
  `source: "hf"`; `DataCfg.path` added (used by `local` + `mindx_dreams`).
- `HardwareCfg.gpus: Literal[0, 1, 8]` β€” `0` = CPU lane.
- Production URL flipped from `mindx.pythai.net/hackathon` to
  `mindx.pythai.net/coach`. Hackathon-era references preserved in
  `HACKATHON.md` and the build-in-public posts for the historical record.
- CI: ruff scoped to `mindxtrain/ tests/`; mypy points at the canonical
  `mindxtrain/config mindxtrain/provenance` (fixing stale paths). Container
  build added on push-to-main; GHCR publish on tag.

### Notes

- Adapter smoke against the real corpus saw 1051 unique rows in
  `/home/hacker/mindX/data/memory` (corpus snapshot 2026-05-14).

## [0.1.0] β€” 2026-05-06

Initial public release. Submitted to the AMD Γ— lablab.ai Developer Hackathon
(build window May 4–10 2026, on-site finale May 9–10 in San Francisco).

### Added

- Single-package canonical layout per `docs/blueprints/mindxtrain2.md` Β§Part 4:
  `mindxtrain/{cli,config,data,models,train,eval,autotune,operator,storage,provenance,deploy,budget}`.
- CLI with 8 verbs: `init`, `bench`, `train`, `eval`, `quantize`, `serve`,
  `publish`, `receipt` (`mindxtrain.cli.main`).
- 60-second AOT autotune probe for AMD MI300X β€” the hackathon differentiator.
  CK vs Triton attention selection + hipBLASLt GEMM heuristic + RCCL config
  (`mindxtrain.autotune.{benchmark,attention_probe,gemm_probe,rccl_probe,plan}`).
- Pydantic v2 `XTrainConfig` with discriminated union over 9 training methods
  (full, lora, qlora, dpo, orpo, grpo, gspo, kto, cpt) (`mindxtrain.config.schema`).
- 12 YAML training recipes covering Qwen3.5/Qwen3.6/Instella across
  SFT-LoRA, full-FSDP, DPO, ORPO, GRPO, CPT, and VL.
- Axolotl YAML compiler; alt backends (Unsloth, torchtune, Primus) wired as
  dispatch stubs (`mindxtrain.train`).
- Provenance manifest with BLAKE3 content addressing, ROCm/git/gfx capture,
  and on-chain pointers (ERC-7857 INFT, Algorand ASA, ERC-8004 attestation)
  (`mindxtrain.provenance`).
- Operator FastAPI app exposing `/v1/chat/completions`, `/v1/agentic`, and
  the interactive `/coach/` UI (`mindxtrain.operator`).
- Pluggable inference backends: vLLM, OpenAI-compatible
  (`mindxtrain.operator.backends`).
- Pluggable storage providers: local fs, HF Hub, Lighthouse, IPFS
  (`mindxtrain.storage`).
- Foundry contracts for ERC-8004 attestation registry (`contracts/`).
- Containerfiles + compose + k8s manifests for MI300X (`ops/`).

### Notes

- This release replaces the earlier 3-package layout
  (`mindXtrain/`, `automindXtrain/`, `custmodel/`) with a single ordered
  package `mindxtrain/`. Old import paths (`xtrain.*`, `automindx.*`,
  `custmodel.*`) are not preserved β€” adopters must rewrite to `mindxtrain.*`.
- Most operator and trainer surfaces ship as honest minimal stubs that raise
  `NotImplementedError` for paths not yet implemented in the hackathon scope.
  The autotune probe, config schema, manifest, recipes, and Axolotl compiler
  are the production-ready paths.

[0.1.0]: https://example.invalid/mindxtrain/releases/tag/v0.1.0