Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,8 @@ experiments/bootstrap/__pycache__/
# Bootstrap Step 3: дефолтный trace_result.json в cwd (bootstrap_trace_plugin.py)
bootstrap_trace_*.json
docs/generated/MODULE_INDEX.md
.local/state/gh/device-id
# Local machine scripts (personal absolute paths) — never publish
.local/

# Agent temp scripts
scripts/_diag_*.py
Expand Down
10 changes: 6 additions & 4 deletions .opencode/plugin/mscodebase_gate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,11 @@
import type { Plugin } from "@opencode-ai/plugin"
import { appendFileSync, mkdirSync } from "node:fs"
import { execFile } from "node:child_process"
import { dirname } from "node:path"
import { dirname, join } from "node:path"
import { tmpdir } from "node:os"

const PY = process.env.MSCODEBASE_PY ?? "D:/Project/MSCodeBase/venv/Scripts/python.exe"
const LOG = process.env.MSCODEBASE_GATE_LOG ?? "C:/Users/misha/AppData/Local/Temp/opencode/mscodebase_gate.log"
// Project-local venv by default; MSCODEBASE_PY overrides. No machine-specific path.
const LOG = process.env.MSCODEBASE_GATE_LOG ?? join(tmpdir(), "opencode", "mscodebase_gate.log")
const STALE_MODE = process.env.MSCODEBASE_STALE_GATE ?? "block"
const ISO_MODE = process.env.MSCODEBASE_ISOLATION_GATE ?? "advisory"

Expand All @@ -38,10 +39,11 @@ function log(rec: Record<string, unknown>) {
}

