fix(ci,mcp): REGISTRY_STAMP в build-артефакте + кросс-пакетный CI-прогон — закрыть skew build/ vs src/ и «guard в чужом пакете» #447
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Зачем
Два структурных слепых пятна, из-за которых parity-guard'ы не спасают:
1. Skew
build/vssrc/. Рантайм сервера грузит скомпилированныйpackages/mcp/build/index.js(docmost-client.loader.ts:require.resolve('@docmost/mcp')→main: ./build/index.js;build/в .gitignore, untracked). А все серверные guard-тесты читают исходники:shared-tool-specs.contract.spec.tsиtool-tiers.spec.tsимпортируют../../../../../../packages/mcp/src/tool-specs. Правкаsrc/tool-specs.tsбез пересборки → тесты зелёные, работающий сервер расходится со спеками. Loader ловит только полное отсутствие реестра («rebuild the package»), не по-тульный дрейф.2. Guard в чужом пакете. Спеки добавляют в
packages/mcp, а parity/phantom-catalog-тесты живут в jest-сьютеapps/server. PR #434 (drawio) трогал толькоpackages/mcp— автор прогнал mcp-тесты, всё зелёное; сломанный in-app обнаружился уже на develop CI после мёржа (чинилось постфактум вf46d89ea).Механика
tsc/pretestгенерировать в build константу-хэш содержимогоtool-specs.ts(имена+схемы+описания). Loader в dev/test сверяет хэш загруженного build с хэшом, вычисленным отsrc, и падает с внятным «stale build — rebuild @docmost/mcp». В prod (гдеsrcнет) — no-op.packages/mcp/**ИЛИapps/server/src/core/ai-chat/**, обязан прогонять оба тест-сьюта (mcp node:test + серверный jest тулов). Реализация — path-фильтр в Gitea Actions workflow.watchуже есть (pnpm --filter @docmost/mcp watch) — упомянуть в AGENTS.md как обязательный при правке спеков.Критерии приёмки
src/tool-specs.tsбез пересборки → красный локальный прогон серверных тестов/старта dev-сервера с сообщением про stale build.packages/mcpбез in-app-проводки, краснеет в CI самого PR, а не на develop после мёржа.Примечание: после #445 (автопроводка) класс «забыли провести in-app» умирает по построению, но stamp остаётся полезен — он ловит любой дрейф стейл-артефакта (описания, схемы, tier), а кросс-пакетный CI — любые будущие межпакетные контракты.
Связано: #416 (роадмап), #445, #446; коммит
f46d89ea(PR #434).