Skip to content

Refactor/structure audit - #2

Merged
LeoLourson merged 6 commits into
mainfrom
refactor/structure-audit
Oct 14, 2026
Merged

LeoLourson merged 6 commits into
mainfrom
refactor/structure-audit

Conversation

@LeoLourson

Copy link
Copy Markdown
Owner

No description provided.

proj.py (600 строк) и lit.py (1300 строк) делали каждый по многу дел сразу. Теперь
внутри scripts/ три папки по объекту работы и хост-слой, а входы остались на месте.

check/ — суждения о проекте, ничего не пишут:
- declarations.py — разбор объявлений Lean и отпечатки формулировок (был leandecl.py);
- hygiene.py — sorry, axiom, native_decide, отключённые линтеры;
- results.py — проверки шапок записей и идей;
- summaries.py — свежесть blueprint.md и ideas/README.md;
- structure.py — обязательные файлы и согласие project.toml с lakefile.toml;
- doctor.py — окружение проекта.

state/ — состояние проекта, из которого собираются сводки:
- proj.py — точка входа: new, set, sync, check, audit, fingerprint, statement, tex, doctor;
- summaries.py — тексты blueprint.md, ideas/README.md и таблицы модулей;
- aristotle.py — пакет для Aristotle и сверка ответа;
- mcp.py — MCP-сервер proj.

sources/ — источники: реестр, тексты, индекс:
- lit.py — точка входа и командная строка;
- web.py — сеть, повторы и обход VPN-туннеля (имя не http.py: файл http.py перекрыл бы
  стандартный пакет http, из которого urllib берёт соединения);
- papers.py — опознание источника и запросы к arXiv, MathNet, Crossref, zbMATH, Scholar;
- registry.py — papers.json, добавление работ, прикрепление файлов;
- store.py — скачивание и хранение полных текстов, страницы PDF;
- tex.py — транскрипция в LaTeX и нарезка на куски;
- search.py — индекс и поиск по полным текстам;
- catalog.py — каталог подборки и статус источника;
- mcp.py — MCP-сервер lit.

host/ — граница с внешними системами:
- harness.py — адаптер DeepSeek Harness (был scripts/harness.py);
- lean.py — единственное место, откуда зовут lake и lean.

Пути к инструментам обновлены во всех инструкциях, настройках Claude, .mcp.json
(--directory . --script scripts/...), CI обоих уровней и тестах. MCP-серверы переехали
в свои папки: scripts/state/mcp.py и scripts/sources/mcp.py.

Попутно исправлено:
- proj_mcp.py обращался к proj.ROOT, переименованному в _ROOT, — сервер proj падал
  при запуске;
- общий разбор записей (records.py) и проверки получают корень параметром, поэтому
  lit.py больше не считает пути при импорте;
- docs/architecture.md описывает новое деление и его основание.

Проверено: python -m unittest discover -s tests/template (36 тестов) и -s tests/kit
(4 теста), template/scripts/host/harness.py --root template prepare и check,
template/scripts/state/proj.py --root template check --fast.
После разрезания scripts/ по группам часть модулей ссылалась на имена, которых в них не
было (REGISTRY, LIT, CATALOG, ATOM), и команды источников падали с NameError, пока тесты
этого не видели. Добавлены три сторожа — неопределённые имена, обращения к атрибутам
модуля в серверах MCP и вызов модуля вместо функции, — и по ним исправлены все ссылки.
Заодно убраны два отказа при запуске: файл mcp.py перекрывал пакет `mcp`, поэтому оба
сервера не поднимались, а proj.py sync звал lit.py с ключом --root после подкоманды, из-за
чего каталог молча не пересобирался.