function cli(directory: string, tool: string, argsJson: string): Promise<string> {
const py = process.env.MSCODEBASE_PY ?? join(directory, "venv", "Scripts", "python.exe")
return new Promise((resolve) => {
try {
execFile(
PY,
py,
["-m", "src.cli", tool, argsJson],
{ cwd: directory, timeout: 90000, windowsHide: true, maxBuffer: 4 * 1024 * 1024 },
(_err, stdout) => resolve(stdout ?? ""),
Expand Down
18 changes: 9 additions & 9 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ read_live_file(file_path="src\\core\\indexer.py") ← только нужны

### Архитектура

- **Source code:** `D:\Project\MSCodeBase` — здесь ты редактируешь код.
- **Source code:** `<repo-root>` — здесь ты редактируешь код.
- **Extension dir:** `%LOCALAPPDATA%\Zed\extensions\mscodebase-intelligence` — откуда MCP реально запускается.
- **Venv:** `{EXT}\venv\Scripts\python.exe` — Python со всеми пакетами.
- **llama binary:** `{EXT}\llama_msvc\` (CPU) или `{EXT}\llama_vulkan\` (GPU).
Expand All @@ -161,7 +161,7 @@ read_live_file(file_path="src\\core\\indexer.py") ← только нужны
Когда пользователь просит что-то изменить и проверить:

```
ШАГ 1 — Правим код в исходниках (D:\Project\MSCodeBase\src\)
ШАГ 1 — Правим код в исходниках (<repo-root>\src\)
ШАГ 2 — Синхронизируем в расширение + убиваем процессы
ШАГ 3 — Запускаем install.py для обновления
ШАГ 4 — Запускаем MCP вручную из расширения
Expand All @@ -173,7 +173,7 @@ read_live_file(file_path="src\\core\\indexer.py") ← только нужны
### Детальный протокол

**Шаг 1 — Правка кода:**
- Редактируешь файлы в `D:\Project\MSCodeBase\src\`.
- Редактируешь файлы в `<repo-root>\src\`.
- После `edit_file` / `write_file` → `notify_change()`.
- Для переименования файлов используй `apply_file_move(old, new)` вместо `notify_change` — мета-патчинг (50ms, 0MB RAM) вместо полной переиндексации (5s, 700MB RAM).

Expand All @@ -186,13 +186,13 @@ sleep 2

# Скопировать изменённые файлы в расширение
# (если install.py запускать не надо, а надо быстро обновить один файл)
cp /d/Project/MSCodeBase/src/providers/reranker/llama_runner.py \
"/c/Users/misha/AppData/Local/Zed/extensions/mscodebase-intelligence/src/providers/reranker/llama_runner.py"
cp /path/to/repo/src/providers/reranker/llama_runner.py \
"/path/to/LocalAppData/Zed/extensions/mscodebase-intelligence/src/providers/reranker/llama_runner.py"
```

**Шаг 3 — install.py (если нужно обновить бинарники/модули):**
```bash
cd /d/Project/MSCodeBase && python install.py
cd /path/to/repo && python install.py
```
Учти: install.py интерактивный (спрашивает Y/n). Если нужно авто-подтверждение:
```bash
Expand All @@ -201,7 +201,7 @@ printf 's\nn\n' | python install.py # s=skip pip, n=skip ONNX models

**Шаг 4 — Запуск MCP для теста:**
```bash
cd "/c/Users/misha/AppData/Local/Zed/extensions/mscodebase-intelligence" && \
cd "/path/to/LocalAppData/Zed/extensions/mscodebase-intelligence" && \
nohup venv/Scripts/python.exe -m src.main > /tmp/mcp_test.log 2>&1 &
sleep 8 # ждём пока стартанёт embedder + reranker
```
Expand Down Expand Up @@ -462,9 +462,9 @@ For file renames, use `apply_file_move(old, new)` instead of `notify_change` —
12. Root чистый? (нет новых одноразовых скриптов/логов в корне — §0.6)

13. **Синхронизация лаборатории с портфолио (обязательна после ЛЮБОЙ эксперимент-серии или изменения вывода):**
- Файлы: `D:\Project\MSPortfolio\src\data\lab\experiments.json` (+ `experiments.ru.json`) — эксперименты и отрицательные результаты; при необходимости `diary.json`/`known-issues.json` (и RU-зеркала). Портфолио — публичное зеркало этой лаборатории, рассинхрон = публичный неточный claim (прецеденты: KI-103 present-trap, exp-18/19 «graph не помогает» vs E5).
- Файлы: `<portfolio-root>\src\data\lab\experiments.json` (+ `experiments.ru.json`) — эксперименты и отрицательные результаты; при необходимости `diary.json`/`known-issues.json` (и RU-зеркала). Портфолио — публичное зеркало этой лаборатории, рассинхрон = публичный неточный claim (прецеденты: KI-103 present-trap, exp-18/19 «graph не помогает» vs E5).
- Новый эксперимент → запись с полями: id (`exp-N`), date, title, hypothesis, command, result, verdict, finding, chart (если есть числа), conclusion, links. Сырые числа из `EXPERIMENTS_LOG.md`, не по памяти.
- Опровергнут прежний вывод → НЕ молча менять старую запись, а добавить в неё `CORRECTED (…): <что опровергнуто и чем>` (формат как в exp-19/E5), сохраняя историю.
- RU-файл обновляется В ТОМ ЖЕ коммите, что и EN (конгруэнтность по id/verdict/temperature — guard-тест в `tests/lab.test.ts`).
- Проверка перед коммитом портфолио: `cd D:\Project\MSPortfolio && pnpm test tests/lab.test.ts tests/evidence-eval.test.ts` — ловит рассинхрон EN/RU и коллизии с парафраз-сетами (новые слова в корпусе могут случайно поддержать парафразу — тогда переформулировать, не трогать тест).
- Проверка перед коммитом портфолио: `cd <portfolio-root> && pnpm test tests/lab.test.ts tests/evidence-eval.test.ts` — ловит рассинхрон EN/RU и коллизии с парафраз-сетами (новые слова в корпусе могут случайно поддержать парафразу — тогда переформулировать, не трогать тест).
- Не выполнено → статус `⚠️ портфолио не синхронизировано` в `[🏁 ИТОГ]`, даже если тесты проекта зелёные.
13 changes: 10 additions & 3 deletions AGENT_DIARY.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
- **E10: сдержанность доставки (anti-numbing) (2026-09-22):** `src/core/restraint.py` — сигнатура findings (kind+symbol+file) + cooldown 600s с backoff ×2^strikes; состояние — один JSON на проект. Opt-in `graph_query isolation` + `kwargs={"restraint":true}`; блокирующие гейты НЕ заходят (жёсткий стоп ≠ нытьё). unit 4/4 (итого 22/22 с gate/redact); CLI E2E: call1 `deliver ✓`, call2 `deliver ✗` (cooldown 597s). Гоча: доп. аргументы CLI — через `kwargs`. Детали — EXPERIMENTS_LOG Exp 22.
- **E11: замороженный список vs новый arrival index Тома (2026-09-22):** каталог `tjonesit/crystals` @3e30ed2 (`catalogue/README.md`, arrival index 25 фраз→записи). Слепой маппер, 5 прогонов / 3 модели: **#16 («агент не пользуется тулами») → A в 5/5**, включая оба ВАЛИДНЫХ (longcat-2.0, qwen3.7-plus; контроли 6/6). deepseek ×3 невалидны — NC3 (#11 Safari/CSS) притянулся к E generated-document (UI/spacing), та же болезнь, что в E7. Вывод: arrival layer чинит #16 (было NONE 10/10); воспроизводимость всё ещё в читателе. ⚠ Новый риск: фраза-ловушка на соседнем домене (UI→CSS) = кандидат в дырку. Детали — EXPERIMENTS_LOG Exp 23.
- **Clean-state 44d451f6 (2026-09-22):** локальный clone закоммиченного состояния → `verify_clean_state.sh --no-clone`: **1800 passed / 0 failed / 13 skipped / 98 deselected** (822s), lock-drift negative-control PASSED, guard inventory ALL PROVEN (3), revision gate VALID. Новый core (quiet_break_gate/redact/restraint) прошёл clean-state. Не запушено (push — только по явному слову).
- **CI ubuntu-red: TESTS-signal fixture была Windows-only (2026-09-23):** `tests/test_graph_stage_e4.py` хардкодил `file_path="D:/Project/..."`; на POSIX `Path("D:/...").is_absolute()`=False → `get_tests_for_symbol` нормализовал в `<root>/D:/...` → узел не найден → 0 тестов (падали 2 теста только на ubuntu; Windows-джоба зелёная). Fix: фикстура строит абсолютные пути из `tmp_path.as_posix()`. Guard: тест платформо-независим (класс P-ловушки «Windows-only тест без skipif», WISDOM 2026-08-08).
- **CI ubuntu-red: TESTS-signal fixture была Windows-only (2026-09-23):** `tests/test_graph_stage_e4.py` хардкодил `file_path="<repos-root>/..."`; на POSIX `Path("D:/...").is_absolute()`=False → `get_tests_for_symbol` нормализовал в `<root>/D:/...` → узел не найден → 0 тестов (падали 2 теста только на ubuntu; Windows-джоба зелёная). Fix: фикстура строит абсолютные пути из `tmp_path.as_posix()`. Guard: тест платформо-независим (класс P-ловушки «Windows-only тест без skipif», WISDOM 2026-08-08).
- **CI green (2026-09-23):** фикс 808864c5 → повторный CI **success** (ubuntu 13m21s + windows 17m20s + clean-state 13m15s + transport/manifest/docker). PR #40 (draft, mergeable). Единственный красный — GitHub Advanced Security (Copilot Autofind): `CAPIError: 400 The requested model is not supported` = инфра-сбой GitHub, не наш код (и на main так же).
- **Hook в репозиторий (2026-09-23):** `.opencode/plugin/mscodebase_gate.ts` — на `git commit`: `stale_detector` **BLOCK** (объективный дрейф версий; сейчас 0) + `graph_query isolation` **ADVISORY** (soft: у графа есть FP). Advisory = before-stash/after-deliver по callID (урок E8). Env-переключатели: `MSCODEBASE_PY`, `MSCODEBASE_STALE_GATE`, `MSCODEBASE_ISOLATION_GATE`, `MSCODEBASE_GATE_LOG`. CLI проверен из корня репо venv-python. Активируется после reload Zed. Глобально (все проекты) — только по явному разрешению (файл вне рабочей папки, §3 HALT).
- **opencode-плагин: `$` не в контексте (2026-09-23, P-ловушка):** `.opencode/plugin/mscodebase_gate.ts` загрузился (лог `init`), но на хуке `TypeError: $ is not a function` — в opencode **1.18.23** контекст фабрики не даёт рабочий `$` (доки описывают v2, где `$: BunShell` есть). Фикс: вызывать python через `node:child_process.execFile` (аргументы массивом — без shell-квотирования), не через `$`. Guard: не полагаться на `$` в локальных плагинах этой версии.
Expand Down Expand Up @@ -52,6 +52,13 @@
- **Чёрные окна 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] Конфунды агентной аппаратуры + pre-registered 4-arm (P1 Tom)
**Status:** 🟡 Дизайн заморожен, прогона нет.
**Root Cause вопроса:** «повлияет ли запуск чистых opencode-агентов/субагентов на эксперимент» — да, и в репо уже 6 каналов: (1) модель/budget читателя (E7: deepseek-low провалил NONE; qwen 8/10 vs longcat 4/10); (2) судья видит артефакт плеча (E17 v2: p=0.0046 → p=1.00); (3) самооценка генератор=судья (Tom 4727138); (4) аппаратура рапортует успех при мёртвом инструменте (E17 pilot 120/120 Error 500; Tom exit 0); (5) лёгкий контроль (E17 v6→v7 rho +0.54→не воспроизвёлся; Tom 4744919 hard-negative); (6) конкуренция за :8080/:8081 (инцидент 2026-09-25 — devbase-MCP убил наш сервер).
**Fix/design:** `experiments/4A_unit_of_return/README.md` — протокол `3fj0o` (top-k / whole-doc / oracle / **closed book**) + контуры §3-4 (изоляция data-root, MCP off, разные шарды генерации/судьи, manifest с моделью+budget, ≥5 прогонов, hard negatives, referent у каждого числа). Стоп-условние G6: свежий замороженный набор (панель 35 видели).
**Нельзя:** коммит в main, мутация живого индекса, смена ретривера после увиденного.
**Триггер:** протокол Tom `3fj0o` (dev.to) + вопрос владельца.

## [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`).
Expand Down Expand Up @@ -394,7 +401,7 @@

**Status:** ✅ Fix (замеры, кода не менялось). **Root Cause (KNOW ISSUES «Lazy-only верификация»):** вопрос, успевает ли VOR проверить ACTIVE-узлы в рамках budget_ms=50 (read-path) / 250 (background idle), и детектит ли он внешнее git-pull изменение без notify_change (H3).

**Команда:** `venv/Scripts/python.exe %TEMP%/opencode/exp1_vor_catchup.py` и `exp3b_head_polling.py` (scratch, изолированные temp-репо/project dirs, бэкапы restore в finally). Венв: `C:\Users\misha\AppData\Local\Zed\extensions\mscodebase-intelligence\venv`.
**Команда:** `venv/Scripts/python.exe %TEMP%/opencode/exp1_vor_catchup.py` и `exp3b_head_polling.py` (scratch, изолированные temp-репо/project dirs, бэкапы restore в finally). Венв: `%LOCALAPPDATA%\Zed\extensions\mscodebase-intelligence\venv`.

**Сырые результаты (Exp 1, synthetic stale nodes, budgets 50/250ms):**
```
Expand Down Expand Up @@ -530,7 +537,7 @@ VERDICT H3: CONFIRMED
## [2026-09-17] Bootstrap Pipeline: внешняя валидация на чужих Python-проектах (anti-sleeveness)

**Status:** Implemented (параметризация dynamic_trace_plugin.py) + валидация на внешних репо
**Контекст:** ревизия всех 18 репо в D:\Project (субагент): кандидаты «чистого» кода — gemma_agent (1102 py, 464 test_*.py, git), 456789/ARCLUX (TS), bench_projects (black/httpbin/headroom). Цель — не быть слепым: детектор и TESTS-рёбра проверялись только на собственном репо.
**Контекст:** ревизия всех 18 репо в <repos-root> (субагент): кандидаты «чистого» кода — gemma_agent (1102 py, 464 test_*.py, git), 456789/ARCLUX (TS), bench_projects (black/httpbin/headroom). Цель — не быть слепым: детектор и TESTS-рёбра проверялись только на собственном репо.
**Find Units:** bootstrap_entities.detect_entities на чужих: black(src)=16 dataclass/2 NT/73 classes, gemma_agent/core=65 dc/228 classes, gemma_agent/modules=1 dc, httpbin=0 (старый код без dataclass). Обнаружена слепота: детектор жёстко завязан на src/ (gemma_agent использует core/, libraries/, modules/ → нужен явный src_dir).
**Fix:** dynamic_trace_plugin.py параметризован: TRACE_SRC_ROOT/TRACE_OUT (env, дефолт=свой repo). Иначе чужой проект нельзя трассировать.
**Трассировка чужих:** black → НЕ работает: скомпилированный .pyd wheel, settrace не видит нативные кадры (0% всех тестов). gemma_agent (2882 теста) → 2737/2882 (95.0%) тестов имеют ≥1 src-функцию, 3827 уникальных src-функций, ~11.6 функций/тест — подтверждает обобщаемость A2 TESTS-рёбер на чужих проектах.
Expand Down
Loading
Loading