Compare commits

..

8 Commits

Author SHA1 Message Date
ue-toolchain 9d52cfa5b9 docs(bundle): record the cross-version run and what it does not prove
All 229 runnable recipes were executed against a second tree one major version
newer. Nothing was one-sided -- no recipe answered in one version and fell
silent in the other. 176 matched exactly, 14 differed in size, 39 returned
nothing in either tree.

The README states two cautions with the numbers, because the numbers alone
would overclaim. Matching counts mean the search surface did not move, not that
a claim still holds; anything semantic is untested by counting lines. And the
comparison was worthless before the trees were made comparable: 41 of the 55
apparent differences in the first pass were generated build output in one tree
and a tooling plugin in the other, a distortion large enough that one query
reported 122 files before exclusions and 1 after.

Full method, per-entry data and the follow-up list live in the research archive
(note 27 and _tools/run_detect_recipes.py), not here.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-06 01:50:53 +07:00
ue-toolchain ee80ce6338 docs(adr-0005): narrow ADR-0001 to what the native transport leaves open
The engine now ships an MCP server, a toolset registry and skill assets --
measured against a live editor rather than read about. Building a second
transport beside it is not a contest this project can win.

ADR-0001 is narrowed, not withdrawn. Its liveness reasoning survives intact:
process over file, tools that vanish honestly, recovery without a restart.
Three mechanisms are dropped (own JSON-RPC server, UDP-broadcast discovery, own
heartbeat) and discovery becomes a probe of the documented endpoint, which the
measurement showed gives a fast negative -- HTTP 404 with a routing error body,
no hang. That is the property the PID file could not provide.

Two layers stay ours: a server that runs without the engine, and tools that run
in a live game outside the editor, the layer the registry's editor-only
declaration leaves uncovered.

The load-bearing claim is flagged as not yet attempted: a runtime tool answering
in a packaged build. Until that runs it is derived, not measured.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-06 01:43:18 +07:00
ue-toolchain f2ec704fde feat(gate): P17 keeps the engine tool surface out of skill content
The first-party agent-tool layer is Experimental and its surface moves between
builds. A recipe that names a toolset does not fail loudly on the next build --
the tool is simply absent, the search finds nothing, and "nothing found" reads
as "no problem here". That is the exact confusion this bundle documents, so the
tokens are barred rather than discouraged.

Grounded in measurement against a live editor, not in reading:
- the aggregator plugin lists 21 dependencies; the server reported 53
  registered toolsets from 22 plugins, one dependency contributing none;
- the visible tool count flips between 3 meta-tools and every tool registered
  natively, on one project setting.

- gate.py: ENGINE_TOOL_TOKENS and check_engine_tool_surface, registered in
  CHECKS; rule floor raised to 17.
- test_gate.py: one poison naming a toolset, a meta-tool and a host:port.
- ADR-0004 records the decision, its confirmation criteria and what is
  deliberately deferred.
- README and CONTRIBUTING state the rule where a contributor meets it.

Verified: gate.py 0 violations over 17 rules; test_gate.py 17/17 redden on
their fixtures, baseline clean, surface coverage intact. The token list matches
nothing under skills/ today, checked before the rule landed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-06 00:00:59 +07:00
ue-toolchain 1277dca615 docs: bring status documents in line with the shipped bundle
Acceptance review found four documents describing a state that no longer holds.
None of the original text is deleted: the reason a decision was taken is part of
the record, so supersession is marked rather than rewritten.

- README: license section reflects ADR-0003, ADR-0003 added to the decision list,
  status line says which component actually ships.
- handoff.md: banner marking it historical, with a table of what changed since
  2026-09-01 (skills moved, layout, licence, engine version still open).
- licensing-options.md: status struck through, pointing at ADR-0003.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-05 23:49:01 +07:00
ue-toolchain dab3f35079 feat(skills): ship ue-design-skills bundle, licensing and delivery gate
Phase 0 of the handoff plan, as a marketplace rather than a flat skills/
directory. Content moved out of the LyraResearch archive and depersonalised:
addresses stay in the archive, recipes ship.

- plugins/ue-design-skills: 17 skills, 232 failure-mode entries, each with the
  six required fields; catalog.json as the harness-neutral source of truth and
  .claude-plugin/ as one adapter over it.
- _gate: 16 rules, one poisoned fixture per rule, plus surface coverage so a
  declared file cannot silently miss the line rules.
- ADR-0002 (harness-neutral bundle behind a marketplace) and ADR-0003 (split
  licensing: CC BY-ND 4.0 prose, Apache-2.0 code and metadata).
- LICENSE files at both levels, CONTRIBUTING.md, docs/licensing-options.md as
  the material the licence decision grew from.

Verified: gate.py 0 violations; test_gate.py 16/16 rules redden on their
fixtures with a clean baseline and 2 root files reaching the line rules.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-05 23:48:55 +07:00
ue-toolchain 9e2194c298 docs: add handoff document for project continuation
Фиксирует состояние проекта на момент завершения сессии 2026-09-01:
что сделано (ADR-0001, репозиторий), что не сделано (фазы 0-5),
открытые вопросы и порядок следующих шагов.