Факты о реестре считает теперь одно место (sources/registry.py::facts): коды источников,
карточки в обеих раскладках и карточки, сверенные по PDF; state/proj.py ими пользуется, а
не читает чужую раскладку сам. Каталог собирается чистой сборкой текста и отделён от
записи, дата из него убрана — поэтому proj.py check сверяет свежесть sources/catalog.md
так же, как blueprint.md и ideas/README.md. Сводку каталога proj.py собирает в своём
процессе, а не подпроцессом, пересборка после изменяющих команд переехала в фасад lit.py,
а направление импортов внутри слоёв закреплено тестом с явным списком оставшихся колец.
Правило «результат инструмента отдаётся текстом, ошибка не роняет сервер» было записано в
state/mcp.py и sources/mcp.py копией, и копии уже разошлись: один сервер ловил KeyError,
другой нет. Правило переехало в scripts/mcptool.py, оба сервера берут его оттуда.

Набор исключений взят объединением прежних двух и расширен TypeError: ошибка ввода или
состояния возвращается текстом, чтобы одна неудачная команда не убивала сервер целиком.
Прочие отказы в список не входят и видны как есть.

Проверено: оба сервера поднимаются и отдают полный список инструментов (proj — 8, lit — 11),
наборы тестов зелёные.
…дели

Математический текст делят пять скиллов, по одному на слой, и каждый отвечает на свой
вопрос: содержание (math-rigor), композиция (paper-canvas), стиль автора (shkalikov-style),
язык (paper-de-ai), набор (math-typeset). Правило лежит в том скилле, на чей вопрос оно
отвечает; справочники разложены по тем же слоям вместо прежних общих файлов. Тела скиллов
больше не называют путей проекта: привязка к проекту — шапка (`paths`, `when_to_use`) и
таблица слоёв в AGENTS.md. `exposition` стала командой: она загружает скиллы слоёв и своих
правил о тексте не держит.

В Harness модель выбирает навык по имени и первым 500 знакам описания, а поле whenToUse ей
не показывается. Поэтому адаптер дописывает условие `when_to_use` и маску `paths` к
описанию, а whenToUse оставляет подписью для интерфейса; описание, которое вместе с
условием не помещается в предел каталога, сборка отвергает, а не обрезает молча.

Обновление проекта останавливается, если навык проекта носит имя команды шаблона: команды и
навыки делят одно пространство имён, и собрать интеграцию иначе нельзя. В режиме --dry-run
об этом только сообщается.

Обновлены AGENTS.md, DEEPSEEK.md, README.md и руководство; проверки адаптера и создания
проекта дополнены случаями на длину описания и на столкновение имён.
harness_runtime.mjs считал корнем корень репозитория и искал output/harness/generated.json
там, тогда как harness.py пишет его в template/output/harness/: job harness-contract в CI
падал на чтении манифеста, а не проверял patch. Раньше корни совпадали случайно — потому
что harness.py лежал в template/scripts/ и его parents[2] давал корень репозитория.

Теперь проект задан явно: по умолчанию заготовка рядом со скриптом, ключ --project называет
другой каталог, рабочий каталог провайдера навыков — тот же проект. Вызовы не изменились,
CI оставлен как есть: prepare и проверка смотрят на одни файлы по структуре пути.

Проверено настоящим прогоном контракта на пакетах Harness 0.2.1-alpha.2: 14 схем плагинов,
13 навыков, MCP lean-lsp 22 инструмента, lit 11, proj 8; запуск из другого рабочего каталога
даёт то же, --project без значения и неверный --project отвергаются.
create.py собирал сводки нового проекта вызовом proj.py sync с check=False и
capture_output=True: падение не видел ни пользователь, ни CI, а сообщение «Проект создан»
печаталось всё равно. Именно так долго не замечался сломанный порядок ключа --root в
вызове lit.py из sync — каталог источников молча не пересобирался.

Теперь код возврата проверяется: создание останавливается до сборки интеграции Harness,
сообщение называет команду, её код возврата и хвост обоих потоков, а скопированные файлы
остаются на месте — причину видно и можно повторить sync руками. Успешный путь не
изменился: вывод sync по-прежнему перехвачен и не печатается.

Добавлены две проверки: падение sync прекращает создание и показывает его вывод, а
успешный sync молчит. Первая падает на прежнем коде («Проект создан» печаталось при
упавшем sync), это проверено возвратом прежней строки.
@LeoLourson
LeoLourson merged commit 374aa6f into main Oct 14, 2026
6 of 10 checks passed
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