diff --git a/atom/compass/design/08_validation_protocol.md b/atom/compass/design/08_validation_protocol.md index 28a7cac98a..9f7838905b 100644 --- a/atom/compass/design/08_validation_protocol.md +++ b/atom/compass/design/08_validation_protocol.md @@ -29,14 +29,15 @@ at *collection* time, via `rocminfo` reached on import, so pytest cannot even bu list, plus 1 that collects cleanly and then fails at run time on a pinned-host allocation (`hipHostMalloc failed: 100`). That numerator is non-plugin, so its denominator must be too — quoting 29 against 189 is the defect `16` L4 fixes and it is not repeated here. **At the -whole-suite denominator the figure is at least 32 of 189**, because `tests/plugin/` is not +whole-suite denominator the figure is at least 34 of 189**, because `tests/plugin/` is not purely a packaging problem: collecting it alone at `236abfd9a`, and again at `fada7424e`, in `xiaobizh_n18_cpu` gives -`153 tests collected, 7 errors in 1.45s`, rc=2, and those 7 decompose as **3 `rocminfo`** +`153 tests collected, 7 errors`, rc=2, and those 7 decompose as **3 `rocminfo`** (`test_gdn_target_verify_batched_equiv.py`, `test_rtpllm_forward_context_semantics.py`, `test_vllm_deepseek_v4_proxy_state_arena_layout.py`), **1 `ModuleNotFoundError: No module named 'sglang'`**, and **3 `ImportError: cannot import name 'fused_gdn_gating' from 'atom.model_ops.attention_gdn' (unknown location)`** — a module left half-initialised by the -first three, not a fourth cause. 29 + 3 = 32 is a floor: the other 23 plugin files collect +first three, not a fourth cause. With the 2 tier files the table below names, which reach +`rocminfo` run alone at `fada7424e` too, 29 + 2 + 3 = 34 is a floor: the other 23 plugin files collect here and are never run, so nothing is measured about what they would touch. `tests/plugin/`'s 30 files at `fada7424e` are dropped whole because the tier targets ATOM and sglang and vllm are in neither image — the measured reason for 27 of them, not for all 30. The @@ -62,7 +63,7 @@ saying those three need the driver is stale. | `test_prefill_scheduler.py`, `test_scheduler_partial_prefill_tail.py` | CPU | chunked prefill boundaries | | `test_block_manager.py`, `test_block_pool.py` | CPU | the block accounting D13 relies on running unmodified | | `test_prefix_cache_accuracy.py` | **neither** | nothing. It holds **no test function at all** — it is an `argparse` script that drives a live server on `localhost:8000`, and `pytest` reports `no tests ran` for it in both containers. The prefix-cache behaviour doc `03` declares correct-by-construction is not covered by this file. | -| `test_prefill_prefix_vs_native.py` | **GPU only** | the prefix-cache behaviour doc `03` declares correct-by-construction. It module-skips on the CPU tier ("needs a real GPU") and gives 4 passed in the GPU container, so the prefix-cache row is GPU-tier evidence and nothing else. | +| `test_prefill_prefix_vs_native.py` | **GPU only** | the prefix-cache behaviour doc `03` declares correct-by-construction. It module-skips on the CPU tier ("needs a real GPU") and gives 4 passed in the GPU container (`xiaobizh_n18`, one card, at `cb684287f`), so the prefix-cache row is GPU-tier evidence and nothing else. | | `test_scheduled_batch_marshal.py` | CPU | the IPC payloads the clock protocol annotates around | | `test_block_table_marshal.py` | **GPU only** | the block-table half of those same payloads — excluded at collection time, so the CPU tier does not see it | | `test_kv_connector_scheduler.py` | **neither** | the connector factory doc `01` D6 registers a simulated connector into — except that it runs nothing in either tier: `1 skipped`, because ATOM #690 split `kv_transfer_engine` into `moriio` and the test's imports were never updated. | diff --git a/atom/compass/design/16_execution_plan.md b/atom/compass/design/16_execution_plan.md index 266265bb92..aea8234beb 100644 --- a/atom/compass/design/16_execution_plan.md +++ b/atom/compass/design/16_execution_plan.md @@ -123,10 +123,9 @@ joined two real numbers wrongly: the 28 counts `rocminfo` across the *whole* sui `PYTHONPATH` asserted to resolve `atom` under that root and pytest's own exit status captured before any pipe. The 4030 at `105ca4197` is **3956 ATOM tests + 74 `tests/compass/` tests**, stated as its parts because a single total cannot show which half moved (principle 7). The - 3956 is the same gate at the base, `042aad97d`, which has no `tests/compass/`. The - file count moves 128 → 130 and the test count 3956 → 4030 because `105ca4197` adds - `tests/compass/test_cpu_gate_exclude.py` and `tests/compass/test_gate_gpu_surplus.py`; the - P0.2 readings above are the same suite without them. **4005** was the same gate at + 3956 is P0.1's control, `042aad97d` with P0.1's `scripts/compass/` copied in and, like the + P0.2 readings above, no `tests/compass/`; `105ca4197` adds `tests/compass/test_cpu_gate_exclude.py` + and `tests/compass/test_gate_gpu_surplus.py`, so the file count moves 128 → 130. **4005** was the same gate at `3afcb4880`, with `tests/compass` at 49 tests. The 49 → 74 growth is two steps: `tests/compass/test_cpu_gate_exclude.py` parametrises one case per entry of `gpu_gate_triggers.txt`, and correcting that file's derivation took it from 13 diff --git a/scripts/compass/README.md b/scripts/compass/README.md index 05fc39f696..c47a525de0 100644 --- a/scripts/compass/README.md +++ b/scripts/compass/README.md @@ -96,8 +96,8 @@ figure is stale by construction between one task and the next, and it has twice been taken as a control by a task that then read the intervening tasks' tests as a surplus of its own. **A control is measured, not read**: run `gate_cpu.sh` on the integration head your branch forked from, in the same container, and state both -figures beside their commits. The CPU row below does not name the commit it ran -on, which is the omission that let it pass for current; the same gate on +figures beside their commits. The CPU row below once named no commit, which is +the omission that let it pass for current; the same gate on `68ef4f329` measured **4380 passed, 149 skipped, 3 xfailed, rc=0** — node 18, container `xiaobizh_n18_cpu`, 2026-09-22, 36.2 s of pytest inside 43.0 s of wall. @@ -110,7 +110,7 @@ with a non-zero rc and no ±1. | Tier | Result | Measured | |---|---|---| -| CPU gate | **4030 passed, 0 failed**, 149 skipped, 3 xfailed, rc=0, **identical in every run on 2026-09-21, the clock 25.4-31.7 s of pytest inside 31.1-37.8 s of wall (`time` real) — a measured spread, not a bound** — decomposing as **3956 ATOM + 74 `tests/compass`** | node 18, container `xiaobizh_n18_cpu`, 2026-09-21, **commit not recorded**, against a `git archive` snapshot with `PYTHONPATH` asserted and pytest's own rc captured before any pipe | +| CPU gate, at `105ca4197` | **4030 passed, 0 failed**, 149 skipped, 3 xfailed, rc=0 — decomposing as **3956 ATOM + 74 `tests/compass`**; the 3956 is PR #6's control, `042aad97d` with PR #6's `scripts/compass/` copied in, since `042aad97d` has none. Six runs at `d737f15e7` and `7ff80cc4b`, before PR #6's restack, read the same counts and **25.6-30.8 s of pytest inside 31.6-36.9 s of wall (`time` real) — a measured spread, not a bound** (`8c0ee374f`) | `105ca4197`, PR #6's head, landed as `4c16792d9` (same tree) — PR #6's gate table; node 18, container `xiaobizh_n18_cpu`, 2026-09-21, against a `git archive` snapshot with `PYTHONPATH` asserted and pytest's own rc captured before any pipe | | CPU gate, same tier, at `186d12829` | **4501 passed, 0 failed**, 149 skipped, 3 xfailed, rc=0 — three runs, identical, 28.8-34.4 s of pytest inside 35-40 s of wall. The **4030** above and the **4380** in the paragraph above are this same gate at earlier trees; all three are history, and this one will be too | `186d12829` — the commit this branch forks from, which is its merge-base with the integration head, **read 2026-09-21T19:21Z**, node 18's own clock — node 18, container `xiaobizh_n18_cpu`, `git archive` snapshot staged by `snapshot.sh`, `PYTHONPATH` asserted, pytest's own rc captured before any pipe | | GPU superset (`--ignore=tests/plugin`) | **4779 passed, 5 failed**, 0 errors, 105 skipped, 3 xfailed, **72.6 s**; two runs, byte-identical failing sets | `fe9ea043c`, node 18, container `xiaobizh_n18`, `HIP_VISIBLE_DEVICES=1`, 2026-09-20, torch **2.10.0+rocm7.2.4.git3d3aa833**, `torch.version.hip` **7.2.53211**, ROCm release **7.2.4**, AITER **v0.1.21.dev0-49-gf4e7c7509** (`git describe`) | | `ruff check .` | 1003 errors, 640 fixable — the gate is *no new* error, not zero | `83daf636d` | @@ -122,11 +122,12 @@ it is this directory.** `tests/compass/test_cpu_gate_exclude.py` parametrises one case each, so regenerating that file changes the pass count by exactly the change in the number of entries. The readings in circulation are the same gate under different exclusion lists and a different `tests/compass`, not discrepancies: -**3925** at 32 exclusions; **3956** is the ATOM-only half; **3988** with -`tests/compass` at 32; **4005** with it at 49; **4022** with it at 66 — 49 plus the 17 -extra trigger paths the corrected derivation below produces — and **4030** with it at 74, -the 8 cases `test_gate_gpu_surplus.py` adds. The -exclusion list went 32 → 29 because `test_dp_metadata.py`, `test_dp_sync_layout.py` +**3925** at `83daf636d`, 32 exclusions and no `tests/compass`; **3956** is the +ATOM-only half, at `042aad97d` above, and 3925 + 31; **4005** at `3afcb4880`, with +`tests/compass` at 49; **4022** at `71d2a1ac2`, with it at 66 — 49 plus the 17 extra +trigger paths the corrected derivation below produces — and **4030** at `105ca4197`, +with it at 74, the 8 cases `test_gate_gpu_surplus.py` adds. The exclusion list went +32 → 29, adding those 31, because `test_dp_metadata.py`, `test_dp_sync_layout.py` and `test_forward_mode.py` were re-measured **CPU-green**. **The five GPU failures are four ULP comparisons and one bitwise check** — not