Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
7232a6e
refactor(adapters): extract Windows/Zed specifics from src/utils (Фаз…
Aug 18, 2026
cb8f671
docs: add Universal MCP Engine implementation plan (EN + RU)
Aug 18, 2026
55a2af4
docs: sync AGENT_DIARY and KNOWN_ISSUES (Фаза 0 Universal Engine)
Aug 18, 2026
e661861
refactor(sources): add WorkspaceSource + LocalFsSource (Фаза 1)
Aug 18, 2026
7a8e703
docs: update Universal Engine plan (Фаза 1 status)
Aug 18, 2026
c980036
docs: sync AGENT_DIARY and KNOWN_ISSUES (Фаза 1 Universal Engine)
Aug 18, 2026
d296323
lock: implementation scope by agent-implementer (Фаза 2 GitUrlSource)
Aug 18, 2026
3bb3b6a
refactor(sources): add GitUrlSource (Фаза 2)
Aug 18, 2026
0915dcf
ci(hooks): wire layer-boundary gate into pre-commit and CI
Aug 18, 2026
69d38cd
docs: update Universal Engine plan (Фаза 2 status)
Aug 18, 2026
b26fbae
docs: sync AGENT_DIARY and KNOWN_ISSUES (Фаза 2 + audit round)
Aug 18, 2026
032aea9
unlock: implementation scope (Фаза 2 GitUrlSource done)
Aug 18, 2026
76b2991
fix(sources): clone directly into cache target (Windows rename lock, …
Aug 18, 2026
e01d1cc
experiment: add E-03 clone→index real-repo benchmark (4/4 PASSED)
Aug 18, 2026
51f950d
docs: sync plans ledgers (E-03 done, clone-in-place fix)
Aug 18, 2026
e4bc051
feat(index): add index_git_url tool (Фаза 2 MCP wiring)
Aug 18, 2026
b7d2f17
docs: sync plans ledgers (index_git_url tool) + coordination norm (кэ…
Aug 19, 2026
16b5e94
experiment: add E-08 live SSRF suite (9/9 PASSED)
Aug 19, 2026
b3907af
feat(sources): add UploadSource (Фаза 2, R-3)
Aug 19, 2026
f2a7596
feat(sources): DNS-rebinding detect in GitUrlSource (Фаза 2.5)
Aug 19, 2026
effb1af
fix(gates): prune nested git clones in health-scan + stale-detector (…
Aug 19, 2026
8ecec52
feat(transport): Streamable HTTP вход (Фаза 3, шаг 1-3)
Aug 19, 2026
9e8b849
feat(transport): rate-limit + circuit breaker on remote gate
Aug 19, 2026
f0109ff
docs(plan): Phase 3 step 4 status + backlog B-1 manifest parsers
Aug 19, 2026
88e2bfd
docs(meta): session sync — Phase 3 step 4 ledger update
Aug 19, 2026
462ea66
feat(transport): Docker deploy for remote engine (Phase 3 step 5)
Aug 19, 2026
9368f6b
docs(meta): session sync — Phase 3 step 5 (Docker) ledger + plan update
Aug 19, 2026
76646a0
experiment: E-07 transport equivalence stdio vs HTTP
Aug 19, 2026
109c930
docs(meta): session sync — E-07 + Phase 3 status update
Aug 19, 2026
ae2b01b
feat(plugins): Phase 4 v1 — trust-gate foundation
Aug 19, 2026
a34de35
docs(meta): session sync — Phase 4 v1 trust-gate ledger + plan
Aug 19, 2026
898e88f
feat(plugins): Phase 4 — subprocess isolation (runner + JSON-RPC proxy)
Aug 19, 2026
f636de7
docs(meta): session sync — Phase 4 subprocess isolation ledger + plan
Aug 19, 2026
2f30f58
feat(plugins): Phase 4 — MCP-proxy wiring + trust UX + deps scan
Aug 19, 2026
b8cc9f3
docs(meta): session sync — Phase 4 wiring ledger + plan
Aug 19, 2026
1f07952
feat(adapters): Phase 5 — client configs + thin CLI wrapper
Aug 19, 2026
85e9645
docs(meta): session sync — Phase 5 adapters ledger + plan
Aug 19, 2026
11c7126
feat(manifest): B-1 foundation — ManifestEntry + python/npm extractor…
Aug 19, 2026
e878543
docs(meta): session sync — Backlog B-1 foundation ledger + plan
Aug 19, 2026
8a28e95
feat(manifest): B-1 phase 1 complete — go/cargo/maven/nuget/composer/gem
Aug 19, 2026
4cd2f55
feat(manifest): B-1 phase 2 (stdlib batch) — lockfile extractors
Aug 19, 2026
efe07e3
feat(plugins): Phase 4 — wire plugins into MCP server (opt-in, fail-s…
Aug 19, 2026
2d9e882
docs(meta): session sync — B-1 phases 1+2 + Phase 4 wiring ledger
Aug 19, 2026
1a93c2d
feat(manifest): B-1 phase 2 — yarn.lock family (v1/v2/berry v10)
Aug 19, 2026
381e41b
feat(receipts): Action Receipt (TOR s11) — get_action_receipt + store…
Aug 19, 2026
e72117e
fix(receipts): E-05 gate — make reproducible_by fully self-contained …
Aug 19, 2026
aa3c4ee
docs(diary): add verified_from_clean_state marker to coordination-inc…
Aug 20, 2026
f8e766f
test(receipts): E-09 — upload-bomb gate GitUrlSource 4/4 (Phase 2 clo…
Aug 20, 2026
daf0121
docs(2e): add machine-readable red-team flip ledger
Aug 20, 2026
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
37 changes: 37 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# ─── Образ docker: исключаем всё, что не нужно рантайму ───
# КРИТИЧНО: experiments/ содержит клоны исследователя (e-s1-polygon, 35k файлов) —
# попадание в build-context раздувает/ломает сборку.

.git
.gitignore
.gitmodules
**/__pycache__
**/*.py[cod]
*.log
*.pyc

# env/секреты и локальные данные
**/.env
.env
.data
.locks
telemetry

# окружения и кэши
venv
.venv
*.egg-info
.pytest_cache
.ruff_cache
.mypy_cache
.coverage
htmlcov

# не рантайм
tests
docs
experiments
scripts
tools
deploy # сам деплой-артефакт в контексте не нужен (не мешает, но держим image чистым)
*.md # README/etc — не нужны в образе
7 changes: 7 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,13 @@ jobs:
- name: Lint (ruff)
run: ruff check src/ tests/

- name: Layer-boundary gate (Фаза 1 Universal Engine)
# Три оси ТЗ: ADAPTER → TRANSPORT → SOURCE → CORE. Гейт не даёт
# mcp/tools импортировать adapters/src.sources и core — adapters.*
# (кроме main.py dispatch); transitional core→src.sources.* обязан
# дойти до 0 к концу Фазы 2.
run: python scripts/check_layer_boundaries.py

- name: Check version consistency
run: python scripts/bump_version.py --check

Expand Down
24 changes: 13 additions & 11 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -167,17 +167,19 @@ scripts/_diag_*.py
scripts/_run_*.py
.codebase/

# One-off dev/test scripts — удалены из репозитория 2026-08-04 (hardcoded paths, 0 ссылок)
runner.py
quickrun.py
runtest.py
do_test.py
execute_test.py
quick_test.py
_run_test.py
.verify_final_render.py
run_test.bat
run_pytest.bat
# One-off dev/test scripts — удалены из репозитория 2026-08-04 (hardcoded paths, 0 ссылок).
# ЯКОРЬ-в-корень (/): паттерн должен матчить ТОЛЬКО корневые одноразовые скрипты,
# а не любой файл с таким именем в дереве (иначе скрывает легитимный src/plugins/runner.py).
/runner.py
/quickrun.py
/runtest.py
/do_test.py
/execute_test.py
/quick_test.py
/_run_test.py
/.verify_final_render.py
/run_test.bat
/run_pytest.bat
run_one_test.bat
run_one_test.sh

Expand Down
154 changes: 154 additions & 0 deletions AGENT_DIARY.md

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion AI_INSTALLATION_PROMPT.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
✅ ONNX модель e5-base-v2 (~265 MB) + GGUF модель bge-reranker-v2-m3 (~544 MB)
✅ MCP сервер настроен в Zed
✅ ~1.0 GB RAM в простое (ONNX in-process + reranker)
61 инструментов доступны Агенту (28 core + 16 intel + 13 inline + 4 dev + 1 optional execute_script)
62 инструментов доступны Агенту (29 core + 16 intel + 13 inline + 4 dev + 1 optional execute_script)
```

---
Expand Down
64 changes: 64 additions & 0 deletions EXPERIMENTS_LOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,69 @@
# EXPERIMENTS_LOG.md — Audit Verification (2026-07-22)

## [2026-08-19] — E-09: upload-bomb защита GitUrlSource (Фаза 2 / ТЗ §4 DoS)

**Гипотеза:** post-clone лимиты GitUrlSource (`_post_clone_checks`) отклоняют оба DoS-вектора upload-bomb — размер и число файлов — машинным kind (→ INCONCLUSIVE), а не крашатся; OK-путь в лимитах чист; редирект-подмена origin блокируется. **Команда:** `python experiments/universal-engine/e09_upload_bombs.py` (локальные деревья без сети, пониженные лимиты).
**Сырой результат:**
```
too_large: PASS (kind=too_large)
too_many: PASS (kind=too_many_files)
ok-path: PASS (не бросает)
redirect: PASS (domain_not_allowed)
E-09: 4 cases — 4 PASSED, 0 FAILED → SMOKE E-09: PASSED
```
**Вердикт:** подтверждена — upload-bomb gate корректен; Фаза 2 (GitUrlSource) полностью закрыта.
**Урок:** post-clone лимиты = вторая линия обороны (после SSRF-пред-проверок в `_parse_url`/`_resolve_and_check_ips`); дешёвые локальные деревья достаточно для проверки механики (500MB-клоны не нужны). Связь: ТЗ §4 «ограничение размера/объёма при клонировании».

## [2026-08-19] — E-05: ActionReceipt `reproducible_by` на реальных действиях (ТЗ §11.5 этап 3 / §12.3)

**Гипотеза (§12.3):** `reproducible_by` воспроизводится 1:1? Или, как с temporal-git-provenance, «очевидно полезное» поле на практике не работает как задумано. **Команда:** `python experiments/universal-engine/e05_action_receipt.py` (реальные действия в чистом temp: file_write с реальными SHA-256, git_commit в чистом репо, git_push status, index_sync). Для каждого: build_receipt → store.record → store.get → выполнить reproducible_by → сравнить вердикт.
**Сырой результат (после фикса):**
```
action verdict repro_verdict result
file_write VERIFIED VERIFIED PASS
git_commit VERIFIED VERIFIED PASS
git_push VERIFIED VERIFIED PASS
index_sync INCONCLUSIVE INCONCLUSIVE PASS
Store round-trip (E05-git1): PASS
E-05: 4 cases — 4 PASSED, 0 FAILED → SMOKE E-05: PASSED
```
**Находка (первый прогон 2/4):** `verify_git_commit`/`verify_git_push` хардкодили cwd ПРОЦЕССА — `git log` шёл в MSCodeBase (коммит 381e41bd), а не в тестовом репо → reproducible_by в др. cwd → mismatch вердиктов. Рovno опасение §12.3 подтвердилось.
**Фикс:** verify_git_commit/push принимают `cwd=` (backward-compat); `reproducible_command(.., workdir)` кодирует `git -C <dir>`; `ActionReceipt.workdir`; `build_receipt(workdir)`; `verify_action` резолвит project_root. **Вердикт:** подтверждена с оговоркой — reproducible_by работает 1:1 ТОЛЬКО с явным workdir для git-типов; receipt стал самодостаточным.
**Урок:** verify и reproduce в разных cwd «выглядят правильно», но вердикты расходятся — unit-тест (cwd процесса) это не различает, нужен реальный E-05 с изолированным окружением. Связь: present-trap / «очевидно полезное ≠ работает» KI-2026-08-11.

## [2026-08-19] — Exp: LIVE vendor test — basedpyright (real pyright fork) LSP features

**Гипотеза:** Нереальный сервер даст «правду»: какие LSP-фичи графа реально доступны на Python. Ожидали: call hierarchy + semantic tokens работают; type hierarchy 3.17, moniker и gate индексации — «возможно». **Команда:** `pip install basedpyright` (venv, без npm) → `venv/Scripts/python.exe experiments/lsp/lsp_live_pyright.py` (real `basedpyright-langserver --stdio`, fixture в experiments/lsp/fixture).
**Сырой результат:**
```
INIT: serverInfo = {name: basedpyright, version: 1.39.10}
callHierarchyProvider: True typeHierarchyProvider: None
semanticTokensProvider: {... full:True ...} monikerProvider: None
call hierarchy: prepare report -> outgoing [ShapeManager,total_area,build] + incoming [main] (ranges точные)
semantic tokens: 62 токена, delta-encoded, result_id=1787169556049
indexing gate: pyright/beginIndexing/endIndexing НЕ наблюдались (только window/logMessage за 8s)
```
**Вердикт:** ЧАСТИЧНО ПОДТВЕРЖДЕНА, с важными негативами: на реальном pyright-форке работают ТОЛЬКО call hierarchy и semantic tokens. Type hierarchy (3.17), moniker (3.16) и pyright/beginIndexing-гейт на базе pyright НЕ доступны — это опровергает их «теоретическую» доступность из прошлой записи (spec-true, но server-false для этого вендора).
**Урок:** (1) «В спецификации есть feature» ≠ «сервер реализует feature». Проверять НА ЖИВОМ сервере (это и был смысл эксперимента). (2) Для Python-индекса графа реальны: call hierarchy (cross-file рёбра CALLS с точными ranges) и semantic tokens. (3) Реализация тонкого клиента поверх запиненного lsprotocol — `src/core/lsp_client.py` (capability-agnostic), демо `experiments/lsp/lsp_client_demo.py`: CALLS edges `report->ShapeManager/total_area/build` (в т.ч. `print->builtins.pyi`), демо-декодер semantic tokens. (4) Побочный артефакт: `basedpyright` установлен в venv (не в requirements) — dev-tool эксперимента, при желании `pip uninstall basedpyright`.

## [2026-08-19] — Exp: LSP wire probe — advanced features for the code knowledge graph

**Гипотеза:** Заявленные LSP «скрытые» возможности для графа кода реальны и воспроизводятся на проводе: (1) 2-фазный call hierarchy с непрозрачным `data`-кэшем (prepare → incoming/outgoing); (2) type hierarchy 3.17 (prepare → supertypes/subtypes); (3) semantic tokens `[dLine,dStart,len,typeIdx,mods]` одной пачкой; (4) `$/progress` как gate индексации; (5) вендор-методы (rust-analyzer/expandMacro) → -32601 MethodNotFound (graceful degradation). Проверка на запиненных `lsprotocol==2025.0.0` (+cattrs) — реальный Content-Length-framed JSON-RPC round-trip, без сети/внешнего сервера.
**Команда:** `venv/Scripts/python.exe experiments/lsp/lsp_wire_probe.py` (исток — `experiments/lsp/`). Схемы типов — `from lsprotocol import types` + `__annotations__`.
**Сырой результат (ключевое):**
```
initialize.capabilities: {callHierarchyProvider:true, typeHierarchyProvider:true, semanticTokensProvider:{legend…, full:true}}
prepareCallHierarchy → data:{opaque:ctx-v1,id:42} (data: typing.Any|None в схеме)
incomingCalls/{item:…с тем же data} → assert id==42 прошёл (server отвечает ИЗ кэша data, без reparse)
typeHierarchy subtypes → [Circle(Shape), Square(Shape)]
semanticTokens/full → data:[0,0,5,1,0, 0,6,4,0,0, 0,3,1,1,2, 2,0], resultId:tok-1
mock/emitProgress → <-- notification: $/progress {token:idx-123, value:{kind:begin,title:indexing}}
rust-analyzer/expandMacro → {code:-32601, message:Method not found: rust-analyzer/expandMacro}
WIRE PROBE: PASSED (exit 0)
```
**Вердикт:** ГИПОТЕЗА ПОДТВЕРЖДЕНА для стандартной части. Wire-механика (framing, JSON-RPC, camelCase на проводе: selectionRange/resultId/fromRanges, типовая сериализация через converters.get_converter()) воспроизведена на запиненной версии. `data`-кэш работает round-trip. Вендор-методы НЕ в спецификации: спецификация требует `-32601` для неизвестных `$/`-методов и «сервер может игнорировать» неизвестные capabilities — это легальный extension-point для vendor-методов (корабли не проверялись: живых rust-analyzer/pyright/tsserver в среде нет).
**Урок:** (1) Реальный инцидент в самом эксперименте — self-echo deadlock из-за неверной топологии пайпов (клиент читал собственный request): пойман таймаутом `timeout 15`, не гаданием; фикс — 2 одно-направленных пайпа fwd/back. (2) Граф-полезные LSP-фичи РЕАЛЬНО доступны через запиненный lsprotocol: `moniker` (3.16) — стабильный cross-language id символа (unique: document/project/group/scheme/global) → сильный кандидат для рёбер индекса; `data`-кэш; semanticTokens как быстрый символьный масс-экстрактор. (3) Ограничение: vendor-ветка (expandMacro/checkCompleted/navtree) не проверялась на живом сервере — сети на установку pyright/rust-analyzer нет (sandbox).

## [2026-08-17] — Exp: кластер циклических импортов MCP — E1 инвентаризация + E2 import-time + E3 прототип (гибрид A+B → 0 циклов)

**Гипотеза (H1-E3):** 24/29 «циклических зависимостей» ARCLUX в src/mcp/ — один гигантский сильно-связный компонент (SCC), но ВСЕ циклы runtime-безопасны (lazy/без import-time использования); контрольный инструмент — собственный AST-инвентарь (SCC + классификация lazy/load + fresh-interpreter import test), та же методика до/после. Гибрид (реэкспорты→core + runtime-состояние→новый src/mcp/context.py) должен разорвать SCC до 0 без сломатестов и без роста import-time.
Expand Down
Loading
Loading