Skip to content

fix(index): never treat a system directory as a project - #141

Open
ManSio wants to merge 6 commits into
mainfrom
fix/no-system-index
Open

ManSio wants to merge 6 commits into
mainfrom
fix/no-system-index

Conversation

@ManSio

@ManSio ManSio commented Nov 15, 2026

Copy link
Copy Markdown
Owner

Что случилось

На живой машине в C:\Windows появился .mscodebase\chunks.db — 105 МБ, 10 264 чанка системных файлов (FrameLayout-статьи, .NET Framework, appcompat/Backup/*.json). В профиле — ещё 376 МБ. Удалить не получалось, пока сервер держал БД.

Цепочка (по логу, RUN_ID e77c87a6e138)

19:10:25  PID 8072  CWD: C:\Windows   PROJECT_PATH env: '${workspaceRoot}'
19:10:31  .mscodebase\chunks.db создан
19:10:33  Contradiction Ledger: project_root = C:\Windows
19:10:33  Auto-index: starting background indexing task
19:11:46  Giant function chunked: file=C:\Windows\Microsoft.NET\...
  1. Хост подставил PROJECT_PATH='${workspaceRoot}' — неразвёрнутый плейсхолдер. Код видел в нём обычный путь, тот не существовал.
  2. Резолвер откатился на CWD-first (это штатное поведение для per-window изоляции) и вернул C:\Windows.
  3. Автоиндексация не проверяла, проект ли это: пошла по всему каталогу ОС.
  4. get_chunks_db_path() кладёт БД внутрь корня проекта → .mscodebase в системном каталоге.

Тот же механизм дал ~/.mscodebase (376 МБ) на другом сервере с CWD=C:\Users\misha.

Исправление

Слой Что добавлено
src/core/project_resolution.py is_forbidden_root(): SystemRoot, Program Files*, ProgramData, корни дисков (C:\), профиль, temp-корень. Вызывается из _reject_self_index_target, т.е. для всех источников (CWD, PROJECT_PATH, ZED_DB, ZED_WORKTREE_ROOT); ACTIVE_WORKSPACE (явный выбор пользователя) по-прежнему доверенный
там же неразвёрнутый плейсхолдер (${workspaceRoot}, %VAR%) → WARNING + None, а не «путь, которого нет»
src/core/project_resolution.py is_project_root(): маркер проекта (.git, .hg, pyproject.toml, package.json, Cargo.toml, go.mod, pom.xml, *.sln, …)
src/mcp/server_factory.py автоиндексация запускается только при наличии маркера; иначе WARNING и пропуск — с подсказкой про явный codebase(action="index", path="project_dir")
src/core/indexing/chunk_store.py get_chunks_db_path() отказывает (ValueError) для системного корня — защита от явного вызова с project_dir=C:\Windows

Проверка

tests/test_root_guards.py        20 passed
мутации (if False вместо проверки):
  системный корень снова «проект»        -> 1 failed
  автоиндексация без маркеров            -> 1 failed
  .mscodebase внутри ОС                  -> 1 failed
ruff src/ tests/                 All checks passed
полный suite                     см. CI

Уборка (сделана на машине)

удалено  C:\Windows\.mscodebase        105 МБ  (10 264 чанка)
удалено  C:\Users\misha\.mscodebase    376 МБ
удалено  D:\Project\.mscodebase + temp-пробы

Осталось

  • Конфиг хоста: PROJECT_PATH='${workspaceRoot}' — переменная не разворачивается. Теперь это видно в логе WARNING'ом, но правится в конфиге клиента (указать реальный путь или $ZED_WORKTREE_ROOT).
  • После мержа: install.py --sync-only + перезапуск хоста, иначе живые серверы продолжат работать старым кодом.
  • Место на C: — 0.74 ГБ свободно; индекс профиля (376 МБ) был одной из причин.

@coderabbitai

coderabbitai Bot commented Nov 15, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

Run configuration

  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: ff9798a1-5f12-40ff-b555-48ec7fc6b3b2

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • Trigger review
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

@ManSio

ManSio commented Nov 15, 2026

Copy link
Copy Markdown
Owner Author

Live check after deploying the branch to the install dir (install.py --sync-only):

PS C:\Windows> python -c "resolve_project_root()"
cwd = C:\Windows
resolved = D:\Project\MSCodeBase      # из Zed SQLite active workspace
forbidden = False
profile_forbidden = True
C:\Windows\.mscodebase exists? False

До фикса тот же запуск создавал C:\Windows\.mscodebase\chunks.db и стартовал полную индексацию ОС.

Ещё по делу: в конфиге хоста (~/.config/opencode/opencode.jsonc) убран
"PROJECT_PATH": "${workspaceRoot}" — эта переменная не разворачивается и именно она
уводила резолвер в CWD. Серверы, запущенные с cwd=C:\Windows и cwd=C:\Users\misha,
сняты; новые поднимаются уже с guard'ом.

@ManSio

ManSio commented Nov 15, 2026

Copy link
Copy Markdown
Owner Author

Аудит после первого прохода (спасибо за вопрос «ты всё продумал?» — нет, было три дырки, все закрыты):

1. CI на ubuntu падал — я записал /home в системные корни, а на GitHub-раннере проект
лежит в /home/runner/.... Плюс temp-корень брался из TEMP/TMP, которых на Linux может
не быть. Исправлено: /home и /Users убраны из prefix-корней (home режется только сам),
temp берётся через tempfile.gettempdir(). Добавлены тесты «проект под ~ разрешён».

2. Обход проверки — resolve_project_root(provided=...) и ACTIVE_WORKSPACE возвращали
системный каталог до проверки. Теперь is_forbidden_root стоит первым для всех источников.

3. Слишком строгий маркер проекта — мой guard отключал бы автоиндексацию для каталогов
без .git (D:\Ekzamen\webapp\design, D:\Ekzamen\Ekzamen, D:\Project\everydaycalc).
Теперь проектом считается также каталог с кодом на верхнем уровне или с уже существующим
.mscodebase. Проверено на реальных каталогах: все три → project=True, C:\Windows →
forbidden=True.

Мутации (все четыре красят свои тесты):

  • резолвер снова берёт системный каталог;
  • явный project_root без проверки;
  • автоиндексация без признаков проекта;
  • .mscodebase внутри ОС.

CI: test (ubuntu) pass, test (windows) pass, clean-state pass, docker-build pass,
secret-scan pass, CodeQL pass.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant