Отчёт архитектора, 27.09.2026. Живые диаграммы (GitHub Pages, интерактив): конвейер A4 · карта данных · отчёт в HTML. В репо: a4-gate-flow.html · axiom-data-map.html
Стадии конвейера A4 (скелет L3, ~1B MoE, JAX):
| Стадия | Результат | Фактические числа |
|---|---|---|
| pretrain_checkpoint | executed | init с нуля → 1 шаг → Orbax → tree_hash |
| rl_environment | executed | 10 задач через net_executor, механические вердикты |
| sft | executed | 200 шагов, 1 638 200 токенов, 442,7 с (0,122 GPU-ч), QAT MXFP4 on |
| rl_base_scheme | executed | 10 шагов GRPO, 40 роллаутов, 2 643,5 с (0,739 GPU-ч) |
| spark_inference | skipped | инференс на RTX 4080 — подмена стенда запрещена (ADR-010) |
Приёмочный сьют сети на GPU: 374 passed / 14 skipped / 1 xfail (известный xfail критерия 6 — NoPE-экстраполяция). Вердикты RL-среды 0/40 — честно: смоук-модель задачи не решает, смоук доказывает провод конвейера, а не качество.
Схема манифеста v1 проверяла только непустые хеши: прогон доступной части конвейера давал бы зелёный C-038 при непройденном A4. Дельта ADR-014 сделала pipeline_complete вычисляемым — переданное извне значение игнорируется, частичный прогон даёт красный с поимённым списком. Сейчас --verify возвращает код 1: покрытие частично: spark_inference — и это правильное состояние.
test_13_integration (A5: два прогона → идентичный манифест) упал: workspace_sha256 различался. Все ждали причину в XLA-недетерминизме (ADR-013, deterministic-флаг). Реальная причина: Python-байткод __pycache__/*.pyc в workspace-снапшоте — .pyc несёт абсолютный co_filename и mtime исходника, который менялся под параллельными правками. Гейт исполняет command_succeeds внутри workspace, поэтому даже с deterministic-флагом манифест «плыл». Фикс: executor вычищает __pycache__/*.pyc из снапшота + PYTHONDONTWRITEBYTECODE. Урок: у недетерминизма могут быть несколько независимых причин — фикс первой не закрывает класс.
Смоук на GB10 запустили при живом SFT-прогоне (38 ГБ) и llama-server (28 ГБ) — без XLA_PYTHON_CLIENT_MEM_FRACTION. JAX по умолчанию резервирует ~75% памяти устройства → вероятный OOM-каскад: в одну минуту умерли наш смоук, SFT (3 ч 44 мин прогресса) и llama-server. Правила теперь в памяти контура: любой JAX-процесс на совмещённом стенде — с явным memory-лимитом (0,15–0,5), предполёт nvidia-smi + free -g, разрешение владельца — текстом в лок-файле.
Первый базлайн-сьют дал test_04_forward_8k: FFF — сирота-процесс от прерванного прогона делил 16 ГБ VRAM. На чистой карте те же тесты — 4 passed за 1:41. Инвариант «одна GPU-нагрузка за раз» (AD-7) верен и для рабочей машины, не только для Spark.
Пайплайн эпизодов (1378 сессий) нашёл то, чего не предвидели:
ExperimentalMaterial3Api (53 попадания, 46 — мусор); сужение до UPPER_SNAKE с суффиксом в конце имени → 5 настоящих.grep "sk-" даёт 705 «находок» — все это di**sk-**sizing и цитаты правил. Критерий качества — в точных паттернах, дающих 0.*_sha256), не секреты. Исключили hash-именованные ключи.resolve/README.md в gated-репо отдаёт 200 без согласия — README и листинг публичны, закрыт только контент. Проверять доступ надо контентным файлом (-r 0-100 на parquet → честный 403/206). Второй слой: fine-grained токен с пустыми скопами не читает gated-контент даже с согласием. Диагностика: whoami-v2 → роль + scopes; контентный curl.
Проба stack-smol-xl (публичный срез) показала потолок ровно 10 000 файлов/язык → 0,079B токенов при цели 3B — в 38 раз меньше. Поэтому шард C: The Stack v2-dedup (доступ получен, схема data/<Язык>/parquet подтверждена контентным запросом), fallback — v1-dedup, план B — codeparrot-clean. Решение по факту измерения, не по названию датасета.
Мета-валидатор отклонил наши новые ADR за нестандартные заголовки (## Alternatives вместо ## Alternatives Considered, свёрнутые негативные последствия). Формат — часть контракта, канон восстанавливается перед интеграцией.
--verify код 1 — красный честно. Закрытие: операторский инференс на GB10.l3-full + оркестратор A4 на стенде → spark_inference=executed → --verify = 0 → A4 закрыт (рецепт: ~/Загрузки/gb10-smoke-full-run.md).