From 727ccf719dc5913e6aeb76672fffdd7aa22844f5 Mon Sep 17 00:00:00 2001 From: MSCodeBase Agent Date: Sat, 26 Sep 2026 11:55:48 +0300 Subject: [PATCH] docs(diary): record CI xdist parallelization Adds the 2026-09-26 diary section and Exp 26 (pytest-xdist -n auto in the test job, clean-state, and the local verify_diary gate-zero), and marks E13/Exp 25 as CORRECTED: the "xdist gives only ~15%" verdict was taken with -n 4 on a many-core box; -n auto measured x2.76 locally and ~x7 in CI (ubuntu 13m44s -> 1m58s, windows 16m23s -> 3m11s, clean-state 13m25s -> 1m41s). Also records the open llama-conflict watch for local parallel runs. --- AGENT_DIARY.md | 10 ++++++++++ EXPERIMENTS_LOG.md | 20 ++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/AGENT_DIARY.md b/AGENT_DIARY.md index 1d8b8f22..42eab5fe 100644 --- a/AGENT_DIARY.md +++ b/AGENT_DIARY.md @@ -1,5 +1,7 @@ ## Key Historical Decisions +- **CI/тест-параллелизация (2026-09-26, xdist `-n auto`):** внедрено в CI test job (#45), `clean-state` (#46) и локальный pre-commit Gate-zero `verify_diary` (#47, fallback serial без xdist). CI-критпуть **~16мин → ~4мин**: ubuntu 13m44s→**1m58s**, windows 16m23s→**3m11s**, clean-state 13m25s→**1m41s**; локальный коммит ~200с→~70с. Ключ: `-n auto` (а не `-n 4` из E13), `.coveragerc.ci` (CI без `dynamic_context` — несовместим с xdist, pytest-cov#604) + module-fixture temporal (36.6s→20.8s). **CORRECTED E13/Exp 25:** «xdist ~15%, не берём» опровергнуто (×2.76 локально, ×7 в CI). Watch: был отмечен llama-конфликт локального xdist — не воспроизведён за 2 прогона. + - **E6/E7: opencode-хук → MSCodeBase CLI; blind eval каталога кристаллов (2026-09-22):** E6 — плагин `tool.execute.before` на `git commit` зовёт `python -m src.cli stale_detector` (без MCP), при drift>0 бросает; negative/positive control пройдены, модель отказ не обошла (подчинение 4/4 суммарно с E3). Гоча: CLI `--project` игнорируется, проект = cwd. E7 — слепой маппинг 10 реальных симптомов на индекс каталога Tom Jones (`crystal-memory`/`crystals`, Apache-2.0, Spanda Works), 11 прогонов / 3 модели: controls 60/60 валидных (deepseek-low провалил NONE-controls → валидность зависит от reasoning), ключевой входной симптом → NONE 10/10 валидных (семья есть, из симптома недостижима), надёжный hit только 1/10, воспроизводимость qwen 8/10 vs longcat 4/10 (свойство модели). Детали — EXPERIMENTS_LOG Exp 18/19. - **Deploy 00ec5a6d → extension + live-revive smoke (2026-09-22):** `python install.py --sync-only` (код + очистка `__pycache__`, без pip/llama); символы `is_port_up`/`ensure_embedder_started`/`_revive_llama_cpp` подтверждены в ext. Live-check на РЕАЛЬНОМ llama.cpp (extension venv, без моков): подняли :8080 → embed dim=384 → убили процесс на :8080 (эмуляция watchdog idle-unload) → `RemoteEmbedder.embed` сам поднял сервер (лог: `WinError 10061` → `_revive_llama_cpp` → `ensure_embedder_started`), dim=384 → **PASS**. НЮАНС: ревайв занял **17.7s** (>15s бюджета search_code: 3 батч-ретрая + ~10s старт llama-server) → первый поиск после unload может ещё таймаутить, но сервер поднимается и следующий работает (раньше не восстанавливался никогда). Для активации в живом окне нужен reload Zed. - **E8: quiet-break gate graph (2026-09-22):** read-only дельта-изоляция узла графа на коммите (git diff + persisted PropertyGraph, БЕЗ мутации индекса). Мотив: абсолютный сигнал бесполезен — **1535/4081 (38%)** функций имеют 0 входящих CALLS (@_step-регистранты, callbacks, entry points). A = правка удаляет последних вызывающих (граф: кто вызывал × рабочее дерево: зовёт ли ещё); B = новая функция без вызовов (diff + текст изменённых файлов). Доступно как `graph_query(action="isolation")` / CLI. Controls (реальный git + seeded graph): POS-A 0 / NEG-A 1 / NEG-B 1 / POS-B 0 / не-git → unavailable; unit `tests/test_quiet_break_gate.py` 10/10; CLI на живом репо 1899ms, 0 ложных. Найден+исправлен баг fail-open (не-git отдавал "empty" вместо "unavailable"). Границы: rename-sweep, динамическая регистрация, soft (не hard-блок). Детали — EXPERIMENTS_LOG Exp 20. @@ -50,6 +52,14 @@ - **Чёрные окна CMD (2026-08-14):** MCP запускался как `venv\Scripts\python.exe` (console-подсистема) → каждое окно Zed = своё чёрное окно; фикс: `pythonw.exe` в extension.toml + CREATE_NO_WINDOW во ВСЕХ runtime subprocess (13 файлов) — с pythonw (нет консоли) незакрытые git/wmic/netstat мигали бы окнами - **FA=0.00 ≠ качество guardrail (2026-08-15):** Exp 1-L Day 3 — qwen3.6/3.7 (zero-shot VOR) достигают FA=0.00 ценой recall(real)=0.08–0.20 (code_first: 2/25 правды принято, 7/25 активно отвергнуто) — fail-closed политика, а не «фильтрация лжи»; выбор LLM для verify-on-read = выбор политики (fail-closed qwen vs max-coverage glm), recall(real) обязан быть в метриках. CoT (V3/Part 5) НЕ окупается: только qwen3.6 recall 0.08→0.20 при цене ×30–65 +## [2026-09-26] CI test parallelization (pytest-xdist) — Adopted +**Status:** ✅ Adopted + CI-green (#45/#46/#47 merged). +**Root Cause:** серийные прогоны доминировали в CI (test 13-16м, clean-state 13м); E13 (2026-09-23) отверг xdist по замеру `-n 4` (~15%) — недогрузка ядер на многоядерной машине + CI-overhead (coverage/`dynamic_context`). +**Fix:** `-n auto` в test job + clean-state + `verify_diary` Gate-zero (fallback serial без xdist); `.coveragerc.ci` (без `dynamic_context`) через `COVERAGE_RCFILE` для CI; `pytest-xdist` в dev-extra; module-fixture temporal generator. +**Measure:** локально 197.1с→71.4с (no cov) / 86.4с (+cov, 54.58%>38%); CI ubuntu 13m44s→1m58s, windows 16m23s→3m11s, clean-state 13m25s→1m41s; 1865 passed / 0 failed (выборка и гейты не тронуты). +**Guard:** выборка идентична (addopts `-m 'not slow and not benchmark'`); CI-парность ubuntu+windows; drift/negative-controls/revision гейты не изменены; fallback serial при отсутствии xdist. +**Open:** llama-конфликт (Exp 25) локального xdist — не воспроизведён за 2 прогона, watch. + ## [2026-09-25] Reindex deadlock + concurrent indexers + embedder lease — Fixed (live) **Status:** ✅ Fixed + live-verified (full reindex completed; index collapse confirmed). **Root Cause:** `_bounded_link` (timeout fix 2026-09-25) ran `bulk_write` on a NEW daemon thread, while `run()` held the global write RLock on the caller thread for the whole reindex. `bulk_write` acquires the SAME RLock → permanent deadlock (py-spy: "bounded-bulk_write" idle at `db_writer.py:336`; job stuck 52% "running", 0 CPU). Timeout only fired at 300s → job failed. Same class for prune/verify (recreate_table_physical). diff --git a/EXPERIMENTS_LOG.md b/EXPERIMENTS_LOG.md index e16f20ed..5f9ed324 100644 --- a/EXPERIMENTS_LOG.md +++ b/EXPERIMENTS_LOG.md @@ -2628,3 +2628,23 @@ whitelist stdlib+builtins+typing, внешние (Zed/Rust), commit-scopes. По **Вердикт:** xdist даёт лишь ~15% локально → не стоит сложности по умолчанию. Главный рычаг CI — кэш deps/install, а не CPU-параллельность. Дальше: кэш pip в `clean-state`; разбор/оптимизация `test_temporal_facts_generator`. (Локальный xdist отключён по прежнему решению владельца — конфликт с llama.) + +**CORRECTED (2026-09-26):** вывод «~15%, не берём» опровергнут: он был снят с `-n 4` на многоядерной +машине (недогрузка CPU). С `-n auto` на 12 ядрах: serial 1865 тестов **197.1с** → `-n auto` **71.4с** +(**×2.76**), с CI-shape coverage — **86.4с**; `0 failed`. В CI эффект ещё больше (см. Exp 26). Решение +владельца 2026-09-23 «не берём» отменено владельцем 2026-09-26. См. AGENT_DIARY 2026-09-26. + +## Exp 26 — CI/тест-параллелизация: pytest-xdist `-n auto` (CONFIRMED, внедрено) + +**Гипотеза:** `-n auto` (все ядра, не 4) + контекст-независимый CI-coverage дадут кратное ускорение CI без потери качества. + +**Метод:** локально (12 ядер) serial vs `-n auto` vs `-n auto --cov`; в CI те же команды на ubuntu/windows (4 ядра), выборка та же (addopts `-m 'not slow and not benchmark'`). + +**Сырой результат (локально, 1865 тестов):** serial (no cov) **197.1с** → `-n auto` (no cov) **71.4с** → `-n auto` + CI-cov **86.4с**; **1865 passed / 0 failed**; coverage **54.58%** (gate 38%). +CI до/после: test ubuntu **13m44s→1m58s**, windows **16m23s→3m11s**, clean-state **13m25s→1m41s**. +Плюс `test_temporal_facts_generator` **36.6с→20.8с** (module-fixture для `generate(seed=7)`). + +**Ключевое препятствие:** `.coveragerc` `dynamic_context=test_function` несовместим с xdist (pytest-cov#604, DistCovError) → CI использует `.coveragerc.ci` (без контекстов) через `COVERAGE_RCFILE`; локальный/bootstrap сохраняют пер-тестовые контексты. + +**Вердикт:** CONFIRMED. Внедрено: #45 (test job), #46 (clean-state), #47 (pre-commit `verify_diary` Gate-zero, с fallback на serial, если xdist нет). +**Остаточный риск:** Exp 25 фиксировал «конфликт с llama» при локальном xdist; полный параллельный прогон локально прошёл `0 failed`, но флейки серверных тестов многократно не проверялись → watch.