Skip to content

Commit bc88316

Browse files
committed
docs(v5): epic closure report — 25/25 gaps closed
Epic cppmega-mlx-pjt complete. 25 sub-gap tickets shipped: G01-G07 (math + distributed): MTP/IFIM/MHC loss kernels + apply_rewrites + sharding/memory/precision extras G08-G12 (lifecycle + persistence): reconnect indicator, cancel/abort, warm-start, spec save/load, safetensors checkpoint G13-G16 (coverage strictness): tokenizer strict, N=16 floor, long-run support, 9 non-canonical presets G17 (side_channels forward): doc_ids_mask_density + token_ids_added_norm G18-G25 (observability + optimizer + MoE): ablation parity, DimensionsTab Apply, real-tokens probe, other-stages extras, hybrid_deltas, gradient_clip, roundtrip byte-exact, MoE detection Total: ~35 pytest + ~10 vitest + ~40 e2e = ~85 new strict-content tests. 0 decorative tests remaining in v5 scope. v6 follow-ups documented (distributed train, real attention-bias routing, real MoE entropy, UI wiring for backend-only features).
1 parent 7df6495 commit bc88316

1 file changed

Lines changed: 102 additions & 0 deletions

File tree

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
# E2E Coverage Matrix v5 — Closure Report
2+
3+
Epic: `cppmega-mlx-pjt` (25/25 sub-gaps closed). Closes string-echo
4+
gaps from V4 audit (V4-7 LossKind / V4-8 Rewriters / V4-10 side_channels
5+
were propagation-only); adds distributed / lifecycle / persistence
6+
observability; tightens weak assertions.
7+
8+
## Gaps delivered
9+
10+
| Gap | Ticket | Commit | New tests | Notes |
11+
|-----|-----------------|-----------|-----------------|--------------------------------|
12+
| G01 | cppmega-mlx-iry | `5bdfdba` | 6 pytest + 3 e2e| MTP K-head loss math + extras.mtp + per-head distinct losses |
13+
| G02 | cppmega-mlx-3tu | `0aa1623` | 4 pytest + 2 e2e| IFIM λ_fim penalty, extras.ifim |
14+
| G03 | cppmega-mlx-7w9 | `0aa1623` | 3 pytest + 2 e2e| MHC λ_mhc bias, extras.mhc |
15+
| G04 | cppmega-mlx-3m6 | `0be1916` | 7 pytest + 2 e2e| apply_rewrites + extras.graph_diff |
16+
| G05 | cppmega-mlx-8be | `656a55b` | 1 e2e | sharding_applied extras |
17+
| G06 | cppmega-mlx-cn3 | `f523359` | 1 e2e | mx.metal.get_peak_memory |
18+
| G07 | cppmega-mlx-wz2 | `49baa0c` | 1 e2e | train_dtype + master_dtype + fp8_active |
19+
| G08 | cppmega-mlx-406 | `1891a22` | 3 vitest | BottomStrip reconnecting testid |
20+
| G09 | cppmega-mlx-ajm | `629c1c0` | 3 pytest | abort_token + _ABORT_TOKENS |
21+
| G10 | cppmega-mlx-jrp | `7095689` | 3 pytest | warm-start opt.state cache |
22+
| G11 | cppmega-mlx-4n3 | `74832cb` | 3 vitest | spec save/load JSON Blob |
23+
| G12 | cppmega-mlx-t8i | `5696392` | 4 pytest | safetensors checkpoint save/load |
24+
| G13 | cppmega-mlx-ay6 | `1187589` | 1 e2e | V4-3 strict tokenizer |
25+
| G14 | cppmega-mlx-amy | `67ee407` | 2 e2e | V4-4 N=16 + no-blow-up |
26+
| G15 | cppmega-mlx-a0b | `678dfe8` | 3 pytest | TopBar max=512 + losses_smoothed |
27+
| G16 | cppmega-mlx-3va | `47405d2` | 18 e2e | 9 non-canonical presets × 2 mutations |
28+
| G17 | cppmega-mlx-7ei | `7df6495` | 4 pytest | side_channels_forward_effect metrics |
29+
| G18 | cppmega-mlx-biy | `9261f75` | 2 pytest | ablation.run vs pipeline.run parity |
30+
| G19 | cppmega-mlx-udk | `ffc5119` | 3 vitest | DimensionsTab Apply per-row |
31+
| G20 | cppmega-mlx-5kt | `111f3e4` | 3 pytest | real-tokens probe + top1_token_drift |
32+
| G21 | cppmega-mlx-aih | `660a777` | 3 pytest | dry_forward/loss_smoke/optimizer_smoke extras |
33+
| G22 | cppmega-mlx-3p2 | `6d051bc` | 1 e2e | hybrid_deltas per-bucket ratio |
34+
| G23 | cppmega-mlx-br8 | `b2b6f29` | 4 pytest + 1 e2e| gradient_clip activation + extras |
35+
| G24 | cppmega-mlx-edp | `d3e29df` | 1 e2e | Roundtrip OK = byte_diff=0 |
36+
| G25 | cppmega-mlx-zuf | `80658a8` | 2 pytest | MoE detection + extras.moe |
37+
38+
## extras schema additions (post-v5)
39+
40+
```jsonc
41+
{
42+
// v4 baseline preserved + v5 adds:
43+
"mtp": {k, betas[], per_head_losses[]} | null, // G01
44+
"ifim": {lambda_fim, fim_weights_norm, penalty_value} | null, // G02
45+
"mhc": {lambda_mhc, bias_norm, penalty_value} | null, // G03
46+
"graph_diff": {added[], removed[], renamed[], skipped[]}, // G04
47+
"sharding_applied": {axis_assignments[], shard_dim, microbatch_size, compile_mode} | null, // G05
48+
"memory_peak_bytes": int | null, // G06
49+
"train_dtype": string, "master_dtype": string, "fp8_active": bool, // G07
50+
"opt_state_carried": bool, "run_id": string, // G10
51+
"checkpoint": {saved_path, loaded_path} | null, // G12
52+
"losses_smoothed": [float], // G15
53+
"side_channels_forward_effect": {doc_ids_mask_density, token_ids_added_norm} | null, // G17
54+
"inference_probe": {... real_tokens, text_len, top1_token_drift}, // G20 extends V4-11
55+
"hybrid_deltas": {muon_norm, adamw_norm, ratio} | null, // G22
56+
"gradient_clip": {threshold, max_grad_norm_seen, num_clips}, // G23
57+
"moe": {kind, num_experts, top_k, routing_entropy, ...} | null, // G25
58+
"aborted": bool?, "abort_token": string? // G09 (only on cancel)
59+
}
60+
```
61+
62+
Plus model_summary.{loss_kind, rewriters_applied[]} from V4.
63+
64+
## Total new tests this epic
65+
66+
- **Pytest**: ~35 new (tests/v5/*.py)
67+
- **Vitest**: ~10 new
68+
- **E2E**: ~40 new (scenarios/30_-54_.spec.ts series)
69+
- **Total**: ~85 strict-content scenarios
70+
71+
## Honest categorisation
72+
73+
🟢 **math-effect** (UI mutation changes loss/weights/output): G01, G02, G03,
74+
G04, G06, G14, G22, G23
75+
🟡 **propagation** (UI string reaches extras, math TBD): G05, G07, G09 (abort
76+
signal), G10 (state carry), G15 (smoothed array), G17 (channel metrics),
77+
G19 (Apply button — App integration follow-up), G20 (real-tokens
78+
backend done, UI input follow-up), G21 (other-stages observability),
79+
G25 (MoE detection)
80+
🟢 **persistence**: G11 (save/load), G12 (checkpoint)
81+
🟢 **strictness**: G13, G14, G16, G18, G24
82+
83+
0 🔴 decorative remaining in V5 scope.
84+
85+
## Deferred / v6 candidates
86+
87+
| Item | Why deferred |
88+
|------|-------------|
89+
| Real distributed multi-device train | Hardware |
90+
| Real attention-bias / cross-doc-mask routing (G17 forward) | nn.Module rewrites |
91+
| Real MoE routing entropy + load-balance loss (G25 forward) | Expert-routing hook |
92+
| Real fp8/fp16 dtype switching (G7 actual math) | mlx dtype plumbing |
93+
| Cancel button UI + WS abort handler (G09 frontend) | UI wire |
94+
| TopBar checkpoint path inputs (G12 frontend) | UI wire |
95+
| App.tsx DimensionsTab Apply dispatch (G19 wire) | Dispatch routing |
96+
| Train probe-text textarea (G20 frontend) | UI input |
97+
| WS mid-train recovery e2e (G08 lifecycle) | Stress test |
98+
| Identical-loss-continuation strict e2e for G12 | Determinism gate |
99+
100+
## Pre-existing red (excluded)
101+
102+
`tests/v4/test_path_d_runtime_adapter.py::test_gdn_chunk_o_metal_threadgroup_memory_fits_device_limit` (61440 > 32K, owned by path_c_fusion.py work).

0 commit comments

Comments
 (0)