Документ нужен, чтобы продолжить работу через неделю/месяц без
необходимости перечитывать всю сессию.
2026-09-02 19:12:13 +07:00
ue-toolchain ff491e86dd docs(adr-0001): remove premature reference to ADR-0002
Убрана отсылка к 'ADR-0002-candidate' про удалённый транспорт, которая
была вставлена для красоты аргумента, но не подкреплена реальным запросом.
Заменено на честную формулировку: loopback-only — это ограничение
v0.1, удалённый сценарий будет рассмотрен отдельным ADR при появлении
конкретной потребности, а не упреждающе.

Соответствует принципу YAGNI: ADR фиксируют принимаемые решения, а не
гипотетические.
2026-09-01 21:08:38 +07:00
ue-toolchain cec48f686b docs: initial ADR-0001 (discovery over PID file) and project skeleton
Зафиксировано архитектурное решение о замене PID-файла на UDP-broadcast
discovery с graceful degradation: MCP-сервер остаётся полезным без
запущенного редактора (файловые и аналитические инструменты работают),
а редакторные инструменты появляются в tools/list только при живом
соединении.

Это ответ на повседневную боль VibeUE: 60-секундные зависания tools/call
после закрытия редактора, конфликты при двух инстансах, жёсткая связка
с файлом-маркером на диске.
2026-09-01 20:55:15 +07:00
2 changed files with 5 additions and 5 deletions
+3 -3
View File
@@ -33,9 +33,9 @@
- `plans/` — 3 плана дальнейших работ - `plans/` — 3 плана дальнейших работ
- `_tools/` — 20 парсеров/генераторов на Python - `_tools/` — 20 парсеров/генераторов на Python
**Проблема:** проект был жёстко завязан на конкретный студийный проект — пути к его дереву, Perforce-правила, конфигурация под конкретный редактор. Скиллы и инструменты не переносились в чужие проекты без переписывания. **Проблема:** проект был жёстко завязан на Overmind (NextGenium) — пути `D:\Work\NG\...`, Perforce-правила, конфигурация под конкретный редактор. Скиллы и инструменты не переносились в чужие проекты без переписывания.
**Решение:** сделать из LyraResearch **самостоятельный публичный продукт** `ue-toolchain`, не зависящий от студии и от конкретного проекта. **Решение:** сделать из LyraResearch **самостоятельный публичный продукт** `ue-toolchain`, не зависящий от NextGenium и от конкретного проекта.
## 2. Целевой продукт ## 2. Целевой продукт
@@ -126,7 +126,7 @@ VibeUE (текущий MCP-сервер для UE) привязан к **PID-ф
### Фаза 0 — Перенос существующего (1-2 недели) ### Фаза 0 — Перенос существующего (1-2 недели)
- Переписать 14 скиллов из `LyraResearch/.claude/skills/local/` под публичный формат. - Переписать 14 скиллов из `LyraResearch/.claude/skills/local/` под публичный формат.
- Убрать упоминания студийных проектов и Perforce. - Убрать упоминания NG, Overmind, Perforce.
- Переписать `_tools/*.py` на универсальные пути. - Переписать `_tools/*.py` на универсальные пути.
- Перенести заметки в `references/` скиллов. - Перенести заметки в `references/` скиллов.
- README, LICENSE (MIT), CONTRIBUTING.md, CHANGELOG.md. - README, LICENSE (MIT), CONTRIBUTING.md, CHANGELOG.md.
+2 -2
View File
@@ -31,7 +31,7 @@ FM = 'skills/sample-skill/references/failure-modes.md'
# rule id -> (operation, path, payload, replacement) # rule id -> (operation, path, payload, replacement)
POISONS: dict[str, tuple] = { POISONS: dict[str, tuple] = {
'P01': ('append', SKILL, 'P01': ('append', SKILL,
'\nDonor tree lives at D:\\Work\\Donor\\tree on the build box.\n'), '\nDonor tree lives at D:\\Work\\NG\\overmind on the build box.\n'),
'P02': ('append', SKILL, 'P02': ('append', SKILL,
'\nSee RangedWeaponInstance.cpp:194 for the original.\n'), '\nSee RangedWeaponInstance.cpp:194 for the original.\n'),
'P03': ('append', SKILL, 'P03': ('append', SKILL,
@@ -77,7 +77,7 @@ POISONS: dict[str, tuple] = {
# Declaring a file on the surface and filtering it out one line later is the # Declaring a file on the surface and filtering it out one line later is the
# same defect class as a rule with no fixture -- coverage asserted, not had. # same defect class as a rule with no fixture -- coverage asserted, not had.
SURFACE_POISON = ( SURFACE_POISON = (
'Donor tree at D:\\Work\\Donor\\tree\n' 'Donor tree at D:\\Work\\NG\\overmind\n'
'See RangedWeaponInstance.cpp:194\n' 'See RangedWeaponInstance.cpp:194\n'
'The donor project Lyra shipped this\n' 'The donor project Lyra shipped this\n'
'\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435\n' '\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435\n'